summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Li <lihongyu@google.com> 2021-04-27 17:30:58 -0700
committer Chris Li <lihongyu@google.com> 2021-04-27 23:59:38 -0700
commitcde271685f55a2dac2cf82fa82298a6b8bad1a8d (patch)
treef858cc2c3ed885aa47d26de404e034a33b8a3039
parent3dfc4cd49805f7f1dbce2392298215fbd5e4de4b (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
-rw-r--r--core/java/android/app/ActivityManager.java5
-rw-r--r--core/java/android/app/ActivityTaskManager.java14
-rw-r--r--core/java/android/app/IActivityTaskManager.aidl7
-rw-r--r--core/java/android/app/TaskInfo.java11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java9
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java27
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java1
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java5
-rw-r--r--services/core/java/com/android/server/wm/Task.java1
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