@@ -2422,6 +2422,9 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
24222422 final int M = prefs .size ();
24232423 for (int i =0 ; i <M ; i ++) {
24242424 final PreferredActivity pa = prefs .get (i );
2425+ if (pa .mUserId != userId ) {
2426+ continue ;
2427+ }
24252428 if (pa .mPref .mMatch != match ) {
24262429 continue ;
24272430 }
@@ -7645,7 +7648,7 @@ private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo out
76457648 mSettings .updateSharedUserPermsLPw (deletedPs , mGlobalGids );
76467649 }
76477650 }
7648- clearPackagePreferredActivitiesLPw (deletedPs .name );
7651+ clearPackagePreferredActivitiesLPw (deletedPs .name , UserHandle . USER_ALL );
76497652 }
76507653 }
76517654 // can downgrade to reader
@@ -8112,26 +8115,28 @@ private int getUidTargetSdkVersionLockedLPr(int uid) {
81128115 }
81138116
81148117 public void addPreferredActivity (IntentFilter filter , int match ,
8115- ComponentName [] set , ComponentName activity ) {
8118+ ComponentName [] set , ComponentName activity , int userId ) {
81168119 // writer
8120+ int callingUid = Binder .getCallingUid ();
8121+ checkValidCaller (callingUid , userId );
81178122 synchronized (mPackages ) {
81188123 if (mContext .checkCallingOrSelfPermission (
81198124 android .Manifest .permission .SET_PREFERRED_APPLICATIONS )
81208125 != PackageManager .PERMISSION_GRANTED ) {
8121- if (getUidTargetSdkVersionLockedLPr (Binder . getCallingUid () )
8126+ if (getUidTargetSdkVersionLockedLPr (callingUid )
81228127 < Build .VERSION_CODES .FROYO ) {
81238128 Slog .w (TAG , "Ignoring addPreferredActivity() from uid "
8124- + Binder . getCallingUid () );
8129+ + callingUid );
81258130 return ;
81268131 }
81278132 mContext .enforceCallingOrSelfPermission (
81288133 android .Manifest .permission .SET_PREFERRED_APPLICATIONS , null );
81298134 }
8130-
8131- Slog .i (TAG , "Adding preferred activity " + activity + ":" );
8135+
8136+ Slog .i (TAG , "Adding preferred activity " + activity + " for user " + userId + " :" );
81328137 filter .dump (new LogPrinter (Log .INFO , TAG ), " " );
81338138 mSettings .mPreferredActivities .addFilter (
8134- new PreferredActivity (filter , match , set , activity ));
8139+ new PreferredActivity (filter , match , set , activity , userId ));
81358140 scheduleWriteSettingsLocked ();
81368141 }
81378142 }
@@ -8167,13 +8172,15 @@ public void replacePreferredActivity(IntentFilter filter, int match,
81678172 mContext .enforceCallingOrSelfPermission (
81688173 android .Manifest .permission .SET_PREFERRED_APPLICATIONS , null );
81698174 }
8170-
8175+
8176+ final int callingUserId = UserHandle .getCallingUserId ();
81718177 ArrayList <PreferredActivity > removed = null ;
81728178 Iterator <PreferredActivity > it = mSettings .mPreferredActivities .filterIterator ();
81738179 String action = filter .getAction (0 );
81748180 String category = filter .getCategory (0 );
81758181 while (it .hasNext ()) {
81768182 PreferredActivity pa = it .next ();
8183+ if (pa .mUserId != callingUserId ) continue ;
81778184 if (pa .getAction (0 ).equals (action ) && pa .getCategory (0 ).equals (category )) {
81788185 if (removed == null ) {
81798186 removed = new ArrayList <PreferredActivity >();
@@ -8189,7 +8196,7 @@ public void replacePreferredActivity(IntentFilter filter, int match,
81898196 mSettings .mPreferredActivities .removeFilter (pa );
81908197 }
81918198 }
8192- addPreferredActivity (filter , match , set , activity );
8199+ addPreferredActivity (filter , match , set , activity , callingUserId );
81938200 }
81948201 }
81958202
@@ -8213,17 +8220,21 @@ public void clearPackagePreferredActivities(String packageName) {
82138220 }
82148221 }
82158222
8216- if (clearPackagePreferredActivitiesLPw (packageName )) {
8223+ if (clearPackagePreferredActivitiesLPw (packageName , UserHandle . getCallingUserId () )) {
82178224 scheduleWriteSettingsLocked ();
82188225 }
82198226 }
82208227 }
82218228
8222- boolean clearPackagePreferredActivitiesLPw (String packageName ) {
8229+ /** This method takes a specific user id as well as UserHandle.USER_ALL. */
8230+ boolean clearPackagePreferredActivitiesLPw (String packageName , int userId ) {
82238231 ArrayList <PreferredActivity > removed = null ;
82248232 Iterator <PreferredActivity > it = mSettings .mPreferredActivities .filterIterator ();
82258233 while (it .hasNext ()) {
82268234 PreferredActivity pa = it .next ();
8235+ if (userId != UserHandle .USER_ALL && pa .mUserId != userId ) {
8236+ continue ;
8237+ }
82278238 if (pa .mPref .mComponent .getPackageName ().equals (packageName )) {
82288239 if (removed == null ) {
82298240 removed = new ArrayList <PreferredActivity >();
@@ -8245,11 +8256,15 @@ public int getPreferredActivities(List<IntentFilter> outFilters,
82458256 List <ComponentName > outActivities , String packageName ) {
82468257
82478258 int num = 0 ;
8259+ final int userId = UserHandle .getCallingUserId ();
82488260 // reader
82498261 synchronized (mPackages ) {
82508262 final Iterator <PreferredActivity > it = mSettings .mPreferredActivities .filterIterator ();
82518263 while (it .hasNext ()) {
82528264 final PreferredActivity pa = it .next ();
8265+ if (pa .mUserId != userId ) {
8266+ continue ;
8267+ }
82538268 if (packageName == null
82548269 || pa .mPref .mComponent .getPackageName ().equals (packageName )) {
82558270 if (outFilters != null ) {
0 commit comments