From e2bdd1568cf19fb49e5b7d8e2b21773d486b1603 Mon Sep 17 00:00:00 2001 From: Schneider Victor-tulias Date: Mon, 3 Jun 2024 15:49:52 -0400 Subject: [PATCH] Finish the running recents animation when the user locks their device mid-animation. Flag: NONE bug fix Fixes: 319022192 Test: locked device during home animation and checked temp logs Change-Id: I884694a4318348259b04c3b6073d3ea37eff98fb --- .../taskbar/TaskbarKeyguardController.java | 19 +----- .../TaskbarLauncherStateController.java | 5 +- .../taskbar/TaskbarStashController.java | 8 +-- .../quickstep/TaskAnimationManager.java | 62 +++++++++++++++---- .../quickstep/TouchInteractionService.java | 13 +--- .../quickstep/util/SystemUiFlagUtils.kt | 53 ++++++++++++++++ 6 files changed, 111 insertions(+), 49 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/SystemUiFlagUtils.kt diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java index eac4eaa130..911140aa2d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java @@ -5,9 +5,6 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; 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 static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK; @@ -16,6 +13,7 @@ import static com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_A import android.app.KeyguardManager; import com.android.launcher3.AbstractFloatingView; +import com.android.quickstep.util.SystemUiFlagUtils; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; @@ -26,19 +24,6 @@ import java.io.PrintWriter; */ public class TaskbarKeyguardController implements TaskbarControllers.LoggableTaskbarController { - private static final long KEYGUARD_SYSUI_FLAGS = SYSUI_STATE_BOUNCER_SHOWING - | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING | SYSUI_STATE_DEVICE_DOZING - | SYSUI_STATE_OVERVIEW_DISABLED | SYSUI_STATE_HOME_DISABLED - | SYSUI_STATE_BACK_DISABLED | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED - | SYSUI_STATE_WAKEFULNESS_MASK; - - // If any of these SysUi flags (via QuickstepContract) is set, the device to be considered - // locked. - public static final long MASK_ANY_SYSUI_LOCKED = SYSUI_STATE_BOUNCER_SHOWING - | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING - | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED - | SYSUI_STATE_DEVICE_DREAMING; - private final TaskbarActivityContext mContext; private long mKeyguardSysuiFlags; private boolean mBouncerShowing; @@ -55,7 +40,7 @@ public class TaskbarKeyguardController implements TaskbarControllers.LoggableTas } public void updateStateForSysuiFlags(@SystemUiStateFlags long systemUiStateFlags) { - long interestingKeyguardFlags = systemUiStateFlags & KEYGUARD_SYSUI_FLAGS; + long interestingKeyguardFlags = systemUiStateFlags & SystemUiFlagUtils.KEYGUARD_SYSUI_FLAGS; if (interestingKeyguardFlags == mKeyguardSysuiFlags) { // No change in keyguard relevant flags return; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index ead1a8a441..cb9f24ae80 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -16,7 +16,6 @@ package com.android.launcher3.taskbar; import static com.android.app.animation.Interpolators.EMPHASIZED; -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_OVERVIEW; import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE; @@ -51,6 +50,7 @@ import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.MultiPropertyFactory.MultiProperty; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationController; +import com.android.quickstep.util.SystemUiFlagUtils; import com.android.quickstep.views.RecentsView; import com.android.systemui.animation.ViewRootSync; import com.android.systemui.shared.recents.model.ThumbnailData; @@ -343,8 +343,7 @@ public class TaskbarLauncherStateController { prevIsAwake && hasAnyFlag(FLAGS_LAUNCHER_ACTIVE)); } - boolean isDeviceLocked = hasAnyFlag(systemUiStateFlags, MASK_ANY_SYSUI_LOCKED); - updateStateForFlag(FLAG_DEVICE_LOCKED, isDeviceLocked); + updateStateForFlag(FLAG_DEVICE_LOCKED, SystemUiFlagUtils.isLocked(systemUiStateFlags)); // Taskbar is hidden whenever the device is dreaming. The dreaming state includes the // interactive dreams, AoD, screen off. Since the SYSUI_STATE_DEVICE_DREAMING only kicks in diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 74d2d60014..a54a349147 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -25,7 +25,6 @@ import static com.android.internal.jank.InteractionJankMonitor.Configuration; import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION; 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.Executors.UI_HELPER_EXECUTOR; import static com.android.launcher3.util.FlagDebugUtils.appendFlag; import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange; @@ -35,7 +34,6 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_I 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_VISIBLE; 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_GOING_AWAY; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -66,6 +64,7 @@ import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.MultiPropertyFactory.MultiProperty; import com.android.quickstep.LauncherActivityInterface; import com.android.quickstep.SystemUiProxy; +import com.android.quickstep.util.SystemUiFlagUtils; import java.io.PrintWriter; import java.lang.annotation.Retention; @@ -942,9 +941,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba && DisplayController.isTransientTaskbar(mActivity); updateStateForFlag(FLAG_STASHED_SYSUI, hasAnyFlag(systemUiStateFlags, SYSUI_STATE_SCREEN_PINNING) || stashForBubbles); - boolean isLocked = hasAnyFlag(systemUiStateFlags, MASK_ANY_SYSUI_LOCKED) - && !hasAnyFlag(systemUiStateFlags, SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY); - updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, isLocked); + updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, + SystemUiFlagUtils.isLocked(systemUiStateFlags)); mIsImeShowing = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_IME_SHOWING); mIsImeSwitcherShowing = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_IME_SWITCHER_SHOWING); diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 2348f28c62..28fa81a4f5 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -26,6 +26,8 @@ import static com.android.quickstep.GestureState.STATE_END_TARGET_ANIMATION_FINI import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_INITIALIZED; import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_STARTED; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION; +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 android.app.ActivityManager; import android.app.ActivityOptions; @@ -44,9 +46,11 @@ import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.DisplayController; import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.SystemUiFlagUtils; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -373,20 +377,54 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn return mCallbacks; } - public void endLiveTile() { - if (mLastGestureState == null) { - return; - } - BaseContainerInterface containerInterface = mLastGestureState.getContainerInterface(); - if (containerInterface.isInLiveTileMode() - && containerInterface.getCreatedContainer() != null) { - RecentsView recentsView = containerInterface.getCreatedContainer().getOverviewPanel(); - if (recentsView != null) { - recentsView.switchToScreenshot(null, - () -> recentsView.finishRecentsAnimation(true /* toRecents */, - false /* shouldPip */, null)); + public void onSystemUiFlagsChanged(@QuickStepContract.SystemUiStateFlags long lastSysUIFlags, + @QuickStepContract.SystemUiStateFlags long newSysUIFlags) { + long isShadeExpandedFlagMask = + SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED | SYSUI_STATE_QUICK_SETTINGS_EXPANDED; + boolean wasExpanded = hasAnyFlag(lastSysUIFlags, isShadeExpandedFlagMask); + boolean isExpanded = hasAnyFlag(newSysUIFlags, isShadeExpandedFlagMask); + if (wasExpanded != isExpanded && isExpanded) { + // End live tile when expanding the notification panel for the first time from + // overview. + if (endLiveTile()) { + return; } } + + boolean wasLocked = SystemUiFlagUtils.isLocked(lastSysUIFlags); + boolean isLocked = SystemUiFlagUtils.isLocked(newSysUIFlags); + if (wasLocked != isLocked && isLocked) { + // Finish the running recents animation when locking the device. + finishRunningRecentsAnimation( + mController != null && mController.getFinishTargetIsLauncher()); + } + } + + private boolean hasAnyFlag(long flags, long flagMask) { + return (flags & flagMask) != 0; + } + + /** + * Switches the {@link RecentsView} to screenshot if in live tile mode. + * + * @return true iff the {@link RecentsView} was in live tile mode and was switched to screenshot + */ + public boolean endLiveTile() { + if (mLastGestureState == null) { + return false; + } + BaseContainerInterface containerInterface = mLastGestureState.getContainerInterface(); + if (!containerInterface.isInLiveTileMode() + || containerInterface.getCreatedContainer() == null) { + return false; + } + RecentsView recentsView = containerInterface.getCreatedContainer().getOverviewPanel(); + if (recentsView == null) { + return false; + } + recentsView.switchToScreenshot(null, () -> recentsView.finishRecentsAnimation( + true /* toRecents */, false /* shouldPip */, null)); + return true; } public void setLiveTileCleanUpHandler(Runnable cleanUpHandler) { diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 4599f180b1..d79242a89d 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -47,8 +47,6 @@ import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SY import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER; -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.wm.shell.Flags.enableBubblesLongPressNavHandle; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_BACK_ANIMATION; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_BUBBLES; @@ -643,16 +641,7 @@ public class TouchInteractionService extends Service { SystemUiProxy.INSTANCE.get(this).setLastSystemUiStateFlags(systemUiStateFlags); mOverviewComponentObserver.onSystemUiStateChanged(); mTaskbarManager.onSystemUiFlagsChanged(systemUiStateFlags); - - long isShadeExpandedFlag = - SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED | SYSUI_STATE_QUICK_SETTINGS_EXPANDED; - boolean wasExpanded = (lastSysUIFlags & isShadeExpandedFlag) != 0; - boolean isExpanded = (systemUiStateFlags & isShadeExpandedFlag) != 0; - if (wasExpanded != isExpanded && isExpanded) { - // End live tile when expanding the notification panel for the first time from - // overview. - mTaskAnimationManager.endLiveTile(); - } + mTaskAnimationManager.onSystemUiFlagsChanged(lastSysUIFlags, systemUiStateFlags); } } diff --git a/quickstep/src/com/android/quickstep/util/SystemUiFlagUtils.kt b/quickstep/src/com/android/quickstep/util/SystemUiFlagUtils.kt new file mode 100644 index 0000000000..5f4388c918 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/SystemUiFlagUtils.kt @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util + +import com.android.systemui.shared.system.QuickStepContract +import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags + +/** Util class for holding and checking [SystemUiStateFlags] masks. */ +object SystemUiFlagUtils { + const val KEYGUARD_SYSUI_FLAGS = + (QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING or + QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING or + QuickStepContract.SYSUI_STATE_DEVICE_DOZING or + QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED or + QuickStepContract.SYSUI_STATE_HOME_DISABLED or + QuickStepContract.SYSUI_STATE_BACK_DISABLED or + QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED or + QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK) + + // If any of these SysUi flags (via QuickstepContract) is set, the device to be considered + // locked. + private const val MASK_ANY_SYSUI_LOCKED = + (QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING or + QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING or + QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED or + QuickStepContract.SYSUI_STATE_DEVICE_DREAMING) + + /** + * Returns true iff the given [SystemUiStateFlags] imply that the device is considered locked. + */ + @JvmStatic + fun isLocked(@SystemUiStateFlags flags: Long): Boolean { + return hasAnyFlag(flags, MASK_ANY_SYSUI_LOCKED) && + !hasAnyFlag(flags, QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY) + } + + private fun hasAnyFlag(@SystemUiStateFlags flags: Long, flagMask: Long): Boolean { + return (flags and flagMask) != 0L + } +}