Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cde27168 authored by Chris Li's avatar Chris Li
Browse files

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
parent 3dfc4cd4
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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;
+0 −14
Original line number Diff line number Diff line
@@ -348,20 +348,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
+0 −7
Original line number Diff line number Diff line
@@ -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();

+11 −0
Original line number Diff line number Diff line
@@ -137,6 +137,13 @@ public class TaskInfo {
    @UnsupportedAppUsage
    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
+4 −5
Original line number Diff line number Diff line
@@ -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;
        }

Loading