4/ Separate construction and initializing in a few more controllers
- To be inline with other controllers, we should be doing setup work on initialization and not on construction Test: atest WMShellUnitTests Test: atest SystemUITests Bug: 238217847 Change-Id: Ifb9924a7704e6089286bb7aa1077bf01a0316de2
This commit is contained in:
@@ -57,6 +57,7 @@ import com.android.wm.shell.common.RemoteCallable;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.annotations.ShellBackgroundThread;
|
||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@@ -90,7 +91,6 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
|
||||
* Raw delta between {@link #mInitTouchLocation} and the last touch location.
|
||||
*/
|
||||
private final Point mTouchEventDelta = new Point();
|
||||
private final ShellExecutor mShellExecutor;
|
||||
|
||||
/** True when a back gesture is ongoing */
|
||||
private boolean mBackGestureStarted = false;
|
||||
@@ -105,6 +105,9 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
|
||||
private final SurfaceControl.Transaction mTransaction;
|
||||
private final IActivityTaskManager mActivityTaskManager;
|
||||
private final Context mContext;
|
||||
private final ContentResolver mContentResolver;
|
||||
private final ShellExecutor mShellExecutor;
|
||||
private final Handler mBgHandler;
|
||||
@Nullable
|
||||
private IOnBackInvokedCallback mBackToLauncherCallback;
|
||||
private float mTriggerThreshold;
|
||||
@@ -133,16 +136,19 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
|
||||
};
|
||||
|
||||
public BackAnimationController(
|
||||
@NonNull ShellInit shellInit,
|
||||
@NonNull @ShellMainThread ShellExecutor shellExecutor,
|
||||
@NonNull @ShellBackgroundThread Handler backgroundHandler,
|
||||
Context context) {
|
||||
this(shellExecutor, backgroundHandler, new SurfaceControl.Transaction(),
|
||||
this(shellInit, shellExecutor, backgroundHandler, new SurfaceControl.Transaction(),
|
||||
ActivityTaskManager.getService(), context, context.getContentResolver());
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
BackAnimationController(@NonNull @ShellMainThread ShellExecutor shellExecutor,
|
||||
@NonNull @ShellBackgroundThread Handler handler,
|
||||
BackAnimationController(
|
||||
@NonNull ShellInit shellInit,
|
||||
@NonNull @ShellMainThread ShellExecutor shellExecutor,
|
||||
@NonNull @ShellBackgroundThread Handler bgHandler,
|
||||
@NonNull SurfaceControl.Transaction transaction,
|
||||
@NonNull IActivityTaskManager activityTaskManager,
|
||||
Context context, ContentResolver contentResolver) {
|
||||
@@ -150,7 +156,13 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
|
||||
mTransaction = transaction;
|
||||
mActivityTaskManager = activityTaskManager;
|
||||
mContext = context;
|
||||
setupAnimationDeveloperSettingsObserver(contentResolver, handler);
|
||||
mContentResolver = contentResolver;
|
||||
mBgHandler = bgHandler;
|
||||
shellInit.addInitCallback(this::onInit, this);
|
||||
}
|
||||
|
||||
private void onInit() {
|
||||
setupAnimationDeveloperSettingsObserver(mContentResolver, mBgHandler);
|
||||
}
|
||||
|
||||
private void setupAnimationDeveloperSettingsObserver(
|
||||
|
||||
@@ -43,6 +43,7 @@ import com.android.wm.shell.compatui.CompatUIWindowManager.CompatUIHintsState;
|
||||
import com.android.wm.shell.compatui.letterboxedu.LetterboxEduWindowManager;
|
||||
import com.android.wm.shell.sysui.KeyguardChangeListener;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
import com.android.wm.shell.transition.Transitions;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
@@ -119,6 +120,7 @@ public class CompatUIController implements OnDisplaysChangedListener,
|
||||
private boolean mKeyguardShowing;
|
||||
|
||||
public CompatUIController(Context context,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
DisplayController displayController,
|
||||
DisplayInsetsController displayInsetsController,
|
||||
@@ -134,10 +136,14 @@ public class CompatUIController implements OnDisplaysChangedListener,
|
||||
mSyncQueue = syncQueue;
|
||||
mMainExecutor = mainExecutor;
|
||||
mTransitionsLazy = transitionsLazy;
|
||||
mCompatUIHintsState = new CompatUIHintsState();
|
||||
shellInit.addInitCallback(this::onInit, this);
|
||||
}
|
||||
|
||||
private void onInit() {
|
||||
mShellController.addKeyguardChangeListener(this);
|
||||
mDisplayController.addDisplayWindowListener(this);
|
||||
mImeController.addPositionProcessor(this);
|
||||
mCompatUIHintsState = new CompatUIHintsState();
|
||||
shellController.addKeyguardChangeListener(this);
|
||||
}
|
||||
|
||||
/** Sets the callback for UI interactions. */
|
||||
|
||||
@@ -204,11 +204,12 @@ public abstract class WMShellBaseModule {
|
||||
@WMSingleton
|
||||
@Provides
|
||||
static CompatUIController provideCompatUIController(Context context,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
DisplayController displayController, DisplayInsetsController displayInsetsController,
|
||||
DisplayImeController imeController, SyncTransactionQueue syncQueue,
|
||||
@ShellMainThread ShellExecutor mainExecutor, Lazy<Transitions> transitionsLazy) {
|
||||
return new CompatUIController(context, shellController, displayController,
|
||||
return new CompatUIController(context, shellInit, shellController, displayController,
|
||||
displayInsetsController, imeController, syncQueue, mainExecutor, transitionsLazy);
|
||||
}
|
||||
|
||||
@@ -268,12 +269,14 @@ public abstract class WMShellBaseModule {
|
||||
@Provides
|
||||
static Optional<BackAnimationController> provideBackAnimationController(
|
||||
Context context,
|
||||
ShellInit shellInit,
|
||||
@ShellMainThread ShellExecutor shellExecutor,
|
||||
@ShellBackgroundThread Handler backgroundHandler
|
||||
) {
|
||||
if (BackAnimationController.IS_ENABLED) {
|
||||
return Optional.of(
|
||||
new BackAnimationController(shellExecutor, backgroundHandler, context));
|
||||
new BackAnimationController(shellInit, shellExecutor, backgroundHandler,
|
||||
context));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
@@ -384,11 +387,13 @@ public abstract class WMShellBaseModule {
|
||||
@WMSingleton
|
||||
@Provides
|
||||
static Optional<HideDisplayCutoutController> provideHideDisplayCutoutController(Context context,
|
||||
ShellController shellController, DisplayController displayController,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
DisplayController displayController,
|
||||
@ShellMainThread ShellExecutor mainExecutor) {
|
||||
return Optional.ofNullable(
|
||||
HideDisplayCutoutController.create(context, shellController, displayController,
|
||||
mainExecutor));
|
||||
HideDisplayCutoutController.create(context, shellInit, shellController,
|
||||
displayController, mainExecutor));
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -248,12 +248,17 @@ public abstract class WMShellModule {
|
||||
@Provides
|
||||
@DynamicOverride
|
||||
static OneHandedController provideOneHandedController(Context context,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
WindowManager windowManager, DisplayController displayController,
|
||||
DisplayLayout displayLayout, TaskStackListenerImpl taskStackListener,
|
||||
UiEventLogger uiEventLogger, InteractionJankMonitor jankMonitor,
|
||||
@ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) {
|
||||
return OneHandedController.create(context, shellController, windowManager,
|
||||
WindowManager windowManager,
|
||||
DisplayController displayController,
|
||||
DisplayLayout displayLayout,
|
||||
TaskStackListenerImpl taskStackListener,
|
||||
UiEventLogger uiEventLogger,
|
||||
InteractionJankMonitor jankMonitor,
|
||||
@ShellMainThread ShellExecutor mainExecutor,
|
||||
@ShellMainThread Handler mainHandler) {
|
||||
return OneHandedController.create(context, shellInit, shellController, windowManager,
|
||||
displayController, displayLayout, taskStackListener, jankMonitor, uiEventLogger,
|
||||
mainExecutor, mainHandler);
|
||||
}
|
||||
@@ -293,7 +298,7 @@ public abstract class WMShellModule {
|
||||
|
||||
@WMSingleton
|
||||
@Provides
|
||||
static Optional<Pip> providePip(Context context,
|
||||
static Optional<Pip> providePip(Context context, ShellInit shellInit,
|
||||
ShellController shellController, DisplayController displayController,
|
||||
PipAppOpsListener pipAppOpsListener, PipBoundsAlgorithm pipBoundsAlgorithm,
|
||||
PipKeepClearAlgorithm pipKeepClearAlgorithm, PipBoundsState pipBoundsState,
|
||||
@@ -306,12 +311,12 @@ public abstract class WMShellModule {
|
||||
PipParamsChangedForwarder pipParamsChangedForwarder,
|
||||
Optional<OneHandedController> oneHandedController,
|
||||
@ShellMainThread ShellExecutor mainExecutor) {
|
||||
return Optional.ofNullable(PipController.create(context, shellController, displayController,
|
||||
pipAppOpsListener, pipBoundsAlgorithm, pipKeepClearAlgorithm, pipBoundsState,
|
||||
pipMotionHelper,
|
||||
pipMediaController, phonePipMenuController, pipTaskOrganizer, pipTransitionState,
|
||||
pipTouchHandler, pipTransitionController, windowManagerShellWrapper,
|
||||
taskStackListener, pipParamsChangedForwarder, oneHandedController, mainExecutor));
|
||||
return Optional.ofNullable(PipController.create(context, shellInit, shellController,
|
||||
displayController, pipAppOpsListener, pipBoundsAlgorithm, pipKeepClearAlgorithm,
|
||||
pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController,
|
||||
pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController,
|
||||
windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder,
|
||||
oneHandedController, mainExecutor));
|
||||
}
|
||||
|
||||
@WMSingleton
|
||||
|
||||
@@ -28,6 +28,7 @@ import com.android.wm.shell.common.DisplayController;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.sysui.ConfigurationChangeListener;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -49,7 +50,9 @@ public class HideDisplayCutoutController implements ConfigurationChangeListener
|
||||
*/
|
||||
@Nullable
|
||||
public static HideDisplayCutoutController create(Context context,
|
||||
ShellController shellController, DisplayController displayController,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
DisplayController displayController,
|
||||
ShellExecutor mainExecutor) {
|
||||
// The SystemProperty is set for devices that support this feature and is used to control
|
||||
// whether to create the HideDisplayCutout instance.
|
||||
@@ -60,14 +63,20 @@ public class HideDisplayCutoutController implements ConfigurationChangeListener
|
||||
|
||||
HideDisplayCutoutOrganizer organizer =
|
||||
new HideDisplayCutoutOrganizer(context, displayController, mainExecutor);
|
||||
return new HideDisplayCutoutController(context, shellController, organizer);
|
||||
return new HideDisplayCutoutController(context, shellInit, shellController, organizer);
|
||||
}
|
||||
|
||||
HideDisplayCutoutController(Context context, ShellController shellController,
|
||||
HideDisplayCutoutController(Context context,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
HideDisplayCutoutOrganizer organizer) {
|
||||
mContext = context;
|
||||
mShellController = shellController;
|
||||
mOrganizer = organizer;
|
||||
shellInit.addInitCallback(this::onInit, this);
|
||||
}
|
||||
|
||||
private void onInit() {
|
||||
updateStatus();
|
||||
mShellController.addConfigurationChangeListener(this);
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ import com.android.wm.shell.common.annotations.ExternalThread;
|
||||
import com.android.wm.shell.sysui.ConfigurationChangeListener;
|
||||
import com.android.wm.shell.sysui.KeyguardChangeListener;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
@@ -192,8 +193,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController>,
|
||||
/**
|
||||
* Creates {@link OneHandedController}, returns {@code null} if the feature is not supported.
|
||||
*/
|
||||
public static OneHandedController create(
|
||||
Context context, ShellController shellController, WindowManager windowManager,
|
||||
public static OneHandedController create(Context context,
|
||||
ShellInit shellInit, ShellController shellController, WindowManager windowManager,
|
||||
DisplayController displayController, DisplayLayout displayLayout,
|
||||
TaskStackListenerImpl taskStackListener,
|
||||
InteractionJankMonitor jankMonitor, UiEventLogger uiEventLogger,
|
||||
@@ -213,14 +214,15 @@ public class OneHandedController implements RemoteCallable<OneHandedController>,
|
||||
context, displayLayout, settingsUtil, animationController, tutorialHandler,
|
||||
jankMonitor, mainExecutor);
|
||||
OneHandedUiEventLogger oneHandedUiEventsLogger = new OneHandedUiEventLogger(uiEventLogger);
|
||||
return new OneHandedController(context, shellController, displayController, organizer,
|
||||
touchHandler, tutorialHandler, settingsUtil, accessibilityUtil, timeoutHandler,
|
||||
oneHandedState, oneHandedUiEventsLogger, taskStackListener,
|
||||
return new OneHandedController(context, shellInit, shellController, displayController,
|
||||
organizer, touchHandler, tutorialHandler, settingsUtil, accessibilityUtil,
|
||||
timeoutHandler, oneHandedState, oneHandedUiEventsLogger, taskStackListener,
|
||||
mainExecutor, mainHandler);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
OneHandedController(Context context,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
DisplayController displayController,
|
||||
OneHandedDisplayAreaOrganizer displayAreaOrganizer,
|
||||
@@ -247,8 +249,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController>,
|
||||
mMainHandler = mainHandler;
|
||||
mOneHandedUiEventLogger = uiEventsLogger;
|
||||
mTaskStackListener = taskStackListener;
|
||||
mAccessibilityManager = AccessibilityManager.getInstance(mContext);
|
||||
|
||||
mDisplayController.addDisplayWindowListener(mDisplaysChangedListener);
|
||||
final float offsetPercentageConfig = context.getResources().getFraction(
|
||||
R.fraction.config_one_handed_offset, 1, 1);
|
||||
final int sysPropPercentageConfig = SystemProperties.getInt(
|
||||
@@ -268,6 +270,11 @@ public class OneHandedController implements RemoteCallable<OneHandedController>,
|
||||
getObserver(this::onSwipeToNotificationEnabledChanged);
|
||||
mShortcutEnabledObserver = getObserver(this::onShortcutEnabledChanged);
|
||||
|
||||
shellInit.addInitCallback(this::onInit, this);
|
||||
}
|
||||
|
||||
private void onInit() {
|
||||
mDisplayController.addDisplayWindowListener(mDisplaysChangedListener);
|
||||
mDisplayController.addDisplayChangingController(this);
|
||||
setupCallback();
|
||||
registerSettingObservers(mUserId);
|
||||
@@ -275,7 +282,6 @@ public class OneHandedController implements RemoteCallable<OneHandedController>,
|
||||
updateSettings();
|
||||
updateDisplayLayout(mContext.getDisplayId());
|
||||
|
||||
mAccessibilityManager = AccessibilityManager.getInstance(context);
|
||||
mAccessibilityManager.addAccessibilityStateChangeListener(
|
||||
mAccessibilityStateChangeListener);
|
||||
|
||||
|
||||
@@ -90,6 +90,7 @@ import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||
import com.android.wm.shell.sysui.ConfigurationChangeListener;
|
||||
import com.android.wm.shell.sysui.KeyguardChangeListener;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
import com.android.wm.shell.transition.Transitions;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
@@ -295,6 +296,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
||||
*/
|
||||
@Nullable
|
||||
public static Pip create(Context context,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
DisplayController displayController,
|
||||
PipAppOpsListener pipAppOpsListener,
|
||||
@@ -319,16 +321,17 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
||||
return null;
|
||||
}
|
||||
|
||||
return new PipController(context, shellController, displayController, pipAppOpsListener,
|
||||
pipBoundsAlgorithm, pipKeepClearAlgorithm, pipBoundsState, pipMotionHelper,
|
||||
pipMediaController, phonePipMenuController, pipTaskOrganizer, pipTransitionState,
|
||||
pipTouchHandler, pipTransitionController,
|
||||
return new PipController(context, shellInit, shellController, displayController,
|
||||
pipAppOpsListener, pipBoundsAlgorithm, pipKeepClearAlgorithm, pipBoundsState,
|
||||
pipMotionHelper, pipMediaController, phonePipMenuController, pipTaskOrganizer,
|
||||
pipTransitionState, pipTouchHandler, pipTransitionController,
|
||||
windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder,
|
||||
oneHandedController, mainExecutor)
|
||||
.mImpl;
|
||||
}
|
||||
|
||||
protected PipController(Context context,
|
||||
ShellInit shellInit,
|
||||
ShellController shellController,
|
||||
DisplayController displayController,
|
||||
PipAppOpsListener pipAppOpsListener,
|
||||
@@ -378,11 +381,10 @@ public class PipController implements PipTransitionController.PipTransitionCallb
|
||||
.getInteger(R.integer.config_pipEnterAnimationDuration);
|
||||
mPipParamsChangedForwarder = pipParamsChangedForwarder;
|
||||
|
||||
//TODO: move this to ShellInit when PipController can be injected
|
||||
mMainExecutor.execute(this::init);
|
||||
shellInit.addInitCallback(this::onInit, this);
|
||||
}
|
||||
|
||||
public void init() {
|
||||
private void onInit() {
|
||||
mPipInputConsumer = new PipInputConsumer(WindowManagerGlobal.getWindowManagerService(),
|
||||
INPUT_CONSUMER_PIP, mMainExecutor);
|
||||
mPipTransitionController.registerPipTransitionCallback(this);
|
||||
|
||||
@@ -52,6 +52,9 @@ public class ShellInit {
|
||||
* Adds a callback to the ordered list of callbacks be made when Shell is first started. This
|
||||
* can be used in class constructors when dagger is used to ensure that the initialization order
|
||||
* matches the dependency order.
|
||||
*
|
||||
* @param r the callback to be made when Shell is initialized
|
||||
* @param instance used for debugging only
|
||||
*/
|
||||
public <T extends Object> void addInitCallback(Runnable r, T instance) {
|
||||
if (mHasInitialized) {
|
||||
|
||||
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
@@ -61,6 +62,7 @@ import androidx.test.platform.app.InstrumentationRegistry;
|
||||
import com.android.internal.util.test.FakeSettingsProvider;
|
||||
import com.android.wm.shell.ShellTestCase;
|
||||
import com.android.wm.shell.TestShellExecutor;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
@@ -81,6 +83,7 @@ public class BackAnimationControllerTest extends ShellTestCase {
|
||||
|
||||
private static final String ANIMATION_ENABLED = "1";
|
||||
private final TestShellExecutor mShellExecutor = new TestShellExecutor();
|
||||
private ShellInit mShellInit;
|
||||
|
||||
@Rule
|
||||
public TestableContext mContext =
|
||||
@@ -110,10 +113,12 @@ public class BackAnimationControllerTest extends ShellTestCase {
|
||||
Settings.Global.putString(mContentResolver, Settings.Global.ENABLE_BACK_ANIMATION,
|
||||
ANIMATION_ENABLED);
|
||||
mTestableLooper = TestableLooper.get(this);
|
||||
mController = new BackAnimationController(
|
||||
mShellInit = spy(new ShellInit(mShellExecutor));
|
||||
mController = new BackAnimationController(mShellInit,
|
||||
mShellExecutor, new Handler(mTestableLooper.getLooper()), mTransaction,
|
||||
mActivityTaskManager, mContext,
|
||||
mContentResolver);
|
||||
mShellInit.init();
|
||||
mEventTime = 0;
|
||||
mShellExecutor.flushAll();
|
||||
}
|
||||
@@ -159,6 +164,11 @@ public class BackAnimationControllerTest extends ShellTestCase {
|
||||
doMotionEvent(MotionEvent.ACTION_UP, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiateController_addInitCallback() {
|
||||
verify(mShellInit, times(1)).addInitCallback(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("b/207481538")
|
||||
public void crossActivity_screenshotAttachedAndVisible() {
|
||||
@@ -233,10 +243,12 @@ public class BackAnimationControllerTest extends ShellTestCase {
|
||||
public void animationDisabledFromSettings() throws RemoteException {
|
||||
// Toggle the setting off
|
||||
Settings.Global.putString(mContentResolver, Settings.Global.ENABLE_BACK_ANIMATION, "0");
|
||||
mController = new BackAnimationController(
|
||||
ShellInit shellInit = new ShellInit(mShellExecutor);
|
||||
mController = new BackAnimationController(shellInit,
|
||||
mShellExecutor, new Handler(mTestableLooper.getLooper()), mTransaction,
|
||||
mActivityTaskManager, mContext,
|
||||
mContentResolver);
|
||||
shellInit.init();
|
||||
mController.setBackToLauncherCallback(mIOnBackInvokedCallback);
|
||||
|
||||
RemoteAnimationTarget animationTarget = createAnimationTarget();
|
||||
|
||||
@@ -29,6 +29,7 @@ import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@@ -54,6 +55,7 @@ import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.SyncTransactionQueue;
|
||||
import com.android.wm.shell.compatui.letterboxedu.LetterboxEduWindowManager;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
import com.android.wm.shell.transition.Transitions;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -79,6 +81,7 @@ public class CompatUIControllerTest extends ShellTestCase {
|
||||
private static final int TASK_ID = 12;
|
||||
|
||||
private CompatUIController mController;
|
||||
private ShellInit mShellInit;
|
||||
private @Mock ShellController mMockShellController;
|
||||
private @Mock DisplayController mMockDisplayController;
|
||||
private @Mock DisplayInsetsController mMockDisplayInsetsController;
|
||||
@@ -107,9 +110,10 @@ public class CompatUIControllerTest extends ShellTestCase {
|
||||
doReturn(TASK_ID).when(mMockLetterboxEduLayout).getTaskId();
|
||||
doReturn(true).when(mMockLetterboxEduLayout).createLayout(anyBoolean());
|
||||
doReturn(true).when(mMockLetterboxEduLayout).updateCompatInfo(any(), any(), anyBoolean());
|
||||
mController = new CompatUIController(mContext, mMockShellController, mMockDisplayController,
|
||||
mMockDisplayInsetsController, mMockImeController, mMockSyncQueue, mMockExecutor,
|
||||
mMockTransitionsLazy) {
|
||||
mShellInit = spy(new ShellInit(mMockExecutor));
|
||||
mController = new CompatUIController(mContext, mShellInit, mMockShellController,
|
||||
mMockDisplayController, mMockDisplayInsetsController, mMockImeController,
|
||||
mMockSyncQueue, mMockExecutor, mMockTransitionsLazy) {
|
||||
@Override
|
||||
CompatUIWindowManager createCompatUiWindowManager(Context context, TaskInfo taskInfo,
|
||||
ShellTaskOrganizer.TaskListener taskListener) {
|
||||
@@ -122,9 +126,15 @@ public class CompatUIControllerTest extends ShellTestCase {
|
||||
return mMockLetterboxEduLayout;
|
||||
}
|
||||
};
|
||||
mShellInit.init();
|
||||
spyOn(mController);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiateController_addInitCallback() {
|
||||
verify(mShellInit, times(1)).addInitCallback(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiateController_registerKeyguardChangeListener() {
|
||||
verify(mMockShellController, times(1)).addKeyguardChangeListener(any());
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
package com.android.wm.shell.hidedisplaycutout;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@@ -29,7 +31,9 @@ import androidx.test.filters.SmallTest;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import com.android.wm.shell.ShellTestCase;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -50,12 +54,20 @@ public class HideDisplayCutoutControllerTest extends ShellTestCase {
|
||||
private HideDisplayCutoutOrganizer mMockDisplayAreaOrganizer;
|
||||
|
||||
private HideDisplayCutoutController mHideDisplayCutoutController;
|
||||
private ShellInit mShellInit;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mShellInit = spy(new ShellInit(mock(ShellExecutor.class)));
|
||||
mHideDisplayCutoutController = new HideDisplayCutoutController(
|
||||
mContext, mShellController, mMockDisplayAreaOrganizer);
|
||||
mContext, mShellInit, mShellController, mMockDisplayAreaOrganizer);
|
||||
mShellInit.init();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiateController_addInitCallback() {
|
||||
verify(mShellInit, times(1)).addInitCallback(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -36,7 +36,6 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.os.Handler;
|
||||
import android.os.UserHandle;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.util.ArrayMap;
|
||||
import android.view.Display;
|
||||
@@ -50,6 +49,7 @@ import com.android.wm.shell.common.DisplayLayout;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.TaskStackListenerImpl;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -61,18 +61,18 @@ import org.mockito.MockitoAnnotations;
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
public class OneHandedControllerTest extends OneHandedTestCase {
|
||||
private int mCurrentUser = UserHandle.myUserId();
|
||||
|
||||
Display mDisplay;
|
||||
OneHandedAccessibilityUtil mOneHandedAccessibilityUtil;
|
||||
OneHandedController mSpiedOneHandedController;
|
||||
OneHandedTimeoutHandler mSpiedTimeoutHandler;
|
||||
OneHandedState mSpiedTransitionState;
|
||||
ShellInit mShellInit;
|
||||
|
||||
@Mock
|
||||
ShellController mMockShellController;
|
||||
@Mock
|
||||
DisplayLayout mDisplayLayout;
|
||||
DisplayLayout mMockDisplayLayout;
|
||||
@Mock
|
||||
DisplayController mMockDisplayController;
|
||||
@Mock
|
||||
@@ -102,7 +102,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mDisplay = mContext.getDisplay();
|
||||
mDisplayLayout = Mockito.mock(DisplayLayout.class);
|
||||
mMockDisplayLayout = Mockito.mock(DisplayLayout.class);
|
||||
mSpiedTimeoutHandler = spy(new OneHandedTimeoutHandler(mMockShellMainExecutor));
|
||||
mSpiedTransitionState = spy(new OneHandedState());
|
||||
|
||||
@@ -122,11 +122,13 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
||||
|
||||
when(mMockDisplayAreaOrganizer.getLastDisplayBounds()).thenReturn(
|
||||
new Rect(0, 0, 1080, 2400));
|
||||
when(mMockDisplayAreaOrganizer.getDisplayLayout()).thenReturn(mDisplayLayout);
|
||||
when(mMockDisplayAreaOrganizer.getDisplayLayout()).thenReturn(mMockDisplayLayout);
|
||||
|
||||
mShellInit = spy(new ShellInit(mMockShellMainExecutor));
|
||||
mOneHandedAccessibilityUtil = new OneHandedAccessibilityUtil(mContext);
|
||||
mSpiedOneHandedController = spy(new OneHandedController(
|
||||
mContext,
|
||||
mShellInit,
|
||||
mMockShellController,
|
||||
mMockDisplayController,
|
||||
mMockDisplayAreaOrganizer,
|
||||
@@ -141,6 +143,12 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
||||
mMockShellMainExecutor,
|
||||
mMockShellMainHandler)
|
||||
);
|
||||
mShellInit.init();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiateController_addInitCallback() {
|
||||
verify(mShellInit, times(1)).addInitCallback(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -308,9 +316,9 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
||||
|
||||
@Test
|
||||
public void testRotation90CanNotStartOneHanded() {
|
||||
mDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_90);
|
||||
mMockDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_90);
|
||||
mSpiedTransitionState.setState(STATE_NONE);
|
||||
when(mDisplayLayout.isLandscape()).thenReturn(true);
|
||||
when(mMockDisplayLayout.isLandscape()).thenReturn(true);
|
||||
mSpiedOneHandedController.setOneHandedEnabled(true);
|
||||
mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
|
||||
mSpiedOneHandedController.startOneHanded();
|
||||
@@ -320,10 +328,10 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
||||
|
||||
@Test
|
||||
public void testRotation180CanStartOneHanded() {
|
||||
mDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_180);
|
||||
mMockDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_180);
|
||||
mSpiedTransitionState.setState(STATE_NONE);
|
||||
when(mMockDisplayAreaOrganizer.isReady()).thenReturn(true);
|
||||
when(mDisplayLayout.isLandscape()).thenReturn(false);
|
||||
when(mMockDisplayLayout.isLandscape()).thenReturn(false);
|
||||
mSpiedOneHandedController.setOneHandedEnabled(true);
|
||||
mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
|
||||
mSpiedOneHandedController.startOneHanded();
|
||||
@@ -333,9 +341,9 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
||||
|
||||
@Test
|
||||
public void testRotation270CanNotStartOneHanded() {
|
||||
mDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_270);
|
||||
mMockDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_270);
|
||||
mSpiedTransitionState.setState(STATE_NONE);
|
||||
when(mDisplayLayout.isLandscape()).thenReturn(true);
|
||||
when(mMockDisplayLayout.isLandscape()).thenReturn(true);
|
||||
mSpiedOneHandedController.setOneHandedEnabled(true);
|
||||
mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
|
||||
mSpiedOneHandedController.startOneHanded();
|
||||
|
||||
@@ -42,6 +42,7 @@ import com.android.wm.shell.common.DisplayLayout;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.TaskStackListenerImpl;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -60,6 +61,8 @@ public class OneHandedStateTest extends OneHandedTestCase {
|
||||
OneHandedTimeoutHandler mSpiedTimeoutHandler;
|
||||
OneHandedState mSpiedState;
|
||||
|
||||
@Mock
|
||||
ShellInit mMockShellInit;
|
||||
@Mock
|
||||
ShellController mMockShellController;
|
||||
@Mock
|
||||
@@ -111,6 +114,7 @@ public class OneHandedStateTest extends OneHandedTestCase {
|
||||
mOneHandedAccessibilityUtil = new OneHandedAccessibilityUtil(mContext);
|
||||
mSpiedOneHandedController = spy(new OneHandedController(
|
||||
mContext,
|
||||
mMockShellInit,
|
||||
mMockShellController,
|
||||
mMockDisplayController,
|
||||
mMockDisplayAreaOrganizer,
|
||||
|
||||
@@ -56,6 +56,7 @@ import com.android.wm.shell.pip.PipTaskOrganizer;
|
||||
import com.android.wm.shell.pip.PipTransitionController;
|
||||
import com.android.wm.shell.pip.PipTransitionState;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -74,6 +75,7 @@ import java.util.Set;
|
||||
@TestableLooper.RunWithLooper
|
||||
public class PipControllerTest extends ShellTestCase {
|
||||
private PipController mPipController;
|
||||
private ShellInit mShellInit;
|
||||
|
||||
@Mock private ShellController mMockShellController;
|
||||
@Mock private DisplayController mMockDisplayController;
|
||||
@@ -105,18 +107,25 @@ public class PipControllerTest extends ShellTestCase {
|
||||
((Runnable) invocation.getArgument(0)).run();
|
||||
return null;
|
||||
}).when(mMockExecutor).execute(any());
|
||||
mPipController = new PipController(mContext, mMockShellController, mMockDisplayController,
|
||||
mMockPipAppOpsListener, mMockPipBoundsAlgorithm,
|
||||
mShellInit = spy(new ShellInit(mMockExecutor));
|
||||
mPipController = new PipController(mContext, mShellInit, mMockShellController,
|
||||
mMockDisplayController, mMockPipAppOpsListener, mMockPipBoundsAlgorithm,
|
||||
mMockPipKeepClearAlgorithm,
|
||||
mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController,
|
||||
mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState,
|
||||
mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
|
||||
mMockTaskStackListener, mPipParamsChangedForwarder,
|
||||
mMockOneHandedController, mMockExecutor);
|
||||
mShellInit.init();
|
||||
when(mMockPipBoundsAlgorithm.getSnapAlgorithm()).thenReturn(mMockPipSnapAlgorithm);
|
||||
when(mMockPipTouchHandler.getMotionHelper()).thenReturn(mMockPipMotionHelper);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiatePipController_addInitCallback() {
|
||||
verify(mShellInit, times(1)).addInitCallback(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiatePipController_registerConfigChangeListener() {
|
||||
verify(mMockShellController, times(1)).addConfigurationChangeListener(any());
|
||||
@@ -149,8 +158,9 @@ public class PipControllerTest extends ShellTestCase {
|
||||
when(mockPackageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)).thenReturn(false);
|
||||
when(spyContext.getPackageManager()).thenReturn(mockPackageManager);
|
||||
|
||||
assertNull(PipController.create(spyContext, mMockShellController, mMockDisplayController,
|
||||
mMockPipAppOpsListener, mMockPipBoundsAlgorithm,
|
||||
ShellInit shellInit = new ShellInit(mMockExecutor);
|
||||
assertNull(PipController.create(spyContext, shellInit, mMockShellController,
|
||||
mMockDisplayController, mMockPipAppOpsListener, mMockPipBoundsAlgorithm,
|
||||
mMockPipKeepClearAlgorithm,
|
||||
mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController,
|
||||
mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState,
|
||||
|
||||
Reference in New Issue
Block a user