Merge "Move requestPictureInPictureMode to internal"

This commit is contained in:
TreeHugger Robot
2020-12-16 12:14:23 +00:00
committed by Android (Google) Code Review
6 changed files with 41 additions and 78 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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.

View File

@@ -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();

View File

@@ -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;
@@ -3253,23 +3251,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;
}
@@ -3754,52 +3744,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) {

View File

@@ -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