From da6af4048d82412b9edfca9514415703a72db6d8 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Wed, 23 Mar 2022 15:41:30 -0700 Subject: [PATCH] Hook up shell-transitions screenshotting for recents shell-transitions doesn't use IRecentsAnimationController, so instead add a companion takeTaskSnapshot to ATMS and use that in the RecentsAnimation adapter. Bug: 226446305 Test: go to recents, start select-mode on live tile Change-Id: I35a1e7be02a01767802eca02b6ba045a7c8309b0 --- .../android/app/IActivityTaskManager.aidl | 6 +++ .../shared/system/RemoteTransitionCompat.java | 12 +++++- .../server/wm/ActivityTaskManagerService.java | 43 +++++++++++++------ .../core/java/com/android/server/wm/Task.java | 11 ----- 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index ef9a2f2733485..ac6eb7e40ee49 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -279,6 +279,12 @@ interface IActivityTaskManager { */ android.window.TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution); + /** + * @param taskId the id of the task to take a snapshot of + * @return a graphic buffer representing a screenshot of a task + */ + android.window.TaskSnapshot takeTaskSnapshot(int taskId); + /** * Return the user id of last resumed activity. */ diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java index b61827a0212c4..3e988fd29c7b1 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java @@ -46,6 +46,7 @@ import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; import android.window.PictureInPictureSurfaceTransaction; import android.window.RemoteTransition; +import android.window.TaskSnapshot; import android.window.TransitionFilter; import android.window.TransitionInfo; import android.window.WindowContainerToken; @@ -299,7 +300,16 @@ public class RemoteTransitionCompat implements Parcelable { } @Override public ThumbnailData screenshotTask(int taskId) { - return mWrapped != null ? mWrapped.screenshotTask(taskId) : null; + try { + final TaskSnapshot snapshot = + ActivityTaskManager.getService().takeTaskSnapshot(taskId); + if (snapshot != null) { + return new ThumbnailData(snapshot); + } + } catch (RemoteException e) { + Log.e(TAG, "Failed to screenshot task", e); + } + return null; } @Override public void setInputConsumerEnabled(boolean enabled) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index ad6f354520511..6d709469a777c 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3652,25 +3652,41 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mAmInternal.enforceCallingPermission(READ_FRAME_BUFFER, "getTaskSnapshot()"); final long ident = Binder.clearCallingIdentity(); try { - return getTaskSnapshot(taskId, isLowResolution, true /* restoreFromDisk */); + final Task task; + synchronized (mGlobalLock) { + task = mRootWindowContainer.anyTaskForId(taskId, + MATCH_ATTACHED_TASK_OR_RECENT_TASKS); + if (task == null) { + Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found"); + return null; + } + } + // 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); } finally { Binder.restoreCallingIdentity(ident); } } - private TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution, - boolean restoreFromDisk) { - final Task task; - synchronized (mGlobalLock) { - task = mRootWindowContainer.anyTaskForId(taskId, - MATCH_ATTACHED_TASK_OR_RECENT_TASKS); - if (task == null) { - Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found"); - return null; + @Override + public TaskSnapshot takeTaskSnapshot(int taskId) { + mAmInternal.enforceCallingPermission(READ_FRAME_BUFFER, "takeTaskSnapshot()"); + final long ident = Binder.clearCallingIdentity(); + try { + synchronized (mGlobalLock) { + final Task task = mRootWindowContainer.anyTaskForId(taskId, + MATCH_ATTACHED_TASK_OR_RECENT_TASKS); + if (task == null || !task.isVisible()) { + Slog.w(TAG, "takeTaskSnapshot: taskId=" + taskId + " not found or not visible"); + return null; + } + return mWindowManager.mTaskSnapshotController.captureTaskSnapshot( + task, false /* snapshotHome */); } + } finally { + Binder.restoreCallingIdentity(ident); } - // Don't call this while holding the lock as this operation might hit the disk. - return task.getSnapshot(isLowResolution, restoreFromDisk); } /** Return the user id of the last resumed activity. */ @@ -6621,8 +6637,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public TaskSnapshot getTaskSnapshotBlocking( int taskId, boolean isLowResolution) { - return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution, - true /* restoreFromDisk */); + return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution); } @Override diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index f3cefca10b065..aac3bc334d8a3 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -968,17 +968,6 @@ class Task extends TaskFragment { || targetWindowingMode == WINDOWING_MODE_FREEFORM; } - /** - * DO NOT HOLD THE ACTIVITY MANAGER LOCK WHEN CALLING THIS METHOD! - */ - TaskSnapshot getSnapshot(boolean isLowResolution, boolean restoreFromDisk) { - - // TODO: Move this to {@link TaskWindowContainerController} once recent tasks are more - // synchronized between AM and WM. - return mAtmService.mWindowManager.getTaskSnapshot(mTaskId, mUserId, isLowResolution, - restoreFromDisk); - } - void touchActiveTime() { lastActiveTime = SystemClock.elapsedRealtime(); }