19ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn/* 29ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Copyright (C) 2006 The Android Open Source Project 39ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * 49ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 59ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * you may not use this file except in compliance with the License. 69ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * You may obtain a copy of the License at 79ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * 89ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 99ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * 109ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 119ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 129ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * See the License for the specific language governing permissions and 149ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * limitations under the License. 159ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 169ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 179ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornpackage com.android.server; 189ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 199ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.io.PrintWriter; 209ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.ArrayList; 219ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.Collections; 229ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.Comparator; 239ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.HashMap; 249ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.HashSet; 259ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.Iterator; 269ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.List; 279ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.Map; 289ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport java.util.Set; 299ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 309ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.net.Uri; 319ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.util.FastImmutableArraySet; 329ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.util.Log; 339ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.util.PrintWriterPrinter; 349ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.util.Slog; 359ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.util.LogPrinter; 369ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.util.Printer; 379ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 389ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.content.Intent; 399ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornimport android.content.IntentFilter; 409ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 419ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn/** 429ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Temporary for verification of new implementation. 439ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * {@hide} 449ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 459ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackbornpublic abstract class IntentResolverOld<F extends IntentFilter, R extends Object> { 469ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final private static String TAG = "IntentResolver"; 479ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final private static boolean DEBUG = false; 489ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final private static boolean localLOGV = DEBUG || false; 499ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 509ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public void addFilter(F f) { 519ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (localLOGV) { 529ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, "Adding filter: " + f); 539ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn f.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); 549ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, " Building Lookup Maps:"); 559ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 569ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 579ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mFilters.add(f); 589ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int numS = register_intent_filter(f, f.schemesIterator(), 599ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mSchemeToFilter, " Scheme: "); 609ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int numT = register_mime_types(f, " Type: "); 619ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (numS == 0 && numT == 0) { 629ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn register_intent_filter(f, f.actionsIterator(), 639ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mActionToFilter, " Action: "); 649ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 659ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (numT != 0) { 669ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn register_intent_filter(f, f.actionsIterator(), 679ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mTypedActionToFilter, " TypedAction: "); 689ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 699ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 709ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 719ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public void removeFilter(F f) { 729ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn removeFilterInternal(f); 739ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mFilters.remove(f); 749ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 759ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 769ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn void removeFilterInternal(F f) { 779ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (localLOGV) { 789ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, "Removing filter: " + f); 799ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn f.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); 809ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, " Cleaning Lookup Maps:"); 819ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 829ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 839ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int numS = unregister_intent_filter(f, f.schemesIterator(), 849ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mSchemeToFilter, " Scheme: "); 859ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int numT = unregister_mime_types(f, " Type: "); 869ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (numS == 0 && numT == 0) { 879ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn unregister_intent_filter(f, f.actionsIterator(), 889ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mActionToFilter, " Action: "); 899ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 909ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (numT != 0) { 919ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn unregister_intent_filter(f, f.actionsIterator(), 929ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mTypedActionToFilter, " TypedAction: "); 939ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 949ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 959ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 969ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean dumpMap(PrintWriter out, String titlePrefix, String title, 979ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String prefix, Map<String, ArrayList<F>> map, String packageName, 989ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean printFilter) { 999ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String eprefix = prefix + " "; 1009ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String fprefix = prefix + " "; 1019ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean printedSomething = false; 1029ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Printer printer = null; 1039ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn for (Map.Entry<String, ArrayList<F>> e : map.entrySet()) { 1049ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<F> a = e.getValue(); 1059ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final int N = a.size(); 1069ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean printedHeader = false; 1079ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn for (int i=0; i<N; i++) { 1089ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn F filter = a.get(i); 1099ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (packageName != null && !packageName.equals(packageForFilter(filter))) { 1109ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn continue; 1119ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1129ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (title != null) { 1139ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn out.print(titlePrefix); out.println(title); 1149ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn title = null; 1159ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1169ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!printedHeader) { 1179ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn out.print(eprefix); out.print(e.getKey()); out.println(":"); 1189ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn printedHeader = true; 1199ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1209ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn printedSomething = true; 1219ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn dumpFilter(out, fprefix, filter); 1229ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (printFilter) { 1239ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (printer == null) { 1249ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn printer = new PrintWriterPrinter(out); 1259ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1269ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn filter.dump(printer, fprefix + " "); 1279ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1289ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1299ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1309ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return printedSomething; 1319ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1329ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1339ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public boolean dump(PrintWriter out, String title, String prefix, String packageName, 1349ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean printFilter) { 1359ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String innerPrefix = prefix + " "; 1369ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String sepPrefix = "\n" + prefix; 1379ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String curPrefix = title + "\n" + prefix; 1389ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (dumpMap(out, curPrefix, "Full MIME Types:", innerPrefix, 1399ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mTypeToFilter, packageName, printFilter)) { 1409ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn curPrefix = sepPrefix; 1419ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1429ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (dumpMap(out, curPrefix, "Base MIME Types:", innerPrefix, 1439ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mBaseTypeToFilter, packageName, printFilter)) { 1449ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn curPrefix = sepPrefix; 1459ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1469ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (dumpMap(out, curPrefix, "Wild MIME Types:", innerPrefix, 1479ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mWildTypeToFilter, packageName, printFilter)) { 1489ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn curPrefix = sepPrefix; 1499ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1509ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (dumpMap(out, curPrefix, "Schemes:", innerPrefix, 1519ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mSchemeToFilter, packageName, printFilter)) { 1529ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn curPrefix = sepPrefix; 1539ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1549ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (dumpMap(out, curPrefix, "Non-Data Actions:", innerPrefix, 1559ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mActionToFilter, packageName, printFilter)) { 1569ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn curPrefix = sepPrefix; 1579ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1589ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (dumpMap(out, curPrefix, "MIME Typed Actions:", innerPrefix, 1599ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mTypedActionToFilter, packageName, printFilter)) { 1609ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn curPrefix = sepPrefix; 1619ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1629ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return curPrefix == sepPrefix; 1639ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1649ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1659ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private class IteratorWrapper implements Iterator<F> { 1669ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private final Iterator<F> mI; 1679ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private F mCur; 1689ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1699ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn IteratorWrapper(Iterator<F> it) { 1709ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mI = it; 1719ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1729ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1739ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public boolean hasNext() { 1749ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return mI.hasNext(); 1759ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1769ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1779ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public F next() { 1789ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return (mCur = mI.next()); 1799ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1809ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1819ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public void remove() { 1829ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (mCur != null) { 1839ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn removeFilterInternal(mCur); 1849ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1859ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mI.remove(); 1869ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1879ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1889ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1899ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1909ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 1919ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Returns an iterator allowing filters to be removed. 1929ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 1939ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public Iterator<F> filterIterator() { 1949ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return new IteratorWrapper(mFilters.iterator()); 1959ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 1969ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 1979ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 1989ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Returns a read-only set of the filters. 1999ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 2009ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public Set<F> filterSet() { 2019ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return Collections.unmodifiableSet(mFilters); 2029ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2039ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2049ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public List<R> queryIntentFromList(Intent intent, String resolvedType, 2059ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean defaultOnly, ArrayList<ArrayList<F>> listCut, int userId) { 2069ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<R> resultList = new ArrayList<R>(); 2079ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2089ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final boolean debug = localLOGV || 2099ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0); 2109ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2119ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn FastImmutableArraySet<String> categories = getFastIntentCategories(intent); 2129ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final String scheme = intent.getScheme(); 2139ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int N = listCut.size(); 2149ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn for (int i = 0; i < N; ++i) { 2159ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn buildResolveList(intent, categories, debug, defaultOnly, 2169ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn resolvedType, scheme, listCut.get(i), resultList, userId); 2179ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2189ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn sortResults(resultList); 2199ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return resultList; 2209ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2219ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2229ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public List<R> queryIntent(Intent intent, String resolvedType, boolean defaultOnly, 2239ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int userId) { 2249ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String scheme = intent.getScheme(); 2259ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2269ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<R> finalList = new ArrayList<R>(); 2279ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2289ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final boolean debug = localLOGV || 2299ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0); 2309ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2319ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v( 2329ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn TAG, "Resolving type " + resolvedType + " scheme " + scheme 2339ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn + " of intent " + intent); 2349ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2359ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<F> firstTypeCut = null; 2369ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<F> secondTypeCut = null; 2379ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<F> thirdTypeCut = null; 2389ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<F> schemeCut = null; 2399ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2409ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // If the intent includes a MIME type, then we want to collect all of 2419ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // the filters that match that MIME type. 2429ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (resolvedType != null) { 2439ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int slashpos = resolvedType.indexOf('/'); 2449ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (slashpos > 0) { 2459ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final String baseType = resolvedType.substring(0, slashpos); 2469ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!baseType.equals("*")) { 2479ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (resolvedType.length() != slashpos+2 2489ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn || resolvedType.charAt(slashpos+1) != '*') { 2499ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // Not a wild card, so we can just look for all filters that 2509ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // completely match or wildcards whose base type matches. 2519ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn firstTypeCut = mTypeToFilter.get(resolvedType); 2529ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "First type cut: " + firstTypeCut); 2539ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn secondTypeCut = mWildTypeToFilter.get(baseType); 2549ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "Second type cut: " + secondTypeCut); 2559ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else { 2569ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // We can match anything with our base type. 2579ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn firstTypeCut = mBaseTypeToFilter.get(baseType); 2589ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "First type cut: " + firstTypeCut); 2599ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn secondTypeCut = mWildTypeToFilter.get(baseType); 2609ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "Second type cut: " + secondTypeCut); 2619ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2629ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // Any */* types always apply, but we only need to do this 2639ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // if the intent type was not already */*. 2649ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn thirdTypeCut = mWildTypeToFilter.get("*"); 2659ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "Third type cut: " + thirdTypeCut); 2669ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else if (intent.getAction() != null) { 2679ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // The intent specified any type ({@literal *}/*). This 2689ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // can be a whole heck of a lot of things, so as a first 2699ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // cut let's use the action instead. 2709ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn firstTypeCut = mTypedActionToFilter.get(intent.getAction()); 2719ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "Typed Action list: " + firstTypeCut); 2729ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2739ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2749ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2759ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2769ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // If the intent includes a data URI, then we want to collect all of 2779ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // the filters that match its scheme (we will further refine matches 2789ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // on the authority and path by directly matching each resulting filter). 2799ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (scheme != null) { 2809ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn schemeCut = mSchemeToFilter.get(scheme); 2819ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "Scheme list: " + schemeCut); 2829ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2839ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2849ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // If the intent does not specify any data -- either a MIME type or 2859ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // a URI -- then we will only be looking for matches against empty 2869ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // data. 2879ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (resolvedType == null && scheme == null && intent.getAction() != null) { 2889ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn firstTypeCut = mActionToFilter.get(intent.getAction()); 2899ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "Action list: " + firstTypeCut); 2909ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2919ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 2929ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn FastImmutableArraySet<String> categories = getFastIntentCategories(intent); 2939ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (firstTypeCut != null) { 2949ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn buildResolveList(intent, categories, debug, defaultOnly, 2959ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn resolvedType, scheme, firstTypeCut, finalList, userId); 2969ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 2979ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (secondTypeCut != null) { 2989ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn buildResolveList(intent, categories, debug, defaultOnly, 2999ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn resolvedType, scheme, secondTypeCut, finalList, userId); 3009ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3019ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (thirdTypeCut != null) { 3029ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn buildResolveList(intent, categories, debug, defaultOnly, 3039ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn resolvedType, scheme, thirdTypeCut, finalList, userId); 3049ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3059ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (schemeCut != null) { 3069ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn buildResolveList(intent, categories, debug, defaultOnly, 3079ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn resolvedType, scheme, schemeCut, finalList, userId); 3089ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3099ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn sortResults(finalList); 3109ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3119ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) { 3129ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, "Final result list:"); 3139ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn for (R r : finalList) { 3149ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, " " + r); 3159ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3169ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3179ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return finalList; 3189ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3199ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3209ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 3219ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Control whether the given filter is allowed to go into the result 3229ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * list. Mainly intended to prevent adding multiple filters for the 3239ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * same target object. 3249ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 3259ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn protected boolean allowFilterResult(F filter, List<R> dest) { 3269ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return true; 3279ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3289ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3299ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 3309ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Returns whether the object associated with the given filter is 3319ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * "stopped," that is whether it should not be included in the result 3329ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * if the intent requests to excluded stopped objects. 3339ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 3349ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn protected boolean isFilterStopped(F filter, int userId) { 3359ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return false; 3369ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3379ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3389ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 3399ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * Return the package that owns this filter. This must be implemented to 3409ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * provide correct filtering of Intents that have specified a package name 3419ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * they are to be delivered to. 3429ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 3439ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn protected abstract String packageForFilter(F filter); 3449ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3459ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn @SuppressWarnings("unchecked") 3469ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn protected R newResult(F filter, int match, int userId) { 3479ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return (R)filter; 3489ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3499ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3509ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn @SuppressWarnings("unchecked") 3519ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn protected void sortResults(List<R> results) { 3529ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Collections.sort(results, mResolvePrioritySorter); 3539ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3549ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3559ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn protected void dumpFilter(PrintWriter out, String prefix, F filter) { 3569ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn out.print(prefix); out.println(filter); 3579ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3589ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3599ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private final int register_mime_types(F filter, String prefix) { 3609ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final Iterator<String> i = filter.typesIterator(); 3619ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (i == null) { 3629ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return 0; 3639ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3649ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3659ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int num = 0; 3669ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn while (i.hasNext()) { 3679ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String name = i.next(); 3689ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn num++; 3699ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (localLOGV) Slog.v(TAG, prefix + name); 3709ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String baseName = name; 3719ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final int slashpos = name.indexOf('/'); 3729ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (slashpos > 0) { 3739ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn baseName = name.substring(0, slashpos).intern(); 3749ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else { 3759ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn name = name + "/*"; 3769ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3779ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3789ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<F> array = mTypeToFilter.get(name); 3799ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (array == null) { 3809ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn //Slog.v(TAG, "Creating new array for " + name); 3819ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array = new ArrayList<F>(); 3829ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mTypeToFilter.put(name, array); 3839ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3849ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array.add(filter); 3859ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 3869ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (slashpos > 0) { 3879ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array = mBaseTypeToFilter.get(baseName); 3889ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (array == null) { 3899ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn //Slog.v(TAG, "Creating new array for " + name); 3909ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array = new ArrayList<F>(); 3919ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mBaseTypeToFilter.put(baseName, array); 3929ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 3939ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array.add(filter); 3949ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else { 3959ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array = mWildTypeToFilter.get(baseName); 3969ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (array == null) { 3979ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn //Slog.v(TAG, "Creating new array for " + name); 3989ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array = new ArrayList<F>(); 3999ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mWildTypeToFilter.put(baseName, array); 4009ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4019ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array.add(filter); 4029ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4039ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4049ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4059ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return num; 4069ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4079ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4089ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private final int unregister_mime_types(F filter, String prefix) { 4099ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final Iterator<String> i = filter.typesIterator(); 4109ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (i == null) { 4119ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return 0; 4129ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4139ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4149ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int num = 0; 4159ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn while (i.hasNext()) { 4169ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String name = i.next(); 4179ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn num++; 4189ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (localLOGV) Slog.v(TAG, prefix + name); 4199ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String baseName = name; 4209ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final int slashpos = name.indexOf('/'); 4219ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (slashpos > 0) { 4229ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn baseName = name.substring(0, slashpos).intern(); 4239ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else { 4249ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn name = name + "/*"; 4259ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4269ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4279ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!remove_all_objects(mTypeToFilter.get(name), filter)) { 4289ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mTypeToFilter.remove(name); 4299ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4309ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4319ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (slashpos > 0) { 4329ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!remove_all_objects(mBaseTypeToFilter.get(baseName), filter)) { 4339ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mBaseTypeToFilter.remove(baseName); 4349ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4359ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else { 4369ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!remove_all_objects(mWildTypeToFilter.get(baseName), filter)) { 4379ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn mWildTypeToFilter.remove(baseName); 4389ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4399ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4409ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4419ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return num; 4429ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4439ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4449ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private final int register_intent_filter(F filter, Iterator<String> i, 4459ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn HashMap<String, ArrayList<F>> dest, String prefix) { 4469ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (i == null) { 4479ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return 0; 4489ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4499ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4509ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int num = 0; 4519ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn while (i.hasNext()) { 4529ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String name = i.next(); 4539ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn num++; 4549ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (localLOGV) Slog.v(TAG, prefix + name); 4559ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn ArrayList<F> array = dest.get(name); 4569ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (array == null) { 4579ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn //Slog.v(TAG, "Creating new array for " + name); 4589ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array = new ArrayList<F>(); 4599ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn dest.put(name, array); 4609ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4619ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn array.add(filter); 4629ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4639ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return num; 4649ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4659ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4669ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private final int unregister_intent_filter(F filter, Iterator<String> i, 4679ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn HashMap<String, ArrayList<F>> dest, String prefix) { 4689ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (i == null) { 4699ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return 0; 4709ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4719ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4729ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int num = 0; 4739ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn while (i.hasNext()) { 4749ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String name = i.next(); 4759ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn num++; 4769ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (localLOGV) Slog.v(TAG, prefix + name); 4779ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!remove_all_objects(dest.get(name), filter)) { 4789ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn dest.remove(name); 4799ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4809ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4819ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return num; 4829ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4839ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4849ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private final boolean remove_all_objects(List<F> list, Object object) { 4859ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (list != null) { 4869ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int N = list.size(); 4879ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn for (int idx=0; idx<N; idx++) { 4889ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (list.get(idx) == object) { 4899ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn list.remove(idx); 4909ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn idx--; 4919ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn N--; 4929ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4939ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4949ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return N > 0; 4959ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4969ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return false; 4979ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 4989ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 4999ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private static FastImmutableArraySet<String> getFastIntentCategories(Intent intent) { 5009ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final Set<String> categories = intent.getCategories(); 5019ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (categories == null) { 5029ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return null; 5039ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5049ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return new FastImmutableArraySet<String>(categories.toArray(new String[categories.size()])); 5059ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5069ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5079ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private void buildResolveList(Intent intent, FastImmutableArraySet<String> categories, 5089ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean debug, boolean defaultOnly, 5099ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String resolvedType, String scheme, List<F> src, List<R> dest, int userId) { 5109ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final String action = intent.getAction(); 5119ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final Uri data = intent.getData(); 5129ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final String packageName = intent.getPackage(); 5139ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5149ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final boolean excludingStopped = intent.isExcludingStopped(); 5159ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5169ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final int N = src != null ? src.size() : 0; 5179ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn boolean hasNonDefaults = false; 5189ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int i; 5199ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn for (i=0; i<N; i++) { 5209ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn F filter = src.get(i); 5219ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn int match; 5229ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, "Matching against filter " + filter); 5239ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5249ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (excludingStopped && isFilterStopped(filter, userId)) { 5259ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) { 5269ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, " Filter's target is stopped; skipping"); 5279ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5289ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn continue; 5299ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5309ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5319ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // Is delivery being limited to filters owned by a particular package? 5329ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (packageName != null && !packageName.equals(packageForFilter(filter))) { 5339ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) { 5349ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, " Filter is not from package " + packageName + "; skipping"); 5359ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5369ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn continue; 5379ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5389ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5399ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // Do we already have this one? 5409ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!allowFilterResult(filter, dest)) { 5419ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) { 5429ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, " Filter's target already added"); 5439ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5449ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn continue; 5459ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5469ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5479ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn match = filter.match(action, resolvedType, scheme, data, categories, TAG); 5489ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (match >= 0) { 5499ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) Slog.v(TAG, " Filter matched! match=0x" + 5509ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Integer.toHexString(match)); 5519ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (!defaultOnly || filter.hasCategory(Intent.CATEGORY_DEFAULT)) { 5529ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final R oneResult = newResult(filter, match, userId); 5539ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (oneResult != null) { 5549ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn dest.add(oneResult); 5559ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5569ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else { 5579ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn hasNonDefaults = true; 5589ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5599ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } else { 5609ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (debug) { 5619ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn String reason; 5629ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn switch (match) { 5639ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn case IntentFilter.NO_MATCH_ACTION: reason = "action"; break; 5649ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn case IntentFilter.NO_MATCH_CATEGORY: reason = "category"; break; 5659ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn case IntentFilter.NO_MATCH_DATA: reason = "data"; break; 5669ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn case IntentFilter.NO_MATCH_TYPE: reason = "type"; break; 5679ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn default: reason = "unknown reason"; break; 5689ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5699ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.v(TAG, " Filter did not match: " + reason); 5709ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5719ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5729ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5739ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5749ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn if (dest.size() == 0 && hasNonDefaults) { 5759ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn Slog.w(TAG, "resolveIntent failed: found match, but none with Intent.CATEGORY_DEFAULT"); 5769ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5779ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5789ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5799ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn // Sorts a List of IntentFilter objects into descending priority order. 5809ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn @SuppressWarnings("rawtypes") 5819ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn private static final Comparator mResolvePrioritySorter = new Comparator() { 5829ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn public int compare(Object o1, Object o2) { 5839ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final int q1 = ((IntentFilter) o1).getPriority(); 5849ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final int q2 = ((IntentFilter) o2).getPriority(); 5859ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn return (q1 > q2) ? -1 : ((q1 < q2) ? 1 : 0); 5869ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn } 5879ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn }; 5889ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5899ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 5909ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * All filters that have been registered. 5919ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 5929ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final HashSet<F> mFilters = new HashSet<F>(); 5939ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 5949ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 5959ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * All of the MIME types that have been registered, such as "image/jpeg", 5969ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * "image/*", or "{@literal *}/*". 5979ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 5989ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final HashMap<String, ArrayList<F>> mTypeToFilter 5999ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn = new HashMap<String, ArrayList<F>>(); 6009ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 6019ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 6029ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * The base names of all of all fully qualified MIME types that have been 6039ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * registered, such as "image" or "*". Wild card MIME types such as 6049ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * "image/*" will not be here. 6059ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 6069ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final HashMap<String, ArrayList<F>> mBaseTypeToFilter 6079ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn = new HashMap<String, ArrayList<F>>(); 6089ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 6099ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 6109ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * The base names of all of the MIME types with a sub-type wildcard that 6119ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * have been registered. For example, a filter with "image/*" will be 6129ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * included here as "image" but one with "image/jpeg" will not be 6139ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * included here. This also includes the "*" for the "{@literal *}/*" 6149ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * MIME type. 6159ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 6169ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final HashMap<String, ArrayList<F>> mWildTypeToFilter 6179ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn = new HashMap<String, ArrayList<F>>(); 6189ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 6199ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 6209ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * All of the URI schemes (such as http) that have been registered. 6219ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 6229ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final HashMap<String, ArrayList<F>> mSchemeToFilter 6239ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn = new HashMap<String, ArrayList<F>>(); 6249ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 6259ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 6269ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * All of the actions that have been registered, but only those that did 6279ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * not specify data. 6289ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 6299ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final HashMap<String, ArrayList<F>> mActionToFilter 6309ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn = new HashMap<String, ArrayList<F>>(); 6319ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 6329ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn /** 6339ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn * All of the actions that have been registered and specified a MIME type. 6349ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn */ 6359ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn final HashMap<String, ArrayList<F>> mTypedActionToFilter 6369ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn = new HashMap<String, ArrayList<F>>(); 6379ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn} 6389ec6cdde9f8f22356dcc9f811d99ebf813194721Dianne Hackborn 639