Skip to content

Commit 6309271

Browse files
author
Dianne Hackborn
committed
Fix issue #7295951: Mako asks which Launcher to use at every re-boot
A couple problems: - We need to clear app preferences later, now that we have encrypted apps. - The multi-user implementation of this would allow different preferred apps from different users to potentially interefere with each other. They are not completely separate data structures. Change-Id: Id4f1ebb6414fdf30ff1049adaa1efe83dabac01a
1 parent 1ad0fd9 commit 6309271

File tree

4 files changed

+230
-173
lines changed

4 files changed

+230
-173
lines changed

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

Lines changed: 108 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,27 +1300,6 @@ public PackageManagerService(Context context, Installer installer,
13001300
? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL)
13011301
: 0));
13021302

1303-
// Verify that all of the preferred activity components actually
1304-
// exist. It is possible for applications to be updated and at
1305-
// that point remove a previously declared activity component that
1306-
// had been set as a preferred activity. We try to clean this up
1307-
// the next time we encounter that preferred activity, but it is
1308-
// possible for the user flow to never be able to return to that
1309-
// situation so here we do a sanity check to make sure we haven't
1310-
// left any junk around.
1311-
ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>();
1312-
for (PreferredActivity pa : mSettings.mPreferredActivities.filterSet()) {
1313-
if (mActivities.mActivities.get(pa.mPref.mComponent) == null) {
1314-
removed.add(pa);
1315-
}
1316-
}
1317-
for (int i=0; i<removed.size(); i++) {
1318-
PreferredActivity pa = removed.get(i);
1319-
Slog.w(TAG, "Removing dangling preferred activity: "
1320-
+ pa.mPref.mComponent);
1321-
mSettings.mPreferredActivities.removeFilter(pa);
1322-
}
1323-
13241303
// can downgrade to reader
13251304
mSettings.writeLPr();
13261305

