Loading services/java/com/android/server/pm/PackageManagerService.java +108 −99 Original line number Original line Diff line number Diff line Loading @@ -1300,27 +1300,6 @@ public class PackageManagerService extends IPackageManager.Stub { ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL) ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL) : 0)); : 0)); // Verify that all of the preferred activity components actually // exist. It is possible for applications to be updated and at // that point remove a previously declared activity component that // had been set as a preferred activity. We try to clean this up // the next time we encounter that preferred activity, but it is // possible for the user flow to never be able to return to that // situation so here we do a sanity check to make sure we haven't // left any junk around. ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>(); for (PreferredActivity pa : mSettings.mPreferredActivities.filterSet()) { if (mActivities.mActivities.get(pa.mPref.mComponent) == null) { removed.add(pa); } } for (int i=0; i<removed.size(); i++) { PreferredActivity pa = removed.get(i); Slog.w(TAG, "Removing dangling preferred activity: " + pa.mPref.mComponent); mSettings.mPreferredActivities.removeFilter(pa); } // can downgrade to reader // can downgrade to reader mSettings.writeLPr(); mSettings.writeLPr(); Loading Loading @@ -2504,9 +2483,11 @@ public class PackageManagerService extends IPackageManager.Stub { intent = intent.getSelector(); intent = intent.getSelector(); } } if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); List<PreferredActivity> prefs = PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); mSettings.mPreferredActivities.queryIntent(intent, resolvedType, List<PreferredActivity> prefs = pir != null (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId); ? pir.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId) : null; if (prefs != null && prefs.size() > 0) { if (prefs != null && prefs.size() > 0) { // First figure out how good the original match set is. // First figure out how good the original match set is. // We will only allow preferred activities that came // We will only allow preferred activities that came Loading Loading @@ -2537,9 +2518,6 @@ public class PackageManagerService extends IPackageManager.Stub { final int M = prefs.size(); final int M = prefs.size(); for (int i=0; i<M; i++) { for (int i=0; i<M; i++) { final PreferredActivity pa = prefs.get(i); final PreferredActivity pa = prefs.get(i); if (pa.mUserId != userId) { continue; } if (pa.mPref.mMatch != match) { if (pa.mPref.mMatch != match) { continue; continue; } } Loading @@ -2560,7 +2538,7 @@ public class PackageManagerService extends IPackageManager.Stub { // it from the preferred activities list, and skip it. // it from the preferred activities list, and skip it. Slog.w(TAG, "Removing dangling preferred activity: " Slog.w(TAG, "Removing dangling preferred activity: " + pa.mPref.mComponent); + pa.mPref.mComponent); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); continue; continue; } } for (int j=0; j<N; j++) { for (int j=0; j<N; j++) { Loading @@ -2580,7 +2558,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (!pa.mPref.sameSet(query, priority)) { if (!pa.mPref.sameSet(query, priority)) { Slog.i(TAG, "Result set changed, dropping preferred activity for " Slog.i(TAG, "Result set changed, dropping preferred activity for " + intent + " type " + resolvedType); + intent + " type " + resolvedType); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); return null; return null; } } Loading Loading @@ -8682,9 +8660,9 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :"); Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); filter.dump(new LogPrinter(Log.INFO, TAG), " "); mSettings.mPreferredActivities.addFilter( mSettings.editPreferredActivitiesLPw(userId).addFilter( new PreferredActivity(filter, match, set, activity, userId)); new PreferredActivity(filter, match, set, activity)); scheduleWriteSettingsLocked(); mSettings.writePackageRestrictionsLPr(userId); } } } } Loading Loading @@ -8722,12 +8700,13 @@ public class PackageManagerService extends IPackageManager.Stub { final int callingUserId = UserHandle.getCallingUserId(); final int callingUserId = UserHandle.getCallingUserId(); ArrayList<PreferredActivity> removed = null; ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); PreferredIntentResolver pir = mSettings.mPreferredActivities.get(callingUserId); if (pir != null) { Iterator<PreferredActivity> it = pir.filterIterator(); String action = filter.getAction(0); String action = filter.getAction(0); String category = filter.getCategory(0); String category = filter.getCategory(0); while (it.hasNext()) { while (it.hasNext()) { PreferredActivity pa = it.next(); PreferredActivity pa = it.next(); if (pa.mUserId != callingUserId) continue; if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { if (removed == null) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); removed = new ArrayList<PreferredActivity>(); Loading @@ -8740,7 +8719,8 @@ public class PackageManagerService extends IPackageManager.Stub { if (removed != null) { if (removed != null) { for (int i=0; i<removed.size(); i++) { for (int i=0; i<removed.size(); i++) { PreferredActivity pa = removed.get(i); PreferredActivity pa = removed.get(i); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); } } } } } addPreferredActivity(filter, match, set, activity, callingUserId); addPreferredActivity(filter, match, set, activity, callingUserId); Loading Loading @@ -8776,12 +8756,16 @@ public class PackageManagerService extends IPackageManager.Stub { /** This method takes a specific user id as well as UserHandle.USER_ALL. */ /** This method takes a specific user id as well as UserHandle.USER_ALL. */ boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { ArrayList<PreferredActivity> removed = null; ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); boolean changed = false; while (it.hasNext()) { for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { PreferredActivity pa = it.next(); final int thisUserId = mSettings.mPreferredActivities.keyAt(i); if (userId != UserHandle.USER_ALL && pa.mUserId != userId) { PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); if (userId != UserHandle.USER_ALL && userId != thisUserId) { continue; continue; } } Iterator<PreferredActivity> it = pir.filterIterator(); while (it.hasNext()) { PreferredActivity pa = it.next(); if (pa.mPref.mComponent.getPackageName().equals(packageName)) { if (pa.mPref.mComponent.getPackageName().equals(packageName)) { if (removed == null) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); removed = new ArrayList<PreferredActivity>(); Loading @@ -8790,13 +8774,15 @@ public class PackageManagerService extends IPackageManager.Stub { } } } } if (removed != null) { if (removed != null) { for (int i=0; i<removed.size(); i++) { for (int j=0; j<removed.size(); j++) { PreferredActivity pa = removed.get(i); PreferredActivity pa = removed.get(j); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); } } return true; changed = true; mSettings.writePackageRestrictionsLPr(thisUserId); } } return false; } return changed; } } public int getPreferredActivities(List<IntentFilter> outFilters, public int getPreferredActivities(List<IntentFilter> outFilters, Loading @@ -8806,12 +8792,11 @@ public class PackageManagerService extends IPackageManager.Stub { final int userId = UserHandle.getCallingUserId(); final int userId = UserHandle.getCallingUserId(); // reader // reader synchronized (mPackages) { synchronized (mPackages) { final Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); if (pir != null) { final Iterator<PreferredActivity> it = pir.filterIterator(); while (it.hasNext()) { while (it.hasNext()) { final PreferredActivity pa = it.next(); final PreferredActivity pa = it.next(); if (pa.mUserId != userId) { continue; } if (packageName == null if (packageName == null || pa.mPref.mComponent.getPackageName().equals(packageName)) { || pa.mPref.mComponent.getPackageName().equals(packageName)) { if (outFilters != null) { if (outFilters != null) { Loading @@ -8823,6 +8808,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } } } } } } return num; return num; } } Loading Loading @@ -9041,6 +9027,39 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_SETTINGS) { if (DEBUG_SETTINGS) { Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); } } synchronized (mPackages) { // Verify that all of the preferred activity components actually // exist. It is possible for applications to be updated and at // that point remove a previously declared activity component that // had been set as a preferred activity. We try to clean this up // the next time we encounter that preferred activity, but it is // possible for the user flow to never be able to return to that // situation so here we do a sanity check to make sure we haven't // left any junk around. ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>(); for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); removed.clear(); for (PreferredActivity pa : pir.filterSet()) { if (mActivities.mActivities.get(pa.mPref.mComponent) == null) { removed.add(pa); } } if (removed.size() > 0) { for (int j=0; j<removed.size(); j++) { PreferredActivity pa = removed.get(i); RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); Slog.w(TAG, "Removing dangling preferred activity: " + pa.mPref.mComponent, here); pir.removeFilter(pa); } mSettings.writePackageRestrictionsLPr( mSettings.mPreferredActivities.keyAt(i)); } } } } } public boolean isSafeMode() { public boolean isSafeMode() { Loading Loading @@ -9281,13 +9300,18 @@ public class PackageManagerService extends IPackageManager.Stub { } } if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) { if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) { if (mSettings.mPreferredActivities.dump(pw, for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { dumpState.getTitlePrinted() ? "\nPreferred Activities:" PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); : "Preferred Activities:", " ", int user = mSettings.mPreferredActivities.keyAt(i); if (pir.dump(pw, dumpState.getTitlePrinted() ? "\nPreferred Activities User " + user + ":" : "Preferred Activities User " + user + ":", " ", packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { dumpState.setTitlePrinted(true); dumpState.setTitlePrinted(true); } } } } } if (dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)) { if (dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)) { pw.flush(); pw.flush(); Loading @@ -9299,7 +9323,7 @@ public class PackageManagerService extends IPackageManager.Stub { serializer.startDocument(null, true); serializer.startDocument(null, true); serializer.setFeature( serializer.setFeature( "http://xmlpull.org/v1/doc/features.html#indent-output", true); "http://xmlpull.org/v1/doc/features.html#indent-output", true); mSettings.writePreferredActivitiesLPr(serializer); mSettings.writePreferredActivitiesLPr(serializer, 0); serializer.endDocument(); serializer.endDocument(); serializer.flush(); serializer.flush(); } catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) { Loading Loading @@ -10045,11 +10069,6 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ /** Called by UserManagerService */ void cleanUpUserLILPw(int userHandle) { void cleanUpUserLILPw(int userHandle) { // Disable all the packages for the user first Set<Entry<String, PackageSetting>> entries = mSettings.mPackages.entrySet(); for (Entry<String, PackageSetting> entry : entries) { entry.getValue().removeUser(userHandle); } if (mDirtyUsers.remove(userHandle)); if (mDirtyUsers.remove(userHandle)); mSettings.removeUserLPr(userHandle); mSettings.removeUserLPr(userHandle); if (mInstaller != null) { if (mInstaller != null) { Loading @@ -10063,17 +10082,7 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ /** Called by UserManagerService */ void createNewUserLILPw(int userHandle, File path) { void createNewUserLILPw(int userHandle, File path) { if (mInstaller != null) { if (mInstaller != null) { path.mkdir(); mSettings.createNewUserLILPw(mInstaller, userHandle, path); FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH, -1, -1); for (PackageSetting ps : mSettings.mPackages.values()) { // Only system apps are initially installed. ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle); // Need to create a data directory for all apps under this user. mInstaller.createUserData(ps.name, UserHandle.getUid(userHandle, ps.appId), userHandle); } mSettings.writePackageRestrictionsLPr(userHandle); } } } } Loading services/java/com/android/server/pm/PreferredActivity.java +0 −15 Original line number Original line Diff line number Diff line Loading @@ -36,32 +36,17 @@ class PreferredActivity extends IntentFilter implements PreferredComponent.Callb static final String ATTR_USER_ID = "userId"; static final String ATTR_USER_ID = "userId"; final PreferredComponent mPref; final PreferredComponent mPref; final int mUserId; PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { this(filter, match, set, activity, 0); } PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { super(filter); super(filter); mUserId = userId; mPref = new PreferredComponent(this, match, set, activity); mPref = new PreferredComponent(this, match, set, activity); } } PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException { PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException { String userIdString = parser.getAttributeValue(null, ATTR_USER_ID); if (userIdString != null && userIdString.length() > 0) { mUserId = Integer.parseInt(userIdString); } else { // Old format with no userId specified - assume primary user mUserId = 0; } mPref = new PreferredComponent(this, parser); mPref = new PreferredComponent(this, parser); } } public void writeToXml(XmlSerializer serializer) throws IOException { public void writeToXml(XmlSerializer serializer) throws IOException { serializer.attribute(null, ATTR_USER_ID, Integer.toString(mUserId)); mPref.writeToXml(serializer); mPref.writeToXml(serializer); serializer.startTag(null, "filter"); serializer.startTag(null, "filter"); super.writeToXml(serializer); super.writeToXml(serializer); Loading services/java/com/android/server/pm/PreferredIntentResolver.java 0 → 100644 +38 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.pm; import java.io.PrintWriter; import com.android.server.IntentResolver; public class PreferredIntentResolver extends IntentResolver<PreferredActivity, PreferredActivity> { @Override protected PreferredActivity[] newArray(int size) { return new PreferredActivity[size]; } @Override protected String packageForFilter(PreferredActivity filter) { return filter.mPref.mComponent.getPackageName(); } @Override protected void dumpFilter(PrintWriter out, String prefix, PreferredActivity filter) { filter.mPref.dump(out, prefix, filter); } } services/java/com/android/server/pm/Settings.java +84 −59 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
services/java/com/android/server/pm/PackageManagerService.java +108 −99 Original line number Original line Diff line number Diff line Loading @@ -1300,27 +1300,6 @@ public class PackageManagerService extends IPackageManager.Stub { ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL) ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL) : 0)); : 0)); // Verify that all of the preferred activity components actually // exist. It is possible for applications to be updated and at // that point remove a previously declared activity component that // had been set as a preferred activity. We try to clean this up // the next time we encounter that preferred activity, but it is // possible for the user flow to never be able to return to that // situation so here we do a sanity check to make sure we haven't // left any junk around. ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>(); for (PreferredActivity pa : mSettings.mPreferredActivities.filterSet()) { if (mActivities.mActivities.get(pa.mPref.mComponent) == null) { removed.add(pa); } } for (int i=0; i<removed.size(); i++) { PreferredActivity pa = removed.get(i); Slog.w(TAG, "Removing dangling preferred activity: " + pa.mPref.mComponent); mSettings.mPreferredActivities.removeFilter(pa); } // can downgrade to reader // can downgrade to reader mSettings.writeLPr(); mSettings.writeLPr(); Loading Loading @@ -2504,9 +2483,11 @@ public class PackageManagerService extends IPackageManager.Stub { intent = intent.getSelector(); intent = intent.getSelector(); } } if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); List<PreferredActivity> prefs = PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); mSettings.mPreferredActivities.queryIntent(intent, resolvedType, List<PreferredActivity> prefs = pir != null (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId); ? pir.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId) : null; if (prefs != null && prefs.size() > 0) { if (prefs != null && prefs.size() > 0) { // First figure out how good the original match set is. // First figure out how good the original match set is. // We will only allow preferred activities that came // We will only allow preferred activities that came Loading Loading @@ -2537,9 +2518,6 @@ public class PackageManagerService extends IPackageManager.Stub { final int M = prefs.size(); final int M = prefs.size(); for (int i=0; i<M; i++) { for (int i=0; i<M; i++) { final PreferredActivity pa = prefs.get(i); final PreferredActivity pa = prefs.get(i); if (pa.mUserId != userId) { continue; } if (pa.mPref.mMatch != match) { if (pa.mPref.mMatch != match) { continue; continue; } } Loading @@ -2560,7 +2538,7 @@ public class PackageManagerService extends IPackageManager.Stub { // it from the preferred activities list, and skip it. // it from the preferred activities list, and skip it. Slog.w(TAG, "Removing dangling preferred activity: " Slog.w(TAG, "Removing dangling preferred activity: " + pa.mPref.mComponent); + pa.mPref.mComponent); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); continue; continue; } } for (int j=0; j<N; j++) { for (int j=0; j<N; j++) { Loading @@ -2580,7 +2558,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (!pa.mPref.sameSet(query, priority)) { if (!pa.mPref.sameSet(query, priority)) { Slog.i(TAG, "Result set changed, dropping preferred activity for " Slog.i(TAG, "Result set changed, dropping preferred activity for " + intent + " type " + resolvedType); + intent + " type " + resolvedType); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); return null; return null; } } Loading Loading @@ -8682,9 +8660,9 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :"); Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); filter.dump(new LogPrinter(Log.INFO, TAG), " "); mSettings.mPreferredActivities.addFilter( mSettings.editPreferredActivitiesLPw(userId).addFilter( new PreferredActivity(filter, match, set, activity, userId)); new PreferredActivity(filter, match, set, activity)); scheduleWriteSettingsLocked(); mSettings.writePackageRestrictionsLPr(userId); } } } } Loading Loading @@ -8722,12 +8700,13 @@ public class PackageManagerService extends IPackageManager.Stub { final int callingUserId = UserHandle.getCallingUserId(); final int callingUserId = UserHandle.getCallingUserId(); ArrayList<PreferredActivity> removed = null; ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); PreferredIntentResolver pir = mSettings.mPreferredActivities.get(callingUserId); if (pir != null) { Iterator<PreferredActivity> it = pir.filterIterator(); String action = filter.getAction(0); String action = filter.getAction(0); String category = filter.getCategory(0); String category = filter.getCategory(0); while (it.hasNext()) { while (it.hasNext()) { PreferredActivity pa = it.next(); PreferredActivity pa = it.next(); if (pa.mUserId != callingUserId) continue; if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { if (removed == null) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); removed = new ArrayList<PreferredActivity>(); Loading @@ -8740,7 +8719,8 @@ public class PackageManagerService extends IPackageManager.Stub { if (removed != null) { if (removed != null) { for (int i=0; i<removed.size(); i++) { for (int i=0; i<removed.size(); i++) { PreferredActivity pa = removed.get(i); PreferredActivity pa = removed.get(i); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); } } } } } addPreferredActivity(filter, match, set, activity, callingUserId); addPreferredActivity(filter, match, set, activity, callingUserId); Loading Loading @@ -8776,12 +8756,16 @@ public class PackageManagerService extends IPackageManager.Stub { /** This method takes a specific user id as well as UserHandle.USER_ALL. */ /** This method takes a specific user id as well as UserHandle.USER_ALL. */ boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { ArrayList<PreferredActivity> removed = null; ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); boolean changed = false; while (it.hasNext()) { for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { PreferredActivity pa = it.next(); final int thisUserId = mSettings.mPreferredActivities.keyAt(i); if (userId != UserHandle.USER_ALL && pa.mUserId != userId) { PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); if (userId != UserHandle.USER_ALL && userId != thisUserId) { continue; continue; } } Iterator<PreferredActivity> it = pir.filterIterator(); while (it.hasNext()) { PreferredActivity pa = it.next(); if (pa.mPref.mComponent.getPackageName().equals(packageName)) { if (pa.mPref.mComponent.getPackageName().equals(packageName)) { if (removed == null) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); removed = new ArrayList<PreferredActivity>(); Loading @@ -8790,13 +8774,15 @@ public class PackageManagerService extends IPackageManager.Stub { } } } } if (removed != null) { if (removed != null) { for (int i=0; i<removed.size(); i++) { for (int j=0; j<removed.size(); j++) { PreferredActivity pa = removed.get(i); PreferredActivity pa = removed.get(j); mSettings.mPreferredActivities.removeFilter(pa); pir.removeFilter(pa); } } return true; changed = true; mSettings.writePackageRestrictionsLPr(thisUserId); } } return false; } return changed; } } public int getPreferredActivities(List<IntentFilter> outFilters, public int getPreferredActivities(List<IntentFilter> outFilters, Loading @@ -8806,12 +8792,11 @@ public class PackageManagerService extends IPackageManager.Stub { final int userId = UserHandle.getCallingUserId(); final int userId = UserHandle.getCallingUserId(); // reader // reader synchronized (mPackages) { synchronized (mPackages) { final Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); if (pir != null) { final Iterator<PreferredActivity> it = pir.filterIterator(); while (it.hasNext()) { while (it.hasNext()) { final PreferredActivity pa = it.next(); final PreferredActivity pa = it.next(); if (pa.mUserId != userId) { continue; } if (packageName == null if (packageName == null || pa.mPref.mComponent.getPackageName().equals(packageName)) { || pa.mPref.mComponent.getPackageName().equals(packageName)) { if (outFilters != null) { if (outFilters != null) { Loading @@ -8823,6 +8808,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } } } } } } return num; return num; } } Loading Loading @@ -9041,6 +9027,39 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_SETTINGS) { if (DEBUG_SETTINGS) { Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); } } synchronized (mPackages) { // Verify that all of the preferred activity components actually // exist. It is possible for applications to be updated and at // that point remove a previously declared activity component that // had been set as a preferred activity. We try to clean this up // the next time we encounter that preferred activity, but it is // possible for the user flow to never be able to return to that // situation so here we do a sanity check to make sure we haven't // left any junk around. ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>(); for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); removed.clear(); for (PreferredActivity pa : pir.filterSet()) { if (mActivities.mActivities.get(pa.mPref.mComponent) == null) { removed.add(pa); } } if (removed.size() > 0) { for (int j=0; j<removed.size(); j++) { PreferredActivity pa = removed.get(i); RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); Slog.w(TAG, "Removing dangling preferred activity: " + pa.mPref.mComponent, here); pir.removeFilter(pa); } mSettings.writePackageRestrictionsLPr( mSettings.mPreferredActivities.keyAt(i)); } } } } } public boolean isSafeMode() { public boolean isSafeMode() { Loading Loading @@ -9281,13 +9300,18 @@ public class PackageManagerService extends IPackageManager.Stub { } } if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) { if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) { if (mSettings.mPreferredActivities.dump(pw, for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { dumpState.getTitlePrinted() ? "\nPreferred Activities:" PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); : "Preferred Activities:", " ", int user = mSettings.mPreferredActivities.keyAt(i); if (pir.dump(pw, dumpState.getTitlePrinted() ? "\nPreferred Activities User " + user + ":" : "Preferred Activities User " + user + ":", " ", packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { dumpState.setTitlePrinted(true); dumpState.setTitlePrinted(true); } } } } } if (dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)) { if (dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)) { pw.flush(); pw.flush(); Loading @@ -9299,7 +9323,7 @@ public class PackageManagerService extends IPackageManager.Stub { serializer.startDocument(null, true); serializer.startDocument(null, true); serializer.setFeature( serializer.setFeature( "http://xmlpull.org/v1/doc/features.html#indent-output", true); "http://xmlpull.org/v1/doc/features.html#indent-output", true); mSettings.writePreferredActivitiesLPr(serializer); mSettings.writePreferredActivitiesLPr(serializer, 0); serializer.endDocument(); serializer.endDocument(); serializer.flush(); serializer.flush(); } catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) { Loading Loading @@ -10045,11 +10069,6 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ /** Called by UserManagerService */ void cleanUpUserLILPw(int userHandle) { void cleanUpUserLILPw(int userHandle) { // Disable all the packages for the user first Set<Entry<String, PackageSetting>> entries = mSettings.mPackages.entrySet(); for (Entry<String, PackageSetting> entry : entries) { entry.getValue().removeUser(userHandle); } if (mDirtyUsers.remove(userHandle)); if (mDirtyUsers.remove(userHandle)); mSettings.removeUserLPr(userHandle); mSettings.removeUserLPr(userHandle); if (mInstaller != null) { if (mInstaller != null) { Loading @@ -10063,17 +10082,7 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ /** Called by UserManagerService */ void createNewUserLILPw(int userHandle, File path) { void createNewUserLILPw(int userHandle, File path) { if (mInstaller != null) { if (mInstaller != null) { path.mkdir(); mSettings.createNewUserLILPw(mInstaller, userHandle, path); FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH, -1, -1); for (PackageSetting ps : mSettings.mPackages.values()) { // Only system apps are initially installed. ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle); // Need to create a data directory for all apps under this user. mInstaller.createUserData(ps.name, UserHandle.getUid(userHandle, ps.appId), userHandle); } mSettings.writePackageRestrictionsLPr(userHandle); } } } } Loading
services/java/com/android/server/pm/PreferredActivity.java +0 −15 Original line number Original line Diff line number Diff line Loading @@ -36,32 +36,17 @@ class PreferredActivity extends IntentFilter implements PreferredComponent.Callb static final String ATTR_USER_ID = "userId"; static final String ATTR_USER_ID = "userId"; final PreferredComponent mPref; final PreferredComponent mPref; final int mUserId; PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { this(filter, match, set, activity, 0); } PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { super(filter); super(filter); mUserId = userId; mPref = new PreferredComponent(this, match, set, activity); mPref = new PreferredComponent(this, match, set, activity); } } PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException { PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException { String userIdString = parser.getAttributeValue(null, ATTR_USER_ID); if (userIdString != null && userIdString.length() > 0) { mUserId = Integer.parseInt(userIdString); } else { // Old format with no userId specified - assume primary user mUserId = 0; } mPref = new PreferredComponent(this, parser); mPref = new PreferredComponent(this, parser); } } public void writeToXml(XmlSerializer serializer) throws IOException { public void writeToXml(XmlSerializer serializer) throws IOException { serializer.attribute(null, ATTR_USER_ID, Integer.toString(mUserId)); mPref.writeToXml(serializer); mPref.writeToXml(serializer); serializer.startTag(null, "filter"); serializer.startTag(null, "filter"); super.writeToXml(serializer); super.writeToXml(serializer); Loading
services/java/com/android/server/pm/PreferredIntentResolver.java 0 → 100644 +38 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.pm; import java.io.PrintWriter; import com.android.server.IntentResolver; public class PreferredIntentResolver extends IntentResolver<PreferredActivity, PreferredActivity> { @Override protected PreferredActivity[] newArray(int size) { return new PreferredActivity[size]; } @Override protected String packageForFilter(PreferredActivity filter) { return filter.mPref.mComponent.getPackageName(); } @Override protected void dumpFilter(PrintWriter out, String prefix, PreferredActivity filter) { filter.mPref.dump(out, prefix, filter); } }
services/java/com/android/server/pm/Settings.java +84 −59 File changed.Preview size limit exceeded, changes collapsed. Show changes