154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/* 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you may not use this file except in compliance with the License. 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You may obtain a copy of the License at 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * See the License for the specific language governing permissions and 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * limitations under the License. 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpackage android.content; 1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedyimport android.annotation.IntDef; 209c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedyimport android.annotation.SystemApi; 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.net.Uri; 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.Parcel; 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.Parcelable; 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.PatternMatcher; 251c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglioimport android.text.TextUtils; 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.AndroidException; 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.Log; 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.Printer; 29129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jinimport android.util.proto.ProtoOutputStream; 302269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn 312269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 3337051cdd8624c4821bb68169be427061c48ad837Gilles Debunneimport org.xmlpull.v1.XmlPullParser; 3437051cdd8624c4821bb68169be427061c48ad837Gilles Debunneimport org.xmlpull.v1.XmlPullParserException; 3537051cdd8624c4821bb68169be427061c48ad837Gilles Debunneimport org.xmlpull.v1.XmlSerializer; 3637051cdd8624c4821bb68169be427061c48ad837Gilles Debunne 3737051cdd8624c4821bb68169be427061c48ad837Gilles Debunneimport java.io.IOException; 38c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedyimport java.lang.annotation.Retention; 39c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedyimport java.lang.annotation.RetentionPolicy; 4037051cdd8624c4821bb68169be427061c48ad837Gilles Debunneimport java.util.ArrayList; 4137051cdd8624c4821bb68169be427061c48ad837Gilles Debunneimport java.util.Iterator; 4237051cdd8624c4821bb68169be427061c48ad837Gilles Debunneimport java.util.Set; 4337051cdd8624c4821bb68169be427061c48ad837Gilles Debunne 4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Structured description of Intent values to be matched. An IntentFilter can 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * match against actions, categories, and data (either via its type, scheme, 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * and/or path) in an Intent. It also includes a "priority" value which is 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * used to order multiple matching filters. 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>IntentFilter objects are often created in XML as part of a package's 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link android.R.styleable#AndroidManifest AndroidManifest.xml} file, 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * using {@link android.R.styleable#AndroidManifestIntentFilter intent-filter} 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * tags. 5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>There are three Intent characteristics you can filter on: the 5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <em>action</em>, <em>data</em>, and <em>categories</em>. For each of these 5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * characteristics you can provide 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * multiple possible matching values (via {@link #addAction}, 59df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * {@link #addDataType}, {@link #addDataScheme}, {@link #addDataSchemeSpecificPart}, 60df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * {@link #addDataAuthority}, {@link #addDataPath}, and {@link #addCategory}, respectively). 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For actions, the field 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * will not be tested if no values have been given (treating it as a wildcard); 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * if no data characteristics are specified, however, then the filter will 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * only match intents that contain no data. 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>The data characteristic is 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * itself divided into three attributes: type, scheme, authority, and path. 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Any that are 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * specified must match the contents of the Intent. If you specify a scheme 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * but no type, only Intent that does not have a type (such as mailto:) will 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * match; a content: URI will never match because they always have a MIME type 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * that is supplied by their content provider. Specifying a type with no scheme 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * has somewhat special meaning: it will match either an Intent with no URI 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * field, or an Intent with a content: or file: URI. If you specify neither, 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * then only an Intent with no data or type will match. To specify an authority, 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you must also specify one or more schemes that it is associated with. 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To specify a path, you also must specify both one or more authorities and 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * one or more schemes it is associated with. 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 80b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <div class="special reference"> 81b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <h3>Developer Guides</h3> 82b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <p>For information about how to create and resolve intents, read the 83b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> 84b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * developer guide.</p> 85b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * </div> 86b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * 87b54e7a3d9f60ac605f404f9eb3c5e92ca51bbd23Joe Fernandez * <h3>Filter Rules</h3> 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>A match is based on the following rules. Note that 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * for an IntentFilter to match an Intent, three conditions must hold: 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the <strong>action</strong> and <strong>category</strong> must match, and 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the data (both the <strong>data type</strong> and 920ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * <strong>data scheme+authority+path</strong> if specified) must match 930ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * (see {@link #match(ContentResolver, Intent, boolean, String)} for more details 940ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * on how the data fields match). 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p><strong>Action</strong> matches if any of the given values match the 97a53ee35754d22e58978c9fd81396e599e00bac18Dianne Hackborn * Intent action; if the filter specifies no actions, then it will only match 98a53ee35754d22e58978c9fd81396e599e00bac18Dianne Hackborn * Intents that do not contain an action. 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p><strong>Data Type</strong> matches if any of the given values match the 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent type. The Intent 10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * type is determined by calling {@link Intent#resolveType}. A wildcard can be 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * used for the MIME sub-type, in both the Intent and IntentFilter, so that the 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * type "audio/*" will match "audio/mpeg", "audio/aiff", "audio/*", etc. 105b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <em>Note that MIME type matching here is <b>case sensitive</b>, unlike 106b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * formal RFC MIME types!</em> You should thus always use lower case letters 107b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * for your MIME types. 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p><strong>Data Scheme</strong> matches if any of the given values match the 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent data's scheme. 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The Intent scheme is determined by calling {@link Intent#getData} 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * and {@link android.net.Uri#getScheme} on that URI. 113b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <em>Note that scheme matching here is <b>case sensitive</b>, unlike 114b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * formal RFC schemes!</em> You should thus always use lower case letters 115b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * for your schemes. 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 117df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * <p><strong>Data Scheme Specific Part</strong> matches if any of the given values match 118df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * the Intent's data scheme specific part <em>and</em> one of the data schemes in the filter 119df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * has matched the Intent, <em>or</em> no scheme specific parts were supplied in the filter. 120df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * The Intent scheme specific part is determined by calling 121df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * {@link Intent#getData} and {@link android.net.Uri#getSchemeSpecificPart} on that URI. 122df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * <em>Note that scheme specific part matching is <b>case sensitive</b>.</em> 123df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p><strong>Data Authority</strong> matches if any of the given values match 125df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * the Intent's data authority <em>and</em> one of the data schemes in the filter 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * has matched the Intent, <em>or</em> no authories were supplied in the filter. 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The Intent authority is determined by calling 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link Intent#getData} and {@link android.net.Uri#getAuthority} on that URI. 129b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <em>Note that authority matching here is <b>case sensitive</b>, unlike 130b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * formal RFC host names!</em> You should thus always use lower case letters 131b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * for your authority. 132e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * 13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p><strong>Data Path</strong> matches if any of the given values match the 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent's data path <em>and</em> both a scheme and authority in the filter 13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * has matched against the Intent, <em>or</em> no paths were supplied in the 13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter. The Intent authority is determined by calling 13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link Intent#getData} and {@link android.net.Uri#getPath} on that URI. 13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p><strong>Categories</strong> match if <em>all</em> of the categories in 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the Intent match categories given in the filter. Extra categories in the 14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter that are not in the Intent will not cause the match to fail. Note 14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * that unlike the action, an IntentFilter with no categories 14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * will only match an Intent that does not have any categories. 14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic class IntentFilter implements Parcelable { 1469c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy private static final String AGLOB_STR = "aglob"; 14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String SGLOB_STR = "sglob"; 14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String PREFIX_STR = "prefix"; 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String LITERAL_STR = "literal"; 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String PATH_STR = "path"; 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String PORT_STR = "port"; 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String HOST_STR = "host"; 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String AUTH_STR = "auth"; 154df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn private static final String SSP_STR = "ssp"; 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String SCHEME_STR = "scheme"; 15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String TYPE_STR = "type"; 15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String CAT_STR = "cat"; 15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String NAME_STR = "name"; 15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String ACTION_STR = "action"; 1601c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio private static final String AUTO_VERIFY_STR = "autoVerify"; 16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter {@link #setPriority} value at which system high-priority 16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * receivers are placed; that is, receivers that should execute before 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * application code. Applications should never use filters with this or 16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * higher priorities. 16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #setPriority 16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int SYSTEM_HIGH_PRIORITY = 1000; 17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter {@link #setPriority} value at which system low-priority 17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * receivers are placed; that is, receivers that should execute after 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * application code. Applications should never use filters with this or 17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * lower priorities. 17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #setPriority 17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int SYSTEM_LOW_PRIORITY = -1000; 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The part of a match constant that describes the category of match 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * that occurred. May be either {@link #MATCH_CATEGORY_EMPTY}, 185df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * {@link #MATCH_CATEGORY_SCHEME}, {@link #MATCH_CATEGORY_SCHEME_SPECIFIC_PART}, 186df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * {@link #MATCH_CATEGORY_HOST}, {@link #MATCH_CATEGORY_PORT}, 18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #MATCH_CATEGORY_PATH}, or {@link #MATCH_CATEGORY_TYPE}. Higher 18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * values indicate a better match. 18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_CATEGORY_MASK = 0xfff0000; 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The part of a match constant that applies a quality adjustment to the 19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * basic category of match. The value {@link #MATCH_ADJUSTMENT_NORMAL} 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * is no adjustment; higher numbers than that improve the quality, while 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * lower numbers reduce it. 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_ADJUSTMENT_MASK = 0x000ffff; 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Quality adjustment applied to the category of match that signifies 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the default, base value; higher numbers improve the quality while 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * lower numbers reduce it. 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_ADJUSTMENT_NORMAL = 0x8000; 20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter matched an intent that had no data specified. 20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_CATEGORY_EMPTY = 0x0100000; 21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter matched an intent with the same data URI scheme. 21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_CATEGORY_SCHEME = 0x0200000; 21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter matched an intent with the same data URI scheme and 21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * authority host. 21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_CATEGORY_HOST = 0x0300000; 22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter matched an intent with the same data URI scheme and 22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * authority host and port. 22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 22454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_CATEGORY_PORT = 0x0400000; 22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 22654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter matched an intent with the same data URI scheme, 22754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * authority, and path. 22854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_CATEGORY_PATH = 0x0500000; 23054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 231df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * The filter matched an intent with the same data URI scheme and 232df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * scheme specific part. 233df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn */ 234df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn public static final int MATCH_CATEGORY_SCHEME_SPECIFIC_PART = 0x0580000; 235df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn /** 23654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter matched an intent with the same data MIME type. 23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int MATCH_CATEGORY_TYPE = 0x0600000; 23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 24154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter didn't match due to different MIME types. 24254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int NO_MATCH_TYPE = -1; 24454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 24554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter didn't match due to different data URIs. 24654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 24754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int NO_MATCH_DATA = -2; 24854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 24954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter didn't match due to different actions. 25054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int NO_MATCH_ACTION = -3; 25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 25354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The filter didn't match because it required one or more categories 25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * that were not in the Intent. 25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 25654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final int NO_MATCH_CATEGORY = -4; 25754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2581c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 2591c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * HTTP scheme. 2601c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 2611c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #addDataScheme(String) 262ece0f4f5198e9e9cb60e96f036baf22c73411becDianne Hackborn * @hide 2631c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 2641c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public static final String SCHEME_HTTP = "http"; 2651c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 2661c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * HTTPS scheme. 2671c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 2681c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #addDataScheme(String) 269ece0f4f5198e9e9cb60e96f036baf22c73411becDianne Hackborn * @hide 2701c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 2711c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public static final String SCHEME_HTTPS = "https"; 2721c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 27354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private int mPriority; 274c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy private int mOrder; 27554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final ArrayList<String> mActions; 27654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private ArrayList<String> mCategories = null; 27754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private ArrayList<String> mDataSchemes = null; 278df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn private ArrayList<PatternMatcher> mDataSchemeSpecificParts = null; 27954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private ArrayList<AuthorityEntry> mDataAuthorities = null; 28054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private ArrayList<PatternMatcher> mDataPaths = null; 28154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private ArrayList<String> mDataTypes = null; 28254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private boolean mHasPartialTypes = false; 28354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2841c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio private static final int STATE_VERIFY_AUTO = 0x00000001; 2851c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio private static final int STATE_NEED_VERIFY = 0x00000010; 2861c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio private static final int STATE_NEED_VERIFY_CHECKED = 0x00000100; 2871c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio private static final int STATE_VERIFIED = 0x00001000; 2881c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 2891c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio private int mVerifyState; 290c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy /** @hide */ 291c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public static final int VISIBILITY_NONE = 0; 292c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy /** @hide */ 293c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public static final int VISIBILITY_EXPLICIT = 1; 294c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy /** @hide */ 295c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public static final int VISIBILITY_IMPLICIT = 2; 296c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy /** @hide */ 297c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy @IntDef(prefix = { "VISIBILITY_" }, value = { 298c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy VISIBILITY_NONE, 299c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy VISIBILITY_EXPLICIT, 300c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy VISIBILITY_IMPLICIT, 301c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy }) 302c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy @Retention(RetentionPolicy.SOURCE) 303c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public @interface InstantAppVisibility {} 30466b5c042c252d954d023ced64bf63484bd905f03Todd Kennedy /** Whether or not the intent filter is visible to instant apps. */ 305c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy private @InstantAppVisibility int mInstantAppVisibility; 30654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // These functions are the start of more optimized code for managing 30754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the string sets... not yet implemented. 30854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static int findStringInSet(String[] set, String string, 31054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int[] lengths, int lenPos) { 31154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (set == null) return -1; 31254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int N = lengths[lenPos]; 31354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 31454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (set[i].equals(string)) return i; 31554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 31654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return -1; 31754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 31854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 31954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static String[] addStringToSet(String[] set, String string, 32054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int[] lengths, int lenPos) { 32154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (findStringInSet(set, string, lengths, lenPos) >= 0) return set; 32254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (set == null) { 32354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project set = new String[2]; 32454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project set[0] = string; 32554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lengths[lenPos] = 1; 32654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return set; 32754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 32854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int N = lengths[lenPos]; 32954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (N < set.length) { 33054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project set[N] = string; 33154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lengths[lenPos] = N+1; 33254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return set; 33354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 33454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 33554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String[] newSet = new String[(N*3)/2 + 2]; 33654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(set, 0, newSet, 0, N); 33754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project set = newSet; 33854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project set[N] = string; 33954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lengths[lenPos] = N+1; 34054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return set; 34154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 34254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 34354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static String[] removeStringFromSet(String[] set, String string, 34454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int[] lengths, int lenPos) { 34554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int pos = findStringInSet(set, string, lengths, lenPos); 34654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (pos < 0) return set; 34754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int N = lengths[lenPos]; 34854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (N > (set.length/4)) { 34954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int copyLen = N-(pos+1); 35054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (copyLen > 0) { 35154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(set, pos+1, set, pos, copyLen); 35254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 35354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project set[N-1] = null; 35454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lengths[lenPos] = N-1; 35554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return set; 35654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 35754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 35854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String[] newSet = new String[set.length/3]; 35954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (pos > 0) System.arraycopy(set, 0, newSet, 0, pos); 36054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if ((pos+1) < N) System.arraycopy(set, pos+1, newSet, pos, N-(pos+1)); 36154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return newSet; 36254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 36354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 36454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 36554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * This exception is thrown when a given MIME type does not have a valid 36654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * syntax. 36754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 36854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static class MalformedMimeTypeException extends AndroidException { 36954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public MalformedMimeTypeException() { 37054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 37154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 37254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public MalformedMimeTypeException(String name) { 37354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super(name); 37454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 3751c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 37654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 37754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 37854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a new IntentFilter instance with a specified action and MIME 37954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * type, where you know the MIME type is correctly formatted. This catches 38054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the {@link MalformedMimeTypeException} exception that the constructor 38154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * can call and turns it into a runtime exception. 38254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 383e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param action The action to match, such as Intent.ACTION_VIEW. 384e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param dataType The type to match, such as "vnd.android.cursor.dir/person". 38554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 38654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return A new IntentFilter for the given action and type. 38754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 38854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #IntentFilter(String, String) 38954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 39054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static IntentFilter create(String action, String dataType) { 39154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project try { 39254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return new IntentFilter(action, dataType); 39354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } catch (MalformedMimeTypeException e) { 39454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project throw new RuntimeException("Bad MIME type", e); 39554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 39654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 39754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 39854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 39954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * New empty IntentFilter. 40054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 40154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public IntentFilter() { 40254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPriority = 0; 40354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mActions = new ArrayList<String>(); 40454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 40554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 40654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 40754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * New IntentFilter that matches a single action with no data. If 40854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * no data characteristics are subsequently specified, then the 40954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter will only match intents that contain no data. 41054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 411e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param action The action to match, such as Intent.ACTION_MAIN. 41254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 41354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public IntentFilter(String action) { 41454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPriority = 0; 41554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mActions = new ArrayList<String>(); 41654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addAction(action); 41754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * New IntentFilter that matches a single action and data type. 42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 422b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <p><em>Note: MIME type matching in the Android framework is 423b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * case-sensitive, unlike formal RFC MIME types. As a result, 424b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * you should always write your MIME types with lower case letters, 425b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * and any MIME types you receive from outside of Android should be 426b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * converted to lower case before supplying them here.</em></p> 427b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * 42854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>Throws {@link MalformedMimeTypeException} if the given MIME type is 42954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * not syntactically correct. 43054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 431e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param action The action to match, such as Intent.ACTION_VIEW. 432e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param dataType The type to match, such as "vnd.android.cursor.dir/person". 43354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 43454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 43554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public IntentFilter(String action, String dataType) 43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project throws MalformedMimeTypeException { 43754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPriority = 0; 43854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mActions = new ArrayList<String>(); 43924847f35177fd970670aa1ffdfc6639bbd11d1f5Tom Gibara addAction(action); 44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addDataType(dataType); 44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 44454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * New IntentFilter containing a copy of an existing filter. 44554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 44654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param o The original filter to copy. 44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public IntentFilter(IntentFilter o) { 44954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPriority = o.mPriority; 450c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy mOrder = o.mOrder; 45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mActions = new ArrayList<String>(o.mActions); 45254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (o.mCategories != null) { 45354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCategories = new ArrayList<String>(o.mCategories); 45454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 45554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (o.mDataTypes != null) { 45654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataTypes = new ArrayList<String>(o.mDataTypes); 45754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 45854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (o.mDataSchemes != null) { 45954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataSchemes = new ArrayList<String>(o.mDataSchemes); 46054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 461df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (o.mDataSchemeSpecificParts != null) { 462df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn mDataSchemeSpecificParts = new ArrayList<PatternMatcher>(o.mDataSchemeSpecificParts); 463df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 46454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (o.mDataAuthorities != null) { 46554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataAuthorities = new ArrayList<AuthorityEntry>(o.mDataAuthorities); 46654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 46754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (o.mDataPaths != null) { 46854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataPaths = new ArrayList<PatternMatcher>(o.mDataPaths); 46954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 47054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHasPartialTypes = o.mHasPartialTypes; 4711c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio mVerifyState = o.mVerifyState; 472c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy mInstantAppVisibility = o.mInstantAppVisibility; 47354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 47454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 47554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 4762c4078611ad1f91c84ef8fd4fac107699b670b06Todd Kennedy * Modify priority of this filter. This only affects receiver filters. 4772c4078611ad1f91c84ef8fd4fac107699b670b06Todd Kennedy * The priority of activity filters are set in XML and cannot be changed 4782c4078611ad1f91c84ef8fd4fac107699b670b06Todd Kennedy * programatically. The default priority is 0. Positive values will be 4792c4078611ad1f91c84ef8fd4fac107699b670b06Todd Kennedy * before the default, lower values will be after it. Applications should 4802c4078611ad1f91c84ef8fd4fac107699b670b06Todd Kennedy * use a value that is larger than {@link #SYSTEM_LOW_PRIORITY} and 4812c4078611ad1f91c84ef8fd4fac107699b670b06Todd Kennedy * smaller than {@link #SYSTEM_HIGH_PRIORITY} . 48254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 48354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param priority The new priority value. 48454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 48554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #getPriority 48654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #SYSTEM_LOW_PRIORITY 48754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #SYSTEM_HIGH_PRIORITY 48854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 48954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void setPriority(int priority) { 49054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPriority = priority; 49154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 49254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 49354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 49454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the priority of this filter. 49554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 49654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return The priority of the filter. 49754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 49854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #setPriority 49954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 50054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int getPriority() { 50154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mPriority; 50254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 504c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy /** @hide */ 5059c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy @SystemApi 506c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy public final void setOrder(int order) { 507c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy mOrder = order; 508c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy } 509c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy 510c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy /** @hide */ 5119c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy @SystemApi 512c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy public final int getOrder() { 513c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy return mOrder; 514c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy } 515c2e96d45d27ab1465aaef89c1a3161708c714bcdTodd Kennedy 51654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 5171c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * Set whether this filter will needs to be automatically verified against its data URIs or not. 5181c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * The default is false. 5191c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5201c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * The verification would need to happen only and only if the Intent action is 5211c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * {@link android.content.Intent#ACTION_VIEW} and the Intent category is 5221c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * {@link android.content.Intent#CATEGORY_BROWSABLE} and the Intent data scheme 5231c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * is "http" or "https". 5241c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5251c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * True means that the filter will need to use its data URIs to be verified. 5261c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5271c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @param autoVerify The new autoVerify value. 5281c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5291c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #getAutoVerify() 5301c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #addAction(String) 5311c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #getAction(int) 5321c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #addCategory(String) 5331c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #getCategory(int) 5341c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #addDataScheme(String) 5351c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #getDataScheme(int) 5361c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5371c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @hide 5381c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 5391c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public final void setAutoVerify(boolean autoVerify) { 5401c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio mVerifyState &= ~STATE_VERIFY_AUTO; 5411c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio if (autoVerify) mVerifyState |= STATE_VERIFY_AUTO; 5421c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 5431c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 5441c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 5451c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * Return if this filter will needs to be automatically verified again its data URIs or not. 5461c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5471c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @return True if the filter will needs to be automatically verified. False otherwise. 5481c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5491c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #setAutoVerify(boolean) 5501c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 5511c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @hide 5521c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 5531c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public final boolean getAutoVerify() { 5543decab60ac992093dbb731eb71588737e7d835daChristopher Tate return ((mVerifyState & STATE_VERIFY_AUTO) == STATE_VERIFY_AUTO); 5551c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 5561c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 5571c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 5582134744efd305a875b7baa5073358387c479e3e4Christopher Tate * Return if this filter handle all HTTP or HTTPS data URI or not. This is the 5592134744efd305a875b7baa5073358387c479e3e4Christopher Tate * core check for whether a given activity qualifies as a "browser". 5607d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * 5617d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * @return True if the filter handle all HTTP or HTTPS data URI. False otherwise. 5627d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * 5632d897fbc447fd315b246a752e14825cbd7214e74Fabrice Di Meglio * This will check if: 5642d897fbc447fd315b246a752e14825cbd7214e74Fabrice Di Meglio * 5652d897fbc447fd315b246a752e14825cbd7214e74Fabrice Di Meglio * - either the Intent category is {@link android.content.Intent#CATEGORY_APP_BROWSER} 5662d897fbc447fd315b246a752e14825cbd7214e74Fabrice Di Meglio * - either the Intent action is {@link android.content.Intent#ACTION_VIEW} and 5677d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * the Intent category is {@link android.content.Intent#CATEGORY_BROWSABLE} and the Intent 5687d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * data scheme is "http" or "https" and that there is no specific host defined. 5697d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * 5707d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * @hide 5717d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio */ 5727d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio public final boolean handleAllWebDataURI() { 5732d897fbc447fd315b246a752e14825cbd7214e74Fabrice Di Meglio return hasCategory(Intent.CATEGORY_APP_BROWSER) || 5742134744efd305a875b7baa5073358387c479e3e4Christopher Tate (handlesWebUris(false) && countDataAuthorities() == 0); 5757d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio } 5767d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio 5777d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio /** 5782134744efd305a875b7baa5073358387c479e3e4Christopher Tate * Return if this filter handles HTTP or HTTPS data URIs. 5797d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * 580413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate * @return True if the filter handles ACTION_VIEW/CATEGORY_BROWSABLE, 5812134744efd305a875b7baa5073358387c479e3e4Christopher Tate * has at least one HTTP or HTTPS data URI pattern defined, and optionally 5822134744efd305a875b7baa5073358387c479e3e4Christopher Tate * does not define any non-http/https data URI patterns. 5837d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * 5847d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * This will check if if the Intent action is {@link android.content.Intent#ACTION_VIEW} and 5857d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * the Intent category is {@link android.content.Intent#CATEGORY_BROWSABLE} and the Intent 5867d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * data scheme is "http" or "https". 5877d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * 5882134744efd305a875b7baa5073358387c479e3e4Christopher Tate * @param onlyWebSchemes When true, requires that the intent filter declare 5892134744efd305a875b7baa5073358387c479e3e4Christopher Tate * that it handles *only* http: or https: schemes. This is a requirement for 5902134744efd305a875b7baa5073358387c479e3e4Christopher Tate * the intent filter's domain linkage being verifiable. 5917d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio * @hide 5927d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio */ 5932134744efd305a875b7baa5073358387c479e3e4Christopher Tate public final boolean handlesWebUris(boolean onlyWebSchemes) { 594413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate // Require ACTION_VIEW, CATEGORY_BROWSEABLE, and at least one scheme 595413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate if (!hasAction(Intent.ACTION_VIEW) 596413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate || !hasCategory(Intent.CATEGORY_BROWSABLE) 597413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate || mDataSchemes == null 598413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate || mDataSchemes.size() == 0) { 599413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate return false; 600413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate } 601413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate 602413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate // Now allow only the schemes "http" and "https" 603413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate final int N = mDataSchemes.size(); 604413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate for (int i = 0; i < N; i++) { 605413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate final String scheme = mDataSchemes.get(i); 6062134744efd305a875b7baa5073358387c479e3e4Christopher Tate final boolean isWebScheme = 6072134744efd305a875b7baa5073358387c479e3e4Christopher Tate SCHEME_HTTP.equals(scheme) || SCHEME_HTTPS.equals(scheme); 6082134744efd305a875b7baa5073358387c479e3e4Christopher Tate if (onlyWebSchemes) { 6092134744efd305a875b7baa5073358387c479e3e4Christopher Tate // If we're specifically trying to ensure that there are no non-web schemes 6102134744efd305a875b7baa5073358387c479e3e4Christopher Tate // declared in this filter, then if we ever see a non-http/https scheme then 6112134744efd305a875b7baa5073358387c479e3e4Christopher Tate // we know it's a failure. 6122134744efd305a875b7baa5073358387c479e3e4Christopher Tate if (!isWebScheme) { 6132134744efd305a875b7baa5073358387c479e3e4Christopher Tate return false; 6142134744efd305a875b7baa5073358387c479e3e4Christopher Tate } 6152134744efd305a875b7baa5073358387c479e3e4Christopher Tate } else { 6162134744efd305a875b7baa5073358387c479e3e4Christopher Tate // If we see any http/https scheme declaration in this case then the 6172134744efd305a875b7baa5073358387c479e3e4Christopher Tate // filter matches what we're looking for. 6182134744efd305a875b7baa5073358387c479e3e4Christopher Tate if (isWebScheme) { 6192134744efd305a875b7baa5073358387c479e3e4Christopher Tate return true; 6202134744efd305a875b7baa5073358387c479e3e4Christopher Tate } 621413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate } 622413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate } 623413020a6ca6e7d4eb7e61e3fe7d7a4c570a605dbChristopher Tate 6242134744efd305a875b7baa5073358387c479e3e4Christopher Tate // We get here if: 6252134744efd305a875b7baa5073358387c479e3e4Christopher Tate // 1) onlyWebSchemes and no non-web schemes were found, i.e success; or 6262134744efd305a875b7baa5073358387c479e3e4Christopher Tate // 2) !onlyWebSchemes and no http/https schemes were found, i.e. failure. 6272134744efd305a875b7baa5073358387c479e3e4Christopher Tate return onlyWebSchemes; 6287d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio } 6297d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio 6307d014cec63939f7aca2a8014f45cd4c9a3e1aa0cFabrice Di Meglio /** 6311c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * Return if this filter needs to be automatically verified again its data URIs or not. 6321c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6331c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @return True if the filter needs to be automatically verified. False otherwise. 6341c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6351c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * This will check if if the Intent action is {@link android.content.Intent#ACTION_VIEW} and 6361c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * the Intent category is {@link android.content.Intent#CATEGORY_BROWSABLE} and the Intent 6371c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * data scheme is "http" or "https". 6381c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6391c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @see #setAutoVerify(boolean) 6401c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6411c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @hide 6421c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 6431c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public final boolean needsVerification() { 6442134744efd305a875b7baa5073358387c479e3e4Christopher Tate return getAutoVerify() && handlesWebUris(true); 6451c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 6461c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 6471c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 6481c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * Return if this filter has been verified 6491c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6501c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @return true if the filter has been verified or if autoVerify is false. 6511c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6521c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @hide 6531c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 6541c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public final boolean isVerified() { 6551c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio if ((mVerifyState & STATE_NEED_VERIFY_CHECKED) == STATE_NEED_VERIFY_CHECKED) { 6561c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio return ((mVerifyState & STATE_NEED_VERIFY) == STATE_NEED_VERIFY); 6571c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 6581c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio return false; 6591c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 6601c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 6611c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 6621c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * Set if this filter has been verified 6631c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6641c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @param verified true if this filter has been verified. False otherwise. 6651c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * 6661c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @hide 6671c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 6681c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public void setVerified(boolean verified) { 6691c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio mVerifyState |= STATE_NEED_VERIFY_CHECKED; 6701c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio mVerifyState &= ~STATE_VERIFIED; 6711c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio if (verified) mVerifyState |= STATE_VERIFIED; 6721c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 6731c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 6747bc3a70966f17bf16acbf4fe640dab0698866d72Todd Kennedy /** @hide */ 675c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public void setVisibilityToInstantApp(@InstantAppVisibility int visibility) { 676c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy mInstantAppVisibility = visibility; 677c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy } 678c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy /** @hide */ 679c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public @InstantAppVisibility int getVisibilityToInstantApp() { 680c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy return mInstantAppVisibility; 6817bc3a70966f17bf16acbf4fe640dab0698866d72Todd Kennedy } 6827bc3a70966f17bf16acbf4fe640dab0698866d72Todd Kennedy /** @hide */ 683be0b8896d1bc385d4c8fb54c21929745935dcbeaTodd Kennedy public boolean isVisibleToInstantApp() { 684c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy return mInstantAppVisibility != VISIBILITY_NONE; 685c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy } 686c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy /** @hide */ 687c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public boolean isExplicitlyVisibleToInstantApp() { 688c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy return mInstantAppVisibility == VISIBILITY_EXPLICIT; 689c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy } 690c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy /** @hide */ 691c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy public boolean isImplicitlyVisibleToInstantApp() { 692c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy return mInstantAppVisibility == VISIBILITY_IMPLICIT; 6937bc3a70966f17bf16acbf4fe640dab0698866d72Todd Kennedy } 6947bc3a70966f17bf16acbf4fe640dab0698866d72Todd Kennedy 6951c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 69654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Add a new Intent action to match against. If any actions are included 69754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * in the filter, then an Intent's action must be one of those values for 69854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * it to match. If no actions are included, the Intent action is ignored. 69954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 700e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param action Name of the action to match, such as Intent.ACTION_VIEW. 70154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 70254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void addAction(String action) { 70354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mActions.contains(action)) { 70454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mActions.add(action.intern()); 70554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 70654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 70754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 70854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 70954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the number of actions in the filter. 71054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 71154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int countActions() { 71254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mActions.size(); 71354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 71454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 71554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 71654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return an action in the filter. 71754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 71854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final String getAction(int index) { 71954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mActions.get(index); 72054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 72154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 72254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 72354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Is the given action included in the filter? Note that if the filter 72454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * does not include any actions, false will <em>always</em> be returned. 72554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 72654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param action The action to look for. 72754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 72854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return True if the action is explicitly mentioned in the filter. 72954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 73054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final boolean hasAction(String action) { 7312c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown return action != null && mActions.contains(action); 73254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 73354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 73454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 73554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Match this filter against an Intent's action. If the filter does not 73654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * specify any actions, the match will always fail. 73754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 73854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param action The desired action to look for. 73954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 7402c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown * @return True if the action is listed in the filter. 74154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 74254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final boolean matchAction(String action) { 7432c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown return hasAction(action); 74454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 74554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 74654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 74754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return an iterator over the filter's actions. If there are no actions, 74854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * returns null. 74954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 75054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final Iterator<String> actionsIterator() { 75154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mActions != null ? mActions.iterator() : null; 75254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 75354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 75454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 75554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Add a new Intent data type to match against. If any types are 75654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * included in the filter, then an Intent's data must be <em>either</em> 75754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * one of these types <em>or</em> a matching scheme. If no data types 75854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * are included, then an Intent will only match if it specifies no data. 75954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 760b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <p><em>Note: MIME type matching in the Android framework is 761b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * case-sensitive, unlike formal RFC MIME types. As a result, 762b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * you should always write your MIME types with lower case letters, 763b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * and any MIME types you receive from outside of Android should be 764b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * converted to lower case before supplying them here.</em></p> 765b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * 76654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>Throws {@link MalformedMimeTypeException} if the given MIME type is 76754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * not syntactically correct. 76854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 769e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param type Name of the data type to match, such as "vnd.android.cursor.dir/person". 77054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 77154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #matchData 77254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 77354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void addDataType(String type) 77454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project throws MalformedMimeTypeException { 77554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int slashpos = type.indexOf('/'); 77654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int typelen = type.length(); 77754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (slashpos > 0 && typelen >= slashpos+2) { 77854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataTypes == null) mDataTypes = new ArrayList<String>(); 77954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (typelen == slashpos+2 && type.charAt(slashpos+1) == '*') { 78054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String str = type.substring(0, slashpos); 78154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mDataTypes.contains(str)) { 78254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataTypes.add(str.intern()); 78354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 78454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHasPartialTypes = true; 78554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 78654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mDataTypes.contains(type)) { 78754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataTypes.add(type.intern()); 78854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 78954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 79054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 79154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 79254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 79354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project throw new MalformedMimeTypeException(type); 79454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 79554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 79654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 79754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Is the given data type included in the filter? Note that if the filter 79854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * does not include any type, false will <em>always</em> be returned. 79954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 80054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param type The data type to look for. 80154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 80254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return True if the type is explicitly mentioned in the filter. 80354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 80454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final boolean hasDataType(String type) { 80554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataTypes != null && findMimeType(type); 80654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 80754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 808f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn /** @hide */ 809f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn public final boolean hasExactDataType(String type) { 810f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return mDataTypes != null && mDataTypes.contains(type); 811f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 812f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn 81354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 81454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the number of data types in the filter. 81554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 81654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int countDataTypes() { 81754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataTypes != null ? mDataTypes.size() : 0; 81854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 81954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 82054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 82154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return a data type in the filter. 82254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 82354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final String getDataType(int index) { 82454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataTypes.get(index); 82554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 82654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 82754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 82854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return an iterator over the filter's data types. 82954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 83054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final Iterator<String> typesIterator() { 83154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataTypes != null ? mDataTypes.iterator() : null; 83254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 83354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 83454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 83554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Add a new Intent data scheme to match against. If any schemes are 83654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * included in the filter, then an Intent's data must be <em>either</em> 83754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * one of these schemes <em>or</em> a matching data type. If no schemes 83854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * are included, then an Intent will match only if it includes no data. 83954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 840b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <p><em>Note: scheme matching in the Android framework is 841b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * case-sensitive, unlike formal RFC schemes. As a result, 842b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * you should always write your schemes with lower case letters, 843b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * and any schemes you receive from outside of Android should be 844b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * converted to lower case before supplying them here.</em></p> 845b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * 846e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param scheme Name of the scheme to match, such as "http". 84754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 84854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #matchData 84954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 85054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void addDataScheme(String scheme) { 85154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataSchemes == null) mDataSchemes = new ArrayList<String>(); 85254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mDataSchemes.contains(scheme)) { 85354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataSchemes.add(scheme.intern()); 85454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 85554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 85654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 85754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 85854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the number of data schemes in the filter. 85954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 86054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int countDataSchemes() { 86154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataSchemes != null ? mDataSchemes.size() : 0; 86254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 86354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 86454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 86554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return a data scheme in the filter. 86654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 86754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final String getDataScheme(int index) { 86854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataSchemes.get(index); 86954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 87054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 87154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 87254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Is the given data scheme included in the filter? Note that if the 87354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter does not include any scheme, false will <em>always</em> be 87454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * returned. 87554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 87654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param scheme The data scheme to look for. 87754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 87854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return True if the scheme is explicitly mentioned in the filter. 87954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 88054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final boolean hasDataScheme(String scheme) { 88154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataSchemes != null && mDataSchemes.contains(scheme); 88254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 88354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 88454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 88554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return an iterator over the filter's data schemes. 88654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 88754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final Iterator<String> schemesIterator() { 88854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataSchemes != null ? mDataSchemes.iterator() : null; 88954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 89054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 89154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 89254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * This is an entry for a single authority in the Iterator returned by 89354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #authoritiesIterator()}. 89454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 89554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final static class AuthorityEntry { 89654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final String mOrigHost; 89754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final String mHost; 89854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final boolean mWild; 89954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final int mPort; 90054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 90154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public AuthorityEntry(String host, String port) { 90254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mOrigHost = host; 90354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mWild = host.length() > 0 && host.charAt(0) == '*'; 90454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHost = mWild ? host.substring(1).intern() : host; 90554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPort = port != null ? Integer.parseInt(port) : -1; 90654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 90754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 90854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project AuthorityEntry(Parcel src) { 90954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mOrigHost = src.readString(); 91054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHost = src.readString(); 91154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mWild = src.readInt() != 0; 91254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPort = src.readInt(); 91354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 91454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 91554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project void writeToParcel(Parcel dest) { 91654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeString(mOrigHost); 91754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeString(mHost); 91854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(mWild ? 1 : 0); 91954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(mPort); 92054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 92154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 922129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin void writeToProto(ProtoOutputStream proto, long fieldId) { 923129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin long token = proto.start(fieldId); 924129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin // The original host information is already contained in host and wild, no output now. 925129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(AuthorityEntryProto.HOST, mHost); 926129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(AuthorityEntryProto.WILD, mWild); 927129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(AuthorityEntryProto.PORT, mPort); 928129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.end(token); 929129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 930129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 93154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public String getHost() { 93254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mOrigHost; 93354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 93454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 93554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public int getPort() { 93654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mPort; 93754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 93854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 939f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn /** @hide */ 940f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn public boolean match(AuthorityEntry other) { 941f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mWild != other.mWild) { 942f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 943f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 944f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (!mHost.equals(other.mHost)) { 945f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 946f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 947f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mPort != other.mPort) { 948f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 949f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 950f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return true; 951f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 952f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn 9535585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy @Override 9545585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy public boolean equals(Object obj) { 9555585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy if (obj instanceof AuthorityEntry) { 9565585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy final AuthorityEntry other = (AuthorityEntry)obj; 9575585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy return match(other); 9585585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy } 9595585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy return false; 9605585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy } 9615585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy 962b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn /** 963b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * Determine whether this AuthorityEntry matches the given data Uri. 964b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <em>Note that this comparison is case-sensitive, unlike formal 965b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * RFC host names. You thus should always normalize to lower-case.</em> 966e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * 967b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * @param data The Uri to match. 968b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * @return Returns either {@link IntentFilter#NO_MATCH_DATA}, 969b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * {@link IntentFilter#MATCH_CATEGORY_PORT}, or 970b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * {@link IntentFilter#MATCH_CATEGORY_HOST}. 971b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn */ 97254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public int match(Uri data) { 97354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String host = data.getHost(); 97454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (host == null) { 97554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 97654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 97743a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v("IntentFilter", 97854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Match host " + host + ": " + mHost); 97954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mWild) { 98054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (host.length() < mHost.length()) { 98154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 98254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 98354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project host = host.substring(host.length()-mHost.length()); 98454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 98554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (host.compareToIgnoreCase(mHost) != 0) { 98654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 98754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 98854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mPort >= 0) { 98954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mPort != data.getPort()) { 99054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 99154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 99254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return MATCH_CATEGORY_PORT; 99354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 99454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return MATCH_CATEGORY_HOST; 99554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9965585dd971e265cbb3a515bb759710646c5bc6f63Todd Kennedy } 99754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 99854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 999df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * Add a new Intent data "scheme specific part" to match against. The filter must 1000df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * include one or more schemes (via {@link #addDataScheme}) for the 1001df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * scheme specific part to be considered. If any scheme specific parts are 1002df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * included in the filter, then an Intent's data must match one of 1003df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * them. If no scheme specific parts are included, then only the scheme must match. 1004df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * 1005ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * <p>The "scheme specific part" that this matches against is the string returned 1006ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * by {@link android.net.Uri#getSchemeSpecificPart() Uri.getSchemeSpecificPart}. 1007ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * For Uris that contain a path, this kind of matching is not generally of interest, 1008ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * since {@link #addDataAuthority(String, String)} and 1009ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * {@link #addDataPath(String, int)} can provide a better mechanism for matching 1010ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * them. However, for Uris that do not contain a path, the authority and path 1011ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * are empty, so this is the only way to match against the non-scheme part.</p> 1012ebc15ef80ff1b4354be99a45d348537f094d6b59Dianne Hackborn * 1013df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * @param ssp Either a raw string that must exactly match the scheme specific part 1014df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * path, or a simple pattern, depending on <var>type</var>. 1015df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * @param type Determines how <var>ssp</var> will be compared to 1016df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * determine a match: either {@link PatternMatcher#PATTERN_LITERAL}, 1017df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * {@link PatternMatcher#PATTERN_PREFIX}, or 1018df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * {@link PatternMatcher#PATTERN_SIMPLE_GLOB}. 1019df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * 1020df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * @see #matchData 1021df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * @see #addDataScheme 1022df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn */ 1023df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn public final void addDataSchemeSpecificPart(String ssp, int type) { 1024b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn addDataSchemeSpecificPart(new PatternMatcher(ssp, type)); 1025b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn } 1026b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn 1027b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn /** @hide */ 1028b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn public final void addDataSchemeSpecificPart(PatternMatcher ssp) { 1029439e9bc85d854cec5ca89e8947a17693e84cb4aeDianne Hackborn if (mDataSchemeSpecificParts == null) { 1030439e9bc85d854cec5ca89e8947a17693e84cb4aeDianne Hackborn mDataSchemeSpecificParts = new ArrayList<PatternMatcher>(); 1031439e9bc85d854cec5ca89e8947a17693e84cb4aeDianne Hackborn } 1032b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn mDataSchemeSpecificParts.add(ssp); 1033df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1034df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn 1035df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn /** 1036df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * Return the number of data scheme specific parts in the filter. 1037df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn */ 1038df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn public final int countDataSchemeSpecificParts() { 1039df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return mDataSchemeSpecificParts != null ? mDataSchemeSpecificParts.size() : 0; 1040df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1041df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn 1042df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn /** 1043df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * Return a data scheme specific part in the filter. 1044df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn */ 1045df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn public final PatternMatcher getDataSchemeSpecificPart(int index) { 1046df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return mDataSchemeSpecificParts.get(index); 1047df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1048df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn 1049df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn /** 1050df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * Is the given data scheme specific part included in the filter? Note that if the 1051df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * filter does not include any scheme specific parts, false will <em>always</em> be 1052df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * returned. 1053df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * 1054df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * @param data The scheme specific part that is being looked for. 1055df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * 1056df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * @return Returns true if the data string matches a scheme specific part listed in the 1057df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * filter. 1058df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn */ 1059df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn public final boolean hasDataSchemeSpecificPart(String data) { 1060df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (mDataSchemeSpecificParts == null) { 1061df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return false; 1062df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1063df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn final int numDataSchemeSpecificParts = mDataSchemeSpecificParts.size(); 1064df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn for (int i = 0; i < numDataSchemeSpecificParts; i++) { 1065df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn final PatternMatcher pe = mDataSchemeSpecificParts.get(i); 1066df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (pe.match(data)) { 1067df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return true; 1068df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1069df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1070df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return false; 1071df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1072df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn 1073f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn /** @hide */ 1074f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn public final boolean hasDataSchemeSpecificPart(PatternMatcher ssp) { 1075f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mDataSchemeSpecificParts == null) { 1076f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 1077f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1078f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final int numDataSchemeSpecificParts = mDataSchemeSpecificParts.size(); 1079f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn for (int i = 0; i < numDataSchemeSpecificParts; i++) { 1080f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final PatternMatcher pe = mDataSchemeSpecificParts.get(i); 1081f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (pe.getType() == ssp.getType() && pe.getPath().equals(ssp.getPath())) { 1082f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return true; 1083f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1084f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1085f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 1086f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1087f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn 1088df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn /** 1089df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn * Return an iterator over the filter's data scheme specific parts. 1090df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn */ 1091df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn public final Iterator<PatternMatcher> schemeSpecificPartsIterator() { 1092df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return mDataSchemeSpecificParts != null ? mDataSchemeSpecificParts.iterator() : null; 1093df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1094df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn 1095df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn /** 109654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Add a new Intent data authority to match against. The filter must 109754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * include one or more schemes (via {@link #addDataScheme}) for the 109854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * authority to be considered. If any authorities are 109954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * included in the filter, then an Intent's data must match one of 110054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * them. If no authorities are included, then only the scheme must match. 110154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1102b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <p><em>Note: host name in the Android framework is 1103b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * case-sensitive, unlike formal RFC host names. As a result, 1104b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * you should always write your host names with lower case letters, 1105b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * and any host names you receive from outside of Android should be 1106b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * converted to lower case before supplying them here.</em></p> 1107b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * 110854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param host The host part of the authority to match. May start with a 110954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * single '*' to wildcard the front of the host name. 111054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param port Optional port part of the authority to match. If null, any 111154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * port is allowed. 111254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 111354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #matchData 111454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #addDataScheme 111554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 111654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void addDataAuthority(String host, String port) { 1117b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn if (port != null) port = port.intern(); 1118b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn addDataAuthority(new AuthorityEntry(host.intern(), port)); 1119b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn } 1120b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn 1121b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn /** @hide */ 1122b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn public final void addDataAuthority(AuthorityEntry ent) { 112354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataAuthorities == null) mDataAuthorities = 112454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new ArrayList<AuthorityEntry>(); 1125b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn mDataAuthorities.add(ent); 112654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 112754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 112854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 112954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the number of data authorities in the filter. 113054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 113154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int countDataAuthorities() { 113254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataAuthorities != null ? mDataAuthorities.size() : 0; 113354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 113454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 113554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 113654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return a data authority in the filter. 113754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 113854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final AuthorityEntry getDataAuthority(int index) { 113954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataAuthorities.get(index); 114054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 114154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 114254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 114354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Is the given data authority included in the filter? Note that if the 114454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter does not include any authorities, false will <em>always</em> be 114554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * returned. 114654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 114754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param data The data whose authority is being looked for. 114854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 114954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return Returns true if the data string matches an authority listed in the 115054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter. 115154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 115254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final boolean hasDataAuthority(Uri data) { 115354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return matchDataAuthority(data) >= 0; 115454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 115554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1156f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn /** @hide */ 1157f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn public final boolean hasDataAuthority(AuthorityEntry auth) { 1158f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mDataAuthorities == null) { 1159f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 1160f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1161f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final int numDataAuthorities = mDataAuthorities.size(); 1162f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn for (int i = 0; i < numDataAuthorities; i++) { 1163f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mDataAuthorities.get(i).match(auth)) { 1164f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return true; 1165f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1166f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1167f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 1168f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1169f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn 117054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 117154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return an iterator over the filter's data authorities. 117254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 117354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final Iterator<AuthorityEntry> authoritiesIterator() { 117454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataAuthorities != null ? mDataAuthorities.iterator() : null; 117554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 117654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 117754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 117837051cdd8624c4821bb68169be427061c48ad837Gilles Debunne * Add a new Intent data path to match against. The filter must 117954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * include one or more schemes (via {@link #addDataScheme}) <em>and</em> 118054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * one or more authorities (via {@link #addDataAuthority}) for the 118154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * path to be considered. If any paths are 118254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * included in the filter, then an Intent's data must match one of 118354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * them. If no paths are included, then only the scheme/authority must 118454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * match. 118554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 118654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>The path given here can either be a literal that must directly 118754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * match or match against a prefix, or it can be a simple globbing pattern. 118854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * If the latter, you can use '*' anywhere in the pattern to match zero 118954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * or more instances of the previous character, '.' as a wildcard to match 119054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * any character, and '\' to escape the next character. 119154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 119254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param path Either a raw string that must exactly match the file 119354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * path, or a simple pattern, depending on <var>type</var>. 119454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param type Determines how <var>path</var> will be compared to 119554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * determine a match: either {@link PatternMatcher#PATTERN_LITERAL}, 119654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link PatternMatcher#PATTERN_PREFIX}, or 119754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link PatternMatcher#PATTERN_SIMPLE_GLOB}. 119854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 119954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #matchData 120054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #addDataScheme 120154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #addDataAuthority 120254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 120354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void addDataPath(String path, int type) { 1204b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn addDataPath(new PatternMatcher(path.intern(), type)); 1205b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn } 1206b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn 1207b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn /** @hide */ 1208b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn public final void addDataPath(PatternMatcher path) { 120954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataPaths == null) mDataPaths = new ArrayList<PatternMatcher>(); 1210b09491f271c0a647632e5a99bfe280cbb7106195Dianne Hackborn mDataPaths.add(path); 121154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 121254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 121354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 121454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the number of data paths in the filter. 121554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 121654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int countDataPaths() { 121754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataPaths != null ? mDataPaths.size() : 0; 121854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 121954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 122054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 122154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return a data path in the filter. 122254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 122354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final PatternMatcher getDataPath(int index) { 122454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataPaths.get(index); 122554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 122654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 122754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 122854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Is the given data path included in the filter? Note that if the 122954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter does not include any paths, false will <em>always</em> be 123054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * returned. 123154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 123254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param data The data path to look for. This is without the scheme 123354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * prefix. 123454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 123554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return True if the data string matches a path listed in the 123654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter. 123754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 123854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final boolean hasDataPath(String data) { 123954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataPaths == null) { 124054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 124154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12422c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown final int numDataPaths = mDataPaths.size(); 12432c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown for (int i = 0; i < numDataPaths; i++) { 12442c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown final PatternMatcher pe = mDataPaths.get(i); 124554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (pe.match(data)) { 124654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 124754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 124854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 124954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 125054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 125154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1252f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn /** @hide */ 1253f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn public final boolean hasDataPath(PatternMatcher path) { 1254f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mDataPaths == null) { 1255f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 1256f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1257f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final int numDataPaths = mDataPaths.size(); 1258f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn for (int i = 0; i < numDataPaths; i++) { 1259f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final PatternMatcher pe = mDataPaths.get(i); 1260f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (pe.getType() == path.getType() && pe.getPath().equals(path.getPath())) { 1261f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return true; 1262f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1263f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1264f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 1265f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 1266f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn 126754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 126854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return an iterator over the filter's data paths. 126954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 127054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final Iterator<PatternMatcher> pathsIterator() { 127154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataPaths != null ? mDataPaths.iterator() : null; 127254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 127354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 127454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 127554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Match this intent filter against the given Intent data. This ignores 127654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the data scheme -- unlike {@link #matchData}, the authority will match 127754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * regardless of whether there is a matching scheme. 127854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 127954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param data The data whose authority is being looked for. 128054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 128154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return Returns either {@link #MATCH_CATEGORY_HOST}, 128254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #MATCH_CATEGORY_PORT}, {@link #NO_MATCH_DATA}. 128354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 128454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int matchDataAuthority(Uri data) { 12859dc6c61a8012f7e7a79ada72a4b65dea676c52f6Dianne Hackborn if (mDataAuthorities == null || data == null) { 128654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 128754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12882c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown final int numDataAuthorities = mDataAuthorities.size(); 12892c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown for (int i = 0; i < numDataAuthorities; i++) { 12902c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown final AuthorityEntry ae = mDataAuthorities.get(i); 129154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int match = ae.match(data); 129254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (match >= 0) { 129354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return match; 129454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 129554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 129654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 129754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 129854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 129954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 130054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Match this filter against an Intent's data (type, scheme and path). If 130154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the filter does not specify any types and does not specify any 130254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * schemes/paths, the match will only succeed if the intent does not 13030ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * also specify a type or data. If the filter does not specify any schemes, 13040ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * it will implicitly match intents with no scheme, or the schemes "content:" 13050ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * or "file:" (basically performing a MIME-type only match). If the filter 13060ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * does not specify any MIME types, the Intent also must not specify a MIME 13070ea920d8396e4c8596ddeaa5bd130fd012d9c4b9Dianne Hackborn * type. 130854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1309b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <p>Be aware that to match against an authority, you must also specify a base 131054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * scheme the authority is in. To match against a data path, both a scheme 131154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * and authority must be specified. If the filter does not specify any 131254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * types or schemes that it matches against, it is considered to be empty 131354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * (any authority or data path given is ignored, as if it were empty as 131454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * well). 131554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1316b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * <p><em>Note: MIME type, Uri scheme, and host name matching in the 1317b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * Android framework is case-sensitive, unlike the formal RFC definitions. 1318b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * As a result, you should always write these elements with lower case letters, 1319b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * and normalize any MIME types or Uris you receive from 1320b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * outside of Android to ensure these elements are lower case before 1321b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * supplying them here.</em></p> 1322b3cddae4994128983b6bf7e808a7670f90cc30e4Dianne Hackborn * 132354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param type The desired data type to look for, as returned by 132454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent.resolveType(). 132554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param scheme The desired data scheme to look for, as returned by 132654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent.getScheme(). 132754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param data The full data string to match against, as supplied in 132854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent.data. 132954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 133054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return Returns either a valid match constant (a combination of 133154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #MATCH_CATEGORY_MASK} and {@link #MATCH_ADJUSTMENT_MASK}), 133254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * or one of the error codes {@link #NO_MATCH_TYPE} if the type didn't match 133354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * or {@link #NO_MATCH_DATA} if the scheme/path didn't match. 133454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 133554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #match 133654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 133754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int matchData(String type, String scheme, Uri data) { 133854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final ArrayList<String> types = mDataTypes; 133954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final ArrayList<String> schemes = mDataSchemes; 134054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 134154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int match = MATCH_CATEGORY_EMPTY; 134254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 134354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (types == null && schemes == null) { 134454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return ((type == null && data == null) 134554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ? (MATCH_CATEGORY_EMPTY+MATCH_ADJUSTMENT_NORMAL) : NO_MATCH_DATA); 134654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 134754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 134854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (schemes != null) { 134954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (schemes.contains(scheme != null ? scheme : "")) { 135054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project match = MATCH_CATEGORY_SCHEME; 135154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 135254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 135354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 135454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1355df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn final ArrayList<PatternMatcher> schemeSpecificParts = mDataSchemeSpecificParts; 13569dc6c61a8012f7e7a79ada72a4b65dea676c52f6Dianne Hackborn if (schemeSpecificParts != null && data != null) { 1357df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn match = hasDataSchemeSpecificPart(data.getSchemeSpecificPart()) 1358df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn ? MATCH_CATEGORY_SCHEME_SPECIFIC_PART : NO_MATCH_DATA; 1359df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1360df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (match != MATCH_CATEGORY_SCHEME_SPECIFIC_PART) { 1361df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn // If there isn't any matching ssp, we need to match an authority. 1362df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn final ArrayList<AuthorityEntry> authorities = mDataAuthorities; 1363df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (authorities != null) { 1364df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn int authMatch = matchDataAuthority(data); 1365df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (authMatch >= 0) { 1366df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn final ArrayList<PatternMatcher> paths = mDataPaths; 1367df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (paths == null) { 1368df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn match = authMatch; 1369df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } else if (hasDataPath(data.getPath())) { 1370df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn match = MATCH_CATEGORY_PATH; 1371df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } else { 1372df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return NO_MATCH_DATA; 1373df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 137454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 137554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 137654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 137754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 137854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 1379df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn // If neither an ssp nor an authority matched, we're done. 1380df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (match == NO_MATCH_DATA) { 1381df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn return NO_MATCH_DATA; 1382df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 138354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 138454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Special case: match either an Intent with no data URI, 138554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // or with a scheme: URI. This is to give a convenience for 138654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the common case where you want to deal with data in a 138754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // content provider, which is done by type, and we don't want 138854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // to force everyone to say they handle content: or file: URIs. 138954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (scheme != null && !"".equals(scheme) 139054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project && !"content".equals(scheme) 139154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project && !"file".equals(scheme)) { 139254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_DATA; 139354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 139454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 139554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 139654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (types != null) { 139754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (findMimeType(type)) { 139854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project match = MATCH_CATEGORY_TYPE; 139954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 140054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_TYPE; 140154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 140254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 140354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // If no MIME types are specified, then we will only match against 140454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // an Intent that does not have a MIME type. 140554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (type != null) { 140654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_TYPE; 140754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 140854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 140954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 141054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return match + MATCH_ADJUSTMENT_NORMAL; 141154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 141254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 141354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 141454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Add a new Intent category to match against. The semantics of 141554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * categories is the opposite of actions -- an Intent includes the 141654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * categories that it requires, all of which must be included in the 141754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter in order to match. In other words, adding a category to the 141854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter has no impact on matching unless that category is specified in 141954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the intent. 142054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1421e20b3d78e34a1a3a46c279aeb83012b98784ce9aKevin Hufnagle * @param category Name of category to match, such as Intent.CATEGORY_EMBED. 142254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 142354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void addCategory(String category) { 142454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCategories == null) mCategories = new ArrayList<String>(); 142554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mCategories.contains(category)) { 142654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCategories.add(category.intern()); 142754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 142854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 142954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 143054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 143154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the number of categories in the filter. 143254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 143354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int countCategories() { 143454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mCategories != null ? mCategories.size() : 0; 143554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 143654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 143754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 143854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return a category in the filter. 143954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 144054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final String getCategory(int index) { 144154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mCategories.get(index); 144254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 144354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 144454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 144554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Is the given category included in the filter? 144654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 144754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param category The category that the filter supports. 144854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 144954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return True if the category is explicitly mentioned in the filter. 145054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 145154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final boolean hasCategory(String category) { 145254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mCategories != null && mCategories.contains(category); 145354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 145454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 145554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 145654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return an iterator over the filter's categories. 1457d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root * 1458d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root * @return Iterator if this filter has categories or {@code null} if none. 145954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 146054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final Iterator<String> categoriesIterator() { 146154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mCategories != null ? mCategories.iterator() : null; 146254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 146354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 146454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 146554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Match this filter against an Intent's categories. Each category in 146654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the Intent must be specified by the filter; if any are not in the 146754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * filter, the match fails. 146854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 146954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param categories The categories included in the intent, as returned by 147054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent.getCategories(). 147154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 147254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return If all categories match (success), null; else the name of the 147354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * first category that didn't match. 147454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 147554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final String matchCategories(Set<String> categories) { 147654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (categories == null) { 147754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return null; 147854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 147954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 148054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<String> it = categories.iterator(); 148154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 148254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCategories == null) { 148354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return it.hasNext() ? it.next() : null; 148454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 148554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 148654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (it.hasNext()) { 148754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final String category = it.next(); 148854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mCategories.contains(category)) { 148954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return category; 149054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 149154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 149254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 149354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return null; 149454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 149554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 149654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 149754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Test whether this filter matches the given <var>intent</var>. 149854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 149954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param intent The Intent to compare against. 150054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param resolve If true, the intent's type will be resolved by calling 150154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent.resolveType(); otherwise a simple match against 150254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Intent.type will be performed. 150354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param logTag Tag to use in debugging messages. 150454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 150554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return Returns either a valid match constant (a combination of 150654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #MATCH_CATEGORY_MASK} and {@link #MATCH_ADJUSTMENT_MASK}), 150754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * or one of the error codes {@link #NO_MATCH_TYPE} if the type didn't match, 150854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #NO_MATCH_DATA} if the scheme/path didn't match, 1509dc894046beddcd60719011d1791b51be8cc2cb4dDianne Hackborn * {@link #NO_MATCH_ACTION} if the action didn't match, or 151054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #NO_MATCH_CATEGORY} if one or more categories didn't match. 151154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 151254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #match(String, String, String, android.net.Uri , Set, String) 151354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 151454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int match(ContentResolver resolver, Intent intent, 151554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean resolve, String logTag) { 151654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String type = resolve ? intent.resolveType(resolver) : intent.getType(); 151754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return match(intent.getAction(), type, intent.getScheme(), 151854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project intent.getData(), intent.getCategories(), logTag); 151954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 152054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 152154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 152254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Test whether this filter matches the given intent data. A match is 152354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * only successful if the actions and categories in the Intent match 152454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * against the filter, as described in {@link IntentFilter}; in that case, 152554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the match result returned will be as per {@link #matchData}. 152654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 152754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param action The intent action to match against (Intent.getAction). 152854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param type The intent type to match against (Intent.resolveType()). 152954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param scheme The data scheme to match against (Intent.getScheme()). 153054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param data The data URI to match against (Intent.getData()). 153154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param categories The categories to match against 153254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * (Intent.getCategories()). 153354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param logTag Tag to use in debugging messages. 153454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 153554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return Returns either a valid match constant (a combination of 153654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #MATCH_CATEGORY_MASK} and {@link #MATCH_ADJUSTMENT_MASK}), 153754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * or one of the error codes {@link #NO_MATCH_TYPE} if the type didn't match, 153854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #NO_MATCH_DATA} if the scheme/path didn't match, 1539dc894046beddcd60719011d1791b51be8cc2cb4dDianne Hackborn * {@link #NO_MATCH_ACTION} if the action didn't match, or 154054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link #NO_MATCH_CATEGORY} if one or more categories didn't match. 154154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 154254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see #matchData 154354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see Intent#getAction 154454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see Intent#resolveType 154554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see Intent#getScheme 154654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see Intent#getData 154754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @see Intent#getCategories 154854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 154954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int match(String action, String type, String scheme, 155054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Uri data, Set<String> categories, String logTag) { 1551239f77d20adcc0e2ce67a7907b3f6ca75b13fd00Jeff Brown if (action != null && !matchAction(action)) { 155243a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v( 155354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project logTag, "No matching action " + action + " for " + this); 155454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_ACTION; 155554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 155654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 155754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int dataMatch = matchData(type, scheme, data); 155854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (dataMatch < 0) { 155943a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) { 156054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (dataMatch == NO_MATCH_TYPE) { 156154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.v(logTag, "No matching type " + type 156254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project + " for " + this); 156354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 156454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (dataMatch == NO_MATCH_DATA) { 156554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.v(logTag, "No matching scheme/path " + data 156654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project + " for " + this); 156754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 156854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 156954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return dataMatch; 157054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 157154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 15722c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown String categoryMismatch = matchCategories(categories); 15732c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown if (categoryMismatch != null) { 157443a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) { 15752c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown Log.v(logTag, "No matching category " + categoryMismatch + " for " + this); 15762c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown } 157754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MATCH_CATEGORY; 157854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 157954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 158054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // It would be nice to treat container activities as more 158154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // important than ones that can be embedded, but this is not the way... 158254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (false) { 158354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (categories != null) { 158454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dataMatch -= mCategories.size() - categories.size(); 158554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 158654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 158754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 158854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return dataMatch; 158954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 159054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 159154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 159254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Write the contents of the IntentFilter as an XML stream. 159354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 159454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void writeToXml(XmlSerializer serializer) throws IOException { 159515b9fd268af89173ede26d1a75796392f6d4c8fbWale Ogunwale 159615b9fd268af89173ede26d1a75796392f6d4c8fbWale Ogunwale if (getAutoVerify()) { 159715b9fd268af89173ede26d1a75796392f6d4c8fbWale Ogunwale serializer.attribute(null, AUTO_VERIFY_STR, Boolean.toString(true)); 159815b9fd268af89173ede26d1a75796392f6d4c8fbWale Ogunwale } 159915b9fd268af89173ede26d1a75796392f6d4c8fbWale Ogunwale 160054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int N = countActions(); 160154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 160254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.startTag(null, ACTION_STR); 160354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, NAME_STR, mActions.get(i)); 160454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.endTag(null, ACTION_STR); 160554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 160654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project N = countCategories(); 160754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 160854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.startTag(null, CAT_STR); 160954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, NAME_STR, mCategories.get(i)); 161054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.endTag(null, CAT_STR); 161154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 161254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project N = countDataTypes(); 161354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 161454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.startTag(null, TYPE_STR); 161554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String type = mDataTypes.get(i); 161654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (type.indexOf('/') < 0) type = type + "/*"; 161754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, NAME_STR, type); 161854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.endTag(null, TYPE_STR); 161954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 162054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project N = countDataSchemes(); 162154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 162254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.startTag(null, SCHEME_STR); 162354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, NAME_STR, mDataSchemes.get(i)); 162454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.endTag(null, SCHEME_STR); 162554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 1626df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn N = countDataSchemeSpecificParts(); 1627df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn for (int i=0; i<N; i++) { 1628df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn serializer.startTag(null, SSP_STR); 1629df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn PatternMatcher pe = mDataSchemeSpecificParts.get(i); 1630df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn switch (pe.getType()) { 1631df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn case PatternMatcher.PATTERN_LITERAL: 1632df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn serializer.attribute(null, LITERAL_STR, pe.getPath()); 1633df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn break; 1634df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn case PatternMatcher.PATTERN_PREFIX: 1635df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn serializer.attribute(null, PREFIX_STR, pe.getPath()); 1636df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn break; 1637df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn case PatternMatcher.PATTERN_SIMPLE_GLOB: 1638df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn serializer.attribute(null, SGLOB_STR, pe.getPath()); 1639df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn break; 16409c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy case PatternMatcher.PATTERN_ADVANCED_GLOB: 16419c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy serializer.attribute(null, AGLOB_STR, pe.getPath()); 16429c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy break; 1643df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1644df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn serializer.endTag(null, SSP_STR); 1645df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 164654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project N = countDataAuthorities(); 164754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 164854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.startTag(null, AUTH_STR); 164954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project AuthorityEntry ae = mDataAuthorities.get(i); 165054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, HOST_STR, ae.getHost()); 165154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (ae.getPort() >= 0) { 165254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, PORT_STR, Integer.toString(ae.getPort())); 165354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 165454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.endTag(null, AUTH_STR); 165554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 165654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project N = countDataPaths(); 165754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 165854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.startTag(null, PATH_STR); 165954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project PatternMatcher pe = mDataPaths.get(i); 166054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project switch (pe.getType()) { 166154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case PatternMatcher.PATTERN_LITERAL: 166254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, LITERAL_STR, pe.getPath()); 166354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 166454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case PatternMatcher.PATTERN_PREFIX: 166554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, PREFIX_STR, pe.getPath()); 166654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 166754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case PatternMatcher.PATTERN_SIMPLE_GLOB: 166854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.attribute(null, SGLOB_STR, pe.getPath()); 166954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 16709c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy case PatternMatcher.PATTERN_ADVANCED_GLOB: 16719c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy serializer.attribute(null, AGLOB_STR, pe.getPath()); 16729c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy break; 167354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 167454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project serializer.endTag(null, PATH_STR); 167554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 167654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 167754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 167854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void readFromXml(XmlPullParser parser) throws XmlPullParserException, 167954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IOException { 16801c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio String autoVerify = parser.getAttributeValue(null, AUTO_VERIFY_STR); 16811c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio setAutoVerify(TextUtils.isEmpty(autoVerify) ? false : Boolean.getBoolean(autoVerify)); 16821c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 168354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int outerDepth = parser.getDepth(); 168454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int type; 168554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 168654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project && (type != XmlPullParser.END_TAG 168754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project || parser.getDepth() > outerDepth)) { 168854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (type == XmlPullParser.END_TAG 168954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project || type == XmlPullParser.TEXT) { 169054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project continue; 169154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 169254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 169354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String tagName = parser.getName(); 169454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (tagName.equals(ACTION_STR)) { 169554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String name = parser.getAttributeValue(null, NAME_STR); 169654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (name != null) { 169754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addAction(name); 169854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 169954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if (tagName.equals(CAT_STR)) { 170054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String name = parser.getAttributeValue(null, NAME_STR); 170154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (name != null) { 170254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addCategory(name); 170354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 170454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if (tagName.equals(TYPE_STR)) { 170554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String name = parser.getAttributeValue(null, NAME_STR); 170654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (name != null) { 170754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project try { 170854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addDataType(name); 170954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } catch (MalformedMimeTypeException e) { 171054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 171154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 171254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if (tagName.equals(SCHEME_STR)) { 171354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String name = parser.getAttributeValue(null, NAME_STR); 171454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (name != null) { 171554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addDataScheme(name); 171654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 1717df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } else if (tagName.equals(SSP_STR)) { 1718df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn String ssp = parser.getAttributeValue(null, LITERAL_STR); 1719df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (ssp != null) { 1720df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn addDataSchemeSpecificPart(ssp, PatternMatcher.PATTERN_LITERAL); 1721df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } else if ((ssp=parser.getAttributeValue(null, PREFIX_STR)) != null) { 1722df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn addDataSchemeSpecificPart(ssp, PatternMatcher.PATTERN_PREFIX); 1723df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } else if ((ssp=parser.getAttributeValue(null, SGLOB_STR)) != null) { 1724df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn addDataSchemeSpecificPart(ssp, PatternMatcher.PATTERN_SIMPLE_GLOB); 17259c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy } else if ((ssp=parser.getAttributeValue(null, AGLOB_STR)) != null) { 17269c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy addDataSchemeSpecificPart(ssp, PatternMatcher.PATTERN_ADVANCED_GLOB); 1727df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 172854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if (tagName.equals(AUTH_STR)) { 172954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String host = parser.getAttributeValue(null, HOST_STR); 173054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String port = parser.getAttributeValue(null, PORT_STR); 173154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (host != null) { 173254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addDataAuthority(host, port); 173354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 173454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if (tagName.equals(PATH_STR)) { 173554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String path = parser.getAttributeValue(null, LITERAL_STR); 173654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (path != null) { 173754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addDataPath(path, PatternMatcher.PATTERN_LITERAL); 173854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if ((path=parser.getAttributeValue(null, PREFIX_STR)) != null) { 173954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addDataPath(path, PatternMatcher.PATTERN_PREFIX); 174054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if ((path=parser.getAttributeValue(null, SGLOB_STR)) != null) { 174154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addDataPath(path, PatternMatcher.PATTERN_SIMPLE_GLOB); 17429c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy } else if ((path=parser.getAttributeValue(null, AGLOB_STR)) != null) { 17439c9fdf27ff74fd4011239b25723f6c05ee5886faTodd Kennedy addDataPath(path, PatternMatcher.PATTERN_ADVANCED_GLOB); 174454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 174554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 174654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.w("IntentFilter", "Unknown tag parsing IntentFilter: " + tagName); 174754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 174854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project XmlUtils.skipCurrentTag(parser); 174954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 175054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 175154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1752129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin /** @hide */ 1753129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin public void writeToProto(ProtoOutputStream proto, long fieldId) { 1754129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin long token = proto.start(fieldId); 1755129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mActions.size() > 0) { 1756129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin Iterator<String> it = mActions.iterator(); 1757129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin while (it.hasNext()) { 1758129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(IntentFilterProto.ACTIONS, it.next()); 1759129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1760129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1761129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mCategories != null) { 1762129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin Iterator<String> it = mCategories.iterator(); 1763129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin while (it.hasNext()) { 1764129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(IntentFilterProto.CATEGORIES, it.next()); 1765129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1766129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1767129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mDataSchemes != null) { 1768129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin Iterator<String> it = mDataSchemes.iterator(); 1769129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin while (it.hasNext()) { 1770129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(IntentFilterProto.DATA_SCHEMES, it.next()); 1771129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1772129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1773129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mDataSchemeSpecificParts != null) { 1774129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin Iterator<PatternMatcher> it = mDataSchemeSpecificParts.iterator(); 1775129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin while (it.hasNext()) { 1776129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin it.next().writeToProto(proto, IntentFilterProto.DATA_SCHEME_SPECS); 1777129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1778129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1779129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mDataAuthorities != null) { 1780129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin Iterator<AuthorityEntry> it = mDataAuthorities.iterator(); 1781129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin while (it.hasNext()) { 1782129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin it.next().writeToProto(proto, IntentFilterProto.DATA_AUTHORITIES); 1783129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1784129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1785129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mDataPaths != null) { 1786129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin Iterator<PatternMatcher> it = mDataPaths.iterator(); 1787129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin while (it.hasNext()) { 1788129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin it.next().writeToProto(proto, IntentFilterProto.DATA_PATHS); 1789129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1790129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1791129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mDataTypes != null) { 1792129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin Iterator<String> it = mDataTypes.iterator(); 1793129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin while (it.hasNext()) { 1794129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(IntentFilterProto.DATA_TYPES, it.next()); 1795129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1796129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1797129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (mPriority != 0 || mHasPartialTypes) { 1798129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(IntentFilterProto.PRIORITY, mPriority); 1799129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(IntentFilterProto.HAS_PARTIAL_TYPES, mHasPartialTypes); 1800129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1801129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(IntentFilterProto.GET_AUTO_VERIFY, getAutoVerify()); 1802129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.end(token); 1803129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 1804129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 180554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void dump(Printer du, String prefix) { 18061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn StringBuilder sb = new StringBuilder(256); 180754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mActions.size() > 0) { 180854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<String> it = mActions.iterator(); 180954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (it.hasNext()) { 18101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append("Action: \""); 18121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(it.next()); sb.append("\""); 18131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn du.println(sb.toString()); 181454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 181554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 181654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCategories != null) { 181754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<String> it = mCategories.iterator(); 181854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (it.hasNext()) { 18191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append("Category: \""); 18211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(it.next()); sb.append("\""); 18221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn du.println(sb.toString()); 182354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 182454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 182554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataSchemes != null) { 182654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<String> it = mDataSchemes.iterator(); 182754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (it.hasNext()) { 18281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append("Scheme: \""); 18301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(it.next()); sb.append("\""); 18311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn du.println(sb.toString()); 183254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 183354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 1834df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (mDataSchemeSpecificParts != null) { 1835df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn Iterator<PatternMatcher> it = mDataSchemeSpecificParts.iterator(); 1836df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn while (it.hasNext()) { 1837df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn PatternMatcher pe = it.next(); 1838df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn sb.setLength(0); 1839df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn sb.append(prefix); sb.append("Ssp: \""); 1840df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn sb.append(pe); sb.append("\""); 1841df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn du.println(sb.toString()); 1842df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1843df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 184454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataAuthorities != null) { 184554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<AuthorityEntry> it = mDataAuthorities.iterator(); 184654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (it.hasNext()) { 184754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project AuthorityEntry ae = it.next(); 18481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append("Authority: \""); 18501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(ae.mHost); sb.append("\": "); 18511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(ae.mPort); 18521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (ae.mWild) sb.append(" WILD"); 18531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn du.println(sb.toString()); 185454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 185554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 185654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataPaths != null) { 185754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<PatternMatcher> it = mDataPaths.iterator(); 185854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (it.hasNext()) { 185954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project PatternMatcher pe = it.next(); 18601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append("Path: \""); 18621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(pe); sb.append("\""); 18631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn du.println(sb.toString()); 186454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 186554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 186654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataTypes != null) { 186754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<String> it = mDataTypes.iterator(); 186854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (it.hasNext()) { 18691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append("Type: \""); 18711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(it.next()); sb.append("\""); 18721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn du.println(sb.toString()); 187354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 187454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18756d418b62934d3235b32f8f70938b66eb4df2c4e4Todd Kennedy if (mPriority != 0 || mOrder != 0 || mHasPartialTypes) { 18761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append("mPriority="); sb.append(mPriority); 18786d418b62934d3235b32f8f70938b66eb4df2c4e4Todd Kennedy sb.append(", mOrder="); sb.append(mOrder); 18791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(", mHasPartialTypes="); sb.append(mHasPartialTypes); 18801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn du.println(sb.toString()); 18811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1882342e6037109a53830277d8de6ecf0e39578c143cDianne Hackborn if (getAutoVerify()) { 18831c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio sb.setLength(0); 18841c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio sb.append(prefix); sb.append("AutoVerify="); sb.append(getAutoVerify()); 18851c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio du.println(sb.toString()); 18861c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 188754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 188854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 188954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static final Parcelable.Creator<IntentFilter> CREATOR 189054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project = new Parcelable.Creator<IntentFilter>() { 189154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public IntentFilter createFromParcel(Parcel source) { 189254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return new IntentFilter(source); 189354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 189454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 189554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public IntentFilter[] newArray(int size) { 189654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return new IntentFilter[size]; 189754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 189854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project }; 189954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 190054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final int describeContents() { 190154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 190254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 190354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 190454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final void writeToParcel(Parcel dest, int flags) { 190554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeStringList(mActions); 190654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCategories != null) { 190754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(1); 190854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeStringList(mCategories); 190954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 191054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(0); 191154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 191254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataSchemes != null) { 191354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(1); 191454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeStringList(mDataSchemes); 191554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 191654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(0); 191754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 191854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataTypes != null) { 191954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(1); 192054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeStringList(mDataTypes); 192154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 192254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(0); 192354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 1924df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (mDataSchemeSpecificParts != null) { 1925df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn final int N = mDataSchemeSpecificParts.size(); 1926df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn dest.writeInt(N); 1927df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn for (int i=0; i<N; i++) { 1928439e9bc85d854cec5ca89e8947a17693e84cb4aeDianne Hackborn mDataSchemeSpecificParts.get(i).writeToParcel(dest, flags); 1929df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 1930df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } else { 1931df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn dest.writeInt(0); 1932df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 193354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataAuthorities != null) { 193454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int N = mDataAuthorities.size(); 193554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(N); 193654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 193754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataAuthorities.get(i).writeToParcel(dest); 193854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 193954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 194054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(0); 194154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 194254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataPaths != null) { 194354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int N = mDataPaths.size(); 194454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(N); 194554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 1946439e9bc85d854cec5ca89e8947a17693e84cb4aeDianne Hackborn mDataPaths.get(i).writeToParcel(dest, flags); 194754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 194854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 194954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(0); 195054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 195154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(mPriority); 195254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dest.writeInt(mHasPartialTypes ? 1 : 0); 19531c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio dest.writeInt(getAutoVerify() ? 1 : 0); 1954c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy dest.writeInt(mInstantAppVisibility); 19556d418b62934d3235b32f8f70938b66eb4df2c4e4Todd Kennedy dest.writeInt(mOrder); 195654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 195754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 195854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 195954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For debugging -- perform a check on the filter, return true if it passed 196054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * or false if it failed. 196154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 196254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@hide} 196354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 196454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public boolean debugCheck() { 196554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 196654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 196754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // This code looks for intent filters that do not specify data. 196854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /* 196954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mActions != null && mActions.size() == 1 197054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project && mActions.contains(Intent.ACTION_MAIN)) { 197154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 197254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 197354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 197454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataTypes == null && mDataSchemes == null) { 197554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.w("IntentFilter", "QUESTIONABLE INTENT FILTER:"); 197654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dump(Log.WARN, "IntentFilter", " "); 197754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 197854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 197954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 198054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 198154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 198254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 198354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1984fb2afbf7fa63e972e3de5a9ecf1e246019246792Narayan Kamath /** @hide */ 1985fb2afbf7fa63e972e3de5a9ecf1e246019246792Narayan Kamath public IntentFilter(Parcel source) { 198654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mActions = new ArrayList<String>(); 198754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project source.readStringList(mActions); 198854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (source.readInt() != 0) { 198954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCategories = new ArrayList<String>(); 199054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project source.readStringList(mCategories); 199154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 199254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (source.readInt() != 0) { 199354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataSchemes = new ArrayList<String>(); 199454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project source.readStringList(mDataSchemes); 199554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 199654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (source.readInt() != 0) { 199754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataTypes = new ArrayList<String>(); 199854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project source.readStringList(mDataTypes); 199954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 200054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int N = source.readInt(); 200154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (N > 0) { 2002df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn mDataSchemeSpecificParts = new ArrayList<PatternMatcher>(N); 2003df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn for (int i=0; i<N; i++) { 2004df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn mDataSchemeSpecificParts.add(new PatternMatcher(source)); 2005df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 2006df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn } 2007df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn N = source.readInt(); 2008df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn if (N > 0) { 2009df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn mDataAuthorities = new ArrayList<AuthorityEntry>(N); 201054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 201154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataAuthorities.add(new AuthorityEntry(source)); 201254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 201354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 201454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project N = source.readInt(); 201554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (N > 0) { 2016df1c0bf7744d4abd3e2000fcfec01c119b857c75Dianne Hackborn mDataPaths = new ArrayList<PatternMatcher>(N); 201754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0; i<N; i++) { 201854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataPaths.add(new PatternMatcher(source)); 201954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 202054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 202154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPriority = source.readInt(); 202254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHasPartialTypes = source.readInt() > 0; 20231c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio setAutoVerify(source.readInt() > 0); 2024c05f5d12d9a1b98221833ec0919d081a869d2486Todd Kennedy setVisibilityToInstantApp(source.readInt()); 20256d418b62934d3235b32f8f70938b66eb4df2c4e4Todd Kennedy mOrder = source.readInt(); 202654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 202754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 202854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final boolean findMimeType(String type) { 202954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final ArrayList<String> t = mDataTypes; 203054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 203154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (type == null) { 203254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 203354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 203454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 203554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (t.contains(type)) { 203654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 203754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 203854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 203954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Deal with an Intent wanting to match every type in the IntentFilter. 204054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int typeLength = type.length(); 204154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (typeLength == 3 && type.equals("*/*")) { 204254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return !t.isEmpty(); 204354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 204454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 204554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Deal with this IntentFilter wanting to match every Intent type. 204654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mHasPartialTypes && t.contains("*")) { 204754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 204854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 204954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 205054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final int slashpos = type.indexOf('/'); 205154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (slashpos > 0) { 205254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mHasPartialTypes && t.contains(type.substring(0, slashpos))) { 205354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 205454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 205554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (typeLength == slashpos+2 && type.charAt(slashpos+1) == '*') { 205654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Need to look through all types for one that matches 205754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // our base... 20582c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown final int numTypes = t.size(); 20592c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown for (int i = 0; i < numTypes; i++) { 20602c376fc46cd01b12e003a7bf83d82f527f6efaf1Jeff Brown final String v = t.get(i); 206154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (type.regionMatches(0, v, 0, slashpos+1)) { 206254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 206354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 206454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 206554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 206654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 206754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 206854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 206954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 20701c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 20711c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 20721c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @hide 20731c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 20741c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public ArrayList<String> getHostsList() { 20751c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio ArrayList<String> result = new ArrayList<>(); 20761c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio Iterator<IntentFilter.AuthorityEntry> it = authoritiesIterator(); 20771c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio if (it != null) { 20781c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio while (it.hasNext()) { 20791c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio IntentFilter.AuthorityEntry entry = it.next(); 20801c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio result.add(entry.getHost()); 20811c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 20821c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 20831c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio return result; 20841c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 20851c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio 20861c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio /** 20871c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio * @hide 20881c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio */ 20891c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio public String[] getHosts() { 20901c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio ArrayList<String> list = getHostsList(); 20911c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio return list.toArray(new String[list.size()]); 20921c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio } 209354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 2094