Skip to content

Commit 7fdaa39

Browse files
Amith YamasaniAndroid (Google) Code Review
authored andcommitted
Merge "Save preferred activity info with user id." into jb-mr1-dev
2 parents 029675e + a3f133a commit 7fdaa39

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)