Merge "Only create DesktopModeController when flag is on" into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2022-12-06 06:44:30 +00:00
committed by Android (Google) Code Review
7 changed files with 57 additions and 24 deletions

View File

@@ -687,10 +687,13 @@ public abstract class WMShellBaseModule {
@WMSingleton @WMSingleton
@Provides @Provides
static Optional<DesktopModeController> providesDesktopModeController( static Optional<DesktopModeController> provideDesktopModeController(
@DynamicOverride Optional<DesktopModeController> desktopModeController) { @DynamicOverride Optional<Lazy<DesktopModeController>> desktopModeController) {
// 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.
if (DesktopModeStatus.IS_SUPPORTED) { if (DesktopModeStatus.IS_SUPPORTED) {
return desktopModeController; return desktopModeController.map(Lazy::get);
} }
return Optional.empty(); return Optional.empty();
} }
@@ -701,10 +704,13 @@ public abstract class WMShellBaseModule {
@WMSingleton @WMSingleton
@Provides @Provides
static Optional<DesktopModeTaskRepository> providesDesktopTaskRepository( static Optional<DesktopModeTaskRepository> provideDesktopTaskRepository(
@DynamicOverride Optional<DesktopModeTaskRepository> desktopModeTaskRepository) { @DynamicOverride Optional<Lazy<DesktopModeTaskRepository>> desktopModeTaskRepository) {
// 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.
if (DesktopModeStatus.IS_SUPPORTED) { if (DesktopModeStatus.IS_SUPPORTED) {
return desktopModeTaskRepository; return desktopModeTaskRepository.map(Lazy::get);
} }
return Optional.empty(); return Optional.empty();
} }

View File

@@ -189,7 +189,7 @@ public abstract class WMShellModule {
ShellTaskOrganizer taskOrganizer, ShellTaskOrganizer taskOrganizer,
DisplayController displayController, DisplayController displayController,
SyncTransactionQueue syncQueue, SyncTransactionQueue syncQueue,
@DynamicOverride DesktopModeController desktopModeController) { Optional<DesktopModeController> desktopModeController) {
return new CaptionWindowDecorViewModel( return new CaptionWindowDecorViewModel(
context, context,
mainHandler, mainHandler,

View File

@@ -100,7 +100,9 @@ public class DesktopModeController implements RemoteCallable<DesktopModeControll
mDesktopModeTaskRepository = desktopModeTaskRepository; mDesktopModeTaskRepository = desktopModeTaskRepository;
mMainExecutor = mainExecutor; mMainExecutor = mainExecutor;
mSettingsObserver = new SettingsObserver(mContext, mainHandler); mSettingsObserver = new SettingsObserver(mContext, mainHandler);
shellInit.addInitCallback(this::onInit, this); if (DesktopModeStatus.isSupported()) {
shellInit.addInitCallback(this::onInit, this);
}
} }
private void onInit() { private void onInit() {

View File

@@ -36,6 +36,13 @@ public class DesktopModeStatus {
public static final boolean IS_SUPPORTED = SystemProperties.getBoolean( public static final boolean IS_SUPPORTED = SystemProperties.getBoolean(
"persist.wm.debug.desktop_mode", false); "persist.wm.debug.desktop_mode", false);
/**
* Return {@code true} if desktop mode support is enabled
*/
public static boolean isSupported() {
return IS_SUPPORTED;
}
/** /**
* Check if desktop mode is active * Check if desktop mode is active
* *
@@ -54,4 +61,5 @@ public class DesktopModeStatus {
return false; return false;
} }
} }
} }

View File

@@ -55,6 +55,7 @@ import com.android.wm.shell.desktopmode.DesktopModeStatus;
import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter;
import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.transition.Transitions;
import java.util.Optional;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
@@ -74,7 +75,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
private final DisplayController mDisplayController; private final DisplayController mDisplayController;
private final SyncTransactionQueue mSyncQueue; private final SyncTransactionQueue mSyncQueue;
private FreeformTaskTransitionStarter mTransitionStarter; private FreeformTaskTransitionStarter mTransitionStarter;
private DesktopModeController mDesktopModeController; private Optional<DesktopModeController> mDesktopModeController;
private boolean mTransitionDragActive; private boolean mTransitionDragActive;
private SparseArray<EventReceiver> mEventReceiversByDisplay = new SparseArray<>(); private SparseArray<EventReceiver> mEventReceiversByDisplay = new SparseArray<>();
@@ -90,7 +91,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
ShellTaskOrganizer taskOrganizer, ShellTaskOrganizer taskOrganizer,
DisplayController displayController, DisplayController displayController,
SyncTransactionQueue syncQueue, SyncTransactionQueue syncQueue,
DesktopModeController desktopModeController) { Optional<DesktopModeController> desktopModeController) {
this( this(
context, context,
mainHandler, mainHandler,
@@ -110,7 +111,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
ShellTaskOrganizer taskOrganizer, ShellTaskOrganizer taskOrganizer,
DisplayController displayController, DisplayController displayController,
SyncTransactionQueue syncQueue, SyncTransactionQueue syncQueue,
DesktopModeController desktopModeController, Optional<DesktopModeController> desktopModeController,
CaptionWindowDecoration.Factory captionWindowDecorFactory, CaptionWindowDecoration.Factory captionWindowDecorFactory,
Supplier<InputManager> inputManagerSupplier) { Supplier<InputManager> inputManagerSupplier) {
@@ -246,10 +247,10 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
} else if (id == R.id.caption_handle) { } else if (id == R.id.caption_handle) {
decoration.createHandleMenu(); decoration.createHandleMenu();
} else if (id == R.id.desktop_button) { } else if (id == R.id.desktop_button) {
mDesktopModeController.setDesktopModeActive(true); mDesktopModeController.ifPresent(c -> c.setDesktopModeActive(true));
decoration.closeHandleMenu(); decoration.closeHandleMenu();
} else if (id == R.id.fullscreen_button) { } else if (id == R.id.fullscreen_button) {
mDesktopModeController.setDesktopModeActive(false); mDesktopModeController.ifPresent(c -> c.setDesktopModeActive(false));
decoration.closeHandleMenu(); decoration.closeHandleMenu();
decoration.setButtonVisibility(); decoration.setButtonVisibility();
} }
@@ -304,9 +305,9 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
*/ */
private void handleEventForMove(MotionEvent e) { private void handleEventForMove(MotionEvent e) {
RunningTaskInfo taskInfo = mTaskOrganizer.getRunningTaskInfo(mTaskId); RunningTaskInfo taskInfo = mTaskOrganizer.getRunningTaskInfo(mTaskId);
int windowingMode = mDesktopModeController if (mDesktopModeController.isPresent()
.getDisplayAreaWindowingMode(taskInfo.displayId); && mDesktopModeController.get().getDisplayAreaWindowingMode(taskInfo.displayId)
if (windowingMode == WINDOWING_MODE_FULLSCREEN) { == WINDOWING_MODE_FULLSCREEN) {
return; return;
} }
switch (e.getActionMasked()) { switch (e.getActionMasked()) {
@@ -331,7 +332,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx)); e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx));
if (e.getRawY(dragPointerIdx) <= statusBarHeight if (e.getRawY(dragPointerIdx) <= statusBarHeight
&& DesktopModeStatus.isActive(mContext)) { && DesktopModeStatus.isActive(mContext)) {
mDesktopModeController.setDesktopModeActive(false); mDesktopModeController.ifPresent(c -> c.setDesktopModeActive(false));
} }
break; break;
} }
@@ -471,7 +472,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
int statusBarHeight = mDisplayController int statusBarHeight = mDisplayController
.getDisplayLayout(focusedDecor.mTaskInfo.displayId).stableInsets().top; .getDisplayLayout(focusedDecor.mTaskInfo.displayId).stableInsets().top;
if (ev.getY() > statusBarHeight) { if (ev.getY() > statusBarHeight) {
mDesktopModeController.setDesktopModeActive(true); mDesktopModeController.ifPresent(c -> c.setDesktopModeActive(true));
return; return;
} }
} }

View File

@@ -36,7 +36,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -100,15 +100,14 @@ public class DesktopModeControllerTest extends ShellTestCase {
@Before @Before
public void setUp() { public void setUp() {
mMockitoSession = mockitoSession().mockStatic(DesktopModeStatus.class).startMocking(); mMockitoSession = mockitoSession().mockStatic(DesktopModeStatus.class).startMocking();
when(DesktopModeStatus.isSupported()).thenReturn(true);
when(DesktopModeStatus.isActive(any())).thenReturn(true); when(DesktopModeStatus.isActive(any())).thenReturn(true);
mShellInit = Mockito.spy(new ShellInit(mTestExecutor)); mShellInit = Mockito.spy(new ShellInit(mTestExecutor));
mDesktopModeTaskRepository = new DesktopModeTaskRepository(); mDesktopModeTaskRepository = new DesktopModeTaskRepository();
mController = new DesktopModeController(mContext, mShellInit, mShellController, mController = createController();
mShellTaskOrganizer, mRootTaskDisplayAreaOrganizer, mTransitions,
mDesktopModeTaskRepository, mMockHandler, new TestShellExecutor());
when(mShellTaskOrganizer.getRunningTasks(anyInt())).thenReturn(new ArrayList<>()); when(mShellTaskOrganizer.getRunningTasks(anyInt())).thenReturn(new ArrayList<>());
@@ -125,7 +124,17 @@ public class DesktopModeControllerTest extends ShellTestCase {
@Test @Test
public void instantiate_addInitCallback() { public void instantiate_addInitCallback() {
verify(mShellInit, times(1)).addInitCallback(any(), any()); verify(mShellInit).addInitCallback(any(), any());
}
@Test
public void instantiate_flagOff_doNotAddInitCallback() {
when(DesktopModeStatus.isSupported()).thenReturn(false);
clearInvocations(mShellInit);
createController();
verify(mShellInit, never()).addInitCallback(any(), any());
} }
@Test @Test
@@ -353,6 +362,12 @@ public class DesktopModeControllerTest extends ShellTestCase {
assertThat(wct).isNotNull(); assertThat(wct).isNotNull();
} }
private DesktopModeController createController() {
return new DesktopModeController(mContext, mShellInit, mShellController,
mShellTaskOrganizer, mRootTaskDisplayAreaOrganizer, mTransitions,
mDesktopModeTaskRepository, mMockHandler, new TestShellExecutor());
}
private DisplayAreaInfo createMockDisplayArea() { private DisplayAreaInfo createMockDisplayArea() {
DisplayAreaInfo displayAreaInfo = new DisplayAreaInfo(new MockToken().mToken, DisplayAreaInfo displayAreaInfo = new DisplayAreaInfo(new MockToken().mToken,
mContext.getDisplayId(), 0); mContext.getDisplayId(), 0);

View File

@@ -54,6 +54,7 @@ import org.mockito.Mock;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.function.Supplier; import java.util.function.Supplier;
/** Tests of {@link CaptionWindowDecorViewModel} */ /** Tests of {@link CaptionWindowDecorViewModel} */
@@ -101,7 +102,7 @@ public class CaptionWindowDecorViewModelTests extends ShellTestCase {
mTaskOrganizer, mTaskOrganizer,
mDisplayController, mDisplayController,
mSyncQueue, mSyncQueue,
mDesktopModeController, Optional.of(mDesktopModeController),
mCaptionWindowDecorFactory, mCaptionWindowDecorFactory,
new MockObjectSupplier<>(mMockInputManagers, () -> mock(InputManager.class))); new MockObjectSupplier<>(mMockInputManagers, () -> mock(InputManager.class)));
mCaptionWindowDecorViewModel.setEventReceiverFactory(mEventReceiverFactory); mCaptionWindowDecorViewModel.setEventReceiverFactory(mEventReceiverFactory);