Merge "Revert "Fix code for more restrictive compiler [options]""
am: 4138eed6f4

Change-Id: Ic7e4a2e8a8096288980091a7a47af4ebd5463c0f
diff --git a/src/io/appium/droiddriver/finders/By.java b/src/io/appium/droiddriver/finders/By.java
index 0b6a57f..f8ac924 100644
--- a/src/io/appium/droiddriver/finders/By.java
+++ b/src/io/appium/droiddriver/finders/By.java
@@ -18,9 +18,6 @@
 
 import android.content.Context;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import io.appium.droiddriver.UiElement;
 import io.appium.droiddriver.exceptions.ElementNotFoundException;
 import io.appium.droiddriver.util.InstrumentationUtils;
@@ -31,19 +28,14 @@
  * Convenience methods to create commonly used finders.
  */
 public class By {
-
   private static final MatchFinder ANY = new MatchFinder(null);
 
-  /**
-   * Matches any UiElement.
-   */
+  /** Matches any UiElement. */
   public static MatchFinder any() {
     return ANY;
   }
 
-  /**
-   * Matches a UiElement whose {@code attribute} is {@code true}.
-   */
+  /** Matches a UiElement whose {@code attribute} is {@code true}. */
   public static MatchFinder is(Attribute attribute) {
     return new MatchFinder(Predicates.attributeTrue(attribute));
   }
@@ -55,91 +47,74 @@
     return new MatchFinder(Predicates.attributeFalse(attribute));
   }
 
-  /**
-   * Matches a UiElement by a resource id defined in the AUT.
-   */
+  /** Matches a UiElement by a resource id defined in the AUT. */
   public static MatchFinder resourceId(int resourceId) {
     Context targetContext = InstrumentationUtils.getInstrumentation().getTargetContext();
     return resourceId(targetContext.getResources().getResourceName(resourceId));
   }
 
   /**
-   * Matches a UiElement by the string representation of a resource id. This works for resources not
-   * belonging to the AUT.
+   * Matches a UiElement by the string representation of a resource id. This works for resources
+   * not belonging to the AUT.
    */
   public static MatchFinder resourceId(String resourceId) {
     return new MatchFinder(Predicates.attributeEquals(Attribute.RESOURCE_ID, resourceId));
   }
 
-  /**
-   * Matches a UiElement by package name.
-   */
+  /** Matches a UiElement by package name. */
   public static MatchFinder packageName(String name) {
     return new MatchFinder(Predicates.attributeEquals(Attribute.PACKAGE, name));
   }
 
-  /**
-   * Matches a UiElement by the exact text.
-   */
+  /** Matches a UiElement by the exact text. */
   public static MatchFinder text(String text) {
     return new MatchFinder(Predicates.attributeEquals(Attribute.TEXT, text));
   }
 
-  /**
-   * Matches a UiElement whose text matches {@code regex}.
-   */
+  /** Matches a UiElement whose text matches {@code regex}. */
   public static MatchFinder textRegex(String regex) {
     return new MatchFinder(Predicates.attributeMatches(Attribute.TEXT, regex));
   }
 
-  /**
-   * Matches a UiElement whose text contains {@code substring}.
-   */
+  /** Matches a UiElement whose text contains {@code substring}. */
   public static MatchFinder textContains(String substring) {
     return new MatchFinder(Predicates.attributeContains(Attribute.TEXT, substring));
   }
 
-  /**
-   * Matches a UiElement by content description.
-   */
+  /** Matches a UiElement by content description. */
   public static MatchFinder contentDescription(String contentDescription) {
     return new MatchFinder(Predicates.attributeEquals(Attribute.CONTENT_DESC, contentDescription));
   }
 
-  /**
-   * Matches a UiElement whose content description contains {@code substring}.
-   */
+  /** Matches a UiElement whose content description contains {@code substring}. */
   public static MatchFinder contentDescriptionContains(String substring) {
     return new MatchFinder(Predicates.attributeContains(Attribute.CONTENT_DESC, substring));
   }
 
-  /**
-   * Matches a UiElement by class name.
-   */
+  /** Matches a UiElement by class name. */
   public static MatchFinder className(String className) {
     return new MatchFinder(Predicates.attributeEquals(Attribute.CLASS, className));
   }
 
-  /**
-   * Matches a UiElement by class name.
-   */
+  /** Matches a UiElement by class name. */
   public static MatchFinder className(Class<?> clazz) {
     return className(clazz.getName());
   }
 
