Skip to content

Commit a3f133a

Browse files
author
Amith Yamasani
committed
Save preferred activity info with user id.
So each user can have their own set of intent resolution preferences. ResolverActivity now launches the activity on the correct user, and persists the preference for the correct user. Bug: 6961905 Change-Id: I6d3a8a9af89bc649277d4fc8d0f367ee123f8392
1 parent 9c38d6e commit a3f133a

File tree

7 files changed

+72
-18
lines changed

7 files changed

+72
-18
lines changed

core/java/android/app/ApplicationPackageManager.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1106,7 +1106,17 @@ public List<PackageInfo> getPreferredPackages(int flags) {
11061106
public void addPreferredActivity(IntentFilter filter,
11071107
int match, ComponentName[] set, ComponentName activity) {
11081108
try {
1109-
mPM.addPreferredActivity(filter, match, set, activity);
1109+
mPM.addPreferredActivity(filter, match, set, activity, UserHandle.myUserId());
1110+
} catch (RemoteException e) {
1111+
// Should never happen!
1112+
}
1113+
}
1114+
1115+
@Override
1116+
public void addPreferredActivity(IntentFilter filter, int match,
1117+
ComponentName[] set, ComponentName activity, int userId) {
1118+
try {
1119+
mPM.addPreferredActivity(filter, match, set, activity, userId);
11101120
} catch (RemoteException e) {
11111121
// Should never happen!
11121122
}

core/java/android/content/pm/IPackageManager.aidl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ interface IPackageManager {
200200
List<PackageInfo> getPreferredPackages(int flags);
201201

202202
void addPreferredActivity(in IntentFilter filter, int match,
203-
in ComponentName[] set, in ComponentName activity);
203+
in ComponentName[] set, in ComponentName activity, int userId);
204204

205205
void replacePreferredActivity(in IntentFilter filter, int match,
206206
in ComponentName[] set, in ComponentName activity);

core/java/android/content/pm/PackageManager.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2459,6 +2459,17 @@ public abstract void getPackageSizeInfo(String packageName,
24592459
public abstract void addPreferredActivity(IntentFilter filter, int match,
24602460
ComponentName[] set, ComponentName activity);
24612461

2462+
/**
2463+
* Same as {@link #addPreferredActivity(IntentFilter, int,
2464+
ComponentName[], ComponentName)}, but with a specific userId to apply the preference
2465+
to.
2466+
* @hide
2467+
*/
2468+
public void addPreferredActivity(IntentFilter filter, int match,
2469+
ComponentName[] set, ComponentName activity, int userId) {
2470+
throw new RuntimeException("Not implemented. Must override in a subclass.");
2471+
}
2472+
24622473
/**
24632474
* @deprecated This is a protected API that should not have been available
24642475
* to third party applications. It is the platform's responsibility for

core/java/com/android/internal/app/ResolverActivity.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ protected void onCreate(Bundle savedInstanceState, Intent intent,
150150

151151
resizeGrid();
152152
} else if (count == 1) {
153-
startActivity(mAdapter.intentForPosition(0));
153+
startActivityAsUser(mAdapter.intentForPosition(0),
154+
UserHandle.getUserId(mLaunchedFromUid));
154155
mPackageMonitor.unregister();
155156
mRegistered = false;
156157
finish();
@@ -363,20 +364,20 @@ protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysChe
363364
if (r.match > bestMatch) bestMatch = r.match;
364365
}
365366
getPackageManager().addPreferredActivity(filter, bestMatch, set,
366-
intent.getComponent());
367+
intent.getComponent(), UserHandle.getUserId(mLaunchedFromUid));
367368
}
368369
}
369370

370371
if (intent != null) {
371-
startActivity(intent);
372+
startActivityAsUser(intent, UserHandle.getUserId(mLaunchedFromUid));
372373
}
373374
}
374375

375376
void showAppDetails(ResolveInfo ri) {
376377
Intent in = new Intent().setAction("android.settings.APPLICATION_DETAILS_SETTINGS")
377378
.setData(Uri.fromParts("package", ri.activityInfo.packageName, null))
378379
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
379-
startActivity(in);
380+
startActivityAsUser(in, UserHandle.getUserId(mLaunchedFromUid));
380381
}
381382

382383
private final class DisplayResolveInfo {

services/java/com/android/server/pm/PackageManagerService.java

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

services/java/com/android/server/pm/PreferredActivity.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,38 @@ class PreferredActivity extends IntentFilter implements PreferredComponent.Callb
3333
private static final String TAG = "PreferredActivity";
3434

3535
private static final boolean DEBUG_FILTERS = false;
36+
static final String ATTR_USER_ID = "userId";
3637

3738
final PreferredComponent mPref;
39+
final int mUserId;
3840

3941
PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) {
42+
this(filter, match, set, activity, 0);
43+
}
44+
45+
PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity,
46+
int userId) {
4047
super(filter);
48+
mUserId = userId;
4149
mPref = new PreferredComponent(this, match, set, activity);
4250
}
4351

4452
PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException {
53+
String userIdString = parser.getAttributeValue(null, ATTR_USER_ID);
54+
if (userIdString != null && userIdString.length() > 0) {
55+
mUserId = Integer.parseInt(userIdString);
56+
} else {
57+
// Old format with no userId specified - assume primary user
58+
mUserId = 0;
59+
}
4560
mPref = new PreferredComponent(this, parser);
4661
}
4762

4863
public void writeToXml(XmlSerializer serializer) throws IOException {
64+
serializer.attribute(null, ATTR_USER_ID, Integer.toString(mUserId));
4965
mPref.writeToXml(serializer);
5066
serializer.startTag(null, "filter");
51-
super.writeToXml(serializer);
67+
super.writeToXml(serializer);
5268
serializer.endTag(null, "filter");
5369
}
5470

services/java/com/android/server/pm/UserManagerService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ public UserInfo createUser(String name, int flags) {
506506
Intent addedIntent = new Intent(Intent.ACTION_USER_ADDED);
507507
addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userInfo.id);
508508
mContext.sendBroadcast(addedIntent, android.Manifest.permission.MANAGE_USERS);
509+
mContext.sendBroadcastToUser(new Intent(Intent.ACTION_BOOT_COMPLETED), userInfo.id);
509510
}
510511
return userInfo;
511512
}

0 commit comments

Comments
 (0)