aboutsummaryrefslogtreecommitdiff
path: root/src/io/appium/droiddriver/base/DefaultPoller.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/io/appium/droiddriver/base/DefaultPoller.java')
-rw-r--r--src/io/appium/droiddriver/base/DefaultPoller.java120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/io/appium/droiddriver/base/DefaultPoller.java b/src/io/appium/droiddriver/base/DefaultPoller.java
new file mode 100644
index 0000000..933ae91
--- /dev/null
+++ b/src/io/appium/droiddriver/base/DefaultPoller.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2013 DroidDriver committers
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.appium.droiddriver.base;
+
+import android.os.SystemClock;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+import io.appium.droiddriver.DroidDriver;
+import io.appium.droiddriver.Poller;
+import io.appium.droiddriver.exceptions.NoRunningActivityException;
+import io.appium.droiddriver.exceptions.TimeoutException;
+import io.appium.droiddriver.finders.Finder;
+
+/**
+ * Default implementation of a {@link Poller}.
+ */
+public class DefaultPoller implements Poller {
+ private final Collection<TimeoutListener> timeoutListeners = new LinkedList<TimeoutListener>();
+ private final Collection<PollingListener> pollingListeners = new LinkedList<PollingListener>();
+ private long timeoutMillis = 10000;
+ private long intervalMillis = 500;
+
+ @Override
+ public long getIntervalMillis() {
+ return intervalMillis;
+ }
+
+ @Override
+ public void setIntervalMillis(long intervalMillis) {
+ this.intervalMillis = intervalMillis;
+ }
+
+ @Override
+ public long getTimeoutMillis() {
+ return timeoutMillis;
+ }
+
+ @Override
+ public void setTimeoutMillis(long timeoutMillis) {
+ this.timeoutMillis = timeoutMillis;
+ }
+
+ @Override
+ public <T> T pollFor(DroidDriver driver, Finder finder, ConditionChecker<T> checker) {
+ return pollFor(driver, finder, checker, timeoutMillis);
+ }
+
+ @Override
+ public <T> T pollFor(DroidDriver driver, Finder finder, ConditionChecker<T> checker,
+ long timeoutMillis) {
+ long end = SystemClock.uptimeMillis() + timeoutMillis;
+ while (true) {
+ try {
+ try {
+ driver.refreshUiElementTree();
+ } catch (NoRunningActivityException nrae) {
+ if (checker == GONE) {
+ return null;
+ }
+ throw nrae;
+ }
+ return checker.check(driver, finder);
+ } catch (UnsatisfiedConditionException uce) {
+ // fall through to poll
+ }
+
+ for (PollingListener pollingListener : pollingListeners) {
+ pollingListener.onPolling(driver, finder);
+ }
+
+ long remainingMillis = end - SystemClock.uptimeMillis();
+ if (remainingMillis < 0) {
+ for (TimeoutListener timeoutListener : timeoutListeners) {
+ timeoutListener.onTimeout(driver, finder);
+ }
+ throw new TimeoutException(String.format(
+ "Timed out after %d milliseconds waiting for %s %s", timeoutMillis, finder, checker));
+ }
+ SystemClock.sleep(Math.min(intervalMillis, remainingMillis));
+ }
+ }
+
+ @Override
+ public ListenerRemover addListener(final TimeoutListener timeoutListener) {
+ timeoutListeners.add(timeoutListener);
+ return new ListenerRemover() {
+ @Override
+ public void remove() {
+ timeoutListeners.remove(timeoutListener);
+ }
+ };
+ }
+
+ @Override
+ public ListenerRemover addListener(final PollingListener pollingListener) {
+ pollingListeners.add(pollingListener);
+ return new ListenerRemover() {
+ @Override
+ public void remove() {
+ pollingListeners.remove(pollingListener);
+ }
+ };
+ }
+}