Loading libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml 0 → 100644 +26 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2024 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="960" android:viewportHeight="960" android:tint="?attr/colorControlNormal"> <path android:fillColor="@android:color/white" android:pathData="M240,840L240,720L120,720L120,640L320,640L320,840L240,840ZM640,840L640,640L840,640L840,720L720,720L720,840L640,840ZM120,320L120,240L240,240L240,120L320,120L320,320L120,320ZM640,320L640,120L720,120L720,240L840,240L840,320L640,320Z"/> </vector> libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -240,6 +240,7 @@ public abstract class WMShellModule { IWindowManager windowManager, ShellCommandHandler shellCommandHandler, ShellTaskOrganizer taskOrganizer, @DynamicOverride DesktopModeTaskRepository desktopRepository, DisplayController displayController, ShellController shellController, DisplayInsetsController displayInsetsController, Loading @@ -266,6 +267,7 @@ public abstract class WMShellModule { shellCommandHandler, windowManager, taskOrganizer, desktopRepository, displayController, shellController, displayInsetsController, Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt +21 −1 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ class DesktopModeTaskRepository ( * @property minimizedTasks task ids for active freeform tasks that are currently minimized. * @property closingTasks task ids for tasks that are going to close, but are currently visible. * @property freeformTasksInZOrder list of current freeform task ids ordered from top to bottom * @property fullImmersiveTaskId the task id of the desktop task that is in full-immersive mode. * (top is at index 0). */ private data class DesktopTaskData( Loading @@ -69,13 +70,15 @@ class DesktopModeTaskRepository ( // TODO(b/332682201): Remove when the repository state is updated via TransitionObserver val closingTasks: ArraySet<Int> = ArraySet(), val freeformTasksInZOrder: ArrayList<Int> = ArrayList(), var fullImmersiveTaskId: Int? = null, ) { fun deepCopy(): DesktopTaskData = DesktopTaskData( activeTasks = ArraySet(activeTasks), visibleTasks = ArraySet(visibleTasks), minimizedTasks = ArraySet(minimizedTasks), closingTasks = ArraySet(closingTasks), freeformTasksInZOrder = ArrayList(freeformTasksInZOrder) freeformTasksInZOrder = ArrayList(freeformTasksInZOrder), fullImmersiveTaskId = fullImmersiveTaskId ) } Loading Loading @@ -300,6 +303,23 @@ class DesktopModeTaskRepository ( } } /** Set whether the given task is the full-immersive task in this display. */ fun setTaskInFullImmersiveState(displayId: Int, taskId: Int, immersive: Boolean) { val desktopData = desktopTaskDataByDisplayId.getOrCreate(displayId) if (immersive) { desktopData.fullImmersiveTaskId = taskId } else { if (desktopData.fullImmersiveTaskId == taskId) { desktopData.fullImmersiveTaskId = null } } } /* Whether the task is in full-immersive state. */ fun isTaskInFullImmersiveState(taskId: Int): Boolean { return desktopTaskDataSequence().any { taskId == it.fullImmersiveTaskId } } private fun notifyVisibleTaskListeners(displayId: Int, visibleTasksCount: Int) { visibleTasksListeners.forEach { (listener, executor) -> executor.execute { listener.onTasksVisibilityChanged(displayId, visibleTasksCount) } Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +7 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import com.android.wm.shell.common.MultiInstanceHelper; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler; import com.android.wm.shell.desktopmode.DesktopModeTaskRepository; import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition; Loading Loading @@ -154,6 +155,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private final ActivityTaskManager mActivityTaskManager; private final ShellCommandHandler mShellCommandHandler; private final ShellTaskOrganizer mTaskOrganizer; private final DesktopModeTaskRepository mDesktopRepository; private final ShellController mShellController; private final Context mContext; private final @ShellMainThread Handler mMainHandler; Loading Loading @@ -225,6 +227,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellCommandHandler shellCommandHandler, IWindowManager windowManager, ShellTaskOrganizer taskOrganizer, DesktopModeTaskRepository desktopRepository, DisplayController displayController, ShellController shellController, DisplayInsetsController displayInsetsController, Loading @@ -250,6 +253,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { shellCommandHandler, windowManager, taskOrganizer, desktopRepository, displayController, shellController, displayInsetsController, Loading Loading @@ -284,6 +288,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellCommandHandler shellCommandHandler, IWindowManager windowManager, ShellTaskOrganizer taskOrganizer, DesktopModeTaskRepository desktopRepository, DisplayController displayController, ShellController shellController, DisplayInsetsController displayInsetsController, Loading Loading @@ -312,6 +317,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mBgExecutor = bgExecutor; mActivityTaskManager = mContext.getSystemService(ActivityTaskManager.class); mTaskOrganizer = taskOrganizer; mDesktopRepository = desktopRepository; mShellController = shellController; mDisplayController = displayController; mDisplayInsetsController = displayInsetsController; Loading Loading @@ -1414,6 +1420,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mContext.createContextAsUser(UserHandle.of(taskInfo.userId), 0 /* flags */), mDisplayController, mSplitScreenController, mDesktopRepository, mTaskOrganizer, taskInfo, taskSurface, Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +21 −7 Original line number Diff line number Diff line Loading @@ -90,6 +90,7 @@ import com.android.wm.shell.common.MultiInstanceHelper; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.CaptionState; import com.android.wm.shell.desktopmode.DesktopModeTaskRepository; import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; Loading Loading @@ -189,12 +190,14 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private final Runnable mCapturedLinkExpiredRunnable = this::onCapturedLinkExpired; private final MultiInstanceHelper mMultiInstanceHelper; private final WindowDecorCaptionHandleRepository mWindowDecorCaptionHandleRepository; private final DesktopModeTaskRepository mDesktopRepository; DesktopModeWindowDecoration( Context context, @NonNull Context userContext, DisplayController displayController, SplitScreenController splitScreenController, DesktopModeTaskRepository desktopRepository, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Loading @@ -208,8 +211,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin AssistContentRequester assistContentRequester, MultiInstanceHelper multiInstanceHelper, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository) { this (context, userContext, displayController, splitScreenController, taskOrganizer, taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue, this (context, userContext, displayController, splitScreenController, desktopRepository, taskOrganizer, taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue, appHeaderViewHolderFactory, rootTaskDisplayAreaOrganizer, genericLinksParser, assistContentRequester, SurfaceControl.Builder::new, SurfaceControl.Transaction::new, Loading @@ -226,6 +229,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @NonNull Context userContext, DisplayController displayController, SplitScreenController splitScreenController, DesktopModeTaskRepository desktopRepository, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Loading Loading @@ -265,6 +269,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mMultiInstanceHelper = multiInstanceHelper; mWindowManagerWrapper = windowManagerWrapper; mWindowDecorCaptionHandleRepository = windowDecorCaptionHandleRepository; mDesktopRepository = desktopRepository; } /** Loading Loading @@ -481,11 +486,18 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin if (canEnterDesktopMode(mContext) && Flags.enableDesktopWindowingAppHandleEducation()) { notifyCaptionStateChanged(); } mWindowDecorViewHolder.bindData(mTaskInfo, position, mResult.mCaptionWidth, mResult.mCaptionHeight, isCaptionVisible()); if (isAppHandle(mWindowDecorViewHolder)) { mWindowDecorViewHolder.bindData(new AppHandleViewHolder.HandleData( mTaskInfo, position, mResult.mCaptionWidth, mResult.mCaptionHeight, isCaptionVisible() )); } else { mWindowDecorViewHolder.bindData(new AppHeaderViewHolder.HeaderData( mTaskInfo, TaskInfoKt.getRequestingImmersive(mTaskInfo), mDesktopRepository.isTaskInFullImmersiveState(mTaskInfo.taskId) )); } Trace.endSection(); if (!mTaskInfo.isFocused) { Loading Loading @@ -1540,6 +1552,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @NonNull Context userContext, DisplayController displayController, SplitScreenController splitScreenController, DesktopModeTaskRepository desktopRepository, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Loading @@ -1558,6 +1571,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin userContext, displayController, splitScreenController, desktopRepository, taskOrganizer, taskInfo, taskSurface, Loading Loading
libs/WindowManager/Shell/res/drawable/decor_desktop_mode_immersive_exit_button_dark.xml 0 → 100644 +26 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2024 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="960" android:viewportHeight="960" android:tint="?attr/colorControlNormal"> <path android:fillColor="@android:color/white" android:pathData="M240,840L240,720L120,720L120,640L320,640L320,840L240,840ZM640,840L640,640L840,640L840,720L720,720L720,840L640,840ZM120,320L120,240L240,240L240,120L320,120L320,320L120,320ZM640,320L640,120L720,120L720,240L840,240L840,320L640,320Z"/> </vector>
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -240,6 +240,7 @@ public abstract class WMShellModule { IWindowManager windowManager, ShellCommandHandler shellCommandHandler, ShellTaskOrganizer taskOrganizer, @DynamicOverride DesktopModeTaskRepository desktopRepository, DisplayController displayController, ShellController shellController, DisplayInsetsController displayInsetsController, Loading @@ -266,6 +267,7 @@ public abstract class WMShellModule { shellCommandHandler, windowManager, taskOrganizer, desktopRepository, displayController, shellController, displayInsetsController, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt +21 −1 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ class DesktopModeTaskRepository ( * @property minimizedTasks task ids for active freeform tasks that are currently minimized. * @property closingTasks task ids for tasks that are going to close, but are currently visible. * @property freeformTasksInZOrder list of current freeform task ids ordered from top to bottom * @property fullImmersiveTaskId the task id of the desktop task that is in full-immersive mode. * (top is at index 0). */ private data class DesktopTaskData( Loading @@ -69,13 +70,15 @@ class DesktopModeTaskRepository ( // TODO(b/332682201): Remove when the repository state is updated via TransitionObserver val closingTasks: ArraySet<Int> = ArraySet(), val freeformTasksInZOrder: ArrayList<Int> = ArrayList(), var fullImmersiveTaskId: Int? = null, ) { fun deepCopy(): DesktopTaskData = DesktopTaskData( activeTasks = ArraySet(activeTasks), visibleTasks = ArraySet(visibleTasks), minimizedTasks = ArraySet(minimizedTasks), closingTasks = ArraySet(closingTasks), freeformTasksInZOrder = ArrayList(freeformTasksInZOrder) freeformTasksInZOrder = ArrayList(freeformTasksInZOrder), fullImmersiveTaskId = fullImmersiveTaskId ) } Loading Loading @@ -300,6 +303,23 @@ class DesktopModeTaskRepository ( } } /** Set whether the given task is the full-immersive task in this display. */ fun setTaskInFullImmersiveState(displayId: Int, taskId: Int, immersive: Boolean) { val desktopData = desktopTaskDataByDisplayId.getOrCreate(displayId) if (immersive) { desktopData.fullImmersiveTaskId = taskId } else { if (desktopData.fullImmersiveTaskId == taskId) { desktopData.fullImmersiveTaskId = null } } } /* Whether the task is in full-immersive state. */ fun isTaskInFullImmersiveState(taskId: Int): Boolean { return desktopTaskDataSequence().any { taskId == it.fullImmersiveTaskId } } private fun notifyVisibleTaskListeners(displayId: Int, visibleTasksCount: Int) { visibleTasksListeners.forEach { (listener, executor) -> executor.execute { listener.onTasksVisibilityChanged(displayId, visibleTasksCount) } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +7 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import com.android.wm.shell.common.MultiInstanceHelper; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler; import com.android.wm.shell.desktopmode.DesktopModeTaskRepository; import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition; Loading Loading @@ -154,6 +155,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private final ActivityTaskManager mActivityTaskManager; private final ShellCommandHandler mShellCommandHandler; private final ShellTaskOrganizer mTaskOrganizer; private final DesktopModeTaskRepository mDesktopRepository; private final ShellController mShellController; private final Context mContext; private final @ShellMainThread Handler mMainHandler; Loading Loading @@ -225,6 +227,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellCommandHandler shellCommandHandler, IWindowManager windowManager, ShellTaskOrganizer taskOrganizer, DesktopModeTaskRepository desktopRepository, DisplayController displayController, ShellController shellController, DisplayInsetsController displayInsetsController, Loading @@ -250,6 +253,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { shellCommandHandler, windowManager, taskOrganizer, desktopRepository, displayController, shellController, displayInsetsController, Loading Loading @@ -284,6 +288,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellCommandHandler shellCommandHandler, IWindowManager windowManager, ShellTaskOrganizer taskOrganizer, DesktopModeTaskRepository desktopRepository, DisplayController displayController, ShellController shellController, DisplayInsetsController displayInsetsController, Loading Loading @@ -312,6 +317,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mBgExecutor = bgExecutor; mActivityTaskManager = mContext.getSystemService(ActivityTaskManager.class); mTaskOrganizer = taskOrganizer; mDesktopRepository = desktopRepository; mShellController = shellController; mDisplayController = displayController; mDisplayInsetsController = displayInsetsController; Loading Loading @@ -1414,6 +1420,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mContext.createContextAsUser(UserHandle.of(taskInfo.userId), 0 /* flags */), mDisplayController, mSplitScreenController, mDesktopRepository, mTaskOrganizer, taskInfo, taskSurface, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +21 −7 Original line number Diff line number Diff line Loading @@ -90,6 +90,7 @@ import com.android.wm.shell.common.MultiInstanceHelper; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.CaptionState; import com.android.wm.shell.desktopmode.DesktopModeTaskRepository; import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; Loading Loading @@ -189,12 +190,14 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private final Runnable mCapturedLinkExpiredRunnable = this::onCapturedLinkExpired; private final MultiInstanceHelper mMultiInstanceHelper; private final WindowDecorCaptionHandleRepository mWindowDecorCaptionHandleRepository; private final DesktopModeTaskRepository mDesktopRepository; DesktopModeWindowDecoration( Context context, @NonNull Context userContext, DisplayController displayController, SplitScreenController splitScreenController, DesktopModeTaskRepository desktopRepository, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Loading @@ -208,8 +211,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin AssistContentRequester assistContentRequester, MultiInstanceHelper multiInstanceHelper, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository) { this (context, userContext, displayController, splitScreenController, taskOrganizer, taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue, this (context, userContext, displayController, splitScreenController, desktopRepository, taskOrganizer, taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue, appHeaderViewHolderFactory, rootTaskDisplayAreaOrganizer, genericLinksParser, assistContentRequester, SurfaceControl.Builder::new, SurfaceControl.Transaction::new, Loading @@ -226,6 +229,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @NonNull Context userContext, DisplayController displayController, SplitScreenController splitScreenController, DesktopModeTaskRepository desktopRepository, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Loading Loading @@ -265,6 +269,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mMultiInstanceHelper = multiInstanceHelper; mWindowManagerWrapper = windowManagerWrapper; mWindowDecorCaptionHandleRepository = windowDecorCaptionHandleRepository; mDesktopRepository = desktopRepository; } /** Loading Loading @@ -481,11 +486,18 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin if (canEnterDesktopMode(mContext) && Flags.enableDesktopWindowingAppHandleEducation()) { notifyCaptionStateChanged(); } mWindowDecorViewHolder.bindData(mTaskInfo, position, mResult.mCaptionWidth, mResult.mCaptionHeight, isCaptionVisible()); if (isAppHandle(mWindowDecorViewHolder)) { mWindowDecorViewHolder.bindData(new AppHandleViewHolder.HandleData( mTaskInfo, position, mResult.mCaptionWidth, mResult.mCaptionHeight, isCaptionVisible() )); } else { mWindowDecorViewHolder.bindData(new AppHeaderViewHolder.HeaderData( mTaskInfo, TaskInfoKt.getRequestingImmersive(mTaskInfo), mDesktopRepository.isTaskInFullImmersiveState(mTaskInfo.taskId) )); } Trace.endSection(); if (!mTaskInfo.isFocused) { Loading Loading @@ -1540,6 +1552,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @NonNull Context userContext, DisplayController displayController, SplitScreenController splitScreenController, DesktopModeTaskRepository desktopRepository, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Loading @@ -1558,6 +1571,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin userContext, displayController, splitScreenController, desktopRepository, taskOrganizer, taskInfo, taskSurface, Loading