diff options
11 files changed, 35 insertions, 28 deletions
diff --git a/core/java/android/window/DesktopModeFlags.java b/core/java/android/window/DesktopModeFlags.java index 082bf5dc5a1c..23e3954497c7 100644 --- a/core/java/android/window/DesktopModeFlags.java +++ b/core/java/android/window/DesktopModeFlags.java @@ -85,6 +85,7 @@ public enum DesktopModeFlags { ENABLE_DESKTOP_WINDOWING_TASK_LIMIT(Flags::enableDesktopWindowingTaskLimit, true), ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY(Flags::enableDesktopWindowingWallpaperActivity, true), + ENABLE_FULLY_IMMERSIVE_IN_DESKTOP(Flags::enableFullyImmersiveInDesktop, true), ENABLE_HANDLE_INPUT_FIX(Flags::enableHandleInputFix, true), ENABLE_HOLD_TO_DRAG_APP_HANDLE(Flags::enableHoldToDragAppHandle, true), ENABLE_MINIMIZE_BUTTON(Flags::enableMinimizeButton, true), diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt index a4620d5a4dfe..f8eea75764f4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt @@ -23,6 +23,7 @@ import android.os.IBinder import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_CHANGE import android.view.animation.DecelerateInterpolator +import android.window.DesktopModeFlags import android.window.DesktopModeFlags.ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS import android.window.TransitionInfo import android.window.TransitionRequestInfo @@ -152,7 +153,7 @@ class DesktopImmersiveController( displayId: Int, reason: ExitReason, ) { - if (!Flags.enableFullyImmersiveInDesktop()) return + if (!DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) return val result = exitImmersiveIfApplicable(wct, displayId, excludeTaskId = null, reason) result.asExit()?.runOnTransitionStart?.invoke(transition) } @@ -171,7 +172,7 @@ class DesktopImmersiveController( excludeTaskId: Int? = null, reason: ExitReason, ): ExitResult { - if (!Flags.enableFullyImmersiveInDesktop()) return ExitResult.NoExit + if (!DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) return ExitResult.NoExit val immersiveTask = desktopUserRepositories.current.getTaskInFullImmersiveState(displayId) ?: return ExitResult.NoExit @@ -213,7 +214,7 @@ class DesktopImmersiveController( taskInfo: RunningTaskInfo, reason: ExitReason, ): ExitResult { - if (!Flags.enableFullyImmersiveInDesktop()) return ExitResult.NoExit + if (!DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) return ExitResult.NoExit if (desktopUserRepositories.current.isTaskInFullImmersiveState(taskInfo.taskId)) { // A full immersive task is being minimized, make sure the immersive state is broken // (i.e. resize back to max bounds). diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt index 9666ca95bcc6..3356a1ce10f2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt @@ -33,7 +33,6 @@ import android.window.WindowContainerTransaction import androidx.annotation.VisibleForTesting import com.android.internal.jank.InteractionJankMonitor import com.android.internal.protolog.ProtoLog -import com.android.window.flags.Flags import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.freeform.FreeformTaskTransitionHandler import com.android.wm.shell.freeform.FreeformTaskTransitionStarter @@ -105,7 +104,7 @@ class DesktopMixedTransitionHandler( exitingImmersiveTask: Int? = null, ): IBinder { if ( - !Flags.enableFullyImmersiveInDesktop() && + !DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue && !DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX.isTrue ) { return transitions.startTransition(transitionType, wct, /* handler= */ null) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 10ffd79717e3..cc0abc4034ee 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -1832,7 +1832,7 @@ class DesktopTasksController( /** Whether the given [change] in the [transition] is a known desktop change. */ fun isDesktopChange(transition: IBinder, change: TransitionInfo.Change): Boolean { // Only the immersive controller is currently involved in mixed transitions. - return Flags.enableFullyImmersiveInDesktop() && + return DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue && desktopImmersiveController.isImmersiveChange(transition, change) } @@ -1843,7 +1843,7 @@ class DesktopTasksController( */ fun shouldPlayDesktopAnimation(info: TransitionRequestInfo): Boolean { // Only immersive mixed transition are currently supported. - if (!Flags.enableFullyImmersiveInDesktop()) return false + if (!DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) return false val triggerTask = info.triggerTask ?: return false if (!isDesktopModeShowing(triggerTask.displayId)) { return false @@ -3056,7 +3056,7 @@ class DesktopTasksController( /** Called when a task's info changes. */ fun onTaskInfoChanged(taskInfo: RunningTaskInfo) { - if (!Flags.enableFullyImmersiveInDesktop()) return + if (!DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) return val inImmersive = taskRepository.isTaskInFullImmersiveState(taskInfo.taskId) val requestingImmersive = taskInfo.requestingImmersive if ( diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java index b6d19b657705..8059b94685ba 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java @@ -21,13 +21,13 @@ import android.content.Context; import android.os.IBinder; import android.view.SurfaceControl; import android.view.WindowManager; +import android.window.DesktopModeFlags; import android.window.TransitionInfo; import android.window.WindowContainerToken; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import com.android.window.flags.Flags; import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.FocusTransitionObserver; @@ -85,7 +85,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startT, @NonNull SurfaceControl.Transaction finishT) { - if (Flags.enableFullyImmersiveInDesktop()) { + if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) { // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the repository // is updated from there **before** the |mWindowDecorViewModel| methods are invoked. // Otherwise window decoration relayout won't run with the immersive state up to date. @@ -191,7 +191,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs @Override public void onTransitionStarting(@NonNull IBinder transition) { - if (Flags.enableFullyImmersiveInDesktop()) { + if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) { // TODO(b/367268953): Remove when DesktopTaskListener is introduced. mDesktopImmersiveController.ifPresent(h -> h.onTransitionStarting(transition)); } @@ -199,7 +199,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs @Override public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) { - if (Flags.enableFullyImmersiveInDesktop()) { + if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) { // TODO(b/367268953): Remove when DesktopTaskListener is introduced. mDesktopImmersiveController.ifPresent(h -> h.onTransitionMerged(merged, playing)); } @@ -224,7 +224,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs @Override public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) { - if (Flags.enableFullyImmersiveInDesktop()) { + if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) { // TODO(b/367268953): Remove when DesktopTaskListener is introduced. mDesktopImmersiveController.ifPresent(h -> h.onTransitionFinished(transition, aborted)); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenu.kt index 575aac381c42..02a5433147ca 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenu.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenu.kt @@ -25,11 +25,11 @@ import android.view.SurfaceControlViewHost import android.view.WindowInsets.Type.systemBars import android.view.WindowManager import android.view.WindowlessWindowManager +import android.window.DesktopModeFlags import android.window.TaskConstants import android.window.TaskSnapshot import androidx.compose.ui.graphics.toArgb import com.android.internal.annotations.VisibleForTesting -import com.android.window.flags.Flags import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.common.DisplayController import com.android.wm.shell.desktopmode.DesktopUserRepositories @@ -76,7 +76,7 @@ class DesktopHeaderManageWindowsMenu( val flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH val desktopRepository = desktopUserRepositories.getProfile(callerTaskInfo.userId) - menuViewContainer = if (Flags.enableFullyImmersiveInDesktop() + menuViewContainer = if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue && desktopRepository.isTaskInFullImmersiveState(callerTaskInfo.taskId)) { // Use system view container so that forcibly shown system bars take effect in // immersive. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 17d619c9bee8..f7eafdf3d371 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -974,7 +974,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, // should shared with the maximize menu's maximize/restore actions. final DesktopRepository desktopRepository = mDesktopUserRepositories.getProfile( decoration.mTaskInfo.userId); - if (Flags.enableFullyImmersiveInDesktop() + if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue() && desktopRepository.isTaskInFullImmersiveState( decoration.mTaskInfo.taskId)) { // Task is in immersive and should exit. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index afb234899339..9fa7cb83b823 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -906,7 +906,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin relayoutParams.mAsyncViewHost = isAppHandle; final boolean showCaption; - if (Flags.enableFullyImmersiveInDesktop()) { + if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) { if (inFullImmersiveMode) { showCaption = isStatusBarVisible && !isKeyguardVisibleAndOccluded; } else { @@ -958,7 +958,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin // including non-immersive apps that just don't handle caption insets properly. relayoutParams.mInsetSourceFlags |= FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; } - if (Flags.enableFullyImmersiveInDesktop() && inFullImmersiveMode) { + if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue() + && inFullImmersiveMode) { final Insets systemBarInsets = displayInsetsState.calculateInsets( taskInfo.getConfiguration().windowConfiguration.getBounds(), WindowInsets.Type.systemBars() & ~WindowInsets.Type.captionBar(), @@ -1050,7 +1051,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin } private int calculateMaximizeMenuWidth() { - final boolean showImmersive = Flags.enableFullyImmersiveInDesktop() + final boolean showImmersive = DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue() && TaskInfoKt.getRequestingImmersive(mTaskInfo); final boolean showMaximize = true; final boolean showSnaps = mTaskInfo.isResizeable; @@ -1278,11 +1279,13 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin calculateMaximizeMenuPosition(menuWidth), mSurfaceControlTransactionSupplier); mMaximizeMenu.show( - /* isTaskInImmersiveMode= */ Flags.enableFullyImmersiveInDesktop() + /* isTaskInImmersiveMode= */ + DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue() && mDesktopUserRepositories.getProfile(mTaskInfo.userId) .isTaskInFullImmersiveState(mTaskInfo.taskId), /* menuWidth= */ menuWidth, - /* showImmersiveOption= */ Flags.enableFullyImmersiveInDesktop() + /* showImmersiveOption= */ + DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue() && TaskInfoKt.getRequestingImmersive(mTaskInfo), /* showSnapOptions= */ mTaskInfo.isResizeable, mOnMaximizeOrRestoreClickListener, @@ -1790,7 +1793,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin } private boolean canOpenMaximizeMenu(boolean animatingTaskResizeOrReposition) { - if (!Flags.enableFullyImmersiveInDesktop()) { + if (!DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) { return !animatingTaskResizeOrReposition; } final boolean inImmersiveAndRequesting = diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt index db12f899f42f..bc2be901d320 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt @@ -49,7 +49,6 @@ import com.android.internal.R.color.materialColorSecondaryContainer import com.android.internal.R.color.materialColorSurfaceContainerHigh import com.android.internal.R.color.materialColorSurfaceContainerLow import com.android.internal.R.color.materialColorSurfaceDim -import com.android.window.flags.Flags import com.android.wm.shell.R import android.window.DesktopModeFlags import androidx.core.view.ViewCompat @@ -463,7 +462,8 @@ class AppHeaderViewHolder( private fun shouldShowExitFullImmersiveOrMaximizeIcon( isTaskMaximized: Boolean, inFullImmersiveState: Boolean - ): Boolean = (Flags.enableFullyImmersiveInDesktop() && inFullImmersiveState) || isTaskMaximized + ): Boolean = (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue && inFullImmersiveState) + || isTaskMaximized private fun getHeaderStyle(header: Header): HeaderStyle { return HeaderStyle( diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 5329e3b9abb3..5090ed04fee1 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -74,7 +74,6 @@ import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.L import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.window.flags.Flags.enableFullyImmersiveInDesktop; import android.annotation.NonNull; import android.annotation.Nullable; @@ -120,6 +119,7 @@ import android.view.WindowManager.LayoutParams; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityManager; import android.window.ClientWindowFrames; +import android.window.DesktopModeFlags; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; @@ -2525,7 +2525,7 @@ public class DisplayPolicy { && !topFreeformTask.getBounds().equals(mDisplayContent.getBounds()); getInsetsPolicy().updateSystemBars(win, adjacentTasksVisible, - enableFullyImmersiveInDesktop() + DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue() ? inNonFullscreenFreeformMode : freeformRootTaskVisible); final boolean topAppHidesStatusBar = topAppHidesSystemBar(Type.statusBars()); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index c6136f316c3e..a192728724d5 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -171,6 +171,7 @@ import android.view.RemoteAnimationAdapter; import android.view.SurfaceControl; import android.view.WindowInsets; import android.view.WindowManager; +import android.window.DesktopModeFlags; import android.window.ITaskOrganizer; import android.window.PictureInPictureSurfaceTransaction; import android.window.StartingWindowInfo; @@ -3470,8 +3471,10 @@ class Task extends TaskFragment { info.lastNonFullscreenBounds = topTask.mLastNonFullscreenBounds; final WindowState windowState = top != null ? top.findMainWindow(/* includeStartingApp= */ false) : null; - info.requestedVisibleTypes = (windowState != null && Flags.enableFullyImmersiveInDesktop()) - ? windowState.getRequestedVisibleTypes() : WindowInsets.Type.defaultVisible(); + info.requestedVisibleTypes = + (windowState != null && DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) + ? windowState.getRequestedVisibleTypes() + : WindowInsets.Type.defaultVisible(); AppCompatUtils.fillAppCompatTaskInfo(this, info, top); info.topActivityMainWindowFrame = calculateTopActivityMainWindowFrameForTaskInfo(top); } |