1f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse/*
2f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * Copyright (C) 2014 The Android Open Source Project
3f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse *
4f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * Licensed under the Apache License, Version 2.0 (the "License");
5f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * you may not use this file except in compliance with the License.
6f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * You may obtain a copy of the License at
7f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse *
8f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse *      http://www.apache.org/licenses/LICENSE-2.0
9f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse *
10f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * Unless required by applicable law or agreed to in writing, software
11f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * distributed under the License is distributed on an "AS IS" BASIS,
12f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * See the License for the specific language governing permissions and
14f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse * limitations under the License.
15f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse */
16f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
17f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnsepackage com.android.server.pm;
18f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
19f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport com.android.internal.util.XmlUtils;
20f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
21f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport org.xmlpull.v1.XmlPullParser;
22f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport org.xmlpull.v1.XmlPullParserException;
23f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport org.xmlpull.v1.XmlSerializer;
24f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
25f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport android.content.ComponentName;
26f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport android.content.IntentFilter;
27f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport android.util.Log;
28f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
29f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseimport java.io.IOException;
30f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
31f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnseclass PersistentPreferredActivity extends IntentFilter {
32f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    private static final String ATTR_NAME = "name"; // component name
33f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    private static final String ATTR_FILTER = "filter"; // filter
34f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
35f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    private static final String TAG = "PersistentPreferredActivity";
36f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
37f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    private static final boolean DEBUG_FILTERS = false;
38f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
39f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    final ComponentName mComponent;
40f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
41f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    PersistentPreferredActivity(IntentFilter filter, ComponentName activity) {
42f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        super(filter);
43f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        mComponent = activity;
44f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    }
45f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
46f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    PersistentPreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException {
47f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        String shortComponent = parser.getAttributeValue(null, ATTR_NAME);
48f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        mComponent = ComponentName.unflattenFromString(shortComponent);
49f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        if (mComponent == null) {
50f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            PackageManagerService.reportSettingsProblem(Log.WARN,
51af597627cb344a144cbeb0a982e97e282cfd8f82Sander Alewijnse                    "Error in package manager settings: " +
52f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                            "Bad activity name " + shortComponent +
53f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                            " at " + parser.getPositionDescription());
54f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        }
55f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        int outerDepth = parser.getDepth();
56f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        String tagName = parser.getName();
57f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        int type;
58f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
59f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
60f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            tagName = parser.getName();
61f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
62f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                continue;
63f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            } else if (type == XmlPullParser.START_TAG) {
64f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                if (tagName.equals(ATTR_FILTER)) {
65f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                    break;
66f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                } else {
67f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                    PackageManagerService.reportSettingsProblem(Log.WARN,
68af597627cb344a144cbeb0a982e97e282cfd8f82Sander Alewijnse                            "Unknown element: " + tagName +
69f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                            " at " + parser.getPositionDescription());
70f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                    XmlUtils.skipCurrentTag(parser);
71f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                }
72f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            }
73f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        }
74f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        if (tagName.equals(ATTR_FILTER)) {
75f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            readFromXml(parser);
76f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        } else {
77f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            PackageManagerService.reportSettingsProblem(Log.WARN,
78af597627cb344a144cbeb0a982e97e282cfd8f82Sander Alewijnse                    "Missing element filter at " +
79f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                    parser.getPositionDescription());
80f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            XmlUtils.skipCurrentTag(parser);
81f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        }
82f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    }
83f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
84f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    public void writeToXml(XmlSerializer serializer) throws IOException {
85f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        serializer.attribute(null, ATTR_NAME, mComponent.flattenToShortString());
86f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        serializer.startTag(null, ATTR_FILTER);
87f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse            super.writeToXml(serializer);
88f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        serializer.endTag(null, ATTR_FILTER);
89f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    }
90f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse
91f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    @Override
92f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    public String toString() {
93f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse        return "PersistentPreferredActivity{0x" + Integer.toHexString(System.identityHashCode(this))
94f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse                + " " + mComponent.flattenToShortString() + "}";
95f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse    }
96f475ca33d9232785710aaa438f17915029dfa83bSander Alewijnse}
97