diff options
| author | 2022-06-27 19:45:26 +0800 | |
|---|---|---|
| committer | 2022-06-29 15:58:01 +0800 | |
| commit | 8b1aed024776be39daacf65471cc82b5e84c8e88 (patch) | |
| tree | 6f6f922d62a889c2342b19d28bc5316d40def0c7 | |
| parent | a41398efa760d3b525977c09a2ef653ce2052ac1 (diff) | |
Take the snapshot if the thumbnail cache returns empty.
To avoid Recents thumbnail being empty, a snapshot is triggered if no
cache exists.
Bug: 191272693
Test: manually test with Exo (Host apps on virtual display.) to check if
the Recents displays non-empty thumbnail.
Change-Id: I2a898d5127e18e6209ff236d3a72aa22c2a0ca82
5 files changed, 20 insertions, 9 deletions
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index fe75dd302beb..dc6825c85705 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -263,9 +263,12 @@ interface IActivityTaskManager { * @param taskId the id of the task to retrieve the sAutoapshots for * @param isLowResolution if set, if the snapshot needs to be loaded from disk, this will load * a reduced resolution of it, which is much faster + * @param takeSnapshotIfNeeded if set, call {@link #takeTaskSnapshot} to trigger the snapshot + if no cache exists. * @return a graphic buffer representing a screenshot of a task */ - android.window.TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution); + android.window.TaskSnapshot getTaskSnapshot( + int taskId, boolean isLowResolution, boolean takeSnapshotIfNeeded); /** * @param taskId the id of the task to take a snapshot of diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java index dc60bcf742ce..29434f73e84b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java @@ -116,7 +116,7 @@ public class PipUtils { if (taskId <= 0) return null; try { return ActivityTaskManager.getService().getTaskSnapshot( - taskId, isLowResolution); + taskId, isLowResolution, false /* takeSnapshotIfNeeded */); } catch (RemoteException e) { Log.e(TAG, "Failed to get task snapshot, taskId=" + taskId, e); return null; 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 be3dfdcf05d5..c5beaa7ee0b1 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 @@ -137,12 +137,14 @@ public class ActivityManagerWrapper { } /** - * @return the task snapshot for the given {@param taskId}. + * @return a {@link ThumbnailData} with {@link TaskSnapshot} for the given {@param taskId}. + * The snapshot will be triggered if no cached {@link TaskSnapshot} exists. */ public @NonNull ThumbnailData getTaskThumbnail(int taskId, boolean isLowResolution) { TaskSnapshot snapshot = null; try { - snapshot = getService().getTaskSnapshot(taskId, isLowResolution); + snapshot = getService().getTaskSnapshot(taskId, isLowResolution, + true /* takeSnapshotIfNeeded */); } catch (RemoteException e) { Log.w(TAG, "Failed to retrieve task snapshot", e); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7bc551b2aacc..5ae0f4722a20 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3668,7 +3668,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution) { + public TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution, + boolean takeSnapshotIfNeeded) { mAmInternal.enforceCallingPermission(READ_FRAME_BUFFER, "getTaskSnapshot()"); final long ident = Binder.clearCallingIdentity(); try { @@ -3682,8 +3683,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } // Don't call this while holding the lock as this operation might hit the disk. - return mWindowManager.mTaskSnapshotController.getSnapshot(taskId, task.mUserId, - true /* restoreFromDisk */, isLowResolution); + TaskSnapshot taskSnapshot = mWindowManager.mTaskSnapshotController.getSnapshot(taskId, + task.mUserId, true /* restoreFromDisk */, isLowResolution); + if (taskSnapshot == null && takeSnapshotIfNeeded) { + taskSnapshot = takeTaskSnapshot(taskId); + } + return taskSnapshot; } finally { Binder.restoreCallingIdentity(ident); } @@ -6656,7 +6661,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public TaskSnapshot getTaskSnapshotBlocking( int taskId, boolean isLowResolution) { - return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution); + return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution, + false /* takeSnapshotIfNeeded */); } @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 1708ed7d4686..83f375f85fa3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -1332,7 +1332,7 @@ public class RecentTasksTest extends WindowTestsBase { }); assertSecurityException(expectCallable, () -> mAtm.startActivityFromRecents(0, new Bundle())); - assertSecurityException(expectCallable, () -> mAtm.getTaskSnapshot(0, true)); + assertSecurityException(expectCallable, () -> mAtm.getTaskSnapshot(0, true, false)); assertSecurityException(expectCallable, () -> mAtm.registerTaskStackListener(null)); assertSecurityException(expectCallable, () -> mAtm.unregisterTaskStackListener(null)); |