diff options
| author | 2021-04-27 17:30:58 -0700 | |
|---|---|---|
| committer | 2021-04-27 23:59:38 -0700 | |
| commit | cde271685f55a2dac2cf82fa82298a6b8bad1a8d (patch) | |
| tree | f858cc2c3ed885aa47d26de404e034a33b8a3039 | |
| parent | 3dfc4cd49805f7f1dbce2392298215fbd5e4de4b (diff) | |
Determine whether to support activities in multi window (1/n)
Add a field of supportsMultiWindow to TaskInfo for WM Shell to use.
Because we will change to Task#supportsMultiWindow to check the
support based on the root activity's resizibilty, min widht/height,
and the device settings, using this to replace the check in
ActivityTaskManager, which is pure device settings.
Bug: 176061101
Test: atest WMShellFlickerTests
Change-Id: Iad94b39506e71b6224d923f02bd7fc454cae02c8
10 files changed, 24 insertions, 62 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index a24555f79a1c..6d2d0238ed37 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1947,8 +1947,9 @@ public class ActivityManager { pw.print(((baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0)); pw.print(" activityType="); pw.print(activityTypeToString(getActivityType())); pw.print(" windowingMode="); pw.print(windowingModeToString(getWindowingMode())); - pw.print(" supportsSplitScreenMultiWindow="); - pw.println(supportsSplitScreenMultiWindow); + pw.print(" supportsSplitScreenMultiWindow="); pw.print(supportsSplitScreenMultiWindow); + pw.print(" supportsMultiWindow="); + pw.println(supportsMultiWindow); if (taskDescription != null) { pw.print(" "); final ActivityManager.TaskDescription td = taskDescription; diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java index 6df9f4da7ae8..4a7fcd232ce9 100644 --- a/core/java/android/app/ActivityTaskManager.java +++ b/core/java/android/app/ActivityTaskManager.java @@ -349,20 +349,6 @@ public class ActivityTaskManager { } /** - * Whether to allow non-resizable apps to be shown in multi-window. The app will be letterboxed - * if the request orientation is not met, and will be shown in size-compat mode if the container - * size has changed. - * @hide - */ - public static boolean supportsNonResizableMultiWindow() { - try { - return ActivityTaskManager.getService().supportsNonResizableMultiWindow(); - } 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 b75e89ce6fda..74d51a0bcf63 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -259,13 +259,6 @@ interface IActivityTaskManager { void setSplitScreenResizing(boolean resizing); boolean supportsLocalVoiceInteraction(); - /** - * Whether to allow non-resizable apps to be shown in multi-window. The app will be letterboxed - * if the request orientation is not met, and will be shown in size-compat mode if the container - * size has changed. - */ - boolean supportsNonResizableMultiWindow(); - // Get device configuration ConfigurationInfo getDeviceConfigurationInfo(); diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 6ad5eea8b602..b95412f00453 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -138,6 +138,13 @@ public class TaskInfo { public boolean supportsSplitScreenMultiWindow; /** + * Whether this task supports multi windowing modes based on the device settings and the + * root activity resizability and configuration. + * @hide + */ + public boolean supportsMultiWindow; + + /** * The resize mode of the task. See {@link ActivityInfo#resizeMode}. * @hide */ @@ -329,6 +336,7 @@ public class TaskInfo { } return topActivityType == that.topActivityType && isResizeable == that.isResizeable + && supportsMultiWindow == that.supportsMultiWindow && Objects.equals(positionInParent, that.positionInParent) && Objects.equals(pictureInPictureParams, that.pictureInPictureParams) && getWindowingMode() == that.getWindowingMode() @@ -375,6 +383,7 @@ public class TaskInfo { taskDescription = source.readTypedObject(ActivityManager.TaskDescription.CREATOR); supportsSplitScreenMultiWindow = source.readBoolean(); + supportsMultiWindow = source.readBoolean(); resizeMode = source.readInt(); configuration.readFromParcel(source); token = WindowContainerToken.CREATOR.createFromParcel(source); @@ -412,6 +421,7 @@ public class TaskInfo { dest.writeTypedObject(taskDescription, flags); dest.writeBoolean(supportsSplitScreenMultiWindow); + dest.writeBoolean(supportsMultiWindow); dest.writeInt(resizeMode); configuration.writeToParcel(dest, flags); token.writeToParcel(dest, flags); @@ -440,6 +450,7 @@ public class TaskInfo { + " numActivities=" + numActivities + " lastActiveTime=" + lastActiveTime + " supportsSplitScreenMultiWindow=" + supportsSplitScreenMultiWindow + + " supportsMultiWindow=" + supportsMultiWindow + " resizeMode=" + resizeMode + " isResizeable=" + isResizeable + " token=" + token diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java index b6d408afd703..eb82c6d597d4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java @@ -23,7 +23,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG; import android.app.ActivityManager; -import android.app.ActivityTaskManager; import android.graphics.Rect; import android.view.SurfaceControl; import android.window.WindowContainerToken; @@ -89,11 +88,11 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.LayoutChan ProtoLog.v(WM_SHELL_TASK_ORG, "pair task1=%d task2=%d in AppPair=%s", task1.taskId, task2.taskId, this); - if ((!task1.isResizeable || !task2.isResizeable) - && !ActivityTaskManager.supportsNonResizableMultiWindow()) { + if (!task1.supportsMultiWindow || !task2.supportsMultiWindow) { ProtoLog.e(WM_SHELL_TASK_ORG, - "Can't pair unresizeable tasks task1.isResizeable=%b task1.isResizeable=%b", - task1.isResizeable, task2.isResizeable); + "Can't pair tasks that doesn't support multi window, " + + "task1.supportsMultiWindow=%b, task2.supportsMultiWindow=%b", + task1.supportsMultiWindow, task2.supportsMultiWindow); return false; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java index 27c56fd55e40..d9409ec2dc17 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java @@ -30,7 +30,6 @@ import android.animation.ValueAnimator; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; -import android.app.ActivityTaskManager; import android.app.WindowConfiguration; import android.graphics.Rect; import android.os.IBinder; @@ -92,11 +91,10 @@ public class LegacySplitScreenTransitions implements Transitions.TransitionHandl // is nothing behind it. ((type == TRANSIT_CLOSE || type == TRANSIT_TO_BACK) && triggerTask.parentTaskId == mListener.mPrimary.taskId) - // if a non-resizable is launched when it is not supported in multi window, + // if an activity that is not supported in multi window mode is launched, // we also need to leave split-screen. || ((type == TRANSIT_OPEN || type == TRANSIT_TO_FRONT) - && !triggerTask.isResizeable - && !ActivityTaskManager.supportsNonResizableMultiWindow()); + && !triggerTask.supportsMultiWindow); // In both cases, dismiss the primary if (shouldDismiss) { WindowManagerProxy.buildDismissSplit(out, mListener, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java index 5a2ef568d82a..1072845b35dd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java @@ -46,7 +46,6 @@ import com.android.wm.shell.transition.Transitions; import java.util.ArrayList; import java.util.List; -import java.util.function.BooleanSupplier; /** * Proxy to simplify calls into window manager/activity manager @@ -209,17 +208,10 @@ class WindowManagerProxy { return false; } ActivityManager.RunningTaskInfo topHomeTask = null; - // One-time lazy wrapper to avoid duplicated IPC in loop. Not store as class variable - // because the value can be changed at runtime. - final BooleanSupplier supportsNonResizableMultiWindow = - createSupportsNonResizableMultiWindowSupplier(); for (int i = rootTasks.size() - 1; i >= 0; --i) { final ActivityManager.RunningTaskInfo rootTask = rootTasks.get(i); - // Check whether to move resizeable task to split secondary. - // Also, we have an exception for non-resizable home because we will minimize to show - // it. - if (!rootTask.isResizeable && rootTask.topActivityType != ACTIVITY_TYPE_HOME - && !supportsNonResizableMultiWindow.getAsBoolean()) { + // Check whether the task can be moved to split secondary. + if (!rootTask.supportsMultiWindow && rootTask.topActivityType != ACTIVITY_TYPE_HOME) { continue; } // Only move fullscreen tasks to split secondary. @@ -364,21 +356,6 @@ class WindowManagerProxy { outWct.setFocusable(tiles.mPrimary.token, true /* focusable */); } - /** Creates a lazy wrapper to get whether it supports non-resizable in multi window. */ - private static BooleanSupplier createSupportsNonResizableMultiWindowSupplier() { - return new BooleanSupplier() { - private Boolean mSupportsNonResizableMultiWindow; - @Override - public boolean getAsBoolean() { - if (mSupportsNonResizableMultiWindow == null) { - mSupportsNonResizableMultiWindow = - ActivityTaskManager.supportsNonResizableMultiWindow(); - } - return mSupportsNonResizableMultiWindow; - } - }; - } - /** * Utility to apply a sync transaction serially with other sync transactions. * diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java index b0de02922f74..2b5cd601b200 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java @@ -69,6 +69,7 @@ public final class TestRunningTaskInfoBuilder { info.configuration.windowConfiguration.setActivityType(mActivityType); info.token = mToken; info.isResizeable = true; + info.supportsMultiWindow = true; return info; } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 0570f6cdfa77..158c30fbac04 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3340,11 +3340,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public boolean supportsNonResizableMultiWindow() { - return mSupportsNonResizableMultiWindow; - } - - @Override public boolean updateConfiguration(Configuration values) { mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateConfiguration()"); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 2a0041afd9d0..9fad7daa7212 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4079,6 +4079,7 @@ class Task extends WindowContainer<WindowContainer> { info.lastActiveTime = lastActiveTime; info.taskDescription = new ActivityManager.TaskDescription(getTaskDescription()); info.supportsSplitScreenMultiWindow = supportsSplitScreenWindowingMode(); + info.supportsMultiWindow = supportsMultiWindow(); info.configuration.setTo(getConfiguration()); // Update to the task's current activity type and windowing mode which may differ from the // window configuration |