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