From 5c460a466341bb8bf0af2a95ec96e069cd477275 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 24 Aug 2020 16:12:46 -0700 Subject: [PATCH 1/5] Fix a couple issues with overview to home transition - In fake portrait, fade out instead of translating offscreen, as the orientation doesn't map to where RecentsView actually lives - From OverviewModalTaskState, start from > 1 scale, and use OverviewToHomeAnim (to ensure RecentsView doesn't fade out etc) - To keep parameter list sane, added RecentsParams to AnimatorControllerWithResistance which has the new startScale (set to current scale for modal state) and renames the old RecentsParams to RecentsResistanceParams. Sorry if that's confusing. Bug: 144170434 Change-Id: Id36ebde440b398159cef50d95822627fca761527 Merged-In: I437f0d18cad4c94feea25954aed3390acedcaed5 --- .../NavBarToHomeTouchController.java | 3 +- .../quickstep/util/OverviewToHomeAnim.java | 9 +- .../AnimatorControllerWithResistance.java | 133 +++++++++++++----- 3 files changed, 105 insertions(+), 40 deletions(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java index 61f6702dcc..95e07e8da5 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java @@ -19,7 +19,6 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; import static com.android.launcher3.AbstractFloatingView.TYPE_ALL_APPS_EDU; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; -import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; import static com.android.launcher3.anim.Interpolators.DEACCEL_3; import static com.android.launcher3.config.FeatureFlags.ENABLE_ALL_APPS_EDU; @@ -222,7 +221,7 @@ public class NavBarToHomeTouchController implements TouchController, recentsView.switchToScreenshot(null, () -> recentsView.finishRecentsAnimation(true /* toRecents */, null)); } - if (mStartState == OVERVIEW) { + if (mStartState.overviewUi) { new OverviewToHomeAnim(mLauncher, () -> onSwipeInteractionCompleted(mEndState)) .animateWithVelocity(velocity); } else { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/OverviewToHomeAnim.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/OverviewToHomeAnim.java index 6278e147c0..4a298d3bad 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/OverviewToHomeAnim.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/OverviewToHomeAnim.java @@ -22,6 +22,7 @@ import static com.android.launcher3.anim.Interpolators.FINAL_FRAME; import static com.android.launcher3.anim.Interpolators.INSTANT; import static com.android.launcher3.states.StateAnimationConfig.ANIM_ALL_COMPONENTS; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_ACTIONS_FADE; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_FADE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y; @@ -106,10 +107,16 @@ public class OverviewToHomeAnim { // StaggeredWorkspaceAnim doesn't animate overview, so we handle it here. ? PLAY_ATOMIC_OVERVIEW_PEEK : ANIM_ALL_COMPONENTS; - config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, DEACCEL); + boolean isLayoutNaturalToLauncher = recentsView.getPagedOrientationHandler() + .isLayoutNaturalToLauncher(); + config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, isLayoutNaturalToLauncher + ? DEACCEL : FINAL_FRAME); config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, FINAL_FRAME); config.setInterpolator(ANIM_OVERVIEW_SCALE, FINAL_FRAME); config.setInterpolator(ANIM_OVERVIEW_ACTIONS_FADE, INSTANT); + if (!isLayoutNaturalToLauncher) { + config.setInterpolator(ANIM_OVERVIEW_FADE, DEACCEL); + } AnimatorSet stateAnim = stateManager.createAtomicAnimation( startState, NORMAL, config); stateAnim.addListener(new AnimationSuccessListener() { diff --git a/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java b/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java index a19a67c8fc..deb70e0f8b 100644 --- a/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java +++ b/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java @@ -31,11 +31,12 @@ import android.util.FloatProperty; import androidx.annotation.Nullable; -import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Launcher; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; +import com.android.launcher3.touch.PagedOrientationHandler; import com.android.quickstep.LauncherActivityInterface; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.views.RecentsView; @@ -54,11 +55,12 @@ public class AnimatorControllerWithResistance { */ public static final float TWO_BUTTON_EXTRA_DRAG_FACTOR = 0.25f; - private enum RecentsParams { + private enum RecentsResistanceParams { FROM_APP(0.75f, 0.5f, 1f), FROM_OVERVIEW(1f, 0.75f, 0.5f); - RecentsParams(float scaleStartResist, float scaleMaxResist, float translationFactor) { + RecentsResistanceParams(float scaleStartResist, float scaleMaxResist, + float translationFactor) { this.scaleStartResist = scaleStartResist; this.scaleMaxResist = scaleMaxResist; this.translationFactor = translationFactor; @@ -139,9 +141,9 @@ public class AnimatorControllerWithResistance { FloatProperty scaleProperty, TRANSLATION translationTarget, FloatProperty translationProperty) { - PendingAnimation resistAnim = createRecentsResistanceAnim(null, context, - recentsOrientedState, dp, scaleTarget, scaleProperty, translationTarget, - translationProperty, RecentsParams.FROM_APP); + RecentsParams params = new RecentsParams(context, recentsOrientedState, dp, scaleTarget, + scaleProperty, translationTarget, translationProperty); + PendingAnimation resistAnim = createRecentsResistanceAnim(params); AnimatorPlaybackController resistanceController = resistAnim.createPlaybackController(); return new AnimatorControllerWithResistance(normalController, resistanceController); @@ -152,31 +154,30 @@ public class AnimatorControllerWithResistance { * when starting from recents, i.e. {@link #createRecentsResistanceFromOverviewAnim}. */ public static PendingAnimation createRecentsResistanceAnim( - @Nullable PendingAnimation resistAnim, Context context, - RecentsOrientedState recentsOrientedState, DeviceProfile dp, SCALE scaleTarget, - FloatProperty scaleProperty, TRANSLATION translationTarget, - FloatProperty translationProperty, RecentsParams params) { + RecentsParams params) { Rect startRect = new Rect(); - LauncherActivityInterface.INSTANCE.calculateTaskSize(context, dp, startRect, - recentsOrientedState.getOrientationHandler()); + PagedOrientationHandler orientationHandler = params.recentsOrientedState + .getOrientationHandler(); + LauncherActivityInterface.INSTANCE.calculateTaskSize(params.context, params.dp, startRect, + orientationHandler); long distanceToCover = startRect.bottom; - boolean isTwoButtonMode = SysUINavigationMode.getMode(context) == TWO_BUTTONS; + boolean isTwoButtonMode = SysUINavigationMode.getMode(params.context) == TWO_BUTTONS; if (isTwoButtonMode) { // We can only drag a small distance past overview, not to the top of the screen. distanceToCover = (long) - ((dp.heightPx - startRect.bottom) * TWO_BUTTON_EXTRA_DRAG_FACTOR); - } - if (resistAnim == null) { - resistAnim = new PendingAnimation(distanceToCover * 2); + ((params.dp.heightPx - startRect.bottom) * TWO_BUTTON_EXTRA_DRAG_FACTOR); } + PendingAnimation resistAnim = params.resistAnim != null + ? params.resistAnim + : new PendingAnimation(distanceToCover * 2); PointF pivot = new PointF(); - float fullscreenScale = recentsOrientedState.getFullScreenScaleAndPivot( - startRect, dp, pivot); - float startScale = 1; - float prevScaleRate = (fullscreenScale - startScale) / (dp.heightPx - startRect.bottom); + float fullscreenScale = params.recentsOrientedState.getFullScreenScaleAndPivot( + startRect, params.dp, pivot); + float prevScaleRate = (fullscreenScale - params.startScale) + / (params.dp.heightPx - startRect.bottom); // This is what the scale would be at the end of the drag if we didn't apply resistance. - float endScale = startScale - prevScaleRate * distanceToCover; + float endScale = params.startScale - prevScaleRate * distanceToCover; final TimeInterpolator scaleInterpolator; if (isTwoButtonMode) { // We are bounded by the distance of the drag, so we don't need to apply resistance. @@ -184,9 +185,10 @@ public class AnimatorControllerWithResistance { } else { // Create an interpolator that resists the scale so the scale doesn't get smaller than // RECENTS_SCALE_MAX_RESIST. - float startResist = Utilities.getProgress(params.scaleStartResist , startScale, - endScale); - float maxResist = Utilities.getProgress(params.scaleMaxResist, startScale, endScale); + float startResist = Utilities.getProgress(params.resistanceParams.scaleStartResist, + params.startScale, endScale); + float maxResist = Utilities.getProgress(params.resistanceParams.scaleMaxResist, + params.startScale, endScale); scaleInterpolator = t -> { if (t < startResist) { return t; @@ -196,20 +198,22 @@ public class AnimatorControllerWithResistance { return startResist + resistProgress * (maxResist - startResist); }; } - resistAnim.addFloat(scaleTarget, scaleProperty, startScale, endScale, + resistAnim.addFloat(params.scaleTarget, params.scaleProperty, params.startScale, endScale, scaleInterpolator); if (!isTwoButtonMode) { // Compute where the task view would be based on the end scale, if we didn't translate. RectF endRectF = new RectF(startRect); Matrix temp = new Matrix(); - temp.setScale(params.scaleMaxResist, params.scaleMaxResist, pivot.x, pivot.y); + temp.setScale(params.resistanceParams.scaleMaxResist, + params.resistanceParams.scaleMaxResist, pivot.x, pivot.y); temp.mapRect(endRectF); // Translate such that the task view touches the top of the screen when drag does. - float endTranslation = endRectF.top * recentsOrientedState.getOrientationHandler() - .getSecondaryTranslationDirectionFactor() * params.translationFactor; - resistAnim.addFloat(translationTarget, translationProperty, 0, endTranslation, - RECENTS_TRANSLATE_RESIST_INTERPOLATOR); + float endTranslation = endRectF.top + * orientationHandler.getSecondaryTranslationDirectionFactor() + * params.resistanceParams.translationFactor; + resistAnim.addFloat(params.translationTarget, params.translationProperty, + params.startTranslation, endTranslation, RECENTS_TRANSLATE_RESIST_INTERPOLATOR); } return resistAnim; @@ -220,11 +224,66 @@ public class AnimatorControllerWithResistance { * a RecentsView interaction that started from the overview state. */ public static PendingAnimation createRecentsResistanceFromOverviewAnim( - BaseDraggingActivity activity, @Nullable PendingAnimation resistanceAnim) { - RecentsView recentsView = activity.getOverviewPanel(); - return createRecentsResistanceAnim(resistanceAnim, activity, - recentsView.getPagedViewOrientedState(), activity.getDeviceProfile(), - recentsView, RECENTS_SCALE_PROPERTY, recentsView, TASK_SECONDARY_TRANSLATION, - RecentsParams.FROM_OVERVIEW); + Launcher launcher, @Nullable PendingAnimation resistanceAnim) { + RecentsView recentsView = launcher.getOverviewPanel(); + RecentsParams params = new RecentsParams(launcher, recentsView.getPagedViewOrientedState(), + launcher.getDeviceProfile(), recentsView, RECENTS_SCALE_PROPERTY, recentsView, + TASK_SECONDARY_TRANSLATION) + .setResistAnim(resistanceAnim) + .setResistanceParams(RecentsResistanceParams.FROM_OVERVIEW) + .setStartScale(recentsView.getScaleX()); + return createRecentsResistanceAnim(params); + } + + /** + * Params to compute resistance when scaling/translating recents. + */ + private static class RecentsParams { + // These are all required and can't have default values, hence are final. + public final Context context; + public final RecentsOrientedState recentsOrientedState; + public final DeviceProfile dp; + public final SCALE scaleTarget; + public final FloatProperty scaleProperty; + public final TRANSLATION translationTarget; + public final FloatProperty translationProperty; + + // These are not required, or can have a default value that is generally correct. + @Nullable public PendingAnimation resistAnim = null; + public RecentsResistanceParams resistanceParams = RecentsResistanceParams.FROM_APP; + public float startScale = 1f; + public float startTranslation = 0f; + + private RecentsParams(Context context, RecentsOrientedState recentsOrientedState, + DeviceProfile dp, SCALE scaleTarget, FloatProperty scaleProperty, + TRANSLATION translationTarget, FloatProperty translationProperty) { + this.context = context; + this.recentsOrientedState = recentsOrientedState; + this.dp = dp; + this.scaleTarget = scaleTarget; + this.scaleProperty = scaleProperty; + this.translationTarget = translationTarget; + this.translationProperty = translationProperty; + } + + private RecentsParams setResistAnim(PendingAnimation resistAnim) { + this.resistAnim = resistAnim; + return this; + } + + private RecentsParams setResistanceParams(RecentsResistanceParams resistanceParams) { + this.resistanceParams = resistanceParams; + return this; + } + + private RecentsParams setStartScale(float startScale) { + this.startScale = startScale; + return this; + } + + private RecentsParams setStartTranslation(float startTranslation) { + this.startTranslation = startTranslation; + return this; + } } } From 77e29775a9e9fd98a3905130dad0c15ead9edfa4 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Tue, 25 Aug 2020 00:53:48 -0700 Subject: [PATCH 2/5] Fix Robolectric test breakage Bug: 166204002 Change-Id: I9c54c6230756dbb5fe8bdcb37ba51165d20bb815 --- src/com/android/launcher3/Launcher.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 0970dae479..52583d413c 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -925,6 +925,7 @@ public class Launcher extends StatefulActivity implements Launche private void logStopAndResume(int command) { + if (mPendingExecutor != null) return; int pageIndex = mWorkspace.isOverlayShown() ? -1 : mWorkspace.getCurrentPage(); int containerType = mStateManager.getState().containerType; From fee2b25b9c0df85190fe01d870c84392d210964a Mon Sep 17 00:00:00 2001 From: Sreyas Date: Thu, 27 Aug 2020 15:48:00 -0700 Subject: [PATCH 3/5] Implementing TouchDelegate to make full chip clickable. Bug: 166376182 Tested: Manual Change-Id: I36b2559908fbf7ab6a863fb6e550a88b5374aefa --- .../android/quickstep/views/RecentsView.java | 10 ++---- .../com/android/quickstep/views/TaskView.java | 36 +++++++++++++++++-- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java index 1d17f5af70..7111b69dba 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java @@ -79,7 +79,6 @@ import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; -import android.view.TouchDelegate; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; @@ -700,12 +699,9 @@ public abstract class RecentsView extends PagedView super.onTouchEvent(ev); TaskView taskView = getCurrentPageTaskView(); - if (taskView != null) { - TouchDelegate mChildTouchDelegate = taskView.getIconTouchDelegate(ev); - if (mChildTouchDelegate != null && mChildTouchDelegate.onTouchEvent(ev)) { - // Keep consuming events to pass to delegate - return true; - } + if (taskView != null && taskView.offerTouchToChildren(ev)) { + // Keep consuming events to pass to delegate + return true; } final int x = (int) ev.getX(); diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java index 2058a7f375..65cadd6350 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java @@ -135,6 +135,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { * delegated bounds only to be updated. */ private TransformingTouchDelegate mIconTouchDelegate; + private TransformingTouchDelegate mChipTouchDelegate; private static final List SYSTEM_GESTURE_EXCLUSION_RECT = Collections.singletonList(new Rect()); @@ -200,6 +201,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { private View mContextualChipWrapper; private View mContextualChip; private final float[] mIconCenterCoords = new float[2]; + private final float[] mChipCenterCoords = new float[2]; public TaskView(Context context) { this(context, null); @@ -263,11 +265,22 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { mIconTouchDelegate = new TransformingTouchDelegate(mIconView); } - public TouchDelegate getIconTouchDelegate(MotionEvent event) { + /** + * Whether the taskview should take the touch event from parent. Events passed to children + * that might require special handling. + */ + public boolean offerTouchToChildren(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { computeAndSetIconTouchDelegate(); + computeAndSetChipTouchDelegate(); } - return mIconTouchDelegate; + if (mIconTouchDelegate != null && mIconTouchDelegate.onTouchEvent(event)) { + return true; + } + if (mChipTouchDelegate != null && mChipTouchDelegate.onTouchEvent(event)) { + return true; + } + return false; } private void computeAndSetIconTouchDelegate() { @@ -282,6 +295,23 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { (int) (mIconCenterCoords[1] + iconHalfSize)); } + private void computeAndSetChipTouchDelegate() { + if (mContextualChipWrapper != null) { + float chipHalfWidth = mContextualChipWrapper.getWidth() / 2f; + float chipHalfHeight = mContextualChipWrapper.getHeight() / 2f; + mChipCenterCoords[0] = chipHalfWidth; + mChipCenterCoords[1] = chipHalfHeight; + getDescendantCoordRelativeToAncestor(mContextualChipWrapper, mActivity.getDragLayer(), + mChipCenterCoords, + false); + mChipTouchDelegate.setBounds( + (int) (mChipCenterCoords[0] - chipHalfWidth), + (int) (mChipCenterCoords[1] - chipHalfHeight), + (int) (mChipCenterCoords[0] + chipHalfWidth), + (int) (mChipCenterCoords[1] + chipHalfHeight)); + } + } + /** * The modalness of this view is how it should be displayed when it is shown on its own in the * modal state of overview. @@ -725,6 +755,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { mContextualChip.animate().scaleX(1f).scaleY(1f).setDuration(50); } if (mContextualChipWrapper != null) { + mChipTouchDelegate = new TransformingTouchDelegate(mContextualChipWrapper); mContextualChipWrapper.animate().alpha(1f).setDuration(50); } } @@ -746,6 +777,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { View oldContextualChipWrapper = mContextualChipWrapper; mContextualChipWrapper = null; mContextualChip = null; + mChipTouchDelegate = null; return oldContextualChipWrapper; } From 8a622edb78260ea852a0ce7be139bc1ac0eb5592 Mon Sep 17 00:00:00 2001 From: Sreyas Date: Fri, 28 Aug 2020 10:20:05 -0700 Subject: [PATCH 4/5] Scale down chip proportional to TaskView becoming fullscreen. Tested: Manual Change-Id: I09c80b28cb01fb4873efffa8d4856b63af32493f --- .../src/com/android/quickstep/views/TaskView.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java index 2058a7f375..e37724b271 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java @@ -546,7 +546,11 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { .getInterpolation(progress); mIconView.setScaleX(scale); mIconView.setScaleY(scale); - + if (mContextualChip != null && mContextualChipWrapper != null) { + mContextualChipWrapper.setAlpha(scale); + mContextualChip.setScaleX(scale); + mContextualChip.setScaleY(scale); + } updateFooterVerticalOffset(1.0f - scale); } From 3aca92104f0c5a156e73f22b562437bfcb3ea3d1 Mon Sep 17 00:00:00 2001 From: Sreyas Date: Fri, 28 Aug 2020 10:59:00 -0700 Subject: [PATCH 5/5] Make modal based UI changes in TaskView only if modalness changes. Fixes issue with jittery displaying of suggestion chip, when entering overview. Tested:Manual Change-Id: Id37fcc67840402f1f66d7646cd562c282a19e312 --- .../src/com/android/quickstep/views/TaskView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java index 2058a7f375..85ac22dd8f 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java @@ -289,6 +289,9 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { * @param modalness [0, 1] 0 being in context with other tasks, 1 being shown on its own. */ public void setModalness(float modalness) { + if (mModalness == modalness) { + return; + } mModalness = modalness; mIconView.setAlpha(comp(modalness)); if (mContextualChip != null) { @@ -298,7 +301,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { if (mContextualChipWrapper != null) { mContextualChipWrapper.setAlpha(comp(modalness)); } - updateFooterVerticalOffset(mFooterVerticalOffset); }