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;
33f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornimport java.util.List;
34f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
35f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackbornpublic class PreferredComponent {
36e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani    private static final String TAG_SET = "set";
37e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani    private static final String ATTR_ALWAYS = "always"; // boolean
38e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani    private static final String ATTR_MATCH = "match"; // number
39e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani    private static final String ATTR_NAME = "name"; // component name
40e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani    private static final String ATTR_SET = "set"; // number
41e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani
42f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    public final int mMatch;
43f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    public final ComponentName mComponent;
44e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani    // Whether this is to be the one that's always chosen. If false, it's the most recently chosen.
45e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani    public boolean mAlways;
46f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
47f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn    final String[] mSetPackages;
48f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn    final String[] mSetClasses;
49f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn    final String[] mSetComponents;
50f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn    final String mShortComponent;
51f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    private String mParseError;
52f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
53f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    private final Callbacks mCallbacks;
54f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
55f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    public interface Callbacks {
56f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        public boolean onReadTag(String tagName, XmlPullParser parser)
57f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                throws XmlPullParserException, IOException;
58f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    }
59f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
60f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    public PreferredComponent(Callbacks callbacks, int match, ComponentName[] set,
61e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani            ComponentName component, boolean always) {
62f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mCallbacks = callbacks;
63f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mMatch = match&IntentFilter.MATCH_CATEGORY_MASK;
64f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mComponent = component;
65e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani        mAlways = always;
66f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mShortComponent = component.flattenToShortString();
67f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mParseError = null;
68f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        if (set != null) {
69f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            final int N = set.length;
70f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            String[] myPackages = new String[N];
71f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            String[] myClasses = new String[N];
72f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            String[] myComponents = new String[N];
73f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            for (int i=0; i<N; i++) {
74f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                ComponentName cn = set[i];
75f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                if (cn == null) {
76f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    mSetPackages = null;
77f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    mSetClasses = null;
78f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    mSetComponents = null;
79f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    return;
80f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                }
81f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                myPackages[i] = cn.getPackageName().intern();
82f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                myClasses[i] = cn.getClassName().intern();
836d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                myComponents[i] = cn.flattenToShortString();
84f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            }
85f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            mSetPackages = myPackages;
86f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            mSetClasses = myClasses;
87f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            mSetComponents = myComponents;
88f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        } else {
89f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            mSetPackages = null;
90f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            mSetClasses = null;
91f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            mSetComponents = null;
92f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        }
93f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    }
94f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
95f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    public PreferredComponent(Callbacks callbacks, XmlPullParser parser)
96f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            throws XmlPullParserException, IOException {
97f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mCallbacks = callbacks;
98e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani        mShortComponent = parser.getAttributeValue(null, ATTR_NAME);
99f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mComponent = ComponentName.unflattenFromString(mShortComponent);
100f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        if (mComponent == null) {
101f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            mParseError = "Bad activity name " + mShortComponent;
102f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        }
103e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani        String matchStr = parser.getAttributeValue(null, ATTR_MATCH);
104f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mMatch = matchStr != null ? Integer.parseInt(matchStr, 16) : 0;
105e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani        String setCountStr = parser.getAttributeValue(null, ATTR_SET);
106f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        int setCount = setCountStr != null ? Integer.parseInt(setCountStr) : 0;
107e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani        String alwaysStr = parser.getAttributeValue(null, ATTR_ALWAYS);
108e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani        mAlways = alwaysStr != null ? Boolean.parseBoolean(alwaysStr) : true;
109f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
110f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        String[] myPackages = setCount > 0 ? new String[setCount] : null;
111f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        String[] myClasses = setCount > 0 ? new String[setCount] : null;
112f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        String[] myComponents = setCount > 0 ? new String[setCount] : null;
113f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
114f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        int setPos = 0;
115f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
116f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        int outerDepth = parser.getDepth();
117f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        int type;
118f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
119f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn               && (type != XmlPullParser.END_TAG
120f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                       || parser.getDepth() > outerDepth)) {
121f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            if (type == XmlPullParser.END_TAG
122f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    || type == XmlPullParser.TEXT) {
123f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                continue;
124f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            }
125f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
126f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            String tagName = parser.getName();
127f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            //Log.i(TAG, "Parse outerDepth=" + outerDepth + " depth="
128f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            //        + parser.getDepth() + " tag=" + tagName);
129e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani            if (tagName.equals(TAG_SET)) {
130e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani                String name = parser.getAttributeValue(null, ATTR_NAME);
131f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                if (name == null) {
132f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    if (mParseError == null) {
133f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        mParseError = "No name in set tag in preferred activity "
134f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                            + mShortComponent;
135f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    }
136f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                } else if (setPos >= setCount) {
137f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    if (mParseError == null) {
138f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        mParseError = "Too many set tags in preferred activity "
139f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                            + mShortComponent;
140f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    }
141f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                } else {
142f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    ComponentName cn = ComponentName.unflattenFromString(name);
143f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    if (cn == null) {
144f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        if (mParseError == null) {
145f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                            mParseError = "Bad set name " + name + " in preferred activity "
146f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                                + mShortComponent;
147f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        }
148f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    } else {
149f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        myPackages[setPos] = cn.getPackageName();
150f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        myClasses[setPos] = cn.getClassName();
151f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        myComponents[setPos] = name;
152f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        setPos++;
153f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    }
154f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                }
155f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
156f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            } else if (!mCallbacks.onReadTag(tagName, parser)) {
157f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                Slog.w("PreferredComponent", "Unknown element: " + parser.getName());
158f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
159f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            }
160f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        }
161f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
162f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        if (setPos != setCount) {
163f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            if (mParseError == null) {
164f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                mParseError = "Not enough set tags (expected " + setCount
165f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    + " but found " + setPos + ") in " + mShortComponent;
166f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            }
167f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        }
168f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
169f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mSetPackages = myPackages;
170f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mSetClasses = myClasses;
171f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        mSetComponents = myComponents;
172f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    }
173f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
174f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    public String getParseError() {
175f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        return mParseError;
176f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    }
177f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
1788a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn    public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
179f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        final int NS = mSetClasses != null ? mSetClasses.length : 0;
180e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani        serializer.attribute(null, ATTR_NAME, mShortComponent);
1818a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn        if (full) {
1828a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn            if (mMatch != 0) {
183e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani                serializer.attribute(null, ATTR_MATCH, Integer.toHexString(mMatch));
1848a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn            }
185e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani            serializer.attribute(null, ATTR_ALWAYS, Boolean.toString(mAlways));
186e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani            serializer.attribute(null, ATTR_SET, Integer.toString(NS));
1878a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn            for (int s=0; s<NS; s++) {
188e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani                serializer.startTag(null, TAG_SET);
189e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani                serializer.attribute(null, ATTR_NAME, mSetComponents[s]);
190e9ecc8b49992840249bfb9d5d52b8824dd5de39bAmith Yamasani                serializer.endTag(null, TAG_SET);
1918a2ed1d7c0c4f6476e39cc37d9ebd29c7562ce01Dianne Hackborn            }
192f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        }
193f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    }
194f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
19557792912ee8f536f90c466db701d71a9e38c54d4Christopher Tate    public boolean sameSet(List<ResolveInfo> query) {
196f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        if (mSetPackages == null) {
197f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn            return query == null;
198f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        }
199f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        if (query == null) {
200f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn            return false;
201f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        }
202f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        final int NQ = query.size();
203f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        final int NS = mSetPackages.length;
20457792912ee8f536f90c466db701d71a9e38c54d4Christopher Tate
205f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        int numMatch = 0;
206f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        for (int i=0; i<NQ; i++) {
207f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            ResolveInfo ri = query.get(i);
208f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            ActivityInfo ai = ri.activityInfo;
209f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            boolean good = false;
210f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            for (int j=0; j<NS; j++) {
211f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                if (mSetPackages[j].equals(ai.packageName)
212f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        && mSetClasses[j].equals(ai.name)) {
213f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    numMatch++;
214f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    good = true;
215f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                    break;
216f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                }
217f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            }
218f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            if (!good) return false;
219f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        }
220f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        return numMatch == NS;
221f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    }
222f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn
223f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn    public boolean sameSet(ComponentName[] comps) {
224f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        if (mSetPackages == null) return false;
225f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        final int NQ = comps.length;
226f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        final int NS = mSetPackages.length;
227f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        int numMatch = 0;
228f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        for (int i=0; i<NQ; i++) {
229f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn            ComponentName cn = comps[i];
230f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn            boolean good = false;
231f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn            for (int j=0; j<NS; j++) {
232f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn                if (mSetPackages[j].equals(cn.getPackageName())
233f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn                        && mSetClasses[j].equals(cn.getClassName())) {
234f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn                    numMatch++;
235f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn                    good = true;
236f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn                    break;
237f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn                }
238f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn            }
239f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn            if (!good) return false;
240f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        }
241f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn        return numMatch == NS;
242f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn    }
243f2ac2761276e4972f6463d6818c9f5798bdc9a4dDianne Hackborn
244f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    public void dump(PrintWriter out, String prefix, Object ident) {
245f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        out.print(prefix); out.print(
246f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                Integer.toHexString(System.identityHashCode(ident)));
247f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                out.print(' ');
2486d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                out.println(mShortComponent);
2496d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        out.print(prefix); out.print(" mMatch=0x");
2506d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                out.print(Integer.toHexString(mMatch));
2516d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn                out.print(" mAlways="); out.println(mAlways);
252f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        if (mSetComponents != null) {
253f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            out.print(prefix); out.println("  Selected from:");
254f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            for (int i=0; i<mSetComponents.length; i++) {
255f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                out.print(prefix); out.print("    ");
256f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn                        out.println(mSetComponents[i]);
257f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn            }
258f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn        }
259f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn    }
260f8b8a3fa955b545843ca264428c620b67c2a5359Dianne Hackborn}
261