Search in sources :

Example 1 with THREE_BUTTON

use of com.android.quickstep.NavigationModeSwitchRule.Mode.THREE_BUTTON in project Neo-Launcher by NeoApplications.

the class NavigationModeSwitchRule method apply.

@Override
public Statement apply(Statement base, Description description) {
    if (TestHelpers.isInLauncherProcess() && description.getAnnotation(NavigationModeSwitch.class) != null) {
        Mode mode = description.getAnnotation(NavigationModeSwitch.class).mode();
        return new Statement() {

            private void assertTrue(String message, boolean condition) {
                if (!condition) {
                    final AssertionError assertionError = new AssertionError(message);
                    FailureWatcher.onError(mLauncher.getDevice(), description, assertionError);
                    throw assertionError;
                }
            }

            @Override
            public void evaluate() throws Throwable {
                mLauncher.enableDebugTracing();
                final Context context = getInstrumentation().getContext();
                final int currentInteractionMode = LauncherInstrumentation.getCurrentInteractionMode(context);
                final String prevOverlayPkg = QuickStepContract.isGesturalMode(currentInteractionMode) ? NAV_BAR_MODE_GESTURAL_OVERLAY : QuickStepContract.isSwipeUpMode(currentInteractionMode) ? NAV_BAR_MODE_2BUTTON_OVERLAY : NAV_BAR_MODE_3BUTTON_OVERLAY;
                final LauncherInstrumentation.NavigationModel originalMode = mLauncher.getNavigationModel();
                try {
                    if (mode == ZERO_BUTTON || mode == ALL) {
                        evaluateWithZeroButtons();
                    }
                    if (mode == TWO_BUTTON || mode == ALL) {
                        evaluateWithTwoButtons();
                    }
                    if (mode == THREE_BUTTON || mode == ALL) {
                        evaluateWithThreeButtons();
                    }
                } catch (Exception e) {
                    Log.e(TAG, "Exception", e);
                    throw e;
                } finally {
                    assertTrue("Couldn't set overlay", setActiveOverlay(prevOverlayPkg, originalMode));
                }
            }

            private void evaluateWithThreeButtons() throws Throwable {
                if (setActiveOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, LauncherInstrumentation.NavigationModel.THREE_BUTTON)) {
                    base.evaluate();
                }
            }

            private void evaluateWithTwoButtons() throws Throwable {
                if (setActiveOverlay(NAV_BAR_MODE_2BUTTON_OVERLAY, LauncherInstrumentation.NavigationModel.TWO_BUTTON)) {
                    base.evaluate();
                }
            }

            private void evaluateWithZeroButtons() throws Throwable {
                if (setActiveOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, LauncherInstrumentation.NavigationModel.ZERO_BUTTON)) {
                    base.evaluate();
                }
            }

            private boolean packageExists(String packageName) {
                try {
                    PackageManager pm = getInstrumentation().getContext().getPackageManager();
                    if (pm.getApplicationInfo(packageName, 0) == null) {
                        return false;
                    }
                } catch (PackageManager.NameNotFoundException e) {
                    return false;
                }
                return true;
            }

            private boolean setActiveOverlay(String overlayPackage, LauncherInstrumentation.NavigationModel expectedMode) throws Exception {
                if (!packageExists(overlayPackage)) {
                    Log.d(TAG, "setActiveOverlay: " + overlayPackage + " pkg does not exist");
                    return false;
                }
                setOverlayPackageEnabled(NAV_BAR_MODE_3BUTTON_OVERLAY, overlayPackage == NAV_BAR_MODE_3BUTTON_OVERLAY);
                setOverlayPackageEnabled(NAV_BAR_MODE_2BUTTON_OVERLAY, overlayPackage == NAV_BAR_MODE_2BUTTON_OVERLAY);
                setOverlayPackageEnabled(NAV_BAR_MODE_GESTURAL_OVERLAY, overlayPackage == NAV_BAR_MODE_GESTURAL_OVERLAY);
                if (currentSysUiNavigationMode() != expectedMode) {
                    final CountDownLatch latch = new CountDownLatch(1);
                    final Context targetContext = getInstrumentation().getTargetContext();
                    final SysUINavigationMode.NavigationModeChangeListener listener = newMode -> {
                        if (LauncherInstrumentation.getNavigationModel(newMode.resValue) == expectedMode) {
                            latch.countDown();
                        }
                    };
                    final SysUINavigationMode sysUINavigationMode = SysUINavigationMode.INSTANCE.get(targetContext);
                    targetContext.getMainExecutor().execute(() -> sysUINavigationMode.addModeChangeListener(listener));
                    latch.await(60, TimeUnit.SECONDS);
                    targetContext.getMainExecutor().execute(() -> sysUINavigationMode.removeModeChangeListener(listener));
                    assertTrue("Navigation mode didn't change to " + expectedMode, currentSysUiNavigationMode() == expectedMode);
                }
                for (int i = 0; i != 100; ++i) {
                    if (mLauncher.getNavigationModel() == expectedMode)
                        break;
                    Thread.sleep(100);
                }
                assertTrue("Couldn't switch to " + overlayPackage, mLauncher.getNavigationModel() == expectedMode);
                for (int i = 0; i != 100; ++i) {
                    if (mLauncher.getNavigationModeMismatchError() == null)
                        break;
                    Thread.sleep(100);
                }
                final String error = mLauncher.getNavigationModeMismatchError();
                assertTrue("Switching nav mode: " + error, error == null);
                Thread.sleep(5000);
                return true;
            }

            private void setOverlayPackageEnabled(String overlayPackage, boolean enable) throws Exception {
                Log.d(TAG, "setOverlayPackageEnabled: " + overlayPackage + " " + enable);
                final String action = enable ? "enable" : "disable";
                UiDevice.getInstance(getInstrumentation()).executeShellCommand("cmd overlay " + action + " " + overlayPackage);
            }
        };
    } else {
        return base;
    }
}
Also used : Context(android.content.Context) Context(android.content.Context) FailureWatcher(com.android.launcher3.util.rule.FailureWatcher) Statement(org.junit.runners.model.Statement) ZERO_BUTTON(com.android.quickstep.NavigationModeSwitchRule.Mode.ZERO_BUTTON) NAV_BAR_MODE_3BUTTON_OVERLAY(com.android.systemui.shared.system.QuickStepContract.NAV_BAR_MODE_3BUTTON_OVERLAY) TWO_BUTTON(com.android.quickstep.NavigationModeSwitchRule.Mode.TWO_BUTTON) PackageManager(android.content.pm.PackageManager) TestRule(org.junit.rules.TestRule) QuickStepContract(com.android.systemui.shared.system.QuickStepContract) NAV_BAR_MODE_GESTURAL_OVERLAY(com.android.systemui.shared.system.QuickStepContract.NAV_BAR_MODE_GESTURAL_OVERLAY) TestHelpers(com.android.launcher3.tapl.TestHelpers) Retention(java.lang.annotation.Retention) InstrumentationRegistry.getInstrumentation(androidx.test.InstrumentationRegistry.getInstrumentation) THREE_BUTTON(com.android.quickstep.NavigationModeSwitchRule.Mode.THREE_BUTTON) ALL(com.android.quickstep.NavigationModeSwitchRule.Mode.ALL) Log(android.util.Log) UiDevice(androidx.test.uiautomator.UiDevice) LauncherInstrumentation(com.android.launcher3.tapl.LauncherInstrumentation) NAV_BAR_MODE_2BUTTON_OVERLAY(com.android.systemui.shared.system.QuickStepContract.NAV_BAR_MODE_2BUTTON_OVERLAY) Description(org.junit.runner.Description) Target(java.lang.annotation.Target) ElementType(java.lang.annotation.ElementType) TimeUnit(java.util.concurrent.TimeUnit) CountDownLatch(java.util.concurrent.CountDownLatch) RetentionPolicy(java.lang.annotation.RetentionPolicy) Statement(org.junit.runners.model.Statement) CountDownLatch(java.util.concurrent.CountDownLatch) LauncherInstrumentation(com.android.launcher3.tapl.LauncherInstrumentation) PackageManager(android.content.pm.PackageManager)

