diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index a9ce61ab8b..486609d16d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -100,7 +100,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { onLauncherResumedOrPaused(mLauncher.hasBeenResumed(), true /* fromInit */); onStashedInAppChanged(mLauncher.getDeviceProfile()); - mTaskbarLauncherStateController.onChangeScreenState( + mTaskbarLauncherStateController.updateStateForSysuiFlags( mControllers.getSharedState().sysuiStateFlags, true /* fromInit */); mLauncher.addOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener); } @@ -319,8 +319,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController { } @Override - public void onChangeScreenState(int screenState) { - mTaskbarLauncherStateController.onChangeScreenState(screenState, false /* fromInit */); + public void updateStateForSysuiFlags(int sysuiFlags, boolean skipAnim) { + mTaskbarLauncherStateController.updateStateForSysuiFlags(sysuiFlags, skipAnim); } @Override diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 60411921fe..79f0a64c4e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -32,7 +32,6 @@ import static com.android.launcher3.taskbar.TaskbarManager.FLAG_HIDE_NAVBAR_WIND import static com.android.launcher3.testing.shared.ResourceUtils.getBoolByName; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_STATE_MASK; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING; import android.animation.AnimatorSet; @@ -592,8 +591,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mControllers.voiceInteractionWindowController.setIsVoiceInteractionWindowVisible( (systemUiStateFlags & SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING) != 0, fromInit); - mControllers.uiController.onChangeScreenState( - systemUiStateFlags & SYSUI_STATE_SCREEN_STATE_MASK); + mControllers.uiController.updateStateForSysuiFlags(systemUiStateFlags, fromInit); } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java index 4e390f106e..8cc8965d53 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java @@ -30,6 +30,12 @@ public class TaskbarKeyguardController implements TaskbarControllers.LoggableTas | SYSUI_STATE_BACK_DISABLED | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED | SYSUI_STATE_SCREEN_STATE_MASK; + // If any of these SysUi flags (via QuickstepContract) is set, the device to be considered + // locked. + public static final int MASK_ANY_SYSUI_LOCKED = SYSUI_STATE_BOUNCER_SHOWING + | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING + | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED; + private final TaskbarActivityContext mContext; private int mKeyguardSysuiFlags; private boolean mBouncerShowing; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index 93a0c11316..a6c38dab87 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.taskbar; +import static com.android.launcher3.taskbar.TaskbarKeyguardController.MASK_ANY_SYSUI_LOCKED; import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP; import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE; import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_HOME; @@ -92,6 +93,9 @@ public class TaskbarLauncherStateController { */ private static final int FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF = 1 << 4; + /** Whether the device is currently locked. */ + private static final int FLAG_DEVICE_LOCKED = 1 << 5; + private static final int FLAGS_LAUNCHER_ACTIVE = FLAG_RESUMED | FLAG_TRANSITION_TO_RESUMED; /** Equivalent to an int with all 1s for binary operation purposes */ private static final int FLAGS_ALL = ~0; @@ -259,18 +263,23 @@ public class TaskbarLauncherStateController { mShouldDelayLauncherStateAnim = shouldDelayLauncherStateAnim; } - /** Screen state changed, see QuickStepContract.SCREEN_STATE_* values. */ - public void onChangeScreenState(int screenState, boolean fromInit) { + /** SysUI flags updated, see QuickStepContract.SYSUI_STATE_* values. */ + public void updateStateForSysuiFlags(int systemUiStateFlags, boolean skipAnim) { final boolean prevScreenIsOn = hasAnyFlag(FLAG_SCREEN_ON); - final boolean currScreenIsOn = hasAnyFlag(screenState, SYSUI_STATE_SCREEN_ON); - - if (prevScreenIsOn == currScreenIsOn) return; + final boolean currScreenIsOn = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_SCREEN_ON); updateStateForFlag(FLAG_SCREEN_ON, currScreenIsOn); - updateStateForFlag(FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF, - prevScreenIsOn && hasAnyFlag(FLAGS_LAUNCHER_ACTIVE)); + if (prevScreenIsOn != currScreenIsOn) { + // The screen is switching between on/off. When turning off, capture whether the + // launcher is active and memoize this state. + updateStateForFlag(FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF, + prevScreenIsOn && hasAnyFlag(FLAGS_LAUNCHER_ACTIVE)); + } - if (fromInit) { + boolean isDeviceLocked = hasAnyFlag(systemUiStateFlags, MASK_ANY_SYSUI_LOCKED); + updateStateForFlag(FLAG_DEVICE_LOCKED, isDeviceLocked); + + if (skipAnim) { applyState(0); } else { applyState(); @@ -448,7 +457,13 @@ public class TaskbarLauncherStateController { animatorSet.play(mTaskbarCornerRoundness.animateToValue(cornerRoundness)); } - if (mIconAlignment.isAnimatingToValue(toAlignment) + if (hasAnyFlag(changedFlags, FLAG_DEVICE_LOCKED)) { + // When transitioning between locked/unlocked, there is no stashing animation. + mIconAlignment.cancelAnimation(); + // updateValue ensures onIconAlignmentRatioChanged will be called if there is an actual + // change in value + mIconAlignment.updateValue(toAlignment); + } else if (mIconAlignment.isAnimatingToValue(toAlignment) || mIconAlignment.isSettledOnValue(toAlignment)) { // Already at desired value, but make sure we run the callback at the end. animatorSet.addListener(AnimatorListeners.forEndCallback( @@ -656,6 +671,7 @@ public class TaskbarLauncherStateController { appendFlag(result, flags, FLAG_SCREEN_ON, "screen_on"); appendFlag(result, flags, FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF, "launcher_active_at_screen_off"); + appendFlag(result, flags, FLAG_DEVICE_LOCKED, "device_locked"); return result.toString(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index b613763fa2..d26fbc4459 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -27,16 +27,14 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_LONGPRESS_SHOW; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TRANSIENT_TASKBAR_HIDE; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TRANSIENT_TASKBAR_SHOW; +import static com.android.launcher3.taskbar.TaskbarKeyguardController.MASK_ANY_SYSUI_LOCKED; import static com.android.launcher3.util.FlagDebugUtils.appendFlag; import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -89,7 +87,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba public static final int FLAG_IN_SETUP = 1 << 7; // In the Setup Wizard public static final int FLAG_STASHED_SMALL_SCREEN = 1 << 8; // phone screen gesture nav, stashed public static final int FLAG_STASHED_IN_APP_AUTO = 1 << 9; // Autohide (transient taskbar). - public static final int FLAG_STASHED_SYSUI = 1 << 10; // app pinning, keyguard, etc. + public static final int FLAG_STASHED_SYSUI = 1 << 10; // app pinning,... + public static final int FLAG_STASHED_DEVICE_LOCKED = 1 << 11; // device is locked: keyguard, ... // If any of these flags are enabled, isInApp should return true. private static final int FLAGS_IN_APP = FLAG_IN_APP | FLAG_IN_SETUP; @@ -110,6 +109,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba private static final int FLAGS_REPORT_STASHED_INSETS_TO_APP = FLAGS_STASHED_IN_APP & ~FLAG_STASHED_IN_APP_IME & ~FLAG_STASHED_IN_TASKBAR_ALL_APPS; + // If any of these flags are enabled, the taskbar must be stashed. + private static final int FLAGS_FORCE_STASHED = FLAG_STASHED_SYSUI | FLAG_STASHED_DEVICE_LOCKED + | FLAG_STASHED_IN_TASKBAR_ALL_APPS | FLAG_STASHED_SMALL_SCREEN; + /** * How long to stash/unstash when manually invoked via long press. * @@ -219,10 +222,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba boolean inApp = hasAnyFlag(flags, FLAGS_IN_APP); boolean stashedInApp = hasAnyFlag(flags, FLAGS_STASHED_IN_APP); boolean stashedLauncherState = hasAnyFlag(flags, FLAG_IN_STASHED_LAUNCHER_STATE); - boolean forceStashed = hasAnyFlag(flags, - FLAG_STASHED_SYSUI - | FLAG_STASHED_IN_TASKBAR_ALL_APPS - | FLAG_STASHED_SMALL_SCREEN); + boolean forceStashed = hasAnyFlag(flags, FLAGS_FORCE_STASHED); return (inApp && stashedInApp) || (!inApp && stashedLauncherState) || forceStashed; }); @@ -584,8 +584,12 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba // If Hotseat is not the top element during animation to/from Launcher, fade in/out a // already stashed Taskbar. - boolean skipStashAnimation = !mControllers.uiController.isHotseatIconOnTopWhenAligned() - && hasAnyFlag(changedFlags, FLAG_IN_APP); + boolean hotseatTopElement = mControllers.uiController.isHotseatIconOnTopWhenAligned() + || !hasAnyFlag(changedFlags, FLAG_IN_APP); + // If transitioning between locked/unlocked device, do not play a stash animation. + boolean unLockedTransition = hasAnyFlag(changedFlags, FLAG_STASHED_DEVICE_LOCKED); + boolean skipStashAnimation = !hotseatTopElement || unLockedTransition; + if (isTransientTaskbar) { createTransientAnimToIsStashed(mAnimator, isStashed, duration, animateBg, changedFlags, skipStashAnimation); @@ -905,11 +909,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba updateStateForFlag(FLAG_STASHED_IN_APP_SYSUI, hasAnyFlag(systemUiStateFlags, SYSUI_STATE_QUICK_SETTINGS_EXPANDED | SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED)); - updateStateForFlag(FLAG_STASHED_SYSUI, hasAnyFlag(systemUiStateFlags, - SYSUI_STATE_SCREEN_PINNING - | SYSUI_STATE_BOUNCER_SHOWING - | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING - | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED)); + updateStateForFlag(FLAG_STASHED_SYSUI, + hasAnyFlag(systemUiStateFlags, SYSUI_STATE_SCREEN_PINNING)); + updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, + hasAnyFlag(systemUiStateFlags, MASK_ANY_SYSUI_LOCKED)); // Only update FLAG_STASHED_IN_APP_IME when system gesture is not in progress. mIsImeShowing = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_IME_SHOWING); @@ -1081,6 +1084,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba appendFlag(sj, flags, FLAG_IN_SETUP, "FLAG_IN_SETUP"); appendFlag(sj, flags, FLAG_STASHED_IN_APP_AUTO, "FLAG_STASHED_IN_APP_AUTO"); appendFlag(sj, flags, FLAG_STASHED_SYSUI, "FLAG_STASHED_SYSUI"); + appendFlag(sj, flags, FLAG_STASHED_DEVICE_LOCKED, "FLAG_STASHED_DEVICE_LOCKED"); return sj.toString(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index 8046cd6a48..b9242b234a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -125,9 +125,9 @@ public class TaskbarUIController { } /** - * Screen state changed, see QuickStepContract.SCREEN_STATE_* values. + * SysUI flags updated, see QuickStepContract.SYSUI_STATE_* values. */ - public void onChangeScreenState(int screenState){ + public void updateStateForSysuiFlags(int sysuiFlags, boolean skipAnim){ } /**