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

Commit 92158009 authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille Committed by Android (Google) Code Review
Browse files

Merge "Stop using DesktopModeStatus in desktopmode itself." into main

parents 40af2bbb a9228cf0
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