Aggregations

Context (android.content.Context)1 PackageManager (android.content.pm.PackageManager)1 Log (android.util.Log)1 InstrumentationRegistry.getInstrumentation (androidx.test.InstrumentationRegistry.getInstrumentation)1 UiDevice (androidx.test.uiautomator.UiDevice)1 LauncherInstrumentation (com.android.launcher3.tapl.LauncherInstrumentation)1 TestHelpers (com.android.launcher3.tapl.TestHelpers)1 FailureWatcher (com.android.launcher3.util.rule.FailureWatcher)1 ALL (com.android.quickstep.NavigationModeSwitchRule.Mode.ALL)1 THREE_BUTTON (com.android.quickstep.NavigationModeSwitchRule.Mode.THREE_BUTTON)1 TWO_BUTTON (com.android.quickstep.NavigationModeSwitchRule.Mode.TWO_BUTTON)1 ZERO_BUTTON (com.android.quickstep.NavigationModeSwitchRule.Mode.ZERO_BUTTON)1 QuickStepContract (com.android.systemui.shared.system.QuickStepContract)1 NAV_BAR_MODE_2BUTTON_OVERLAY (com.android.systemui.shared.system.QuickStepContract.NAV_BAR_MODE_2BUTTON_OVERLAY)1 NAV_BAR_MODE_3BUTTON_OVERLAY (com.android.systemui.shared.system.QuickStepContract.NAV_BAR_MODE_3BUTTON_OVERLAY)1 NAV_BAR_MODE_GESTURAL_OVERLAY (com.android.systemui.shared.system.QuickStepContract.NAV_BAR_MODE_GESTURAL_OVERLAY)1 ElementType (java.lang.annotation.ElementType)1 Retention (java.lang.annotation.Retention)1 RetentionPolicy (java.lang.annotation.RetentionPolicy)1 Target (java.lang.annotation.Target)1