diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 09dbeb6fb9..042bc9a8ab 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -36,6 +36,7 @@ import com.android.launcher3.Flags; import com.android.launcher3.LauncherState; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatedFloat; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.InstanceIdSequence; import com.android.launcher3.model.data.ItemInfo; @@ -68,14 +69,17 @@ public class LauncherTaskbarUIController extends TaskbarUIController { public static final int ALL_APPS_PAGE_PROGRESS_INDEX = 1; public static final int WIDGETS_PAGE_PROGRESS_INDEX = 2; public static final int SYSUI_SURFACE_PROGRESS_INDEX = 3; + public static final int LAUNCHER_PAUSE_PROGRESS_INDEX = 4; - public static final int DISPLAY_PROGRESS_COUNT = 4; + public static final int DISPLAY_PROGRESS_COUNT = 5; private final AnimatedFloat mTaskbarInAppDisplayProgress = new AnimatedFloat( this::onInAppDisplayProgressChanged); private final MultiPropertyFactory mTaskbarInAppDisplayProgressMultiProp = new MultiPropertyFactory<>(mTaskbarInAppDisplayProgress, AnimatedFloat.VALUE, DISPLAY_PROGRESS_COUNT, Float::max); + private final AnimatedFloat mLauncherPauseProgress = new AnimatedFloat( + this::launcherPauseProgressUpdate); private final QuickstepLauncher mLauncher; private final HomeVisibilityState mHomeState; @@ -190,6 +194,33 @@ public class LauncherTaskbarUIController extends TaskbarUIController { placeholderDuration)); } + /** + * Called when Launcher Activity is paused/resumed. + *

+ * To avoid UI clash between taskbar & bottom sheet, shift nav buttons down on launcher + * pause/resume at home. + * @param paused if launcher is currently paused. + */ + public void onLauncherPausedOrResumed(boolean paused) { + if (!FeatureFlags.enableHomeTransitionListener()) { + onLauncherVisibilityChanged(mLauncher.hasBeenResumed()); + return; + } + + // Animate navbar iff pause/resume from home, NOT to/from app (avoid overriding existing + // animations). + boolean launcherPauseOrResumeFromHome = mHomeState.isHomeVisible() && mControllers + .taskbarAutohideSuspendController.isSuspendedForTransientTaskbarInLauncher(); + if (launcherPauseOrResumeFromHome) { + mLauncherPauseProgress.animateToValue(paused ? 1.0f : 0.0f).start(); + } + } + + private void launcherPauseProgressUpdate() { + onTaskbarInAppDisplayProgressUpdate( + mLauncherPauseProgress.value, LAUNCHER_PAUSE_PROGRESS_INDEX); + } + /** * Should be called from onResume() and onPause(), and animates the Taskbar accordingly. */ @@ -364,18 +395,20 @@ public class LauncherTaskbarUIController extends TaskbarUIController { } if (mControllers.uiController.isIconAlignedWithHotseat() && !mTaskbarLauncherStateController.isAnimatingToLauncher()) { - // Only animate the nav buttons while home and not animating home, otherwise let + // Only animate nav button position while home and not animating home, otherwise let // the TaskbarViewController handle it. mControllers.navbarButtonsViewController - .getTaskbarNavButtonTranslationYForInAppDisplay() + .getNavButtonTranslationYForInAppDisplay() .updateValue(mLauncher.getDeviceProfile().getTaskbarOffsetY() * mTaskbarInAppDisplayProgress.value); - mControllers.navbarButtonsViewController - .getOnTaskbarBackgroundNavButtonColorOverride().updateValue(progress); + if (!mLauncher.isPaused()) { + mControllers.navbarButtonsViewController + .getOnTaskbarBackgroundNavButtonColorOverride().updateValue(progress); + } } } - /** Returns true iff any in-app display progress > 0. */ + @Override public boolean shouldUseInAppLayout() { return mTaskbarInAppDisplayProgress.value > 0; } diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 7d8e93ce00..cfcbd2f552 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -183,7 +183,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT private final AnimatedFloat mTaskbarNavButtonTranslationY = new AnimatedFloat( this::updateNavButtonTranslationY); - private final AnimatedFloat mTaskbarNavButtonTranslationYForInAppDisplay = new AnimatedFloat( + private final AnimatedFloat mNavButtonTranslationYForInAppDisplay = new AnimatedFloat( this::updateNavButtonTranslationY); private final AnimatedFloat mTaskbarNavButtonTranslationYForIme = new AnimatedFloat( this::updateNavButtonTranslationY); @@ -704,8 +704,8 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT } /** Use to set the translationY for the all nav+contextual buttons when in Launcher */ - public AnimatedFloat getTaskbarNavButtonTranslationYForInAppDisplay() { - return mTaskbarNavButtonTranslationYForInAppDisplay; + public AnimatedFloat getNavButtonTranslationYForInAppDisplay() { + return mNavButtonTranslationYForInAppDisplay; } /** Use to set the dark intensity for the all nav+contextual buttons */ @@ -751,20 +751,22 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT if (mContext.isPhoneButtonNavMode()) { return; } - final float normalTranslationY = mTaskbarNavButtonTranslationY.value; - final float imeAdjustmentTranslationY = mTaskbarNavButtonTranslationYForIme.value; - TaskbarUIController uiController = mControllers.uiController; - final float inAppDisplayAdjustmentTranslationY = - (uiController instanceof LauncherTaskbarUIController - && ((LauncherTaskbarUIController) uiController).shouldUseInAppLayout()) - ? mTaskbarNavButtonTranslationYForInAppDisplay.value : 0; - - mLastSetNavButtonTranslationY = normalTranslationY - + imeAdjustmentTranslationY - + inAppDisplayAdjustmentTranslationY; + mLastSetNavButtonTranslationY = calculateNavButtonTranslationY(); mNavButtonsView.setTranslationY(mLastSetNavButtonTranslationY); } + /** + * Calculates the translationY of the nav buttons based on the current device state. + */ + private float calculateNavButtonTranslationY() { + float translationY = + mTaskbarNavButtonTranslationY.value + mTaskbarNavButtonTranslationYForIme.value; + if (mControllers.uiController.shouldUseInAppLayout()) { + translationY += mNavButtonTranslationYForInAppDisplay.value; + } + return translationY; + } + /** * Sets Taskbar 3-button mode icon colors based on the * {@link #mTaskbarNavButtonDarkIntensity} value piped in from Framework. For certain cases @@ -1162,7 +1164,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT pw.println(prefix + "\t\tmTaskbarNavButtonTranslationY=" + mTaskbarNavButtonTranslationY.value); pw.println(prefix + "\t\tmTaskbarNavButtonTranslationYForInAppDisplay=" - + mTaskbarNavButtonTranslationYForInAppDisplay.value); + + mNavButtonTranslationYForInAppDisplay.value); pw.println(prefix + "\t\tmTaskbarNavButtonTranslationYForIme=" + mTaskbarNavButtonTranslationYForIme.value); pw.println(prefix + "\t\tmTaskbarNavButtonDarkIntensity=" diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index b80aaf8840..7030088287 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -90,6 +90,14 @@ public class TaskbarUIController implements BubbleBarController.BubbleBarLocatio protected void onStashedInAppChanged() { } + /** + * Whether the Taskbar should use in-app layout. + * @return {@code true} iff in-app display progress > 0 or Launcher Activity paused. + */ + public boolean shouldUseInAppLayout() { + return false; + } + /** * Called when taskbar icon layout bounds change. */ diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index bc61c72212..c4d9e5028a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -234,7 +234,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar mTaskbarNavButtonTranslationY = controllers.navbarButtonsViewController.getTaskbarNavButtonTranslationY(); mTaskbarNavButtonTranslationYForInAppDisplay = controllers.navbarButtonsViewController - .getTaskbarNavButtonTranslationYForInAppDisplay(); + .getNavButtonTranslationYForInAppDisplay(); mActivity.addOnDeviceProfileChangeListener(mDeviceProfileChangeListener); diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 39bf6ac814..ce4e9807e5 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -419,10 +419,8 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, mDepthController.setActivityStarted(isStarted()); } - if ((changeBits & ACTIVITY_STATE_RESUMED) != 0) { - if (!FeatureFlags.enableHomeTransitionListener() && mTaskbarUIController != null) { - mTaskbarUIController.onLauncherVisibilityChanged(hasBeenResumed()); - } + if ((changeBits & ACTIVITY_STATE_RESUMED) != 0 && mTaskbarUIController != null) { + mTaskbarUIController.onLauncherPausedOrResumed(isPaused()); } super.onActivityFlagsChanged(changeBits); diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index 2e7526192d..3774ae3afe 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -306,6 +306,10 @@ public abstract class BaseActivity extends Activity implements ActivityContext { removeActivityFlags(ACTIVITY_STATE_RESUMED | ACTIVITY_STATE_DEFERRED_RESUMED); } + public boolean isPaused() { + return !hasBeenResumed() && (mActivityFlags & ACTIVITY_STATE_DEFERRED_RESUMED) == 0; + } + /** * Sets the activity to appear as resumed. */