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