From 76d21d09d49809e15b59e4b4b1a9f976051b4d89 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 15 Dec 2020 00:48:25 +0800 Subject: [PATCH] Move requestPictureInPictureMode to internal There is no usage of ActivityTaskManager#requestPictureInPictureMode. Only keep the server side method for the reference from the implementation of other type device. Bug: 174041144 Bug: 174040691 Test: ActivityTaskManagerServiceTests Change-Id: Iac27a542f1ef693850336e31627bdb6629ee3d4e --- core/api/test-current.txt | 1 - .../java/android/app/ActivityTaskManager.java | 14 ----- .../android/app/IActivityTaskManager.aidl | 1 - .../server/wm/ActivityClientController.java | 35 +++++++++++ .../server/wm/ActivityTaskManagerService.java | 60 +------------------ .../wm/ActivityTaskManagerServiceTests.java | 8 +-- 6 files changed, 41 insertions(+), 78 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index ffe2736fe8c5d..d00dde0edaf36 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -141,7 +141,6 @@ package android.app { method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public boolean moveTopActivityToPinnedRootTask(int, @NonNull android.graphics.Rect); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void removeRootTasksInWindowingModes(@NonNull int[]); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void removeRootTasksWithActivityTypes(@NonNull int[]); - method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void requestPictureInPictureMode(@NonNull android.os.IBinder); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void resizePrimarySplitScreen(@NonNull android.graphics.Rect, @NonNull android.graphics.Rect); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void resizeTask(int, android.graphics.Rect); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public boolean setTaskWindowingMode(int, int, boolean) throws java.lang.SecurityException; diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java index 03c1a011f1987..2060252500182 100644 --- a/core/java/android/app/ActivityTaskManager.java +++ b/core/java/android/app/ActivityTaskManager.java @@ -418,20 +418,6 @@ public class ActivityTaskManager { } } - /** - * Requests that an activity should enter picture-in-picture mode if possible. - * @hide - */ - @TestApi - @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) - public void requestPictureInPictureMode(@NonNull IBinder token) { - try { - getService().requestPictureInPictureMode(token); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - /** * @return whether the UI mode of the given config supports error dialogs (ANR, crash, etc). * @hide diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index fabce459afccf..7bd6c974430f1 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -258,7 +258,6 @@ interface IActivityTaskManager { void suppressResizeConfigChanges(boolean suppress); boolean moveTopActivityToPinnedRootTask(int rootTaskId, in Rect bounds); - void requestPictureInPictureMode(in IBinder token); /** * Resizes the docked stack, and all other stacks as the result of the dock stack bounds change. diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index 85fcd3dbe501f..1387311b2395f 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -39,12 +39,15 @@ import static com.android.server.wm.ActivityTaskManagerService.enforceNotIsolate import static com.android.server.wm.Task.ActivityState.DESTROYED; import static com.android.server.wm.Task.ActivityState.DESTROYING; +import android.annotation.NonNull; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.IActivityClientController; import android.app.PictureInPictureParams; +import android.app.servertransaction.ClientTransaction; +import android.app.servertransaction.EnterPipRequestedItem; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -736,6 +739,38 @@ class ActivityClientController extends IActivityClientController.Stub { return r; } + /** + * Requests that an activity should enter picture-in-picture mode if possible. This method may + * be used by the implementation of non-phone form factors. + */ + void requestPictureInPictureMode(@NonNull ActivityRecord r) { + if (r.inPinnedWindowingMode()) { + throw new IllegalStateException("Activity is already in PIP mode"); + } + + final boolean canEnterPictureInPicture = r.checkEnterPictureInPictureState( + "requestPictureInPictureMode", /* beforeStopping */ false); + if (!canEnterPictureInPicture) { + throw new IllegalStateException( + "Requested PIP on an activity that doesn't support it"); + } + + if (r.pictureInPictureArgs.isAutoEnterEnabled()) { + mService.enterPictureInPictureMode(r, r.pictureInPictureArgs); + return; + } + + try { + final ClientTransaction transaction = ClientTransaction.obtain( + r.app.getThread(), r.token); + transaction.addCallback(EnterPipRequestedItem.obtain()); + mService.getLifecycleManager().scheduleTransaction(transaction); + } catch (Exception e) { + Slog.w(TAG, "Failed to send enter pip requested item: " + + r.intent.getComponent(), e); + } + } + @Override public void toggleFreeformWindowingMode(IBinder token) { final long ident = Binder.clearCallingIdentity(); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 791d74afebdda..532f1155fac93 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -148,8 +148,6 @@ import android.app.WindowConfiguration; import android.app.admin.DevicePolicyCache; import android.app.assist.AssistContent; import android.app.assist.AssistStructure; -import android.app.servertransaction.ClientTransaction; -import android.app.servertransaction.EnterPipRequestedItem; import android.app.usage.UsageStatsManagerInternal; import android.content.ActivityNotFoundException; import android.content.ComponentName; @@ -3254,23 +3252,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } - @VisibleForTesting - boolean isInPictureInPictureMode(ActivityRecord r) { - return r != null - && r.getRootTask() != null - && r.inPinnedWindowingMode() - && r.getRootTask().isInTask(r) != null; - } - /** * Puts the given activity in picture in picture mode if possible. * * @return true if the activity is now in picture-in-picture mode, or false if it could not * enter picture-in-picture mode. */ - boolean enterPictureInPictureMode(ActivityRecord r, final PictureInPictureParams params) { + boolean enterPictureInPictureMode(@NonNull ActivityRecord r, PictureInPictureParams params) { // If the activity is already in picture in picture mode, then just return early - if (isInPictureInPictureMode(r)) { + if (r.inPinnedWindowingMode()) { return true; } @@ -3755,52 +3745,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } - /** - * Requests that an activity should enter picture-in-picture mode if possible. - */ - @Override - public void requestPictureInPictureMode(IBinder token) throws RemoteException { - enforceTaskPermission("requestPictureInPictureMode"); - final long origId = Binder.clearCallingIdentity(); - try { - synchronized (mGlobalLock) { - final ActivityRecord activity = ActivityRecord.forTokenLocked(token); - if (activity == null) { - return; - } - - if (isInPictureInPictureMode(activity)) { - throw new IllegalStateException("Activity is already in PIP mode"); - } - - final boolean canEnterPictureInPicture = activity.checkEnterPictureInPictureState( - "requestPictureInPictureMode", /* beforeStopping */ false); - if (!canEnterPictureInPicture) { - throw new IllegalStateException( - "Requested PIP on an activity that doesn't support it"); - } - - if (activity.pictureInPictureArgs.isAutoEnterEnabled()) { - enterPictureInPictureMode(activity, activity.pictureInPictureArgs); - return; - } - - try { - final ClientTransaction transaction = ClientTransaction.obtain( - activity.app.getThread(), - activity.token); - transaction.addCallback(EnterPipRequestedItem.obtain()); - getLifecycleManager().scheduleTransaction(transaction); - } catch (Exception e) { - Slog.w(TAG, "Failed to send enter pip requested item: " - + activity.intent.getComponent(), e); - } - } - } finally { - Binder.restoreCallingIdentity(origId); - } - } - void dumpLastANRLocked(PrintWriter pw) { pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)"); if (mLastANRState == null) { diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index d34e2c4923dc1..285d887a42962 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -98,7 +98,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { doReturn(mockLifecycleManager).when(mAtm).getLifecycleManager(); doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean()); - mAtm.requestPictureInPictureMode(activity.token); + mAtm.mActivityClientController.requestPictureInPictureMode(activity); verify(mockLifecycleManager).scheduleTransaction(mClientTransactionCaptor.capture()); final ClientTransaction transaction = mClientTransactionCaptor.getValue(); @@ -117,7 +117,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { doReturn(false).when(activity).inPinnedWindowingMode(); doReturn(false).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean()); - mAtm.requestPictureInPictureMode(activity.token); + mAtm.mActivityClientController.requestPictureInPictureMode(activity); // Check enter no transactions with enter pip requests are made. verify(lifecycleManager, times(0)).scheduleTransaction(any()); @@ -130,7 +130,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { ClientLifecycleManager lifecycleManager = mAtm.getLifecycleManager(); doReturn(true).when(activity).inPinnedWindowingMode(); - mAtm.requestPictureInPictureMode(activity.token); + mAtm.mActivityClientController.requestPictureInPictureMode(activity); // Check that no transactions with enter pip requests are made. verify(lifecycleManager, times(0)).scheduleTransaction(any()); @@ -219,7 +219,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { //mock other operations doReturn(true).when(record) .checkEnterPictureInPictureState("enterPictureInPictureMode", false); - doReturn(false).when(mAtm).isInPictureInPictureMode(any()); + doReturn(false).when(record).inPinnedWindowingMode(); doReturn(false).when(mAtm).isKeyguardLocked(); //to simulate NPE