Merge "Move requestPictureInPictureMode to internal"
This commit is contained in:
committed by
Android (Google) Code Review
commit
ff02566ed2
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user