-  /**
-   * Matches a UiElement that is selected.
-   */
+  /** Matches a UiElement that is selected. */
   public static MatchFinder selected() {
     return is(Attribute.SELECTED);
   }
 
   /**
-   * Matches by XPath. When applied on an non-root element, it will not evaluate above the context
-   * element. <p> XPath is the domain-specific-language for navigating a node tree. It is ideal if
-   * the UiElement to match has a complex relationship with surrounding nodes. For simple cases,
-   * {@link #withParent} or {@link #withAncestor} are preferred, which can combine with other {@link
-   * MatchFinder}s in {@link #allOf}. For complex cases like below, XPath is superior:
+   * Matches by XPath. When applied on an non-root element, it will not evaluate
+   * above the context element.
+   * <p>
+   * XPath is the domain-specific-language for navigating a node tree. It is
+   * ideal if the UiElement to match has a complex relationship with surrounding
+   * nodes. For simple cases, {@link #withParent} or {@link #withAncestor} are
+   * preferred, which can combine with other {@link MatchFinder}s in
+   * {@link #allOf}. For complex cases like below, XPath is superior:
    *
    * <pre>
    * {@code
@@ -157,8 +132,8 @@
    * }
    * </pre>
    *
-   * If we need to locate the RelativeLayout containing the album "Forever" instead of a song or an
-   * artist named "Forever", this XPath works:
+   * If we need to locate the RelativeLayout containing the album "Forever"
+   * instead of a song or an artist named "Forever", this XPath works:
    *
    * <pre>
    * {@code //*[LinearLayout/*[@text='Albums']]/RelativeLayout[*[@text='Forever']]}
@@ -172,28 +147,34 @@
   }
 
   /**
-   * Returns a finder that uses the UiElement returned by first Finder as context for the second
-   * Finder. <p> typically first Finder finds the ancestor, then second Finder finds the target
-   * UiElement, which is a descendant. </p> Note that if the first Finder matches multiple
-   * UiElements, only the first match is tried, which usually is not what callers expect. In this
-   * case, allOf(second, withAncesor(first)) may work.
+   * Returns a finder that uses the UiElement returned by first Finder as
+   * context for the second Finder.
+   * <p>
+   * typically first Finder finds the ancestor, then second Finder finds the
+   * target UiElement, which is a descendant.
+   * </p>
+   * Note that if the first Finder matches multiple UiElements, only the first
+   * match is tried, which usually is not what callers expect. In this case,
+   * allOf(second, withAncesor(first)) may work.
    */
   public static ChainFinder chain(Finder first, Finder second) {
     return new ChainFinder(first, second);
   }
 
-  private static List<Predicate<? super UiElement>> getPredicates(MatchFinder... finders) {
-    ArrayList<Predicate<? super UiElement>> predicates = new ArrayList<>(finders.length);
+  private static Predicate<? super UiElement>[] getPredicates(MatchFinder... finders) {
+    @SuppressWarnings("unchecked")
+    Predicate<? super UiElement>[] predicates = new Predicate[finders.length];
     for (int i = 0; i < finders.length; i++) {
-      predicates.add(finders[i].predicate);
+      predicates[i] = finders[i].predicate;
     }
     return predicates;
   }
 
   /**
-   * Evaluates given {@code finders} in short-circuit fashion in the order they are passed. Costly
-   * finders (for example those returned by with* methods that navigate the node tree) should be
-   * passed after cheap finders (for example the ByAttribute finders).
+   * Evaluates given {@code finders} in short-circuit fashion in the order
+   * they are passed. Costly finders (for example those returned by with*
+   * methods that navigate the node tree) should be passed after cheap finders
+   * (for example the ByAttribute finders).
    *
    * @return a finder that is the logical conjunction of given finders
    */
@@ -202,9 +183,10 @@
   }
 
   /**
-   * Evaluates given {@code finders} in short-circuit fashion in the order they are passed. Costly
-   * finders (for example those returned by with* methods that navigate the node tree) should be
-   * passed after cheap finders (for example the ByAttribute finders).
+   * Evaluates given {@code finders} in short-circuit fashion in the order
+   * they are passed. Costly finders (for example those returned by with*
+   * methods that navigate the node tree) should be passed after cheap finders
+   * (for example the ByAttribute finders).
    *
    * @return a finder that is the logical disjunction of given finders
    */
