Merge "Only create DesktopModeController when flag is on" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
64e177c029
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user