From c1b5ff048192363e9db492f2e81df77e05c1fa14 Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Mon, 18 Apr 2022 13:07:54 -0400 Subject: [PATCH] Invalidate home task snapshot onWakeAndUnlock. Also, add ability to pass in null to invalidateHomeTaskSnapshot if the correct permissions are held, so that System UI does not need to IPC to Launcher to ask it to invalidate itself. Fixes: 229191103 Test: atest SystemUITests Test: wake and unlock, note no double launcher Change-Id: I0c547639979460b3a85b0ef0a8bbf760d60054cb --- core/java/android/app/ActivityClient.java | 8 ++++++- .../shared/system/ActivityManagerWrapper.java | 9 ++++++-- .../keyguard/KeyguardViewMediator.java | 8 +++++++ .../server/wm/ActivityClientController.java | 21 ++++++++++++++++++- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/ActivityClient.java b/core/java/android/app/ActivityClient.java index 7b7b1efdb86b8..668dc6b8ec63f 100644 --- a/core/java/android/app/ActivityClient.java +++ b/core/java/android/app/ActivityClient.java @@ -454,7 +454,13 @@ public class ActivityClient { } } - /** Removes the snapshot of home task. */ + /** + * Removes the outdated snapshot of the home task. + * + * @param homeToken The token of the home task, or null if you have the + * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS} permission and + * want us to find the home task token for you. + */ public void invalidateHomeTaskSnapshot(IBinder homeToken) { try { getActivityClientController().invalidateHomeTaskSnapshot(homeToken); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index 461c2dc2c2af6..be3dfdcf05d5e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -23,6 +23,7 @@ import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; import static android.app.ActivityTaskManager.getService; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityClient; import android.app.ActivityManager; @@ -154,11 +155,15 @@ public class ActivityManagerWrapper { /** * Removes the outdated snapshot of home task. + * + * @param homeActivity The home task activity, or null if you have the + * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS} permission and + * want us to find the home task for you. */ - public void invalidateHomeTaskSnapshot(final Activity homeActivity) { + public void invalidateHomeTaskSnapshot(@Nullable final Activity homeActivity) { try { ActivityClient.getInstance().invalidateHomeTaskSnapshot( - homeActivity.getActivityToken()); + homeActivity == null ? null : homeActivity.getActivityToken()); } catch (Throwable e) { Log.w(TAG, "Failed to invalidate home snapshot", e); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index a5618568d6c73..17f7cb17b5a76 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -119,6 +119,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.dagger.KeyguardModule; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationShadeDepthController; @@ -2780,6 +2781,13 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, public void onWakeAndUnlocking() { Trace.beginSection("KeyguardViewMediator#onWakeAndUnlocking"); mWakeAndUnlocking = true; + + // We're going to animate in the Launcher, so ask WM to clear the task snapshot so we don't + // initially display an old snapshot with all of the icons visible. We're System UI, so + // we're allowed to pass in null to ask WM to find the home activity for us to prevent + // needing to IPC to Launcher. + ActivityManagerWrapper.getInstance().invalidateHomeTaskSnapshot(null /* homeActivity */); + keyguardDone(); Trace.endSection(); } diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index 5fdcd690b5e25..4822ddbc0ebb6 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -1190,10 +1190,29 @@ class ActivityClientController extends IActivityClientController.Stub { } } + /** + * Removes the outdated home task snapshot. + * + * @param token The token of the home task, or null if you have the + * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS} + * permission and want us to find the home task token for you. + */ @Override public void invalidateHomeTaskSnapshot(IBinder token) { + if (token == null) { + ActivityTaskManagerService.enforceTaskPermission("invalidateHomeTaskSnapshot"); + } + synchronized (mGlobalLock) { - final ActivityRecord r = ActivityRecord.isInRootTaskLocked(token); + final ActivityRecord r; + if (token == null) { + final Task rootTask = + mService.mRootWindowContainer.getDefaultTaskDisplayArea().getRootHomeTask(); + r = rootTask != null ? rootTask.topRunningActivity() : null; + } else { + r = ActivityRecord.isInRootTaskLocked(token); + } + if (r != null && r.isActivityTypeHome()) { mService.mWindowManager.mTaskSnapshotController.removeSnapshotCache( r.getTask().mTaskId);