14b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinpackage io.appium.droiddriver.helpers;
27655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin
34b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.DroidDriver;
44b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.Poller.PollingListener;
54b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.exceptions.ElementNotFoundException;
64b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.finders.Finder;
77655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin
87655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin/**
97655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin * Static utility methods to create commonly used PollingListeners.
107655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin */
117655a5e140a667493d177b3e19d3ee415e97d43bKevin Jinpublic class PollingListeners {
12c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin  /**
13c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin   * Tries to find {@code watchFinder}, and clicks it if found.
14c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin   *
15e66c531bb9bd973a8dfd76cf5c404b5dc03facfeKevin Jin   * @param driver a DroidDriver instance
16c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin   * @param watchFinder Identifies the UI component to watch
17c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin   * @return whether {@code watchFinder} is found
18c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin   */
19c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin  public static boolean tryFindAndClick(DroidDriver driver, Finder watchFinder) {
20df66b27599d3679de93f14ef972a32100d231683Kevin Jin    try {
21c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin      driver.find(watchFinder).click();
22c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin      return true;
23df66b27599d3679de93f14ef972a32100d231683Kevin Jin    } catch (ElementNotFoundException enfe) {
24df66b27599d3679de93f14ef972a32100d231683Kevin Jin      return false;
257655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin    }
267655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin  }
277655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin
287655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin  /**
297655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * Returns a new {@code PollingListener} that will look for
307655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * {@code watchFinder}, then click {@code dismissFinder} to dismiss it.
317655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * <p>
327655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * Typically a {@code PollingListener} is used to dismiss "random" dialogs. If
337655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * you know the certain situation when a dialog is displayed, you should deal
347655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * with the dialog in the specific situation instead of using a
357655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * {@code PollingListener} because it is checked in all polling events, which
367655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * occur frequently.
377655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * </p>
387655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   *
397655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * @param watchFinder Identifies the UI component, for example an AlertDialog
407655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   * @param dismissFinder Identifies the UiElement to click on that will dismiss
417655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   *        the UI component
427655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin   */
437655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin  public static PollingListener newDismissListener(final Finder watchFinder,
447655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin      final Finder dismissFinder) {
457655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin    return new PollingListener() {
467655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin      @Override
477655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin      public void onPolling(DroidDriver driver, Finder finder) {
48c91a011bd95b776da769c27e18cfd5b85a818491Kevin Jin        if (driver.has(watchFinder)) {
497655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin          driver.find(dismissFinder).click();
507655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin        }
517655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin      }
527655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin    };
537655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin  }
547655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin
557655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin  private PollingListeners() {}
567655a5e140a667493d177b3e19d3ee415e97d43bKevin Jin}
57