/* * 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; import io.appium.droiddriver.exceptions.ElementNotFoundException; import io.appium.droiddriver.finders.Finder; /** * Interface for polling mechanism. */ public interface Poller { /** * Interface for a callback to be invoked when {@link #pollFor} times out. */ interface TimeoutListener { /** * Called when {@link #pollFor} times out. Should return quickly (no * polling). */ void onTimeout(DroidDriver driver, Finder finder); } /** * Interface for a callback to be invoked when {@link #pollFor} polls. */ interface PollingListener { /** * Called when {@link #pollFor} polls. Should return quickly (no polling). */ void onPolling(DroidDriver driver, Finder finder); } /** * Interface for removing a listener. */ interface ListenerRemover { /** * A ListenerRemover that does nothing. Can be used as initial value for * ListenerRemovers. */ ListenerRemover NOP_LISTENER_REMOVER = new ListenerRemover() { @Override public void remove() {} }; /** * Removes the associated listener. */ void remove(); } /** * Used by Poller to check conditions. * * @param <T> type of the value returned by {@link #check} */ interface ConditionChecker<T> { /** * Checks condition that overriding methods provide. * * @throws UnsatisfiedConditionException If the condition is not met */ T check(DroidDriver driver, Finder finder) throws UnsatisfiedConditionException; } /** Thrown to indicate condition not met. Used in {@link ConditionChecker}. */ @SuppressWarnings("serial") class UnsatisfiedConditionException extends Exception { } /** * A ConditionChecker that returns the matching {@link UiElement}. */ ConditionChecker<UiElement> EXISTS = new ConditionChecker<UiElement>() { @Override public UiElement check(DroidDriver driver, Finder finder) throws UnsatisfiedConditionException { try { return driver.find(finder); } catch (ElementNotFoundException e) { throw new UnsatisfiedConditionException(); } } @Override public String toString() { return "to appear"; } }; /** * A ConditionChecker that does not throw only if the matching * {@link UiElement} is gone. */ ConditionChecker<Void> GONE = new ConditionChecker<Void>() { @Override public Void check(DroidDriver driver, Finder finder) throws UnsatisfiedConditionException { try { // "find" does not call refreshUiElementTree, while "has" calls driver.find(finder); throw new UnsatisfiedConditionException(); } catch (ElementNotFoundException enfe) { return null; } } @Override public String toString() { return "to disappear"; } }; /** * Polls until {@code checker} does not throw * {@link UnsatisfiedConditionException}, up to the default timeout. * * @return An object of type T returned by {@code checker} */ <T> T pollFor(DroidDriver driver, Finder finder, ConditionChecker<T> checker); /** * Polls until {@code checker} does not throw * {@link UnsatisfiedConditionException}, up to {@code timeoutMillis}. * * @return An object of type T returned by {@code checker} */ <T> T pollFor(DroidDriver driver, Finder finder, ConditionChecker<T> checker, long timeoutMillis); /** * Adds a {@link TimeoutListener}. */ ListenerRemover addListener(TimeoutListener timeoutListener); /** * Adds a {@link PollingListener}. */ ListenerRemover addListener(PollingListener pollingListener); /** * Sets default timeoutMillis. */ void setTimeoutMillis(long timeoutMillis); /** * @return default timeoutMillis */ long getTimeoutMillis(); /** * Sets intervalMillis. */ void setIntervalMillis(long intervalMillis); /** * @return intervalMillis */ long getIntervalMillis(); }