Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java +6 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<>(); Loading @@ -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(); Loading @@ -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()); Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +10 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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(); Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayControllerTests.java +17 −27 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() Loading @@ -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( Loading @@ -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; } } Loading @@ -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(); Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java +6 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<>(); Loading @@ -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(); Loading @@ -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()); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +10 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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(); Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayControllerTests.java +17 −27 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() Loading @@ -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( Loading @@ -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; } } Loading @@ -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(); Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading