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

Commit 7694d1eb authored by Eghosa Ewansiha-Vlachavas's avatar Eghosa Ewansiha-Vlachavas
Browse files

Refactor `AppCompatUtils.kt`

Rename to `DesktopModeCompatPolicy` and convert to singleton class

Flag: EXEMPT refactor
Test: atest WMShellUnitTests:DesktopModeWindowDecorViewModelTests,
      atest WMShellUnitTests:DesktopTasksControllerTest,
      atest WMShellUnitTests:SystemModalsTransitionHandlerTest,
      atest WMShellUnitTests:AppCompatUtilsTest
Fixes: 391363063
Change-Id: I161a25e4692d6cdb8a21ff80b75161cae0cd038d
parent 42879987
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -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
}
+2 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
+11 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -794,7 +796,8 @@ public abstract class WMShellModule {
                bubbleController,
                overviewToDesktopTransitionObserver,
                desksOrganizer,
                userProfileContexts);
                userProfileContexts,
                desktopModeCompatPolicy);
    }

    @WMSingleton
@@ -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();
@@ -988,7 +992,7 @@ public abstract class WMShellModule {
                desktopTasksLimiter, appHandleEducationController, appToWebEducationController,
                windowDecorCaptionHandleRepository, activityOrientationChangeHandler,
                focusTransitionObserver, desktopModeEventLogger, desktopModeUiEventLogger,
                taskResourceLoader, recentsTransitionHandler));
                taskResourceLoader, recentsTransitionHandler, desktopModeCompatPolicy));
    }

    @WMSingleton
@@ -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()) {
@@ -1019,7 +1024,7 @@ public abstract class WMShellModule {
        return Optional.of(
                new SystemModalsTransitionHandler(
                        context, mainExecutor, animExecutor, shellInit, transitions,
                        desktopUserRepositories));
                        desktopUserRepositories, desktopModeCompatPolicy));
    }

    @WMSingleton
+5 −5
Original line number Diff line number Diff line
@@ -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
@@ -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,
@@ -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
@@ -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() &&
@@ -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)
        }
+6 −6
Original line number Diff line number Diff line
@@ -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
@@ -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>()
@@ -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? =
@@ -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