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

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

Stop using DesktopModeStatus in DisplayController

Bug: 395863348
Flag: EXEMPT (refactor)
Test: atest WMShellUnitTests
Change-Id: I8950ba4dca01138c79f3b41e36784c88a97c7c87
parent 97dba1b5
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ import androidx.annotation.BinderThread;

import com.android.wm.shell.common.DisplayChangeController.OnDisplayChangingListener;
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.ShellInit;

import java.util.ArrayList;
@@ -63,6 +63,7 @@ public class DisplayController {
    private final DisplayManager mDisplayManager;
    private final DisplayChangeController mChangeController;
    private final IDisplayWindowListener mDisplayContainerListener;
    private final DesktopState mDesktopState;

    private final SparseArray<DisplayRecord> mDisplays = new SparseArray<>();
    private final ArrayList<OnDisplaysChangedListener> mDisplayChangedListeners = new ArrayList<>();
@@ -70,11 +71,13 @@ public class DisplayController {
    private DisplayTopology mDisplayTopology;

    public DisplayController(Context context, IWindowManager wmService, ShellInit shellInit,
            ShellExecutor mainExecutor, DisplayManager displayManager) {
            ShellExecutor mainExecutor, DisplayManager displayManager,
            DesktopState desktopState) {
        mMainExecutor = mainExecutor;
        mContext = context;
        mWmService = wmService;
        mDisplayManager = displayManager;
        mDesktopState = desktopState;
        // TODO: Inject this instead
        mChangeController = new DisplayChangeController(mWmService, shellInit, mainExecutor);
        mDisplayContainerListener = new DisplayWindowListenerImpl();
@@ -94,7 +97,7 @@ public class DisplayController {
            }

            if (DesktopExperienceFlags.ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG.isTrue()
                    && DesktopModeStatus.canEnterDesktopMode(mContext)) {
                    && mDesktopState.canEnterDesktopMode()) {
                mDisplayManager.registerTopologyListener(mMainExecutor,
                        this::onDisplayTopologyChanged);
                onDisplayTopologyChanged(mDisplayManager.getDisplayTopology());
+10 −7
Original line number Diff line number Diff line
@@ -120,7 +120,6 @@ import com.android.wm.shell.shared.annotations.ShellSplashscreenThread;
import com.android.wm.shell.shared.desktopmode.DesktopConfig;
import com.android.wm.shell.shared.desktopmode.DesktopConfigImpl;
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.shared.desktopmode.DesktopStateImpl;
import com.android.wm.shell.splitscreen.SplitScreen;
@@ -185,8 +184,10 @@ public abstract class WMShellBaseModule {
            IWindowManager wmService,
            ShellInit shellInit,
            @ShellMainThread ShellExecutor mainExecutor,
            DisplayManager displayManager) {
        return new DisplayController(context, wmService, shellInit, mainExecutor, displayManager);
            DisplayManager displayManager,
            DesktopState desktopState) {
        return new DisplayController(context, wmService, shellInit, mainExecutor, displayManager,
                desktopState);
    }

    @WMSingleton
@@ -1043,13 +1044,14 @@ public abstract class WMShellBaseModule {

    @WMSingleton
    @Provides
    static Optional<DesktopTasksController> providesDesktopTasksController(Context context,
    static Optional<DesktopTasksController> providesDesktopTasksController(
            DesktopState desktopState,
            @DynamicOverride Optional<Lazy<DesktopTasksController>> desktopTasksController) {
        // Use optional-of-lazy for the dependency that this provider relies on.
        // Lazy ensures that this provider will not be the cause the dependency is created
        // when it will not be returned due to the condition below.
        return desktopTasksController.flatMap((lazy) -> {
            if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) {
            if (desktopState.canEnterDesktopModeOrShowAppHandle()) {
                return Optional.of(lazy.get());
            }
            return Optional.empty();
@@ -1062,13 +1064,14 @@ public abstract class WMShellBaseModule {

    @WMSingleton
    @Provides
    static Optional<DesktopUserRepositories> provideDesktopUserRepositories(Context context,
    static Optional<DesktopUserRepositories> provideDesktopUserRepositories(
            DesktopState desktopState,
            @DynamicOverride Optional<Lazy<DesktopUserRepositories>> desktopUserRepositories) {
        // Use optional-of-lazy for the dependency that this provider relies on.
        // Lazy ensures that this provider will not be the cause the dependency is created
        // when it will not be returned due to the condition below.
        return desktopUserRepositories.flatMap((lazy) -> {
            if (DesktopModeStatus.canEnterDesktopMode(context)) {
            if (desktopState.canEnterDesktopMode()) {
                return Optional.of(lazy.get());
            }
            return Optional.empty();
+17 −27
Original line number Diff line number Diff line
@@ -47,12 +47,10 @@ import android.view.IWindowManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;

import com.android.dx.mockito.inline.extended.ExtendedMockito;
import com.android.dx.mockito.inline.extended.StaticMockitoSession;
import com.android.window.flags.Flags;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestSyncExecutor;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import com.android.wm.shell.shared.desktopmode.FakeDesktopState;
import com.android.wm.shell.sysui.ShellInit;

import org.junit.After;
@@ -60,7 +58,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.quality.Strictness;
import org.mockito.MockitoAnnotations;

import java.util.function.Consumer;

@@ -78,25 +76,22 @@ public class DisplayControllerTests extends ShellTestCase {
    @Mock private DisplayManager mDisplayManager;
    @Mock private DisplayTopology mMockTopology;
    @Mock private DisplayController.OnDisplaysChangedListener mListener;
    private StaticMockitoSession mMockitoSession;
    private TestSyncExecutor mMainExecutor;
    private IDisplayWindowListener mDisplayContainerListener;
    private Consumer<DisplayTopology> mCapturedTopologyListener;
    private Display mMockDisplay;
    private DisplayController mController;
    private FakeDesktopState mDesktopState;
    private static final int DISPLAY_ID_0 = 0;
    private static final int DISPLAY_ID_1 = 1;
    private static final RectF DISPLAY_ABS_BOUNDS_0 = new RectF(10, 10, 20, 20);
    private static final RectF DISPLAY_ABS_BOUNDS_1 = new RectF(11, 11, 22, 22);
    private AutoCloseable mMocksInit = null;

    @Before
    public void setUp() throws RemoteException {
        mMockitoSession =
                ExtendedMockito.mockitoSession()
                        .initMocks(this)
                        .mockStatic(DesktopModeStatus.class)
                        .strictness(Strictness.LENIENT)
                        .startMocking();
        mDesktopState = new FakeDesktopState();
        mMocksInit = MockitoAnnotations.openMocks(this);

        mContext = spy(new TestableContext(
                androidx.test.platform.app.InstrumentationRegistry.getInstrumentation()
@@ -104,7 +99,7 @@ public class DisplayControllerTests extends ShellTestCase {

        mMainExecutor = new TestSyncExecutor();
        mController = new DisplayController(
                mContext, mWM, mShellInit, mMainExecutor, mDisplayManager);
                mContext, mWM, mShellInit, mMainExecutor, mDisplayManager, mDesktopState);

        mMockDisplay = mock(Display.class);
        when(mMockDisplay.getDisplayAdjustments()).thenReturn(
@@ -126,9 +121,10 @@ public class DisplayControllerTests extends ShellTestCase {
    }

    @After
    public void tearDown() {
        if (mMockitoSession != null) {
            mMockitoSession.finishMocking();
    public void tearDown() throws Exception {
        if (mMocksInit != null) {
            mMocksInit.close();
            mMocksInit = null;
        }
    }

@@ -140,8 +136,7 @@ public class DisplayControllerTests extends ShellTestCase {
    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG)
    public void onInit_canEnterDesktopMode_registerListeners() throws RemoteException {
        ExtendedMockito.doReturn(true)
                .when(() -> DesktopModeStatus.canEnterDesktopMode(any()));
        mDesktopState.setCanEnterDesktopMode(true);

        mController.onInit();

@@ -154,8 +149,7 @@ public class DisplayControllerTests extends ShellTestCase {
    @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG)
    public void onInit_canNotEnterDesktopMode_onlyRegisterDisplayWindowListener()
            throws RemoteException {
        ExtendedMockito.doReturn(false)
                .when(() -> DesktopModeStatus.canEnterDesktopMode(any()));
        mDesktopState.setCanEnterDesktopMode(false);

        mController.onInit();

@@ -167,8 +161,7 @@ public class DisplayControllerTests extends ShellTestCase {
    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG)
    public void addDisplayWindowListener_notifiesExistingDisplaysAndTopology() {
        ExtendedMockito.doReturn(true)
                .when(() -> DesktopModeStatus.canEnterDesktopMode(any()));
        mDesktopState.setCanEnterDesktopMode(true);

        mController.onInit();
        mController.addDisplayWindowListener(mListener);
@@ -198,8 +191,7 @@ public class DisplayControllerTests extends ShellTestCase {
    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG)
    public void onDisplayTopologyChanged_updateDisplayLayout() throws RemoteException {
        ExtendedMockito.doReturn(true)
                .when(() -> DesktopModeStatus.canEnterDesktopMode(any()));
        mDesktopState.setCanEnterDesktopMode(true);
        mController.onInit();
        mController.addDisplayWindowListener(mListener);
        mDisplayContainerListener.onDisplayAdded(DISPLAY_ID_1);
@@ -216,8 +208,7 @@ public class DisplayControllerTests extends ShellTestCase {
    @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG)
    public void onDisplayTopologyChanged_topologyBeforeDisplayAdded_appliesBoundsOnAdd()
            throws RemoteException {
        ExtendedMockito.doReturn(true)
                .when(() -> DesktopModeStatus.canEnterDesktopMode(any()));
        mDesktopState.setCanEnterDesktopMode(true);
        mController.onInit();
        mController.addDisplayWindowListener(mListener);

@@ -237,8 +228,7 @@ public class DisplayControllerTests extends ShellTestCase {
    @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG)
    public void onDisplayConfigurationChanged_reInitDisplayLayout()
            throws RemoteException {
        ExtendedMockito.doReturn(true)
                .when(() -> DesktopModeStatus.canEnterDesktopMode(any()));
        mDesktopState.setCanEnterDesktopMode(true);
        mController.onInit();
        mController.addDisplayWindowListener(mListener);