1f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn/* 2f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * 4f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * you may not use this file except in compliance with the License. 6f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * You may obtain a copy of the License at 7f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * 8f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * 10f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * See the License for the specific language governing permissions and 14f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn * limitations under the License. 15f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn */ 16f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 1709e9cdceceb722643e2c80c6544d44a43d7f95f0Amith Yamasanipackage com.android.server.pm; 18f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 19f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport com.android.internal.util.XmlUtils; 20f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 21f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport org.xmlpull.v1.XmlPullParser; 22f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport org.xmlpull.v1.XmlPullParserException; 23f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport org.xmlpull.v1.XmlSerializer; 24f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 25f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport android.content.ComponentName; 26f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport android.content.IntentFilter; 27f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport android.content.pm.ActivityInfo; 28f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport android.content.pm.ResolveInfo; 29f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport android.util.Slog; 30f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 31f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport java.io.IOException; 32f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport java.io.PrintWriter; 334ff5defa5328411035183b785a77db41778bc272Michal Karpinskiimport java.util.ArrayList; 34f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport java.util.List; 35f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 36f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornpublic class PreferredComponent { 37e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani private static final String TAG_SET = "set"; 38e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani private static final String ATTR_ALWAYS = "always"; // boolean 39e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani private static final String ATTR_MATCH = "match"; // number 40e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani private static final String ATTR_NAME = "name"; // component name 41e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani private static final String ATTR_SET = "set"; // number 42e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani 43f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public final int mMatch; 44f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public final ComponentName mComponent; 45e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani // Whether this is to be the one that's always chosen. If false, it's the most recently chosen. 46e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani public boolean mAlways; 47f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 48f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final String[] mSetPackages; 49f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final String[] mSetClasses; 50f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final String[] mSetComponents; 51f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final String mShortComponent; 52f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn private String mParseError; 53f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 54f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn private final Callbacks mCallbacks; 55f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 56f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public interface Callbacks { 57f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public boolean onReadTag(String tagName, XmlPullParser parser) 58f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn throws XmlPullParserException, IOException; 59f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 60f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 61f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public PreferredComponent(Callbacks callbacks, int match, ComponentName[] set, 62e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani ComponentName component, boolean always) { 63f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mCallbacks = callbacks; 64f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mMatch = match&IntentFilter.MATCH_CATEGORY_MASK; 65f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mComponent = component; 66e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani mAlways = always; 67f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mShortComponent = component.flattenToShortString(); 68f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mParseError = null; 69f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (set != null) { 70f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn final int N = set.length; 71f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn String[] myPackages = new String[N]; 72f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn String[] myClasses = new String[N]; 73f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn String[] myComponents = new String[N]; 74f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn for (int i=0; i<N; i++) { 75f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn ComponentName cn = set[i]; 76f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (cn == null) { 77f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetPackages = null; 78f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetClasses = null; 79f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetComponents = null; 80f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn return; 81f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 82f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn myPackages[i] = cn.getPackageName().intern(); 83f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn myClasses[i] = cn.getClassName().intern(); 846d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn myComponents[i] = cn.flattenToShortString(); 85f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 86f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetPackages = myPackages; 87f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetClasses = myClasses; 88f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetComponents = myComponents; 89f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } else { 90f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetPackages = null; 91f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetClasses = null; 92f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetComponents = null; 93f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 94f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 95f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 96f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public PreferredComponent(Callbacks callbacks, XmlPullParser parser) 97f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn throws XmlPullParserException, IOException { 98f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mCallbacks = callbacks; 99e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani mShortComponent = parser.getAttributeValue(null, ATTR_NAME); 100f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mComponent = ComponentName.unflattenFromString(mShortComponent); 101f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (mComponent == null) { 102f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mParseError = "Bad activity name " + mShortComponent; 103f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 104e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani String matchStr = parser.getAttributeValue(null, ATTR_MATCH); 105f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mMatch = matchStr != null ? Integer.parseInt(matchStr, 16) : 0; 106e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani String setCountStr = parser.getAttributeValue(null, ATTR_SET); 107f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn int setCount = setCountStr != null ? Integer.parseInt(setCountStr) : 0; 108e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani String alwaysStr = parser.getAttributeValue(null, ATTR_ALWAYS); 109e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani mAlways = alwaysStr != null ? Boolean.parseBoolean(alwaysStr) : true; 110f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 111f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn String[] myPackages = setCount > 0 ? new String[setCount] : null; 112f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn String[] myClasses = setCount > 0 ? new String[setCount] : null; 113f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn String[] myComponents = setCount > 0 ? new String[setCount] : null; 114f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 115f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn int setPos = 0; 116f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 117f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn int outerDepth = parser.getDepth(); 118f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn int type; 119f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 120f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn && (type != XmlPullParser.END_TAG 121f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn || parser.getDepth() > outerDepth)) { 122f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (type == XmlPullParser.END_TAG 123f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn || type == XmlPullParser.TEXT) { 124f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn continue; 125f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 126f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 127f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn String tagName = parser.getName(); 128f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn //Log.i(TAG, "Parse outerDepth=" + outerDepth + " depth=" 129f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn // + parser.getDepth() + " tag=" + tagName); 130e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani if (tagName.equals(TAG_SET)) { 131e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 132f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (name == null) { 133f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (mParseError == null) { 134f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mParseError = "No name in set tag in preferred activity " 135f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn + mShortComponent; 136f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 137f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } else if (setPos >= setCount) { 138f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (mParseError == null) { 139f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mParseError = "Too many set tags in preferred activity " 140f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn + mShortComponent; 141f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 142f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } else { 143f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn ComponentName cn = ComponentName.unflattenFromString(name); 144f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (cn == null) { 145f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (mParseError == null) { 146f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mParseError = "Bad set name " + name + " in preferred activity " 147f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn + mShortComponent; 148f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 149f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } else { 150f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn myPackages[setPos] = cn.getPackageName(); 151f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn myClasses[setPos] = cn.getClassName(); 152f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn myComponents[setPos] = name; 153f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn setPos++; 154f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 155f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 156f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn XmlUtils.skipCurrentTag(parser); 157f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } else if (!mCallbacks.onReadTag(tagName, parser)) { 158f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn Slog.w("PreferredComponent", "Unknown element: " + parser.getName()); 159f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn XmlUtils.skipCurrentTag(parser); 160f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 161f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 162f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 163f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (setPos != setCount) { 164f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (mParseError == null) { 165f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mParseError = "Not enough set tags (expected " + setCount 166f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn + " but found " + setPos + ") in " + mShortComponent; 167f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 168f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 169f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 170f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetPackages = myPackages; 171f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetClasses = myClasses; 172f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn mSetComponents = myComponents; 173f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 174f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 175f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public String getParseError() { 176f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn return mParseError; 177f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 178f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 1798a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn public void writeToXml(XmlSerializer serializer, boolean full) throws IOException { 180f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn final int NS = mSetClasses != null ? mSetClasses.length : 0; 181e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani serializer.attribute(null, ATTR_NAME, mShortComponent); 1828a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn if (full) { 1838a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn if (mMatch != 0) { 184e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani serializer.attribute(null, ATTR_MATCH, Integer.toHexString(mMatch)); 1858a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn } 186e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani serializer.attribute(null, ATTR_ALWAYS, Boolean.toString(mAlways)); 187e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani serializer.attribute(null, ATTR_SET, Integer.toString(NS)); 1888a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn for (int s=0; s<NS; s++) { 189e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani serializer.startTag(null, TAG_SET); 190e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani serializer.attribute(null, ATTR_NAME, mSetComponents[s]); 191e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani serializer.endTag(null, TAG_SET); 1928a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn } 193f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 194f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 195f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 19657792912ee8f536f90c466db701d71a9e38c54d4Christopher Tate public boolean sameSet(List<ResolveInfo> query) { 197f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mSetPackages == null) { 198f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return query == null; 199f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 200f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (query == null) { 201f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return false; 202f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 203f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn final int NQ = query.size(); 204f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn final int NS = mSetPackages.length; 20557792912ee8f536f90c466db701d71a9e38c54d4Christopher Tate 206f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn int numMatch = 0; 207f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn for (int i=0; i<NQ; i++) { 208f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn ResolveInfo ri = query.get(i); 209f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn ActivityInfo ai = ri.activityInfo; 210f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn boolean good = false; 211f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn for (int j=0; j<NS; j++) { 212f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (mSetPackages[j].equals(ai.packageName) 213f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn && mSetClasses[j].equals(ai.name)) { 214f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn numMatch++; 215f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn good = true; 216f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn break; 217f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 218f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 219f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (!good) return false; 220f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 221f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn return numMatch == NS; 222f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 223f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn 224f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn public boolean sameSet(ComponentName[] comps) { 225f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mSetPackages == null) return false; 226f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final int NQ = comps.length; 227f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn final int NS = mSetPackages.length; 228f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn int numMatch = 0; 229f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn for (int i=0; i<NQ; i++) { 230f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn ComponentName cn = comps[i]; 231f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn boolean good = false; 232f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn for (int j=0; j<NS; j++) { 233f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (mSetPackages[j].equals(cn.getPackageName()) 234f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn && mSetClasses[j].equals(cn.getClassName())) { 235f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn numMatch++; 236f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn good = true; 237f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn break; 238f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 239f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 240f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn if (!good) return false; 241f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 242f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn return numMatch == NS; 243f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn } 244f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn 2454ff5defa5328411035183b785a77db41778bc272Michal Karpinski public boolean isSuperset(List<ResolveInfo> query) { 2464ff5defa5328411035183b785a77db41778bc272Michal Karpinski if (mSetPackages == null) { 2474ff5defa5328411035183b785a77db41778bc272Michal Karpinski return query == null; 2484ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2494ff5defa5328411035183b785a77db41778bc272Michal Karpinski if (query == null) { 2504ff5defa5328411035183b785a77db41778bc272Michal Karpinski return true; 2514ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2524ff5defa5328411035183b785a77db41778bc272Michal Karpinski final int NQ = query.size(); 2534ff5defa5328411035183b785a77db41778bc272Michal Karpinski final int NS = mSetPackages.length; 2544ff5defa5328411035183b785a77db41778bc272Michal Karpinski if (NS < NQ) { 2554ff5defa5328411035183b785a77db41778bc272Michal Karpinski return false; 2564ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2574ff5defa5328411035183b785a77db41778bc272Michal Karpinski for (int i=0; i<NQ; i++) { 2584ff5defa5328411035183b785a77db41778bc272Michal Karpinski ResolveInfo ri = query.get(i); 2594ff5defa5328411035183b785a77db41778bc272Michal Karpinski ActivityInfo ai = ri.activityInfo; 2604ff5defa5328411035183b785a77db41778bc272Michal Karpinski boolean foundMatch = false; 2614ff5defa5328411035183b785a77db41778bc272Michal Karpinski for (int j=0; j<NS; j++) { 2624ff5defa5328411035183b785a77db41778bc272Michal Karpinski if (mSetPackages[j].equals(ai.packageName) && mSetClasses[j].equals(ai.name)) { 2634ff5defa5328411035183b785a77db41778bc272Michal Karpinski foundMatch = true; 2644ff5defa5328411035183b785a77db41778bc272Michal Karpinski break; 2654ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2664ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2674ff5defa5328411035183b785a77db41778bc272Michal Karpinski if (!foundMatch) return false; 2684ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2694ff5defa5328411035183b785a77db41778bc272Michal Karpinski return true; 2704ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2714ff5defa5328411035183b785a77db41778bc272Michal Karpinski 2724ff5defa5328411035183b785a77db41778bc272Michal Karpinski /** Returns components from mSetPackages that are present in query. */ 2734ff5defa5328411035183b785a77db41778bc272Michal Karpinski public ComponentName[] discardObsoleteComponents(List<ResolveInfo> query) { 2744ff5defa5328411035183b785a77db41778bc272Michal Karpinski if (mSetPackages == null || query == null) { 2754ff5defa5328411035183b785a77db41778bc272Michal Karpinski return new ComponentName[0]; 2764ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2774ff5defa5328411035183b785a77db41778bc272Michal Karpinski final int NQ = query.size(); 2784ff5defa5328411035183b785a77db41778bc272Michal Karpinski final int NS = mSetPackages.length; 2794ff5defa5328411035183b785a77db41778bc272Michal Karpinski ArrayList<ComponentName> aliveComponents = new ArrayList<>(); 2804ff5defa5328411035183b785a77db41778bc272Michal Karpinski for (int i = 0; i < NQ; i++) { 2814ff5defa5328411035183b785a77db41778bc272Michal Karpinski ResolveInfo ri = query.get(i); 2824ff5defa5328411035183b785a77db41778bc272Michal Karpinski ActivityInfo ai = ri.activityInfo; 2834ff5defa5328411035183b785a77db41778bc272Michal Karpinski for (int j = 0; j < NS; j++) { 2844ff5defa5328411035183b785a77db41778bc272Michal Karpinski if (mSetPackages[j].equals(ai.packageName) && mSetClasses[j].equals(ai.name)) { 2854ff5defa5328411035183b785a77db41778bc272Michal Karpinski aliveComponents.add(new ComponentName(mSetPackages[j], mSetClasses[j])); 2864ff5defa5328411035183b785a77db41778bc272Michal Karpinski break; 2874ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2884ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2894ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2904ff5defa5328411035183b785a77db41778bc272Michal Karpinski return aliveComponents.toArray(new ComponentName[aliveComponents.size()]); 2914ff5defa5328411035183b785a77db41778bc272Michal Karpinski } 2924ff5defa5328411035183b785a77db41778bc272Michal Karpinski 293f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn public void dump(PrintWriter out, String prefix, Object ident) { 294f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn out.print(prefix); out.print( 295f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn Integer.toHexString(System.identityHashCode(ident))); 296f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn out.print(' '); 2976d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn out.println(mShortComponent); 2986d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn out.print(prefix); out.print(" mMatch=0x"); 2996d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn out.print(Integer.toHexString(mMatch)); 3006d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn out.print(" mAlways="); out.println(mAlways); 301f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn if (mSetComponents != null) { 302f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn out.print(prefix); out.println(" Selected from:"); 303f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn for (int i=0; i<mSetComponents.length; i++) { 304f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn out.print(prefix); out.print(" "); 305f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn out.println(mSetComponents[i]); 306f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 307f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 308f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn } 309f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn} 310