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

Commit a9201bcf authored by Jerry Chang's avatar Jerry Chang
Browse files

Add lock task check when applying window container transaction

Unbind locked task mode check with legacy split screen. Add checks to
prevent performing hierarchy operation or updating windowing mode
unexpectedly while task locked.

Bug: 177190100
Test: atest CtsWindowManagerDeviceTestCases:MultiWindowTests
Test: atest WindowOrganizerTests
Change-Id: I33a6509e21af36afbd4554936c4f5e4208e9a8a3
parent 1ee02141
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.ActivityTaskManager.RESIZE_MODE_PRESERVE_WINDOW;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
@@ -1895,6 +1896,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        synchronized (mGlobalLock) {
            final long ident = Binder.clearCallingIdentity();
            try {
                if (isInLockTaskMode() && windowingMode != WINDOWING_MODE_FULLSCREEN) {
                    Slog.w(TAG, "setTaskWindowingMode: Is in lock task mode="
                            + getLockTaskModeState());
                    return false;
                }

                if (WindowConfiguration.isSplitScreenWindowingMode(windowingMode)) {
                    return setTaskWindowingModeSplitScreen(taskId, windowingMode, toTop);
                }
@@ -2159,11 +2166,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
            throw new IllegalArgumentException("Calling setTaskWindowingModeSplitScreen with non"
                    + "split-screen mode: " + windowingMode);
        }
        if (isInLockTaskMode()) {
            Slog.w(TAG, "setTaskWindowingModeSplitScreen: Is in lock task mode="
                    + getLockTaskModeState());
            return false;
        }

        final Task task = mRootWindowContainer.anyTaskForId(taskId,
                MATCH_ATTACHED_TASK_ONLY);
+58 −47
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.wm;

import static android.Manifest.permission.READ_FRAME_BUFFER;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REPARENT;
@@ -264,11 +265,15 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
            }
            // Hierarchy changes
            final List<WindowContainerTransaction.HierarchyOp> hops = t.getHierarchyOps();
            if (!hops.isEmpty() && mService.isInLockTaskMode()) {
                Slog.w(TAG, "Attempt to perform hierarchy operations while in lock task mode...");
            } else {
                for (int i = 0, n = hops.size(); i < n; ++i) {
                    final WindowContainerTransaction.HierarchyOp hop = hops.get(i);
                    switch (hop.getType()) {
                        case HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT: {
                        final WindowContainer wc = WindowContainer.fromBinder(hop.getContainer());
                            final WindowContainer wc = WindowContainer.fromBinder(
                                    hop.getContainer());
                            final Task task = wc != null ? wc.asTask() : null;
                            if (task != null) {
                                task.getDisplayArea().setLaunchRootTask(task,
@@ -287,7 +292,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                            break;
                        case HIERARCHY_OP_TYPE_REORDER:
                        case HIERARCHY_OP_TYPE_REPARENT:
                        final WindowContainer wc = WindowContainer.fromBinder(hop.getContainer());
                            final WindowContainer wc = WindowContainer.fromBinder(
                                    hop.getContainer());
                            if (wc == null || !wc.isAttached()) {
                                Slog.e(TAG, "Attempt to operate on detached container: " + wc);
                                continue;
@@ -317,6 +323,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                            effects |= sanitizeAndApplyHierarchyOp(wc, hop);
                    }
                }
            }
            // Queue-up bounds-change transactions for tasks which are now organized. Do
            // this after hierarchy ops so we have the final organized state.
            entries = t.getChanges().entrySet().iterator();
@@ -412,6 +419,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
        }

        if (windowingMode > -1) {
            if (mService.isInLockTaskMode() && windowingMode != WINDOWING_MODE_FULLSCREEN) {
                throw new UnsupportedOperationException("Not supported to set non-fullscreen"
                        + " windowing mode during locked task mode.");
            }
            container.setWindowingMode(windowingMode);
        }
        return effects;