19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 223a184efa127da097d7fa5a37bc944b47a7025858Bjorn Bringertimport java.util.List; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.regex.Pattern; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectUtility class to aid in matching URIs in content providers. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 280a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien<p>To use this class, build up a tree of <code>UriMatcher</code> objects. 290a675fd8fe145ce636f363c8d29e2416d7d52003Daniel TrebbienFor example: 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<pre> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PEOPLE = 1; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PEOPLE_ID = 2; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PEOPLE_PHONES = 3; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PEOPLE_PHONES_ID = 4; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PEOPLE_CONTACTMETHODS = 7; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PEOPLE_CONTACTMETHODS_ID = 8; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DELETED_PEOPLE = 20; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PHONES = 9; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PHONES_ID = 10; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PHONES_FILTER = 14; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int CONTACTMETHODS = 18; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int CONTACTMETHODS_ID = 19; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int CALLS = 11; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int CALLS_ID = 12; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int CALLS_FILTER = 15; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 510a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 550a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "people", PEOPLE); 560a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "people/#", PEOPLE_ID); 570a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "people/#/phones", PEOPLE_PHONES); 580a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "people/#/phones/#", PEOPLE_PHONES_ID); 590a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "people/#/contact_methods", PEOPLE_CONTACTMETHODS); 600a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID); 610a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "deleted_people", DELETED_PEOPLE); 620a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "phones", PHONES); 630a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "phones/filter/*", PHONES_FILTER); 640a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "phones/#", PHONES_ID); 650a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "contact_methods", CONTACTMETHODS); 660a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("contacts", "contact_methods/#", CONTACTMETHODS_ID); 670a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("call_log", "calls", CALLS); 680a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("call_log", "calls/filter/*", CALLS_FILTER); 690a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien sURIMatcher.addURI("call_log", "calls/#", CALLS_ID); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</pre> 720a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien<p>Then when you need to match against a URI, call {@link #match}, providing 730a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbienthe URL that you have been given. You can use the result to build a query, 740a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbienreturn a type, insert or delete a row, or whatever you need, without duplicating 750a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbienall of the if-else logic that you would otherwise need. For example: 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<pre> 770a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien public String getType(Uri url) 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 790a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien int match = sURIMatcher.match(url); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (match) 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PEOPLE: 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.dir/person"; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PEOPLE_ID: 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.item/person"; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project... snip ... 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.dir/snail-mail"; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PEOPLE_ADDRESS_ID: 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.item/snail-mail"; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</pre> 950a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbieninstead of: 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<pre> 970a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien public String getType(Uri url) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 990a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien List<String> pathSegments = url.getPathSegments(); 1000a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien if (pathSegments.size() >= 2) { 1010a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien if ("people".equals(pathSegments.get(1))) { 1020a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien if (pathSegments.size() == 2) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.dir/person"; 1040a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien } else if (pathSegments.size() == 3) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.item/person"; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project... snip ... 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.dir/snail-mail"; 1080a675fd8fe145ce636f363c8d29e2416d7d52003Daniel Trebbien } else if (pathSegments.size() == 3) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "vnd.android.cursor.item/snail-mail"; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</pre> 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class UriMatcher 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NO_MATCH = -1; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates the root node of the URI tree. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param code the code to match for the root URI 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public UriMatcher(int code) 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCode = code; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhich = -1; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildren = new ArrayList<UriMatcher>(); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mText = null; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private UriMatcher() 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCode = NO_MATCH; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhich = -1; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildren = new ArrayList<UriMatcher>(); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mText = null; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a URI to match, and the code to return when this URI is 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * matched. URI nodes may be exact match string, the token "*" 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that matches any text, or the token "#" that matches only 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * numbers. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param authority the authority to match 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path the path to match. * may be used as a wild card for 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any text, and # may be used as a wild card for numbers. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param code the code that is returned when a URI is matched 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * against the given components. Must be positive. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addURI(String authority, String path, int code) 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code < 0) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("code " + code + " is invalid: it must be positive"); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] tokens = path != null ? PATH_SPLIT_PATTERN.split(path) : null; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numTokens = tokens != null ? tokens.length : 0; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UriMatcher node = this; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = -1; i < numTokens; i++) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String token = i < 0 ? authority : tokens[i]; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<UriMatcher> children = node.mChildren; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numChildren = children.size(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UriMatcher child; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (j = 0; j < numChildren; j++) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child = children.get(j); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.equals(child.mText)) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node = child; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (j == numChildren) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child not found, create it 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child = new UriMatcher(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.equals("#")) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mWhich = NUMBER; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (token.equals("*")) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mWhich = TEXT; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mWhich = EXACT; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mText = token; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node.mChildren.add(child); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node = child; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node.mCode = code; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final Pattern PATH_SPLIT_PATTERN = Pattern.compile("/"); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Try to match against the path in a url. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The url whose path we will match against. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The code for the matched node (added using addURI), 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or -1 if there is no matched node. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int match(Uri uri) 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2045d015d7331923f852a2a8675b4203b29f6c34d96Bjorn Bringert final List<String> pathSegments = uri.getPathSegments(); 2055d015d7331923f852a2a8675b4203b29f6c34d96Bjorn Bringert final int li = pathSegments.size(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UriMatcher node = this; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (li == 0 && uri.getAuthority() == null) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.mCode; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=-1; i<li; i++) { 2145d015d7331923f852a2a8675b4203b29f6c34d96Bjorn Bringert String u = i < 0 ? uri.getAuthority() : pathSegments.get(i); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<UriMatcher> list = node.mChildren; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list == null) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node = null; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lj = list.size(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<lj; j++) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UriMatcher n = list.get(j); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project which_switch: 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (n.mWhich) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EXACT: 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n.mText.equals(u)) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node = n; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NUMBER: 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lk = u.length(); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k=0; k<lk; k++) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = u.charAt(k); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c < '0' || c > '9') { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break which_switch; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node = n; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TEXT: 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project node = n; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (node != null) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (node == null) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_MATCH; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return node.mCode; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EXACT = 0; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NUMBER = 1; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int TEXT = 2; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCode; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mWhich; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mText; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<UriMatcher> mChildren; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 265