aboutsummaryrefslogtreecommitdiff
path: root/src/io/appium/droiddriver/instrumentation/InstrumentationDriver.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/io/appium/droiddriver/instrumentation/InstrumentationDriver.java')
-rw-r--r--src/io/appium/droiddriver/instrumentation/InstrumentationDriver.java73
1 files changed, 38 insertions, 35 deletions
diff --git a/src/io/appium/droiddriver/instrumentation/InstrumentationDriver.java b/src/io/appium/droiddriver/instrumentation/InstrumentationDriver.java
index d3e5dd2..03b2123 100644
--- a/src/io/appium/droiddriver/instrumentation/InstrumentationDriver.java
+++ b/src/io/appium/droiddriver/instrumentation/InstrumentationDriver.java
@@ -16,14 +16,11 @@
package io.appium.droiddriver.instrumentation;
+import android.app.Activity;
import android.app.Instrumentation;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
-
-import java.util.List;
-import java.util.concurrent.Callable;
-
import io.appium.droiddriver.actions.InputInjector;
import io.appium.droiddriver.base.BaseDroidDriver;
import io.appium.droiddriver.base.DroidDriverContext;
@@ -31,11 +28,36 @@ import io.appium.droiddriver.exceptions.NoRunningActivityException;
import io.appium.droiddriver.util.ActivityUtils;
import io.appium.droiddriver.util.InstrumentationUtils;
import io.appium.droiddriver.util.Logs;
+import java.util.List;
+import java.util.concurrent.Callable;
-/**
- * Implementation of DroidDriver that is driven via instrumentation.
- */
+/** Implementation of DroidDriver that is driven via instrumentation. */
public class InstrumentationDriver extends BaseDroidDriver<View, ViewElement> {
+ private static final Callable<View> FIND_ROOT_VIEW =
+ new Callable<View>() {
+ @Override
+ public View call() {
+ InstrumentationUtils.checkMainThread();
+ Activity runningActivity = ActivityUtils.getRunningActivityNoWait();
+ if (runningActivity == null) {
+ // runningActivity changed since last call!
+ return null;
+ }
+
+ List<View> views = RootFinder.getRootViews();
+ if (views.size() > 1) {
+ Logs.log(Log.VERBOSE, "views.size()=" + views.size());
+ for (View view : views) {
+ if (view.hasWindowFocus()) {
+ return view;
+ }
+ }
+ }
+ // Fall back to DecorView.
+ // TODO(kjin): Should wait until a view hasWindowFocus?
+ return runningActivity.getWindow().getDecorView();
+ }
+ };
private final DroidDriverContext<View, ViewElement> context;
private final InputInjector injector;
private final InstrumentationUiDevice uiDevice;
@@ -61,41 +83,22 @@ public class InstrumentationDriver extends BaseDroidDriver<View, ViewElement> {
return new ViewElement(context, rawElement, parent);
}
- private static final Callable<View> FIND_ROOT_VIEW = new Callable<View>() {
- @Override
- public View call() {
- List<View> views = RootFinder.getRootViews();
- if (views.size() > 1) {
- Logs.log(Log.VERBOSE, "views.size()=" + views.size());
- for (View view : views) {
- if (view.hasWindowFocus()) {
- return view;
- }
- }
- }
- // Fall back to DecorView.
- return ActivityUtils.getRunningActivity().getWindow().getDecorView();
- }
- };
-
private View findRootView() {
- waitForRunningActivity();
- return InstrumentationUtils.runOnMainSyncWithTimeout(FIND_ROOT_VIEW);
- }
-
- private void waitForRunningActivity() {
long timeoutMillis = getPoller().getTimeoutMillis();
long end = SystemClock.uptimeMillis() + timeoutMillis;
while (true) {
- if (ActivityUtils.getRunningActivity() != null) {
- return;
- }
long remainingMillis = end - SystemClock.uptimeMillis();
if (remainingMillis < 0) {
- throw new NoRunningActivityException(String.format(
- "Cannot find the running activity after %d milliseconds", timeoutMillis));
+ throw new NoRunningActivityException(
+ String.format("Cannot find the running activity after %d milliseconds", timeoutMillis));
+ }
+
+ if (ActivityUtils.getRunningActivity(remainingMillis) != null) {
+ View view = InstrumentationUtils.runOnMainSyncWithTimeout(FIND_ROOT_VIEW);
+ if (view != null) {
+ return view;
+ }
}
- SystemClock.sleep(Math.min(250, remainingMillis));
}
}