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

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

Stop using DesktopModeStatus in 'freeform'

Bug: 395863348
Test: atest WMShellUnitTests
Flag: EXEMPT (refactor)
Change-Id: I74f2bad4ce20eaa7c9e216dc0682a084d42ba93d
parent 18603294
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -668,8 +668,8 @@ public abstract class WMShellBaseModule {
    @Provides
    static Optional<FreeformComponents> provideFreeformComponents(
            @DynamicOverride Optional<FreeformComponents> freeformComponents,
            Context context) {
        if (FreeformComponents.requiresFreeformComponents(context)) {
            DesktopState desktopState) {
        if (FreeformComponents.requiresFreeformComponents(desktopState)) {
            return freeformComponents;
        }
        return Optional.empty();
+15 −15
Original line number Diff line number Diff line
@@ -151,7 +151,6 @@ 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;
@@ -411,10 +410,12 @@ public abstract class WMShellModule {
    static WindowDecorViewHostSupplier<WindowDecorViewHost> provideWindowDecorViewHostSupplier(
            @NonNull Context context,
            @ShellMainThread @NonNull CoroutineScope mainScope,
            @NonNull ShellInit shellInit) {
        final int poolSize = DesktopModeStatus.getWindowDecorScvhPoolSize(context);
        final int preWarmSize = DesktopModeStatus.getWindowDecorPreWarmSize();
        if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context) && poolSize > 0) {
            @NonNull ShellInit shellInit,
            DesktopState desktopState,
            DesktopConfig desktopConfig) {
        final int poolSize = desktopConfig.getWindowDecorScvhPoolSize();
        final int preWarmSize = desktopConfig.getWindowDecorPreWarmSize();
        if (desktopState.canEnterDesktopModeOrShowAppHandle() && poolSize > 0) {
            return new PooledWindowDecorViewHostSupplier(
                    context, mainScope, shellInit, poolSize, preWarmSize);
        }
@@ -451,20 +452,19 @@ public abstract class WMShellModule {
            DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver,
            LaunchAdjacentController launchAdjacentController,
            WindowDecorViewModel windowDecorViewModel,
            Optional<TaskChangeListener> taskChangeListener) {
        // TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
        //                    override for this controller from the base module
        ShellInit init = FreeformComponents.requiresFreeformComponents(context) ? shellInit : null;
            Optional<TaskChangeListener> taskChangeListener,
            DesktopState desktopState) {
        return new FreeformTaskListener(
                context,
                init,
                shellInit,
                shellTaskOrganizer,
                desktopUserRepositories,
                desktopTasksController,
                desktopModeLoggerTransitionObserver,
                launchAdjacentController,
                windowDecorViewModel,
                taskChangeListener);
                taskChangeListener,
                desktopState);
    }

    @WMSingleton
@@ -482,23 +482,23 @@ public abstract class WMShellModule {
    @WMSingleton
    @Provides
    static FreeformTaskTransitionObserver provideFreeformTaskTransitionObserver(
            Context context,
            ShellInit shellInit,
            Transitions transitions,
            Optional<DesktopImmersiveController> desktopImmersiveController,
            WindowDecorViewModel windowDecorViewModel,
            Optional<TaskChangeListener> taskChangeListener,
            FocusTransitionObserver focusTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver) {
            Optional<DesksTransitionObserver> desksTransitionObserver,
            DesktopState desktopState) {
        return new FreeformTaskTransitionObserver(
                context,
                shellInit,
                transitions,
                desktopImmersiveController,
                windowDecorViewModel,
                taskChangeListener,
                focusTransitionObserver,
                desksTransitionObserver);
                desksTransitionObserver,
                desktopState);
    }

    @WMSingleton
+3 −18
Original line number Diff line number Diff line
@@ -16,14 +16,8 @@

package com.android.wm.shell.freeform;

import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;

import android.content.Context;
import android.provider.Settings;

import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import com.android.wm.shell.shared.desktopmode.DesktopState;
import com.android.wm.shell.transition.Transitions;

import java.util.Optional;
@@ -52,20 +46,11 @@ public class FreeformComponents {
        mTransitionStarterInitializer = transitionStarterInitializer;
    }

    /**
     * Returns if this device supports freeform.
     */
    public static boolean isFreeformEnabled(Context context) {
        return context.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT)
                || Settings.Global.getInt(context.getContentResolver(),
                DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
    }

    /**
     * Freeform is enabled or we need the components to enable the app handle when desktop mode is
     * not enabled
     */
    public static boolean requiresFreeformComponents(Context context) {
        return isFreeformEnabled(context) || DesktopModeStatus.overridesShowAppHandle(context);
    public static boolean requiresFreeformComponents(DesktopState desktopState) {
        return desktopState.isFreeformEnabled() || desktopState.overridesShowAppHandle();
    }
}
+11 −8
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ import com.android.wm.shell.desktopmode.DesktopRepository;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.desktopmode.DesktopUserRepositories;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
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.windowdecor.WindowDecorViewModel;

@@ -58,6 +58,7 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,
    private final WindowDecorViewModel mWindowDecorationViewModel;
    private final LaunchAdjacentController mLaunchAdjacentController;
    private final Optional<TaskChangeListener> mTaskChangeListener;
    private final DesktopState mDesktopState;

    private final SparseArray<State> mTasks = new SparseArray<>();

@@ -70,7 +71,8 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,
            DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver,
            LaunchAdjacentController launchAdjacentController,
            WindowDecorViewModel windowDecorationViewModel,
            Optional<TaskChangeListener> taskChangeListener) {
            Optional<TaskChangeListener> taskChangeListener,
            DesktopState desktopState) {
        mContext = context;
        mShellTaskOrganizer = shellTaskOrganizer;
        mWindowDecorationViewModel = windowDecorationViewModel;
@@ -79,14 +81,15 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,
        mDesktopModeLoggerTransitionObserver = desktopModeLoggerTransitionObserver;
        mLaunchAdjacentController = launchAdjacentController;
        mTaskChangeListener = taskChangeListener;
        if (shellInit != null) {
        mDesktopState = desktopState;
        if (FreeformComponents.requiresFreeformComponents(desktopState)) {
            shellInit.addInitCallback(this::onInit, this);
        }
    }

    private void onInit() {
        mShellTaskOrganizer.addListenerForType(this, TASK_LISTENER_TYPE_FREEFORM);
        if (DesktopModeStatus.canEnterDesktopMode(mContext)) {
        if (mDesktopState.canEnterDesktopMode()) {
            mShellTaskOrganizer.addFocusListener(this);
        }
    }
@@ -104,7 +107,7 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,
        mTasks.put(taskInfo.taskId, state);

        if (!DesktopModeFlags.ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue() &&
                DesktopModeStatus.canEnterDesktopMode(mContext)) {
                mDesktopState.canEnterDesktopMode()) {
            mDesktopUserRepositories.ifPresent(userRepositories -> {
                DesktopRepository currentRepo = userRepositories.getProfile(taskInfo.userId);
                currentRepo.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible);
@@ -120,7 +123,7 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,
        mTasks.remove(taskInfo.taskId);

        if (!DesktopModeFlags.ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue() &&
                DesktopModeStatus.canEnterDesktopMode(mContext)
                mDesktopState.canEnterDesktopMode()
                && mDesktopUserRepositories.isPresent()) {
            DesktopRepository repository =
                    mDesktopUserRepositories.get().getProfile(taskInfo.userId);
@@ -155,7 +158,7 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,
        mDesktopTasksController.ifPresent(c -> c.onTaskInfoChanged(taskInfo));
        mWindowDecorationViewModel.onTaskInfoChanged(taskInfo);
        state.mTaskInfo = taskInfo;
        if (DesktopModeStatus.canEnterDesktopMode(mContext)) {
        if (mDesktopState.canEnterDesktopMode()) {
            if (DesktopModeFlags.ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()) {
                // Pass task info changes to the [TaskChangeListener] since [TransitionsObserver]
                // does not propagate all task info changes.
@@ -195,7 +198,7 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,
        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG,
                "Freeform Task Focus Changed: #%d focused=%b",
                taskInfo.taskId, taskInfo.isFocused);
        if (DesktopModeStatus.canEnterDesktopMode(mContext) && taskInfo.isFocused
        if (mDesktopState.canEnterDesktopMode() && taskInfo.isFocused
                && mDesktopUserRepositories.isPresent()) {
            DesktopRepository repository =
                mDesktopUserRepositories.get().getProfile(taskInfo.userId);
+4 −4
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.wm.shell.freeform;

import android.app.ActivityManager;
import android.content.Context;
import android.os.IBinder;
import android.view.SurfaceControl;
import android.view.WindowManager;
@@ -30,6 +29,7 @@ import androidx.annotation.VisibleForTesting;

import com.android.wm.shell.desktopmode.DesktopImmersiveController;
import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver;
import com.android.wm.shell.shared.desktopmode.DesktopState;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.FocusTransitionObserver;
import com.android.wm.shell.transition.Transitions;
@@ -59,21 +59,21 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
            new HashMap<>();

    public FreeformTaskTransitionObserver(
            Context context,
            ShellInit shellInit,
            Transitions transitions,
            Optional<DesktopImmersiveController> desktopImmersiveController,
            WindowDecorViewModel windowDecorViewModel,
            Optional<TaskChangeListener> taskChangeListener,
            FocusTransitionObserver focusTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver) {
            Optional<DesksTransitionObserver> desksTransitionObserver,
            DesktopState desktopState) {
        mTransitions = transitions;
        mDesktopImmersiveController = desktopImmersiveController;
        mWindowDecorViewModel = windowDecorViewModel;
        mTaskChangeListener = taskChangeListener;
        mFocusTransitionObserver = focusTransitionObserver;
        mDesksTransitionObserver = desksTransitionObserver;
        if (FreeformComponents.requiresFreeformComponents(context)) {
        if (FreeformComponents.requiresFreeformComponents(desktopState)) {
            shellInit.addInitCallback(this::onInit, this);
        }
    }
Loading