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

Commit a9228cf0 authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille
Browse files

Stop using DesktopModeStatus in desktopmode itself.

Bug: 395863348
Test: atest WMShellUnitTests
Flag: EXEMPT (refactor)
Change-Id: I3d024fc40f22a58098f928922c8ee49094a4af23
parent 82225146
Loading
Loading
Loading
Loading
+69 −55
Original line number Diff line number Diff line
@@ -149,8 +149,10 @@ import com.android.wm.shell.shared.annotations.ShellAnimationThread;
import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
import com.android.wm.shell.shared.annotations.ShellDesktopThread;
import com.android.wm.shell.shared.annotations.ShellMainThread;
import com.android.wm.shell.shared.desktopmode.DesktopConfig;
import com.android.wm.shell.shared.desktopmode.DesktopModeCompatPolicy;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import com.android.wm.shell.shared.desktopmode.DesktopState;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellController;
@@ -821,7 +823,9 @@ public abstract class WMShellModule {
            DesktopModeCompatPolicy desktopModeCompatPolicy,
            DragToDisplayTransitionHandler dragToDisplayTransitionHandler,
            DesktopModeMoveToDisplayTransitionHandler moveToDisplayTransitionHandler,
            HomeIntentProvider homeIntentProvider) {
            HomeIntentProvider homeIntentProvider,
            DesktopState desktopState,
            DesktopConfig desktopConfig) {
        return new DesktopTasksController(
                context,
                shellInit,
@@ -864,7 +868,9 @@ public abstract class WMShellModule {
                desktopModeCompatPolicy,
                dragToDisplayTransitionHandler,
                moveToDisplayTransitionHandler,
                homeIntentProvider);
                homeIntentProvider,
                desktopState,
                desktopConfig);
    }

    @WMSingleton
