use of com.android.quickstep.NavigationModeSwitchRule.Mode.TWO_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;
}
}
Aggregations