diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index d39dfda930..fb0cd17d27 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -54,6 +54,7 @@ import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.RemoteFadeOutAnimationListener; import com.android.quickstep.util.ShelfPeekAnim; import com.android.quickstep.views.RecentsView; +import com.android.systemui.shared.system.ActivityManagerWrapper; import java.util.stream.Stream; @@ -157,6 +158,12 @@ public abstract class BaseQuickstepLauncher extends Launcher RecentsModel.INSTANCE.get(this).onTrimMemory(level); } + @Override + protected void onUiChangedWhileSleeping() { + // Remove the snapshot because the content view may have obvious changes. + ActivityManagerWrapper.getInstance().invalidateHomeTaskSnapshot(this); + } + @Override public void startIntentSenderForResult(IntentSender intent, int requestCode, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3e1032319a..20ebc7a27d 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -924,6 +924,9 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, @Override protected void onStop() { + final boolean wasActive = isUserActive(); + final LauncherState origState = getStateManager().getState(); + final int origDragLayerChildCount = mDragLayer.getChildCount(); super.onStop(); if (mDeferOverlayCallbacks) { @@ -941,6 +944,20 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, // Workaround for b/78520668, explicitly trim memory once UI is hidden onTrimMemory(TRIM_MEMORY_UI_HIDDEN); + + if (wasActive) { + // The expected condition is that this activity is stopped because the device goes to + // sleep and the UI may have noticeable changes. + mDragLayer.post(() -> { + if ((!getStateManager().isInStableState(origState) + // The drag layer may be animating (e.g. dismissing QSB). + || mDragLayer.getAlpha() < 1 + // Maybe an ArrowPopup is closed. + || mDragLayer.getChildCount() != origDragLayerChildCount)) { + onUiChangedWhileSleeping(); + } + }); + } } @Override @@ -1336,11 +1353,16 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, // Reset AllApps to its initial state only if we are not in the middle of // processing a multi-step drop if (mPendingRequestArgs == null) { + if (!isInState(NORMAL)) { + onUiChangedWhileSleeping(); + } mStateManager.goToState(NORMAL); } } }; + protected void onUiChangedWhileSleeping() { } + private void updateNotificationDots(Predicate updatedDots) { mWorkspace.updateNotificationDots(updatedDots); mAppsView.getAppsStore().updateNotificationDots(updatedDots); diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 195e69bf67..9f25729602 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -163,6 +163,15 @@ public class LauncherStateManager { return !mLauncher.isForceInvisible() && mLauncher.isStarted(); } + /** + * @return {@code true} if the state matches the current state and there is no active + * transition to different state. + */ + public boolean isInStableState(LauncherState state) { + return mState == state && mCurrentStableState == state + && (mConfig.mTargetState == null || mConfig.mTargetState == state); + } + /** * @see #goToState(LauncherState, boolean, Runnable) */