Disabling first-run greeter on fresh android emulator

326 views Asked by At

I am writing a test that requires launching application directly from launcher. Because I can't emulate it correctly by launching through intent.

The problem is that when I am running the test on a fresh emulator (I am using Travis CI, but it can be easily reproduced on my home PC) the emulator starts with the "first run" greeter overlay. Which blocks my uiautomator code from correctly launching the application.

I have tried to add some code to close that greeter but unfortunately it can appear with some delay, when my "greeter detecting and closing" code has already stopped working thinking that the coast is clear.

Is there any guaranteed way to disable that greeter? Some preference maybe or just an example of code that will reliably kill the greeter.

2

There are 2 answers

0
aragaer On BEST ANSWER

Apparently the greeter is called "cling". Searching though (rather old) code I found the following:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.2_r1/com/android/launcher2/Launcher.java#Launcher.isClingsEnabled%28%29

private boolean isClingsEnabled() {
    // TEMPORARY: DISABLE CLINGS ON LARGE UI
    if (LauncherApplication.isScreenLarge()) return false;
    // disable clings when running in a test harness
    if(ActivityManager.isRunningInTestHarness()) return false;
    return true;
}

And next stop is isRunningInTestHarness() at http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.2_r1/android/app/ActivityManager.java#ActivityManager.isRunningInTestHarness%28%29

public static boolean isRunningInTestHarness() {
    return SystemProperties.getBoolean("ro.test_harness", false);
}

Which in turn leads to adb shell setprop ro.test_harness true. Which just works.

1
Allen Hair On

Have you tried using PackageManager.getLaunchIntentForPackage(..)? This will allow you to send the same Intent that the launcher uses to start your app. It should be equivalent to clicking on your application's launcher icon.

If you do need to go through the launcher, you can use a UiWatcher to dismiss the first-run overlay. Whenever UiAutomator can't find an element, it will call the checkForCondition(..) method for each registered UiWatcher and give you a chance to dismiss any overlays or dialogs that are getting in the way.