Loading core/java/android/app/ApplicationPackageManager.java +11 −1 Original line number Diff line number Diff line Loading @@ -1106,7 +1106,17 @@ final class ApplicationPackageManager extends PackageManager { public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { try { mPM.addPreferredActivity(filter, match, set, activity); mPM.addPreferredActivity(filter, match, set, activity, UserHandle.myUserId()); } catch (RemoteException e) { // Should never happen! } } @Override public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { try { mPM.addPreferredActivity(filter, match, set, activity, userId); } catch (RemoteException e) { // Should never happen! } Loading core/java/android/content/pm/IPackageManager.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -200,7 +200,7 @@ interface IPackageManager { List<PackageInfo> getPreferredPackages(int flags); void addPreferredActivity(in IntentFilter filter, int match, in ComponentName[] set, in ComponentName activity); in ComponentName[] set, in ComponentName activity, int userId); void replacePreferredActivity(in IntentFilter filter, int match, in ComponentName[] set, in ComponentName activity); Loading core/java/android/content/pm/PackageManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -2459,6 +2459,17 @@ public abstract class PackageManager { public abstract void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity); /** * Same as {@link #addPreferredActivity(IntentFilter, int, ComponentName[], ComponentName)}, but with a specific userId to apply the preference to. * @hide */ public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { throw new RuntimeException("Not implemented. Must override in a subclass."); } /** * @deprecated This is a protected API that should not have been available * to third party applications. It is the platform's responsibility for Loading core/java/com/android/internal/app/ResolverActivity.java +5 −4 Original line number Diff line number Diff line Loading @@ -150,7 +150,8 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte resizeGrid(); } else if (count == 1) { startActivity(mAdapter.intentForPosition(0)); startActivityAsUser(mAdapter.intentForPosition(0), UserHandle.getUserId(mLaunchedFromUid)); mPackageMonitor.unregister(); mRegistered = false; finish(); Loading Loading @@ -363,12 +364,12 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte if (r.match > bestMatch) bestMatch = r.match; } getPackageManager().addPreferredActivity(filter, bestMatch, set, intent.getComponent()); intent.getComponent(), UserHandle.getUserId(mLaunchedFromUid)); } } if (intent != null) { startActivity(intent); startActivityAsUser(intent, UserHandle.getUserId(mLaunchedFromUid)); } } Loading @@ -376,7 +377,7 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte Intent in = new Intent().setAction("android.settings.APPLICATION_DETAILS_SETTINGS") .setData(Uri.fromParts("package", ri.activityInfo.packageName, null)) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); startActivity(in); startActivityAsUser(in, UserHandle.getUserId(mLaunchedFromUid)); } private final class DisplayResolveInfo { Loading services/java/com/android/server/pm/PackageManagerService.java +26 −11 Original line number Diff line number Diff line Loading @@ -2422,6 +2422,9 @@ public class PackageManagerService extends IPackageManager.Stub { final int M = prefs.size(); for (int i=0; i<M; i++) { final PreferredActivity pa = prefs.get(i); if (pa.mUserId != userId) { continue; } if (pa.mPref.mMatch != match) { continue; } Loading Loading @@ -7645,7 +7648,7 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.updateSharedUserPermsLPw(deletedPs, mGlobalGids); } } clearPackagePreferredActivitiesLPw(deletedPs.name); clearPackagePreferredActivitiesLPw(deletedPs.name, UserHandle.USER_ALL); } } // can downgrade to reader Loading Loading @@ -8112,26 +8115,28 @@ public class PackageManagerService extends IPackageManager.Stub { } public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { ComponentName[] set, ComponentName activity, int userId) { // writer int callingUid = Binder.getCallingUid(); checkValidCaller(callingUid, userId); synchronized (mPackages) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { if (getUidTargetSdkVersionLockedLPr(Binder.getCallingUid()) if (getUidTargetSdkVersionLockedLPr(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring addPreferredActivity() from uid " + Binder.getCallingUid()); + callingUid); return; } mContext.enforceCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); } Slog.i(TAG, "Adding preferred activity " + activity + ":"); Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); mSettings.mPreferredActivities.addFilter( new PreferredActivity(filter, match, set, activity)); new PreferredActivity(filter, match, set, activity, userId)); scheduleWriteSettingsLocked(); } } Loading Loading @@ -8168,12 +8173,14 @@ public class PackageManagerService extends IPackageManager.Stub { android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); } final int callingUserId = UserHandle.getCallingUserId(); ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); String action = filter.getAction(0); String category = filter.getCategory(0); while (it.hasNext()) { PreferredActivity pa = it.next(); if (pa.mUserId != callingUserId) continue; if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); Loading @@ -8189,7 +8196,7 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.mPreferredActivities.removeFilter(pa); } } addPreferredActivity(filter, match, set, activity); addPreferredActivity(filter, match, set, activity, callingUserId); } } Loading @@ -8213,17 +8220,21 @@ public class PackageManagerService extends IPackageManager.Stub { } } if (clearPackagePreferredActivitiesLPw(packageName)) { if (clearPackagePreferredActivitiesLPw(packageName, UserHandle.getCallingUserId())) { scheduleWriteSettingsLocked(); } } } boolean clearPackagePreferredActivitiesLPw(String packageName) { /** This method takes a specific user id as well as UserHandle.USER_ALL. */ boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); while (it.hasNext()) { PreferredActivity pa = it.next(); if (userId != UserHandle.USER_ALL && pa.mUserId != userId) { continue; } if (pa.mPref.mComponent.getPackageName().equals(packageName)) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); Loading @@ -8245,11 +8256,15 @@ public class PackageManagerService extends IPackageManager.Stub { List<ComponentName> outActivities, String packageName) { int num = 0; final int userId = UserHandle.getCallingUserId(); // reader synchronized (mPackages) { final Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); while (it.hasNext()) { final PreferredActivity pa = it.next(); if (pa.mUserId != userId) { continue; } if (packageName == null || pa.mPref.mComponent.getPackageName().equals(packageName)) { if (outFilters != null) { Loading Loading
core/java/android/app/ApplicationPackageManager.java +11 −1 Original line number Diff line number Diff line Loading @@ -1106,7 +1106,17 @@ final class ApplicationPackageManager extends PackageManager { public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { try { mPM.addPreferredActivity(filter, match, set, activity); mPM.addPreferredActivity(filter, match, set, activity, UserHandle.myUserId()); } catch (RemoteException e) { // Should never happen! } } @Override public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { try { mPM.addPreferredActivity(filter, match, set, activity, userId); } catch (RemoteException e) { // Should never happen! } Loading
core/java/android/content/pm/IPackageManager.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -200,7 +200,7 @@ interface IPackageManager { List<PackageInfo> getPreferredPackages(int flags); void addPreferredActivity(in IntentFilter filter, int match, in ComponentName[] set, in ComponentName activity); in ComponentName[] set, in ComponentName activity, int userId); void replacePreferredActivity(in IntentFilter filter, int match, in ComponentName[] set, in ComponentName activity); Loading
core/java/android/content/pm/PackageManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -2459,6 +2459,17 @@ public abstract class PackageManager { public abstract void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity); /** * Same as {@link #addPreferredActivity(IntentFilter, int, ComponentName[], ComponentName)}, but with a specific userId to apply the preference to. * @hide */ public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId) { throw new RuntimeException("Not implemented. Must override in a subclass."); } /** * @deprecated This is a protected API that should not have been available * to third party applications. It is the platform's responsibility for Loading
core/java/com/android/internal/app/ResolverActivity.java +5 −4 Original line number Diff line number Diff line Loading @@ -150,7 +150,8 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte resizeGrid(); } else if (count == 1) { startActivity(mAdapter.intentForPosition(0)); startActivityAsUser(mAdapter.intentForPosition(0), UserHandle.getUserId(mLaunchedFromUid)); mPackageMonitor.unregister(); mRegistered = false; finish(); Loading Loading @@ -363,12 +364,12 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte if (r.match > bestMatch) bestMatch = r.match; } getPackageManager().addPreferredActivity(filter, bestMatch, set, intent.getComponent()); intent.getComponent(), UserHandle.getUserId(mLaunchedFromUid)); } } if (intent != null) { startActivity(intent); startActivityAsUser(intent, UserHandle.getUserId(mLaunchedFromUid)); } } Loading @@ -376,7 +377,7 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte Intent in = new Intent().setAction("android.settings.APPLICATION_DETAILS_SETTINGS") .setData(Uri.fromParts("package", ri.activityInfo.packageName, null)) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); startActivity(in); startActivityAsUser(in, UserHandle.getUserId(mLaunchedFromUid)); } private final class DisplayResolveInfo { Loading
services/java/com/android/server/pm/PackageManagerService.java +26 −11 Original line number Diff line number Diff line Loading @@ -2422,6 +2422,9 @@ public class PackageManagerService extends IPackageManager.Stub { final int M = prefs.size(); for (int i=0; i<M; i++) { final PreferredActivity pa = prefs.get(i); if (pa.mUserId != userId) { continue; } if (pa.mPref.mMatch != match) { continue; } Loading Loading @@ -7645,7 +7648,7 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.updateSharedUserPermsLPw(deletedPs, mGlobalGids); } } clearPackagePreferredActivitiesLPw(deletedPs.name); clearPackagePreferredActivitiesLPw(deletedPs.name, UserHandle.USER_ALL); } } // can downgrade to reader Loading Loading @@ -8112,26 +8115,28 @@ public class PackageManagerService extends IPackageManager.Stub { } public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { ComponentName[] set, ComponentName activity, int userId) { // writer int callingUid = Binder.getCallingUid(); checkValidCaller(callingUid, userId); synchronized (mPackages) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { if (getUidTargetSdkVersionLockedLPr(Binder.getCallingUid()) if (getUidTargetSdkVersionLockedLPr(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring addPreferredActivity() from uid " + Binder.getCallingUid()); + callingUid); return; } mContext.enforceCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); } Slog.i(TAG, "Adding preferred activity " + activity + ":"); Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); mSettings.mPreferredActivities.addFilter( new PreferredActivity(filter, match, set, activity)); new PreferredActivity(filter, match, set, activity, userId)); scheduleWriteSettingsLocked(); } } Loading Loading @@ -8168,12 +8173,14 @@ public class PackageManagerService extends IPackageManager.Stub { android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); } final int callingUserId = UserHandle.getCallingUserId(); ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); String action = filter.getAction(0); String category = filter.getCategory(0); while (it.hasNext()) { PreferredActivity pa = it.next(); if (pa.mUserId != callingUserId) continue; if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); Loading @@ -8189,7 +8196,7 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.mPreferredActivities.removeFilter(pa); } } addPreferredActivity(filter, match, set, activity); addPreferredActivity(filter, match, set, activity, callingUserId); } } Loading @@ -8213,17 +8220,21 @@ public class PackageManagerService extends IPackageManager.Stub { } } if (clearPackagePreferredActivitiesLPw(packageName)) { if (clearPackagePreferredActivitiesLPw(packageName, UserHandle.getCallingUserId())) { scheduleWriteSettingsLocked(); } } } boolean clearPackagePreferredActivitiesLPw(String packageName) { /** This method takes a specific user id as well as UserHandle.USER_ALL. */ boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { ArrayList<PreferredActivity> removed = null; Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); while (it.hasNext()) { PreferredActivity pa = it.next(); if (userId != UserHandle.USER_ALL && pa.mUserId != userId) { continue; } if (pa.mPref.mComponent.getPackageName().equals(packageName)) { if (removed == null) { removed = new ArrayList<PreferredActivity>(); Loading @@ -8245,11 +8256,15 @@ public class PackageManagerService extends IPackageManager.Stub { List<ComponentName> outActivities, String packageName) { int num = 0; final int userId = UserHandle.getCallingUserId(); // reader synchronized (mPackages) { final Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); while (it.hasNext()) { final PreferredActivity pa = it.next(); if (pa.mUserId != userId) { continue; } if (packageName == null || pa.mPref.mComponent.getPackageName().equals(packageName)) { if (outFilters != null) { Loading