Java程序  |  170行  |  4.5 KB

/*
 * 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();
}