Loading libs/WindowManager/Shell/src/com/android/wm/shell/compatui/AppCompatUtils.kt→libs/WindowManager/Shell/src/com/android/wm/shell/compatui/DesktopModeCompatPolicy.kt +52 −0 Original line number Diff line number Diff line Loading @@ -14,34 +14,39 @@ * limitations under the License. */ @file:JvmName("AppCompatUtils") package com.android.wm.shell.compatui import android.app.ActivityManager.RunningTaskInfo import android.content.Context import com.android.internal.R import com.android.wm.shell.dagger.WMSingleton import javax.inject.Inject /** * Class to decide whether to apply app compat policies in desktop mode. */ // TODO(b/347289970): Consider replacing with API @WMSingleton class DesktopModeCompatPolicy @Inject constructor(context: Context) { private val systemUiPackage: String = context.resources.getString(R.string.config_systemUi) /** * If the top activity should be exempt from desktop windowing and forced back to fullscreen. * Currently includes all system ui activities and modal dialogs. However if the top activity is not * being displayed, regardless of its configuration, we will not exempt it as to remain in the * desktop windowing environment. * Currently includes all system ui activities and modal dialogs. However if the top activity is * not being displayed, regardless of its configuration, we will not exempt it as to remain in * the desktop windowing environment. */ fun isTopActivityExemptFromDesktopWindowing(context: Context, task: RunningTaskInfo) = (isSystemUiTask(context, task) || isTransparentTask(task)) && !task.isTopActivityNoDisplay fun isTopActivityExemptFromDesktopWindowing(task: RunningTaskInfo) = (isSystemUiTask(task) || isTransparentTask(task)) && !task.isTopActivityNoDisplay /** * Returns true if all activities in a tasks stack are transparent. If there are no activities will * return false. * Returns true if all activities in a tasks stack are transparent. If there are no activities * will return false. */ fun isTransparentTask(task: RunningTaskInfo): Boolean = task.isActivityStackTransparent && task.numActivities > 0 private fun isSystemUiTask(context: Context, task: RunningTaskInfo): Boolean { val sysUiPackageName: String = context.resources.getString(R.string.config_systemUi) return task.baseActivity?.packageName == sysUiPackageName private fun isSystemUiTask(task: RunningTaskInfo): Boolean = task.baseActivity?.packageName == systemUiPackage } libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +2 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.activityembedding.ActivityEmbeddingController; import com.android.wm.shell.appzoomout.AppZoomOut; import com.android.wm.shell.appzoomout.AppZoomOutController; import com.android.wm.shell.back.BackAnimation; import com.android.wm.shell.back.BackAnimationBackground; import com.android.wm.shell.back.BackAnimationController; Loading Loading @@ -113,8 +115,6 @@ import com.android.wm.shell.shared.annotations.ShellAnimationThread; import com.android.wm.shell.shared.annotations.ShellMainThread; import com.android.wm.shell.shared.annotations.ShellSplashscreenThread; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.appzoomout.AppZoomOut; import com.android.wm.shell.appzoomout.AppZoomOutController; import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.startingsurface.StartingSurface; Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +11 −6 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.UserProfileContexts; import com.android.wm.shell.common.split.SplitState; import com.android.wm.shell.compatui.DesktopModeCompatPolicy; import com.android.wm.shell.compatui.letterbox.LetterboxCommandHandler; import com.android.wm.shell.compatui.letterbox.LetterboxTransitionObserver; import com.android.wm.shell.dagger.back.ShellBackAnimationModule; Loading Loading @@ -758,7 +759,8 @@ public abstract class WMShellModule { Optional<BubbleController> bubbleController, OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver, DesksOrganizer desksOrganizer, UserProfileContexts userProfileContexts) { UserProfileContexts userProfileContexts, DesktopModeCompatPolicy desktopModeCompatPolicy) { return new DesktopTasksController( context, shellInit, Loading Loading @@ -794,7 +796,8 @@ public abstract class WMShellModule { bubbleController, overviewToDesktopTransitionObserver, desksOrganizer, userProfileContexts); userProfileContexts, desktopModeCompatPolicy); } @WMSingleton Loading Loading @@ -972,7 +975,8 @@ public abstract class WMShellModule { DesktopModeEventLogger desktopModeEventLogger, DesktopModeUiEventLogger desktopModeUiEventLogger, WindowDecorTaskResourceLoader taskResourceLoader, RecentsTransitionHandler recentsTransitionHandler RecentsTransitionHandler recentsTransitionHandler, DesktopModeCompatPolicy desktopModeCompatPolicy ) { if (!DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) { return Optional.empty(); Loading @@ -988,7 +992,7 @@ public abstract class WMShellModule { desktopTasksLimiter, appHandleEducationController, appToWebEducationController, windowDecorCaptionHandleRepository, activityOrientationChangeHandler, focusTransitionObserver, desktopModeEventLogger, desktopModeUiEventLogger, taskResourceLoader, recentsTransitionHandler)); taskResourceLoader, recentsTransitionHandler, desktopModeCompatPolicy)); } @WMSingleton Loading @@ -1010,7 +1014,8 @@ public abstract class WMShellModule { @ShellAnimationThread ShellExecutor animExecutor, ShellInit shellInit, Transitions transitions, @DynamicOverride DesktopUserRepositories desktopUserRepositories) { @DynamicOverride DesktopUserRepositories desktopUserRepositories, DesktopModeCompatPolicy desktopModeCompatPolicy) { if (!DesktopModeStatus.canEnterDesktopMode(context) || !ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() || !Flags.enableDesktopSystemDialogsTransitions()) { Loading @@ -1019,7 +1024,7 @@ public abstract class WMShellModule { return Optional.of( new SystemModalsTransitionHandler( context, mainExecutor, animExecutor, shellInit, transitions, desktopUserRepositories)); desktopUserRepositories, desktopModeCompatPolicy)); } @WMSingleton Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +5 −5 Original line number Diff line number Diff line Loading @@ -86,8 +86,7 @@ import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.common.SingleInstanceRemoteListener import com.android.wm.shell.common.SyncTransactionQueue import com.android.wm.shell.common.UserProfileContexts import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing import com.android.wm.shell.compatui.isTransparentTask import com.android.wm.shell.compatui.DesktopModeCompatPolicy import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger Loading Loading @@ -185,6 +184,7 @@ class DesktopTasksController( private val overviewToDesktopTransitionObserver: OverviewToDesktopTransitionObserver, private val desksOrganizer: DesksOrganizer, private val userProfileContexts: UserProfileContexts, private val desktopModeCompatPolicy: DesktopModeCompatPolicy, ) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler, Loading Loading @@ -518,7 +518,7 @@ class DesktopTasksController( ) { if ( DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && isTopActivityExemptFromDesktopWindowing(context, task) desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(task) ) { logW("Cannot enter desktop for taskId %d, ineligible top activity found", task.taskId) return Loading Loading @@ -1822,7 +1822,7 @@ class DesktopTasksController( private fun isIncompatibleTask(task: RunningTaskInfo) = DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && isTopActivityExemptFromDesktopWindowing(context, task) desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(task) private fun shouldHandleTaskClosing(request: TransitionRequestInfo): Boolean = ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue() && Loading Loading @@ -2097,7 +2097,7 @@ class DesktopTasksController( // Only update task repository for transparent task. if ( DesktopModeFlags.INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC .isTrue() && isTransparentTask(task) .isTrue() && desktopModeCompatPolicy.isTransparentTask(task) ) { taskRepository.setTopTransparentFullscreenTaskId(task.displayId, task.taskId) } Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandler.kt +6 −6 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ import androidx.core.animation.addListener import com.android.app.animation.Interpolators import com.android.internal.protolog.ProtoLog import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing import com.android.wm.shell.compatui.DesktopModeCompatPolicy import com.android.wm.shell.desktopmode.DesktopUserRepositories import com.android.wm.shell.desktopmode.DesktopWallpaperActivity import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE Loading @@ -49,6 +49,7 @@ class SystemModalsTransitionHandler( private val shellInit: ShellInit, private val transitions: Transitions, private val desktopUserRepositories: DesktopUserRepositories, private val desktopModeCompatPolicy: DesktopModeCompatPolicy, ) : TransitionHandler { private val showingSystemModalsIds = mutableSetOf<Int>() Loading Loading @@ -130,7 +131,7 @@ class SystemModalsTransitionHandler( return@find false } val taskInfo = change.taskInfo ?: return@find false return@find isSystemModal(context, taskInfo) return@find isSystemModal(taskInfo) } private fun getClosingSystemModal(info: TransitionInfo): TransitionInfo.Change? = Loading @@ -139,13 +140,12 @@ class SystemModalsTransitionHandler( return@find false } val taskInfo = change.taskInfo ?: return@find false return@find isSystemModal(context, taskInfo) || showingSystemModalsIds.contains(taskInfo.taskId) return@find isSystemModal(taskInfo) || showingSystemModalsIds.contains(taskInfo.taskId) } private fun isSystemModal(context: Context, taskInfo: RunningTaskInfo): Boolean = private fun isSystemModal(taskInfo: RunningTaskInfo): Boolean = !DesktopWallpaperActivity.isWallpaperTask(taskInfo) && isTopActivityExemptFromDesktopWindowing(context, taskInfo) desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(taskInfo) private fun createAlphaAnimator( transaction: SurfaceControl.Transaction, Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/compatui/AppCompatUtils.kt→libs/WindowManager/Shell/src/com/android/wm/shell/compatui/DesktopModeCompatPolicy.kt +52 −0 Original line number Diff line number Diff line Loading @@ -14,34 +14,39 @@ * limitations under the License. */ @file:JvmName("AppCompatUtils") package com.android.wm.shell.compatui import android.app.ActivityManager.RunningTaskInfo import android.content.Context import com.android.internal.R import com.android.wm.shell.dagger.WMSingleton import javax.inject.Inject /** * Class to decide whether to apply app compat policies in desktop mode. */ // TODO(b/347289970): Consider replacing with API @WMSingleton class DesktopModeCompatPolicy @Inject constructor(context: Context) { private val systemUiPackage: String = context.resources.getString(R.string.config_systemUi) /** * If the top activity should be exempt from desktop windowing and forced back to fullscreen. * Currently includes all system ui activities and modal dialogs. However if the top activity is not * being displayed, regardless of its configuration, we will not exempt it as to remain in the * desktop windowing environment. * Currently includes all system ui activities and modal dialogs. However if the top activity is * not being displayed, regardless of its configuration, we will not exempt it as to remain in * the desktop windowing environment. */ fun isTopActivityExemptFromDesktopWindowing(context: Context, task: RunningTaskInfo) = (isSystemUiTask(context, task) || isTransparentTask(task)) && !task.isTopActivityNoDisplay fun isTopActivityExemptFromDesktopWindowing(task: RunningTaskInfo) = (isSystemUiTask(task) || isTransparentTask(task)) && !task.isTopActivityNoDisplay /** * Returns true if all activities in a tasks stack are transparent. If there are no activities will * return false. * Returns true if all activities in a tasks stack are transparent. If there are no activities * will return false. */ fun isTransparentTask(task: RunningTaskInfo): Boolean = task.isActivityStackTransparent && task.numActivities > 0 private fun isSystemUiTask(context: Context, task: RunningTaskInfo): Boolean { val sysUiPackageName: String = context.resources.getString(R.string.config_systemUi) return task.baseActivity?.packageName == sysUiPackageName private fun isSystemUiTask(task: RunningTaskInfo): Boolean = task.baseActivity?.packageName == systemUiPackage }
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +2 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.activityembedding.ActivityEmbeddingController; import com.android.wm.shell.appzoomout.AppZoomOut; import com.android.wm.shell.appzoomout.AppZoomOutController; import com.android.wm.shell.back.BackAnimation; import com.android.wm.shell.back.BackAnimationBackground; import com.android.wm.shell.back.BackAnimationController; Loading Loading @@ -113,8 +115,6 @@ import com.android.wm.shell.shared.annotations.ShellAnimationThread; import com.android.wm.shell.shared.annotations.ShellMainThread; import com.android.wm.shell.shared.annotations.ShellSplashscreenThread; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.appzoomout.AppZoomOut; import com.android.wm.shell.appzoomout.AppZoomOutController; import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.startingsurface.StartingSurface; Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +11 −6 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.UserProfileContexts; import com.android.wm.shell.common.split.SplitState; import com.android.wm.shell.compatui.DesktopModeCompatPolicy; import com.android.wm.shell.compatui.letterbox.LetterboxCommandHandler; import com.android.wm.shell.compatui.letterbox.LetterboxTransitionObserver; import com.android.wm.shell.dagger.back.ShellBackAnimationModule; Loading Loading @@ -758,7 +759,8 @@ public abstract class WMShellModule { Optional<BubbleController> bubbleController, OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver, DesksOrganizer desksOrganizer, UserProfileContexts userProfileContexts) { UserProfileContexts userProfileContexts, DesktopModeCompatPolicy desktopModeCompatPolicy) { return new DesktopTasksController( context, shellInit, Loading Loading @@ -794,7 +796,8 @@ public abstract class WMShellModule { bubbleController, overviewToDesktopTransitionObserver, desksOrganizer, userProfileContexts); userProfileContexts, desktopModeCompatPolicy); } @WMSingleton Loading Loading @@ -972,7 +975,8 @@ public abstract class WMShellModule { DesktopModeEventLogger desktopModeEventLogger, DesktopModeUiEventLogger desktopModeUiEventLogger, WindowDecorTaskResourceLoader taskResourceLoader, RecentsTransitionHandler recentsTransitionHandler RecentsTransitionHandler recentsTransitionHandler, DesktopModeCompatPolicy desktopModeCompatPolicy ) { if (!DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) { return Optional.empty(); Loading @@ -988,7 +992,7 @@ public abstract class WMShellModule { desktopTasksLimiter, appHandleEducationController, appToWebEducationController, windowDecorCaptionHandleRepository, activityOrientationChangeHandler, focusTransitionObserver, desktopModeEventLogger, desktopModeUiEventLogger, taskResourceLoader, recentsTransitionHandler)); taskResourceLoader, recentsTransitionHandler, desktopModeCompatPolicy)); } @WMSingleton Loading @@ -1010,7 +1014,8 @@ public abstract class WMShellModule { @ShellAnimationThread ShellExecutor animExecutor, ShellInit shellInit, Transitions transitions, @DynamicOverride DesktopUserRepositories desktopUserRepositories) { @DynamicOverride DesktopUserRepositories desktopUserRepositories, DesktopModeCompatPolicy desktopModeCompatPolicy) { if (!DesktopModeStatus.canEnterDesktopMode(context) || !ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() || !Flags.enableDesktopSystemDialogsTransitions()) { Loading @@ -1019,7 +1024,7 @@ public abstract class WMShellModule { return Optional.of( new SystemModalsTransitionHandler( context, mainExecutor, animExecutor, shellInit, transitions, desktopUserRepositories)); desktopUserRepositories, desktopModeCompatPolicy)); } @WMSingleton Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +5 −5 Original line number Diff line number Diff line Loading @@ -86,8 +86,7 @@ import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.common.SingleInstanceRemoteListener import com.android.wm.shell.common.SyncTransactionQueue import com.android.wm.shell.common.UserProfileContexts import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing import com.android.wm.shell.compatui.isTransparentTask import com.android.wm.shell.compatui.DesktopModeCompatPolicy import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.MinimizeReason import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger Loading Loading @@ -185,6 +184,7 @@ class DesktopTasksController( private val overviewToDesktopTransitionObserver: OverviewToDesktopTransitionObserver, private val desksOrganizer: DesksOrganizer, private val userProfileContexts: UserProfileContexts, private val desktopModeCompatPolicy: DesktopModeCompatPolicy, ) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler, Loading Loading @@ -518,7 +518,7 @@ class DesktopTasksController( ) { if ( DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && isTopActivityExemptFromDesktopWindowing(context, task) desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(task) ) { logW("Cannot enter desktop for taskId %d, ineligible top activity found", task.taskId) return Loading Loading @@ -1822,7 +1822,7 @@ class DesktopTasksController( private fun isIncompatibleTask(task: RunningTaskInfo) = DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && isTopActivityExemptFromDesktopWindowing(context, task) desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(task) private fun shouldHandleTaskClosing(request: TransitionRequestInfo): Boolean = ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue() && Loading Loading @@ -2097,7 +2097,7 @@ class DesktopTasksController( // Only update task repository for transparent task. if ( DesktopModeFlags.INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC .isTrue() && isTransparentTask(task) .isTrue() && desktopModeCompatPolicy.isTransparentTask(task) ) { taskRepository.setTopTransparentFullscreenTaskId(task.displayId, task.taskId) } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandler.kt +6 −6 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ import androidx.core.animation.addListener import com.android.app.animation.Interpolators import com.android.internal.protolog.ProtoLog import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing import com.android.wm.shell.compatui.DesktopModeCompatPolicy import com.android.wm.shell.desktopmode.DesktopUserRepositories import com.android.wm.shell.desktopmode.DesktopWallpaperActivity import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE Loading @@ -49,6 +49,7 @@ class SystemModalsTransitionHandler( private val shellInit: ShellInit, private val transitions: Transitions, private val desktopUserRepositories: DesktopUserRepositories, private val desktopModeCompatPolicy: DesktopModeCompatPolicy, ) : TransitionHandler { private val showingSystemModalsIds = mutableSetOf<Int>() Loading Loading @@ -130,7 +131,7 @@ class SystemModalsTransitionHandler( return@find false } val taskInfo = change.taskInfo ?: return@find false return@find isSystemModal(context, taskInfo) return@find isSystemModal(taskInfo) } private fun getClosingSystemModal(info: TransitionInfo): TransitionInfo.Change? = Loading @@ -139,13 +140,12 @@ class SystemModalsTransitionHandler( return@find false } val taskInfo = change.taskInfo ?: return@find false return@find isSystemModal(context, taskInfo) || showingSystemModalsIds.contains(taskInfo.taskId) return@find isSystemModal(taskInfo) || showingSystemModalsIds.contains(taskInfo.taskId) } private fun isSystemModal(context: Context, taskInfo: RunningTaskInfo): Boolean = private fun isSystemModal(taskInfo: RunningTaskInfo): Boolean = !DesktopWallpaperActivity.isWallpaperTask(taskInfo) && isTopActivityExemptFromDesktopWindowing(context, taskInfo) desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(taskInfo) private fun createAlphaAnimator( transaction: SurfaceControl.Transaction, Loading