AI 144008: UriMatcher: Avoid repeated calls to Uri.getPathSegments()
  in UriMatcher.match().
  Before, every call to UriMatcher.match() called
  Uri.getPathSegments() N + 1 times,
  where N is the size of the list returned by
  Uri.getPathSegments(). Since some of the implementations
  of Uri.getPathSegments() are O(N), UriMatcher.match() was O(N^2).
  This CL fixes the problem by calling uri.getPathSegments() once in
  the beginning of match(). That should be safe since Uri is
  immutable.
  BUG=1751158

Automated import of CL 144008
diff --git a/core/java/android/content/UriMatcher.java b/core/java/android/content/UriMatcher.java
index a98e6d5..c28ecac 100644
--- a/core/java/android/content/UriMatcher.java
+++ b/core/java/android/content/UriMatcher.java
@@ -200,7 +200,8 @@
      */
     public int match(Uri uri)
     {
-        final int li = uri.getPathSegments().size();
+        final List<String> pathSegments = uri.getPathSegments();
+        final int li = pathSegments.size();
 
         UriMatcher node = this;
 
@@ -209,7 +210,7 @@
         }
 
         for (int i=-1; i<li; i++) {
-            String u = i < 0 ? uri.getAuthority() : uri.getPathSegments().get(i);
+            String u = i < 0 ? uri.getAuthority() : pathSegments.get(i);
             ArrayList<UriMatcher> list = node.mChildren;
             if (list == null) {
                 break;