@@ -213,8 +195,8 @@
   }
 
   /**
-   * Matches a UiElement whose parent matches the given parentFinder. For complex cases, consider
-   * {@link #xpath}.
+   * Matches a UiElement whose parent matches the given parentFinder. For
+   * complex cases, consider {@link #xpath}.
    */
   public static MatchFinder withParent(MatchFinder parentFinder) {
     checkNotNull(parentFinder);
@@ -222,8 +204,8 @@
   }
 
   /**
-   * Matches a UiElement whose ancestor matches the given ancestorFinder. For complex cases,
-   * consider {@link #xpath}.
+   * Matches a UiElement whose ancestor matches the given ancestorFinder. For
+   * complex cases, consider {@link #xpath}.
    */
   public static MatchFinder withAncestor(MatchFinder ancestorFinder) {
     checkNotNull(ancestorFinder);
@@ -231,8 +213,8 @@
   }
 
   /**
-   * Matches a UiElement which has a visible sibling matching the given siblingFinder. This could be
-   * inefficient; consider {@link #xpath}.
+   * Matches a UiElement which has a visible sibling matching the given
+   * siblingFinder. This could be inefficient; consider {@link #xpath}.
    */
   public static MatchFinder withSibling(MatchFinder siblingFinder) {
     checkNotNull(siblingFinder);
@@ -240,8 +222,8 @@
   }
 
   /**
-   * Matches a UiElement which has a visible child matching the given childFinder. This could be
-   * inefficient; consider {@link #xpath}.
+   * Matches a UiElement which has a visible child matching the given
+   * childFinder. This could be inefficient; consider {@link #xpath}.
    */
   public static MatchFinder withChild(MatchFinder childFinder) {
     checkNotNull(childFinder);
@@ -249,8 +231,8 @@
   }
 
   /**
-   * Matches a UiElement whose descendant (including self) matches the given descendantFinder. This
-   * could be VERY inefficient; consider {@link #xpath}.
+   * Matches a UiElement whose descendant (including self) matches the given
+   * descendantFinder. This could be VERY inefficient; consider {@link #xpath}.
    */
   public static MatchFinder withDescendant(final MatchFinder descendantFinder) {
     checkNotNull(descendantFinder);
@@ -272,14 +254,11 @@
     });
   }
 
-  /**
-   * Matches a UiElement that does not match the provided {@code finder}.
-   */
+  /** Matches a UiElement that does not match the provided {@code finder}. */
   public static MatchFinder not(MatchFinder finder) {
     checkNotNull(finder);
     return new MatchFinder(Predicates.not(finder.predicate));
   }
 
-  private By() {
-  }
+  private By() {}
 }
diff --git a/src/io/appium/droiddriver/finders/Predicates.java b/src/io/appium/droiddriver/finders/Predicates.java
index f32b365..1b9ad80 100644
--- a/src/io/appium/droiddriver/finders/Predicates.java
+++ b/src/io/appium/droiddriver/finders/Predicates.java
@@ -18,17 +18,13 @@
 
 import android.text.TextUtils;
 