@@ -2504,9 +2483,11 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25042483
intent = intent.getSelector();
25052484
}
25062485
if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);
2507-
List<PreferredActivity> prefs =
2508-
mSettings.mPreferredActivities.queryIntent(intent, resolvedType,
2509-
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId);
2486+
PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId);
2487+
List<PreferredActivity> prefs = pir != null
2488+
? pir.queryIntent(intent, resolvedType,
2489+
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId)
2490+
: null;
25102491
if (prefs != null && prefs.size() > 0) {
25112492
// First figure out how good the original match set is.
25122493
// We will only allow preferred activities that came
@@ -2537,9 +2518,6 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25372518
final int M = prefs.size();
25382519
for (int i=0; i<M; i++) {
25392520
final PreferredActivity pa = prefs.get(i);
2540-
if (pa.mUserId != userId) {
2541-
continue;
2542-
}
25432521
if (pa.mPref.mMatch != match) {
25442522
continue;
25452523
}
@@ -2560,7 +2538,7 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25602538
// it from the preferred activities list, and skip it.
25612539
Slog.w(TAG, "Removing dangling preferred activity: "
25622540
+ pa.mPref.mComponent);
2563-
mSettings.mPreferredActivities.removeFilter(pa);
2541+
pir.removeFilter(pa);
25642542
continue;
25652543
}
25662544
for (int j=0; j<N; j++) {
@@ -2580,7 +2558,7 @@ ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
25802558
if (!pa.mPref.sameSet(query, priority)) {
25812559
Slog.i(TAG, "Result set changed, dropping preferred activity for "
25822560
+ intent + " type " + resolvedType);
2583-
mSettings.mPreferredActivities.removeFilter(pa);
2561+
pir.removeFilter(pa);
25842562
return null;
25852563
}
25862564

@@ -8682,9 +8660,9 @@ public void addPreferredActivity(IntentFilter filter, int match,
86828660

86838661
Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :");
86848662
filter.dump(new LogPrinter(Log.INFO, TAG), " ");
8685-
mSettings.mPreferredActivities.addFilter(
8686-
new PreferredActivity(filter, match, set, activity, userId));
8687-
scheduleWriteSettingsLocked();
8663+
mSettings.editPreferredActivitiesLPw(userId).addFilter(
8664+
new PreferredActivity(filter, match, set, activity));
8665+
mSettings.writePackageRestrictionsLPr(userId);
86888666
}
86898667
}
86908668

@@ -8722,25 +8700,27 @@ public void replacePreferredActivity(IntentFilter filter, int match,
87228700

87238701
final int callingUserId = UserHandle.getCallingUserId();
87248702
ArrayList<PreferredActivity> removed = null;
8725-
Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator();
8726-
String action = filter.getAction(0);
8727-
String category = filter.getCategory(0);
8728-
while (it.hasNext()) {
8729-
PreferredActivity pa = it.next();
8730-
if (pa.mUserId != callingUserId) continue;
8731-
if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) {
8732-
if (removed == null) {
8733-
removed = new ArrayList<PreferredActivity>();
8703+
PreferredIntentResolver pir = mSettings.mPreferredActivities.get(callingUserId);
8704+
if (pir != null) {
8705+
Iterator<PreferredActivity> it = pir.filterIterator();
8706+
String action = filter.getAction(0);
8707+
String category = filter.getCategory(0);
8708+
while (it.hasNext()) {
8709+
PreferredActivity pa = it.next();
8710+
if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) {
8711+
if (removed == null) {
8712+
removed = new ArrayList<PreferredActivity>();
8713+
}
8714+
removed.add(pa);
8715+
Log.i(TAG, "Removing preferred activity " + pa.mPref.mComponent + ":");
8716+
filter.dump(new LogPrinter(Log.INFO, TAG), " ");
87348717
}
8735-
removed.add(pa);
8736-
Log.i(TAG, "Removing preferred activity " + pa.mPref.mComponent + ":");
8737-
filter.dump(new LogPrinter(Log.INFO, TAG), " ");
87388718
}
8739-
}
8740-
if (removed != null) {
8741-
for (int i=0; i<removed.size(); i++) {
8742-
PreferredActivity pa = removed.get(i);
8743-
mSettings.mPreferredActivities.removeFilter(pa);
8719+
if (removed != null) {
8720+
for (int i=0; i<removed.size(); i++) {
8721+
PreferredActivity pa = removed.get(i);
8722+
pir.removeFilter(pa);
8723+
}
87448724
}
87458725
}
87468726
addPreferredActivity(filter, match, set, activity, callingUserId);
@@ -8776,27 +8756,33 @@ public void clearPackagePreferredActivities(String packageName) {
87768756
/** This method takes a specific user id as well as UserHandle.USER_ALL. */
87778757
boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) {
87788758
ArrayList<PreferredActivity> removed = null;
8779-
Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator();
8780-
while (it.hasNext()) {
8781-
PreferredActivity pa = it.next();
8782-
if (userId != UserHandle.USER_ALL && pa.mUserId != userId) {
8759+
boolean changed = false;
8760+
for (int i=0; i<mSettings.mPreferredActivities.size(); i++) {
8761+
final int thisUserId = mSettings.mPreferredActivities.keyAt(i);
8762+
PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i);
8763+
if (userId != UserHandle.USER_ALL && userId != thisUserId) {
87838764
continue;
87848765
}
8785-
if (pa.mPref.mComponent.getPackageName().equals(packageName)) {
8786-
if (removed == null) {
8787-
removed = new ArrayList<PreferredActivity>();
8766+
Iterator<PreferredActivity> it = pir.filterIterator();
8767+
while (it.hasNext()) {
8768+
PreferredActivity pa = it.next();
8769+
if (pa.mPref.mComponent.getPackageName().equals(packageName)) {
8770+
if (removed == null) {
8771+
removed = new ArrayList<PreferredActivity>();
8772+
}
8773+
removed.add(pa);
87888774
}
8789-
removed.add(pa);
87908775
}
8791-
}
8792-
if (removed != null) {
8793-
for (int i=0; i<removed.size(); i++) {
8794-
PreferredActivity pa = removed.get(i);
8795-
mSettings.mPreferredActivities.removeFilter(pa);
8776+
if (removed != null) {
8777+
for (int j=0; j<removed.size(); j++) {
8778+
PreferredActivity pa = removed.get(j);
8779+
pir.removeFilter(pa);
8780+
}
8781+
changed = true;
8782+
mSettings.writePackageRestrictionsLPr(thisUserId);
87968783
}
8797-
return true;
87988784
}
8799-
return false;
8785+
return changed;
88008786
}
88018787

88028788
public int getPreferredActivities(List<IntentFilter> outFilters,
@@ -8806,19 +8792,19 @@ public int getPreferredActivities(List<IntentFilter> outFilters,
88068792
final int userId = UserHandle.getCallingUserId();
88078793
// reader
88088794
synchronized (mPackages) {
8809-
final Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator();
8810-
while (it.hasNext()) {
8811-
final PreferredActivity pa = it.next();
8812-
if (pa.mUserId != userId) {
8813-
continue;
8814-
}
8815-
if (packageName == null
8816-
|| pa.mPref.mComponent.getPackageName().equals(packageName)) {
8817-
if (outFilters != null) {
8818-
outFilters.add(new IntentFilter(pa));
8819-
}
8820-
if (outActivities != null) {
8821-
outActivities.add(pa.mPref.mComponent);
8795+
PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId);
8796+
if (pir != null) {
8797+
final Iterator<PreferredActivity> it = pir.filterIterator();
8798+
while (it.hasNext()) {
8799+
final PreferredActivity pa = it.next();
8800+
if (packageName == null
8801+
|| pa.mPref.mComponent.getPackageName().equals(packageName)) {
8802+
if (outFilters != null) {
8803+
outFilters.add(new IntentFilter(pa));
8804+
}
8805+
if (outActivities != null) {
8806+
outActivities.add(pa.mPref.mComponent);
8807+
}
88228808
}
88238809
}
88248810
}
@@ -9041,6 +9027,39 @@ public void systemReady() {
90419027
if (DEBUG_SETTINGS) {
90429028
Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
90439029
}
9030+
9031+
synchronized (mPackages) {
9032+
// Verify that all of the preferred activity components actually
9033+
// exist. It is possible for applications to be updated and at
9034+
// that point remove a previously declared activity component that
9035+
// had been set as a preferred activity. We try to clean this up
9036+
// the next time we encounter that preferred activity, but it is
9037+
// possible for the user flow to never be able to return to that
9038+
// situation so here we do a sanity check to make sure we haven't
9039+
// left any junk around.
9040+
ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>();
9041+
for (int i=0; i<mSettings.mPreferredActivities.size(); i++) {
9042+
PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i);
9043+
removed.clear();
9044+
for (PreferredActivity pa : pir.filterSet()) {
9045+
if (mActivities.mActivities.get(pa.mPref.mComponent) == null) {
9046+
removed.add(pa);
9047+
}
9048+
}
9049+
if (removed.size() > 0) {
9050+
for (int j=0; j<removed.size(); j++) {
9051+
PreferredActivity pa = removed.get(i);
9052+
RuntimeException here = new RuntimeException("here");
9053+
here.fillInStackTrace();
9054+
Slog.w(TAG, "Removing dangling preferred activity: "
9055+
+ pa.mPref.mComponent, here);
9056+
pir.removeFilter(pa);
9057+
}
9058+
mSettings.writePackageRestrictionsLPr(
9059+
mSettings.mPreferredActivities.keyAt(i));
9060+
}
9061+
}
9062+
}
90449063
}
90459064

90469065
public boolean isSafeMode() {
@@ -9281,11 +9300,16 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
92819300
}
92829301

92839302
if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
9284-
if (mSettings.mPreferredActivities.dump(pw,
9285-
dumpState.getTitlePrinted() ? "\nPreferred Activities:"
9286-
: "Preferred Activities:", " ",
9287-
packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
9288-
dumpState.setTitlePrinted(true);
9303+
for (int i=0; i<mSettings.mPreferredActivities.size(); i++) {
9304+
PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i);
9305+
int user = mSettings.mPreferredActivities.keyAt(i);
9306+
if (pir.dump(pw,
9307+
dumpState.getTitlePrinted()
9308+
? "\nPreferred Activities User " + user + ":"
9309+
: "Preferred Activities User " + user + ":", " ",
9310+
packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
9311+
dumpState.setTitlePrinted(true);
9312+
}
92899313
}
92909314
}
92919315

@@ -9299,7 +9323,7 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
92999323
serializer.startDocument(null, true);
93009324
serializer.setFeature(
93019325
"http://xmlpull.org/v1/doc/features.html#indent-output", true);
9302-
mSettings.writePreferredActivitiesLPr(serializer);
9326+
mSettings.writePreferredActivitiesLPr(serializer, 0);
93039327
serializer.endDocument();
93049328
serializer.flush();
93059329
} catch (IllegalArgumentException e) {
@@ -10045,11 +10069,6 @@ public int getInstallLocation() {
1004510069

1004610070
/** Called by UserManagerService */
1004710071
void cleanUpUserLILPw(int userHandle) {
10048-
// Disable all the packages for the user first
10049-
Set<Entry<String, PackageSetting>> entries = mSettings.mPackages.entrySet();
10050-
for (Entry<String, PackageSetting> entry : entries) {
10051-
entry.getValue().removeUser(userHandle);
10052-
}
1005310072
if (mDirtyUsers.remove(userHandle));
1005410073
mSettings.removeUserLPr(userHandle);
1005510074
if (mInstaller != null) {
@@ -10063,17 +10082,7 @@ void cleanUpUserLILPw(int userHandle) {
1006310082
/** Called by UserManagerService */
1006410083
void createNewUserLILPw(int userHandle, File path) {
1006510084
if (mInstaller != null) {
10066-
path.mkdir();
10067-
FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG
10068-
| FileUtils.S_IXOTH, -1, -1);
10069-
for (PackageSetting ps : mSettings.mPackages.values()) {
10070-
// Only system apps are initially installed.
10071-
ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle);
10072-
// Need to create a data directory for all apps under this user.
10073-
mInstaller.createUserData(ps.name,
10074-
UserHandle.getUid(userHandle, ps.appId), userHandle);
10075-
}
10076-
mSettings.writePackageRestrictionsLPr(userHandle);
10085+
mSettings.createNewUserLILPw(mInstaller, userHandle, path);
1007710086
}
1007810087
}
1007910088

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

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,17 @@ class PreferredActivity extends IntentFilter implements PreferredComponent.Callb
3636
static final String ATTR_USER_ID = "userId";
3737

3838
final PreferredComponent mPref;
39-
final int mUserId;
4039

4140
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) {
4741
super(filter);
48-
mUserId = userId;
4942
mPref = new PreferredComponent(this, match, set, activity);
5043
}
5144

5245
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-
}
6046
mPref = new PreferredComponent(this, parser);
6147
}
6248

6349
public void writeToXml(XmlSerializer serializer) throws IOException {
64-
serializer.attribute(null, ATTR_USER_ID, Integer.toString(mUserId));
6550
mPref.writeToXml(serializer);
6651
serializer.startTag(null, "filter");
6752
super.writeToXml(serializer);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (C) 2012 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.android.server.pm;
18+
19+
import java.io.PrintWriter;
20+
21+
import com.android.server.IntentResolver;
22+
23+
public class PreferredIntentResolver
24+
extends IntentResolver<PreferredActivity, PreferredActivity> {
25+
@Override
26+
protected PreferredActivity[] newArray(int size) {
27+
return new PreferredActivity[size];
28+
}
29+
@Override
30+
protected String packageForFilter(PreferredActivity filter) {
31+
return filter.mPref.mComponent.getPackageName();
32+
}
33+
@Override
34+
protected void dumpFilter(PrintWriter out, String prefix,
35+
PreferredActivity filter) {
36+
filter.mPref.dump(out, prefix, filter);
37+
}
38+
}

0 commit comments

Comments
 (0)