Loading core/java/android/view/WindowContainerTransaction.java +25 −1 Original line number Diff line number Diff line Loading @@ -167,6 +167,18 @@ public class WindowContainerTransaction implements Parcelable { return this; } /** * Sets whether a container or its children should be hidden. When {@code false}, the existing * visibility of the container applies, but when {@code true} the container will be forced * to be hidden. */ public WindowContainerTransaction setHidden(IWindowContainer container, boolean hidden) { Change chg = getOrCreateChange(container.asBinder()); chg.mHidden = hidden; chg.mChangeMask |= Change.CHANGE_HIDDEN; return this; } /** * Set the smallestScreenWidth of a container. */ Loading Loading @@ -250,9 +262,11 @@ public class WindowContainerTransaction implements Parcelable { public static final int CHANGE_FOCUSABLE = 1; public static final int CHANGE_BOUNDS_TRANSACTION = 1 << 1; public static final int CHANGE_PIP_CALLBACK = 1 << 2; public static final int CHANGE_HIDDEN = 1 << 3; private final Configuration mConfiguration = new Configuration(); private boolean mFocusable = true; private boolean mHidden = false; private int mChangeMask = 0; private @ActivityInfo.Config int mConfigSetMask = 0; private @WindowConfiguration.WindowConfig int mWindowSetMask = 0; Loading @@ -268,6 +282,7 @@ public class WindowContainerTransaction implements Parcelable { protected Change(Parcel in) { mConfiguration.readFromParcel(in); mFocusable = in.readBoolean(); mHidden = in.readBoolean(); mChangeMask = in.readInt(); mConfigSetMask = in.readInt(); mWindowSetMask = in.readInt(); Loading Loading @@ -296,7 +311,7 @@ public class WindowContainerTransaction implements Parcelable { return mConfiguration; } /** Gets the requested focusable value */ /** Gets the requested focusable state */ public boolean getFocusable() { if ((mChangeMask & CHANGE_FOCUSABLE) == 0) { throw new RuntimeException("Focusable not set. check CHANGE_FOCUSABLE first"); Loading @@ -304,6 +319,14 @@ public class WindowContainerTransaction implements Parcelable { return mFocusable; } /** Gets the requested hidden state */ public boolean getHidden() { if ((mChangeMask & CHANGE_HIDDEN) == 0) { throw new RuntimeException("Hidden not set. check CHANGE_HIDDEN first"); } return mHidden; } public int getChangeMask() { return mChangeMask; } Loading Loading @@ -369,6 +392,7 @@ public class WindowContainerTransaction implements Parcelable { public void writeToParcel(Parcel dest, int flags) { mConfiguration.writeToParcel(dest, flags); dest.writeBoolean(mFocusable); dest.writeBoolean(mHidden); dest.writeInt(mChangeMask); dest.writeInt(mConfigSetMask); dest.writeInt(mWindowSetMask); Loading services/core/java/com/android/server/wm/ActivityStack.java +1 −1 Original line number Diff line number Diff line Loading @@ -1510,7 +1510,7 @@ class ActivityStack extends Task { */ @StackVisibility int getVisibility(ActivityRecord starting) { if (!isAttached() || mForceHidden) { if (!isAttached() || isForceHidden()) { return STACK_VISIBILITY_INVISIBLE; } Loading services/core/java/com/android/server/wm/ActivityStackSupervisor.java +3 −2 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_ONL import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE; import static com.android.server.wm.RootWindowContainer.TAG_STATES; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_PINNED_TASK; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.Task.LOCK_TASK_AUTH_WHITELISTED; Loading Loading @@ -1565,9 +1566,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { * stopping list by handling the idle. */ stack.cancelAnimation(); stack.mForceHidden = true; stack.setForceHidden(FLAG_FORCE_HIDDEN_FOR_PINNED_TASK, true /* set */); stack.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS); stack.mForceHidden = false; stack.setForceHidden(FLAG_FORCE_HIDDEN_FOR_PINNED_TASK, false /* set */); activityIdleInternal(null /* idleActivity */, false /* fromTimeout */, true /* processPausingActivities */, null /* configuration */); Loading services/core/java/com/android/server/wm/Task.java +41 −5 Original line number Diff line number Diff line Loading @@ -431,7 +431,10 @@ class Task extends WindowContainer<WindowContainer> { private boolean mForceShowForAllUsers; /** When set, will force the task to report as invisible. */ boolean mForceHidden = false; static final int FLAG_FORCE_HIDDEN_FOR_PINNED_TASK = 1; static final int FLAG_FORCE_HIDDEN_FOR_TASK_ORG = 1 << 1; private int mForceHiddenFlags = 0; SurfaceControl.Transaction mMainWindowSizeChangeTransaction; Loading Loading @@ -3047,7 +3050,7 @@ class Task extends WindowContainer<WindowContainer> { */ @VisibleForTesting boolean isTranslucent(ActivityRecord starting) { if (!isAttached() || mForceHidden) { if (!isAttached() || isForceHidden()) { return true; } final PooledPredicate p = PooledLambda.obtainPredicate(Task::isOpaqueActivity, Loading Loading @@ -4045,17 +4048,17 @@ class Task extends WindowContainer<WindowContainer> { return; } // Let the old organizer know it has lost control. if (mTaskOrganizer != null) { sendTaskVanished(); } mTaskOrganizer = organizer; sendTaskAppeared(); onTaskOrganizerChanged(); } // Called on Binder death. void taskOrganizerDied() { mTaskOrganizer = null; mLastTaskOrganizerWindowingMode = -1; onTaskOrganizerChanged(); } /** Loading Loading @@ -4090,6 +4093,14 @@ class Task extends WindowContainer<WindowContainer> { mLastTaskOrganizerWindowingMode = windowingMode; } private void onTaskOrganizerChanged() { if (mTaskOrganizer == null) { // If this task is no longer controlled by a task organizer, then reset the force hidden // state setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */); } } @Override void setSurfaceControl(SurfaceControl sc) { super.setSurfaceControl(sc); Loading Loading @@ -4200,6 +4211,31 @@ class Task extends WindowContainer<WindowContainer> { c.recycle(); } /** * Sets/unsets the forced-hidden state flag for this task depending on {@param set}. * @return Whether the force hidden state changed */ boolean setForceHidden(int flags, boolean set) { int newFlags = mForceHiddenFlags; if (set) { newFlags |= flags; } else { newFlags &= ~flags; } if (mForceHiddenFlags == newFlags) { return false; } mForceHiddenFlags = newFlags; return true; } /** * Returns whether this task is currently forced to be hidden for any reason. */ protected boolean isForceHidden() { return mForceHiddenFlags != 0; } @Override long getProtoFieldId() { return TASK; Loading services/core/java/com/android/server/wm/TaskOrganizerController.java +7 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMAR import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG; import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; import static com.android.server.wm.WindowContainer.POSITION_TOP; Loading Loading @@ -475,6 +476,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub if (!(container instanceof Task)) { throw new RuntimeException("Invalid token in task transaction"); } final Task task = (Task) container; // The "client"-facing API should prevent bad changes; however, just in case, sanitize // masks here. int configMask = change.getConfigSetMask(); Loading @@ -498,6 +500,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub effects |= TRANSACT_EFFECTS_LIFECYCLE; } } if ((change.getChangeMask() & WindowContainerTransaction.Change.CHANGE_HIDDEN) != 0) { if (task.setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, change.getHidden())) { effects |= TRANSACT_EFFECTS_LIFECYCLE; } } return effects; } Loading Loading
core/java/android/view/WindowContainerTransaction.java +25 −1 Original line number Diff line number Diff line Loading @@ -167,6 +167,18 @@ public class WindowContainerTransaction implements Parcelable { return this; } /** * Sets whether a container or its children should be hidden. When {@code false}, the existing * visibility of the container applies, but when {@code true} the container will be forced * to be hidden. */ public WindowContainerTransaction setHidden(IWindowContainer container, boolean hidden) { Change chg = getOrCreateChange(container.asBinder()); chg.mHidden = hidden; chg.mChangeMask |= Change.CHANGE_HIDDEN; return this; } /** * Set the smallestScreenWidth of a container. */ Loading Loading @@ -250,9 +262,11 @@ public class WindowContainerTransaction implements Parcelable { public static final int CHANGE_FOCUSABLE = 1; public static final int CHANGE_BOUNDS_TRANSACTION = 1 << 1; public static final int CHANGE_PIP_CALLBACK = 1 << 2; public static final int CHANGE_HIDDEN = 1 << 3; private final Configuration mConfiguration = new Configuration(); private boolean mFocusable = true; private boolean mHidden = false; private int mChangeMask = 0; private @ActivityInfo.Config int mConfigSetMask = 0; private @WindowConfiguration.WindowConfig int mWindowSetMask = 0; Loading @@ -268,6 +282,7 @@ public class WindowContainerTransaction implements Parcelable { protected Change(Parcel in) { mConfiguration.readFromParcel(in); mFocusable = in.readBoolean(); mHidden = in.readBoolean(); mChangeMask = in.readInt(); mConfigSetMask = in.readInt(); mWindowSetMask = in.readInt(); Loading Loading @@ -296,7 +311,7 @@ public class WindowContainerTransaction implements Parcelable { return mConfiguration; } /** Gets the requested focusable value */ /** Gets the requested focusable state */ public boolean getFocusable() { if ((mChangeMask & CHANGE_FOCUSABLE) == 0) { throw new RuntimeException("Focusable not set. check CHANGE_FOCUSABLE first"); Loading @@ -304,6 +319,14 @@ public class WindowContainerTransaction implements Parcelable { return mFocusable; } /** Gets the requested hidden state */ public boolean getHidden() { if ((mChangeMask & CHANGE_HIDDEN) == 0) { throw new RuntimeException("Hidden not set. check CHANGE_HIDDEN first"); } return mHidden; } public int getChangeMask() { return mChangeMask; } Loading Loading @@ -369,6 +392,7 @@ public class WindowContainerTransaction implements Parcelable { public void writeToParcel(Parcel dest, int flags) { mConfiguration.writeToParcel(dest, flags); dest.writeBoolean(mFocusable); dest.writeBoolean(mHidden); dest.writeInt(mChangeMask); dest.writeInt(mConfigSetMask); dest.writeInt(mWindowSetMask); Loading
services/core/java/com/android/server/wm/ActivityStack.java +1 −1 Original line number Diff line number Diff line Loading @@ -1510,7 +1510,7 @@ class ActivityStack extends Task { */ @StackVisibility int getVisibility(ActivityRecord starting) { if (!isAttached() || mForceHidden) { if (!isAttached() || isForceHidden()) { return STACK_VISIBILITY_INVISIBLE; } Loading
services/core/java/com/android/server/wm/ActivityStackSupervisor.java +3 −2 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_ONL import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE; import static com.android.server.wm.RootWindowContainer.TAG_STATES; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_PINNED_TASK; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.Task.LOCK_TASK_AUTH_WHITELISTED; Loading Loading @@ -1565,9 +1566,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { * stopping list by handling the idle. */ stack.cancelAnimation(); stack.mForceHidden = true; stack.setForceHidden(FLAG_FORCE_HIDDEN_FOR_PINNED_TASK, true /* set */); stack.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS); stack.mForceHidden = false; stack.setForceHidden(FLAG_FORCE_HIDDEN_FOR_PINNED_TASK, false /* set */); activityIdleInternal(null /* idleActivity */, false /* fromTimeout */, true /* processPausingActivities */, null /* configuration */); Loading
services/core/java/com/android/server/wm/Task.java +41 −5 Original line number Diff line number Diff line Loading @@ -431,7 +431,10 @@ class Task extends WindowContainer<WindowContainer> { private boolean mForceShowForAllUsers; /** When set, will force the task to report as invisible. */ boolean mForceHidden = false; static final int FLAG_FORCE_HIDDEN_FOR_PINNED_TASK = 1; static final int FLAG_FORCE_HIDDEN_FOR_TASK_ORG = 1 << 1; private int mForceHiddenFlags = 0; SurfaceControl.Transaction mMainWindowSizeChangeTransaction; Loading Loading @@ -3047,7 +3050,7 @@ class Task extends WindowContainer<WindowContainer> { */ @VisibleForTesting boolean isTranslucent(ActivityRecord starting) { if (!isAttached() || mForceHidden) { if (!isAttached() || isForceHidden()) { return true; } final PooledPredicate p = PooledLambda.obtainPredicate(Task::isOpaqueActivity, Loading Loading @@ -4045,17 +4048,17 @@ class Task extends WindowContainer<WindowContainer> { return; } // Let the old organizer know it has lost control. if (mTaskOrganizer != null) { sendTaskVanished(); } mTaskOrganizer = organizer; sendTaskAppeared(); onTaskOrganizerChanged(); } // Called on Binder death. void taskOrganizerDied() { mTaskOrganizer = null; mLastTaskOrganizerWindowingMode = -1; onTaskOrganizerChanged(); } /** Loading Loading @@ -4090,6 +4093,14 @@ class Task extends WindowContainer<WindowContainer> { mLastTaskOrganizerWindowingMode = windowingMode; } private void onTaskOrganizerChanged() { if (mTaskOrganizer == null) { // If this task is no longer controlled by a task organizer, then reset the force hidden // state setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */); } } @Override void setSurfaceControl(SurfaceControl sc) { super.setSurfaceControl(sc); Loading Loading @@ -4200,6 +4211,31 @@ class Task extends WindowContainer<WindowContainer> { c.recycle(); } /** * Sets/unsets the forced-hidden state flag for this task depending on {@param set}. * @return Whether the force hidden state changed */ boolean setForceHidden(int flags, boolean set) { int newFlags = mForceHiddenFlags; if (set) { newFlags |= flags; } else { newFlags &= ~flags; } if (mForceHiddenFlags == newFlags) { return false; } mForceHiddenFlags = newFlags; return true; } /** * Returns whether this task is currently forced to be hidden for any reason. */ protected boolean isForceHidden() { return mForceHiddenFlags != 0; } @Override long getProtoFieldId() { return TASK; Loading
services/core/java/com/android/server/wm/TaskOrganizerController.java +7 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMAR import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG; import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; import static com.android.server.wm.WindowContainer.POSITION_TOP; Loading Loading @@ -475,6 +476,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub if (!(container instanceof Task)) { throw new RuntimeException("Invalid token in task transaction"); } final Task task = (Task) container; // The "client"-facing API should prevent bad changes; however, just in case, sanitize // masks here. int configMask = change.getConfigSetMask(); Loading @@ -498,6 +500,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub effects |= TRANSACT_EFFECTS_LIFECYCLE; } } if ((change.getChangeMask() & WindowContainerTransaction.Change.CHANGE_HIDDEN) != 0) { if (task.setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, change.getHidden())) { effects |= TRANSACT_EFFECTS_LIFECYCLE; } } return effects; } Loading