@@ -906,9 +912,10 @@ public abstract class WMShellModule {
    @WMSingleton
    @Provides
    static Optional<TaskChangeListener> provideDesktopTaskChangeListener(
            Context context, @DynamicOverride DesktopUserRepositories desktopUserRepositories) {
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            DesktopState desktopState) {
        if (ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()
                && DesktopModeStatus.canEnterDesktopMode(context)) {
                && desktopState.canEnterDesktopMode()) {
            return Optional.of(new DesktopTaskChangeListener(desktopUserRepositories));
        }
        return Optional.empty();
@@ -917,41 +924,37 @@ public abstract class WMShellModule {
    @WMSingleton
    @Provides
    static Optional<DesktopTasksLimiter> provideDesktopTasksLimiter(
            Context context,
            Transitions transitions,
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            ShellTaskOrganizer shellTaskOrganizer,
            DesksOrganizer desksOrganizer,
            InteractionJankMonitor interactionJankMonitor,
            @ShellMainThread Handler handler) {
        int maxTaskLimit = DesktopModeStatus.getMaxTaskLimit(context);
        if (!DesktopModeStatus.canEnterDesktopMode(context)
            DesktopConfig desktopConfig,
            DesktopState desktopState) {
        if (!desktopState.canEnterDesktopMode()
                || !ENABLE_DESKTOP_WINDOWING_TASK_LIMIT.isTrue()) {
            return Optional.empty();
        }
        int maxTaskLimit = desktopConfig.getMaxTaskLimit();
        return Optional.of(
                new DesktopTasksLimiter(
                        transitions,
                        desktopUserRepositories,
                        shellTaskOrganizer,
                        desksOrganizer,
                        maxTaskLimit <= 0 ? null : maxTaskLimit,
                        interactionJankMonitor,
                        context,
                        handler));
                        maxTaskLimit <= 0 ? null : maxTaskLimit));
    }

    @WMSingleton
    @Provides
    static Optional<DesktopImmersiveController> provideDesktopImmersiveController(
            Context context,
            ShellInit shellInit,
            Transitions transitions,
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            DisplayController displayController,
            ShellTaskOrganizer shellTaskOrganizer,
            ShellCommandHandler shellCommandHandler) {
        if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) {
            ShellCommandHandler shellCommandHandler,
            DesktopState desktopState) {
        if (desktopState.canEnterDesktopModeOrShowAppHandle()) {
            return Optional.of(
                    new DesktopImmersiveController(
                            shellInit,
@@ -980,14 +983,14 @@ public abstract class WMShellModule {
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            InteractionJankMonitor interactionJankMonitor,
            Optional<BubbleController> bubbleController,
            DisplayController displayController) {
            DesktopState desktopState) {
        return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue()
                ? new SpringDragToDesktopTransitionHandler(
                context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
                interactionJankMonitor, bubbleController, displayController)
                interactionJankMonitor, bubbleController, desktopState)
                : new DefaultDragToDesktopTransitionHandler(
                        context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
                        interactionJankMonitor, bubbleController, displayController);
                        interactionJankMonitor, bubbleController, desktopState);
    }

    @WMSingleton
@@ -1025,8 +1028,9 @@ public abstract class WMShellModule {
            ShellTaskOrganizer shellTaskOrganizer,
            FocusTransitionObserver focusTransitionObserver,
            @ShellMainThread ShellExecutor mainExecutor,
            DisplayController displayController) {
        if (DesktopModeStatus.canEnterDesktopMode(context)
            DisplayController displayController,
            DesktopState desktopState) {
        if (desktopState.canEnterDesktopMode()
                && manageKeyGestures()
                && (Flags.enableMoveToNextDisplayShortcut()
                || DesktopModeFlags.ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS.isTrue())) {
@@ -1229,18 +1233,18 @@ public abstract class WMShellModule {
    @Provides
    @DynamicOverride
    static DesktopUserRepositories provideDesktopUserRepositories(
            Context context,
            ShellInit shellInit,
            ShellController shellController,
            DesktopPersistentRepository desktopPersistentRepository,
            DesktopRepositoryInitializer desktopRepositoryInitializer,
            @ShellMainThread CoroutineScope mainScope,
            UserManager userManager
            UserManager userManager,
            DesktopState desktopState
    ) {
        return new DesktopUserRepositories(context, shellInit, shellController,
        return new DesktopUserRepositories(shellInit, shellController,
                desktopPersistentRepository,
                desktopRepositoryInitializer,
                mainScope, userManager);
                mainScope, userManager, desktopState);
    }

    @WMSingleton
@@ -1252,8 +1256,9 @@ public abstract class WMShellModule {
            TaskStackListenerImpl taskStackListener,
            ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler,
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            DisplayController displayController) {
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
            DisplayController displayController,
            DesktopState desktopState) {
        if (desktopState.canEnterDesktopMode()) {
            return Optional.of(
                    new DesktopActivityOrientationChangeHandler(
                            context,
@@ -1262,7 +1267,8 @@ public abstract class WMShellModule {
                            taskStackListener,
                            toggleResizeDesktopTaskTransitionHandler,
                            desktopUserRepositories,
                            displayController));
                            displayController,
                            desktopState));
        }
        return Optional.empty();
    }
@@ -1277,29 +1283,30 @@ public abstract class WMShellModule {
            Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler,
            Optional<BackAnimationController> backAnimationController,
            DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
            DesktopState desktopState,
            ShellInit shellInit) {
        return desktopUserRepositories.flatMap(
                repository ->
                        Optional.of(
                                new DesktopTasksTransitionObserver(
                                        context,
                                        repository,
                                        transitions,
                                        shellTaskOrganizer,
                                        desktopMixedTransitionHandler.get(),
                                        backAnimationController.get(),
                                        desktopWallpaperActivityTokenProvider,
                                        desktopState,
                                        shellInit)));
    }

    @WMSingleton
    @Provides
    static Optional<DesksTransitionObserver> provideDesksTransitionObserver(
            Context context,
            @DynamicOverride DesktopUserRepositories desktopUserRepositories,
            @NonNull DesksOrganizer desksOrganizer
            @NonNull DesksOrganizer desksOrganizer,
            DesktopState desktopState
    ) {
        if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) {
        if (desktopState.canEnterDesktopModeOrShowAppHandle()) {
            return Optional.of(
                    new DesksTransitionObserver(desktopUserRepositories, desksOrganizer));
        }
@@ -1319,10 +1326,11 @@ public abstract class WMShellModule {
            InteractionJankMonitor interactionJankMonitor,
            @ShellMainThread Handler handler,
            ShellInit shellInit,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            DesktopState desktopState
    ) {
        if (!DesktopModeStatus.canEnterDesktopMode(context)
                && !DesktopModeStatus.overridesShowAppHandle(context)) {
        if (!desktopState.canEnterDesktopMode()
                && !desktopState.overridesShowAppHandle()) {
            return Optional.empty();
        }
        return Optional.of(
@@ -1343,15 +1351,14 @@ public abstract class WMShellModule {
    @WMSingleton
    @Provides
    static DesktopModeLoggerTransitionObserver provideDesktopModeLoggerTransitionObserver(
            Context context,
            ShellInit shellInit,
            Transitions transitions,
            DesktopModeEventLogger desktopModeEventLogger,
            Optional<DesktopTasksLimiter> desktopTasksLimiter,
            ShellTaskOrganizer shellTaskOrganizer) {
            DesktopState desktopState) {
        return new DesktopModeLoggerTransitionObserver(
                context, shellInit, transitions, desktopModeEventLogger,
                desktopTasksLimiter, shellTaskOrganizer);
                shellInit, transitions, desktopModeEventLogger,
                desktopTasksLimiter, desktopState);
    }

    @WMSingleton
@@ -1363,7 +1370,6 @@ public abstract class WMShellModule {
    @WMSingleton
    @Provides
    static Optional<DesktopDisplayEventHandler> provideDesktopDisplayEventHandler(
            Context context,
            ShellInit shellInit,
            @ShellMainThread CoroutineScope mainScope,
            ShellController shellController,
@@ -1373,14 +1379,14 @@ public abstract class WMShellModule {
            Optional<DesktopTasksController> desktopTasksController,
            Optional<DesktopDisplayModeController> desktopDisplayModeController,
            DesktopRepositoryInitializer desktopRepositoryInitializer,
            Optional<DesksTransitionObserver> desksTransitionObserver
            Optional<DesksTransitionObserver> desksTransitionObserver,
            DesktopState desktopState
    ) {
        if (!DesktopModeStatus.canEnterDesktopMode(context)) {
        if (!desktopState.canEnterDesktopMode()) {
            return Optional.empty();
        }
        return Optional.of(
                new DesktopDisplayEventHandler(
                        context,
                        shellInit,
                        mainScope,
                        shellController,
@@ -1390,7 +1396,8 @@ public abstract class WMShellModule {
                        desktopUserRepositories.get(),
                        desktopTasksController.get(),
                        desktopDisplayModeController.get(),
                        desksTransitionObserver.get()));
                        desksTransitionObserver.get(),
                        desktopState));
    }

    @WMSingleton
@@ -1450,7 +1457,8 @@ public abstract class WMShellModule {
            DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController,
            @ShellMainThread CoroutineScope applicationScope,
            @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher,
            DesktopModeUiEventLogger desktopModeUiEventLogger) {
            DesktopModeUiEventLogger desktopModeUiEventLogger,
            DesktopState desktopState) {
        return new AppHandleEducationController(
                context,
                appHandleEducationFilter,
@@ -1459,7 +1467,8 @@ public abstract class WMShellModule {
                desktopWindowingEducationTooltipController,
                applicationScope,
                backgroundDispatcher,
                desktopModeUiEventLogger);
                desktopModeUiEventLogger,
                desktopState);
    }

    @WMSingleton
@@ -1487,11 +1496,12 @@ public abstract class WMShellModule {
            WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
            DesktopWindowingEducationPromoController desktopWindowingEducationPromoController,
            @ShellMainThread CoroutineScope applicationScope,
            @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher) {
            @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher,
            DesktopState desktopState) {
        return new AppToWebEducationController(context, appToWebEducationFilter,
                appToWebEducationDatastoreRepository, windowDecorCaptionHandleRepository,
                desktopWindowingEducationPromoController, applicationScope,
                backgroundDispatcher);
                backgroundDispatcher, desktopState);
    }

    @WMSingleton
@@ -1506,9 +1516,10 @@ public abstract class WMShellModule {
    static DesktopRepositoryInitializer provideDesktopRepositoryInitializer(
            Context context,
            DesktopPersistentRepository desktopPersistentRepository,
            @ShellMainThread CoroutineScope mainScope) {
            @ShellMainThread CoroutineScope mainScope,
            DesktopConfig desktopConfig) {
        return new DesktopRepositoryInitializerImpl(context, desktopPersistentRepository,
                mainScope);
                mainScope, desktopConfig);
    }

    @WMSingleton
@@ -1533,9 +1544,10 @@ public abstract class WMShellModule {
            DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
            InputManager inputManager,
            DisplayController displayController,
            @ShellMainThread Handler mainHandler
            @ShellMainThread Handler mainHandler,
            DesktopState desktopState
    ) {
        if (!DesktopModeStatus.canEnterDesktopMode(context)) {
        if (!desktopState.canEnterDesktopMode()) {
            return Optional.empty();
        }
        return Optional.of(
@@ -1550,7 +1562,8 @@ public abstract class WMShellModule {
                        desktopWallpaperActivityTokenProvider,
                        inputManager,
                        displayController,
                        mainHandler));
                        mainHandler,
                        desktopState));
    }

    @WMSingleton
@@ -1566,8 +1579,9 @@ public abstract class WMShellModule {
            @ShellMainThread ShellExecutor mainExecutor,
            @ShellAnimationThread ShellExecutor animExecutor,
            Context context,
            ShellInit shellInit) {
        if (!DesktopModeStatus.canEnterDesktopMode(context)) {
            ShellInit shellInit,
            DesktopState desktopState) {
        if (!desktopState.canEnterDesktopMode()) {
            return Optional.empty();
        }
        return Optional.of(
+3 −2
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.TaskStackListenerCallback
import com.android.wm.shell.common.TaskStackListenerImpl
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.desktopmode.DesktopState
import com.android.wm.shell.sysui.ShellInit

/** Handles task resizing to respect orientation change of non-resizeable activities in desktop. */
@@ -41,10 +41,11 @@ class DesktopActivityOrientationChangeHandler(
    private val resizeHandler: ToggleResizeDesktopTaskTransitionHandler,
    private val desktopUserRepositories: DesktopUserRepositories,
    private val displayController: DisplayController,
    private val desktopState: DesktopState,
) {

    init {
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
        if (desktopState.canEnterDesktopMode) {
            shellInit.addInitCallback({ onInit() }, this)
        }
    }
+3 −3
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import com.android.wm.shell.desktopmode.multidesks.OnDeskDisplayChangeListener
import com.android.wm.shell.desktopmode.multidesks.OnDeskRemovedListener
import com.android.wm.shell.desktopmode.persistence.DesktopRepositoryInitializer
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.desktopmode.DesktopState
import com.android.wm.shell.sysui.ShellController
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.sysui.UserChangeListener
@@ -39,7 +39,6 @@ import kotlinx.coroutines.launch

/** Handles display events in desktop mode */
class DesktopDisplayEventHandler(
    private val context: Context,
    shellInit: ShellInit,
    private val mainScope: CoroutineScope,
    private val shellController: ShellController,
@@ -50,6 +49,7 @@ class DesktopDisplayEventHandler(
    private val desktopTasksController: DesktopTasksController,
    private val desktopDisplayModeController: DesktopDisplayModeController,
    private val desksTransitionObserver: DesksTransitionObserver,
    private val desktopState: DesktopState,
) : OnDisplaysChangedListener, OnDeskRemovedListener, OnDeskDisplayChangeListener {

    init {
@@ -154,7 +154,7 @@ class DesktopDisplayEventHandler(

    // TODO: b/362720497 - connected/projected display considerations.
    private fun supportsDesks(displayId: Int): Boolean =
        DesktopModeStatus.canEnterDesktopMode(context)
        desktopState.isDesktopModeSupportedOnDisplay(displayId)

    private fun logV(msg: String, vararg arguments: Any?) {
        ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
+5 −15
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.desktopmode.desktopwallpaperactivity.DesktopWallpaperActivityTokenProvider
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.annotations.ShellMainThread
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.desktopmode.DesktopState
import com.android.wm.shell.sysui.ShellCommandHandler
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.Transitions
@@ -61,6 +61,7 @@ class DesktopDisplayModeController(
    private val inputManager: InputManager,
    private val displayController: DisplayController,
    @ShellMainThread private val mainHandler: Handler,
    private val desktopState: DesktopState,
) {

    /**
@@ -98,10 +99,7 @@ class DesktopDisplayModeController(
    fun updateExternalDisplayWindowingMode(displayId: Int) {
        if (!DesktopExperienceFlags.ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue) return

        val desktopModeSupported =
            displayController.getDisplay(displayId)?.let { display ->
                DesktopModeStatus.isDesktopModeSupportedOnDisplay(context, display)
            } ?: false
        val desktopModeSupported = desktopState.isDesktopModeSupportedOnDisplay(displayId)
        if (!desktopModeSupported) return

        // An external display should always be a freeform display when desktop mode is enabled.
@@ -230,11 +228,7 @@ class DesktopDisplayModeController(
            return rootTaskDisplayAreaOrganizer
                .getDisplayIds()
                .filter { it != DEFAULT_DISPLAY }
                .any { displayId ->
                    displayController.getDisplay(displayId)?.let { display ->
                        DesktopModeStatus.isDesktopModeSupportedOnDisplay(context, display)
                    } ?: false
                }
                .any { displayId -> desktopState.isDesktopModeSupportedOnDisplay(displayId) }
        }

        return 0 !=
@@ -263,11 +257,7 @@ class DesktopDisplayModeController(
        }

    private fun isDefaultDisplayDesktopEligible(): Boolean {
        val display =
            requireNotNull(displayController.getDisplay(DEFAULT_DISPLAY)) {
                "Display object of DEFAULT_DISPLAY must be non-null."
            }
        return DesktopModeStatus.isDesktopModeSupportedOnDisplay(context, display)
        return desktopState.isDesktopModeSupportedOnDisplay(DEFAULT_DISPLAY)
    }

    private fun logV(msg: String, vararg arguments: Any?) {
+3 −6
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.app.ActivityManager.RunningTaskInfo
import android.app.ActivityTaskManager.INVALID_TASK_ID
import android.app.TaskInfo
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.content.Context
import android.os.IBinder
import android.os.SystemProperties
import android.os.Trace
@@ -38,7 +37,6 @@ import androidx.core.util.isNotEmpty
import androidx.core.util.plus
import androidx.core.util.putAll
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.FocusReason
@@ -54,7 +52,7 @@ import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.TransitionUtil
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.desktopmode.DesktopState
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.Transitions
import java.util.Optional
@@ -66,16 +64,15 @@ import kotlin.jvm.optionals.getOrNull
 * and other transitions that originate both within and outside shell.
 */
class DesktopModeLoggerTransitionObserver(
    context: Context,
    shellInit: ShellInit,
    private val transitions: Transitions,
    private val desktopModeEventLogger: DesktopModeEventLogger,
    private val desktopTasksLimiter: Optional<DesktopTasksLimiter>,
    private val shellTaskOrganizer: ShellTaskOrganizer,
    desktopState: DesktopState,
) : Transitions.TransitionObserver {

    init {
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
        if (desktopState.canEnterDesktopMode) {
            shellInit.addInitCallback(this::onInit, this)
        }
    }
Loading