-import java.util.Arrays;
-
 import io.appium.droiddriver.UiElement;
 
 /**
  * Static utility methods pertaining to {@code Predicate} instances.
  */
 public final class Predicates {
-
-  private Predicates() {
-  }
+  private Predicates() {}
 
   private static final Predicate<Object> ANY = new Predicate<Object>() {
     @Override
@@ -68,9 +64,9 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} if both arguments evaluate to {@code true}.
-   * The arguments are evaluated in order, and evaluation will be "short-circuited" as soon as a
-   * false predicate is found.
+   * Returns a predicate that evaluates to {@code true} if both arguments
+   * evaluate to {@code true}. The arguments are evaluated in order, and
+   * evaluation will be "short-circuited" as soon as a false predicate is found.
    */
   @SuppressWarnings("unchecked")
   public static <T> Predicate<T> allOf(final Predicate<? super T> first,
@@ -96,11 +92,13 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} if each of its components evaluates to
-   * {@code true}. The components are evaluated in order, and evaluation will be "short-circuited"
-   * as soon as a false predicate is found.
+   * Returns a predicate that evaluates to {@code true} if each of its
+   * components evaluates to {@code true}. The components are evaluated in
+   * order, and evaluation will be "short-circuited" as soon as a false
+   * predicate is found.
    */
-  public static <T> Predicate<T> allOf(final Iterable<Predicate<? super T>> components) {
+  @SuppressWarnings("unchecked")
+  public static <T> Predicate<T> allOf(final Predicate<? super T>... components) {
     return new Predicate<T>() {
       @Override
       public boolean apply(T input) {
@@ -120,21 +118,13 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} if each of its components evaluates to
-   * {@code true}. The components are evaluated in order, and evaluation will be "short-circuited"
-   * as soon as a false predicate is found.
+   * Returns a predicate that evaluates to {@code true} if any one of its
+   * components evaluates to {@code true}. The components are evaluated in
+   * order, and evaluation will be "short-circuited" as soon as a true predicate
+   * is found.
    */
-  @SafeVarargs
-  public static <T> Predicate<T> allOf(final Predicate<? super T>... components) {
-    return Predicates.<T>allOf(Arrays.asList(components));
-  }
-
-  /**
-   * Returns a predicate that evaluates to {@code true} if any one of its components evaluates to
-   * {@code true}. The components are evaluated in order, and evaluation will be "short-circuited"
-   * as soon as a true predicate is found.
-   */
-  public static <T> Predicate<T> anyOf(final Iterable<Predicate<? super T>> components) {
+  @SuppressWarnings("unchecked")
+  public static <T> Predicate<T> anyOf(final Predicate<? super T>... components) {
     return new Predicate<T>() {
       @Override
       public boolean apply(T input) {
@@ -154,18 +144,8 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} if any one of its components evaluates to
-   * {@code true}. The components are evaluated in order, and evaluation will be "short-circuited"
-   * as soon as a true predicate is found.
-   */
-  @SafeVarargs
-  public static <T> Predicate<T> anyOf(final Predicate<? super T>... components) {
-    return Predicates.<T>anyOf(Arrays.asList(components));
-  }
-
-  /**
-   * Returns a predicate that evaluates to {@code true} on a {@link UiElement} if its {@code
-   * attribute} is {@code true}.
+   * Returns a predicate that evaluates to {@code true} on a {@link UiElement}
+   * if its {@code attribute} is {@code true}.
    */
   public static Predicate<UiElement> attributeTrue(final Attribute attribute) {
     return new Predicate<UiElement>() {
@@ -183,8 +163,8 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} on a {@link UiElement} if its {@code
-   * attribute} is {@code false}.
+   * Returns a predicate that evaluates to {@code true} on a {@link UiElement}
+   * if its {@code attribute} is {@code false}.
    */
   public static Predicate<UiElement> attributeFalse(final Attribute attribute) {
     return new Predicate<UiElement>() {
@@ -202,8 +182,8 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} on a {@link UiElement} if its {@code
-   * attribute} equals {@code expected}.
+   * Returns a predicate that evaluates to {@code true} on a {@link UiElement}
+   * if its {@code attribute} equals {@code expected}.
    */
   public static Predicate<UiElement> attributeEquals(final Attribute attribute,
       final Object expected) {
@@ -222,11 +202,10 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} on a {@link UiElement} if its {@code
-   * attribute} matches {@code regex}.
+   * Returns a predicate that evaluates to {@code true} on a {@link UiElement}
+   * if its {@code attribute} matches {@code regex}.
    */
-  public static Predicate<UiElement> attributeMatches(final Attribute attribute,
-      final String regex) {
+  public static Predicate<UiElement> attributeMatches(final Attribute attribute, final String regex) {
     return new Predicate<UiElement>() {
       @Override
       public boolean apply(UiElement element) {
@@ -242,8 +221,8 @@
   }
 
   /**
-   * Returns a predicate that evaluates to {@code true} on a {@link UiElement} if its {@code
-   * attribute} contains {@code substring}.
+   * Returns a predicate that evaluates to {@code true} on a {@link UiElement}
+   * if its {@code attribute} contains {@code substring}.
    */
   public static Predicate<UiElement> attributeContains(final Attribute attribute,
       final String substring) {
@@ -261,8 +240,7 @@
     };
   }
 
-  public static Predicate<UiElement> withParent(
-      final Predicate<? super UiElement> parentPredicate) {
+  public static Predicate<UiElement> withParent(final Predicate<? super UiElement> parentPredicate) {
     return new Predicate<UiElement>() {
       @Override
       public boolean apply(UiElement element) {
@@ -299,8 +277,7 @@
     };
   }
 
-  public static Predicate<UiElement> withSibling(
-      final Predicate<? super UiElement> siblingPredicate) {
+  public static Predicate<UiElement> withSibling(final Predicate<? super UiElement> siblingPredicate) {
     return new Predicate<UiElement>() {
       @Override
       public boolean apply(UiElement element) {
@@ -341,6 +318,4 @@
       }
     };
   }
-
-
 }
diff --git a/src/io/appium/droiddriver/uiautomation/UiAutomationElement.java b/src/io/appium/droiddriver/uiautomation/UiAutomationElement.java
index c011749..cf7449e 100644
--- a/src/io/appium/droiddriver/uiautomation/UiAutomationElement.java
+++ b/src/io/appium/droiddriver/uiautomation/UiAutomationElement.java
@@ -141,9 +141,7 @@
     Rect parentBounds;
     while (parent != null) {
       parentBounds = parent.getBounds();
-      if (!visibleBounds.intersect(parentBounds)) {
-        return new Rect();
-      }
+      visibleBounds.intersect(parentBounds);
       parent = parent.getParent();
     }
     return visibleBounds;