Merge "Fix unintended preferred activity reset" into rvc-dev am: 69b18e57fc

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12220605

Change-Id: I257d0b7e254040dfbce6b6387c4848f6421a6cd6
This commit is contained in:
Patrick Baumann
2020-07-24 20:54:26 +00:00
committed by Automerger Merge Worker

View File

@@ -6432,9 +6432,14 @@ public class PackageManagerService extends IPackageManager.Stub
true /*allowDynamicSplits*/); true /*allowDynamicSplits*/);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
final boolean queryMayBeFiltered =
UserHandle.getAppId(filterCallingUid) >= Process.FIRST_APPLICATION_UID
&& !resolveForStart;
final ResolveInfo bestChoice = final ResolveInfo bestChoice =
chooseBestActivity( chooseBestActivity(
intent, resolvedType, flags, privateResolveFlags, query, userId); intent, resolvedType, flags, privateResolveFlags, query, userId,
queryMayBeFiltered);
final boolean nonBrowserOnly = final boolean nonBrowserOnly =
(privateResolveFlags & PackageManagerInternal.RESOLVE_NON_BROWSER_ONLY) != 0; (privateResolveFlags & PackageManagerInternal.RESOLVE_NON_BROWSER_ONLY) != 0;
if (nonBrowserOnly && bestChoice != null && bestChoice.handleAllWebDataURI) { if (nonBrowserOnly && bestChoice != null && bestChoice.handleAllWebDataURI) {
@@ -6598,7 +6603,8 @@ public class PackageManagerService extends IPackageManager.Stub
} }
private ResolveInfo chooseBestActivity(Intent intent, String resolvedType, private ResolveInfo chooseBestActivity(Intent intent, String resolvedType,
int flags, int privateResolveFlags, List<ResolveInfo> query, int userId) { int flags, int privateResolveFlags, List<ResolveInfo> query, int userId,
boolean queryMayBeFiltered) {
if (query != null) { if (query != null) {
final int N = query.size(); final int N = query.size();
if (N == 1) { if (N == 1) {
@@ -6623,7 +6629,7 @@ public class PackageManagerService extends IPackageManager.Stub
// If we have saved a preference for a preferred activity for // If we have saved a preference for a preferred activity for
// this Intent, use that. // this Intent, use that.
ResolveInfo ri = findPreferredActivityNotLocked(intent, resolvedType, ResolveInfo ri = findPreferredActivityNotLocked(intent, resolvedType,
flags, query, r0.priority, true, false, debug, userId); flags, query, r0.priority, true, false, debug, userId, queryMayBeFiltered);
if (ri != null) { if (ri != null) {
return ri; return ri;
} }
@@ -6805,11 +6811,19 @@ public class PackageManagerService extends IPackageManager.Stub
&& intent.hasCategory(CATEGORY_DEFAULT); && intent.hasCategory(CATEGORY_DEFAULT);
} }
ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType, int flags,
List<ResolveInfo> query, int priority, boolean always,
boolean removeMatches, boolean debug, int userId) {
return findPreferredActivityNotLocked(
intent, resolvedType, flags, query, priority, always, removeMatches, debug, userId,
UserHandle.getAppId(Binder.getCallingUid()) >= Process.FIRST_APPLICATION_UID);
}
// TODO: handle preferred activities missing while user has amnesia // TODO: handle preferred activities missing while user has amnesia
/** <b>must not hold {@link #mLock}</b> */ /** <b>must not hold {@link #mLock}</b> */
ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType, int flags, ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType, int flags,
List<ResolveInfo> query, int priority, boolean always, List<ResolveInfo> query, int priority, boolean always,
boolean removeMatches, boolean debug, int userId) { boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered) {
if (Thread.holdsLock(mLock)) { if (Thread.holdsLock(mLock)) {
Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName()
+ " is holding mLock", new Throwable()); + " is holding mLock", new Throwable());
@@ -6903,10 +6917,12 @@ public class PackageManagerService extends IPackageManager.Stub
} }
final boolean excludeSetupWizardHomeActivity = isHomeIntent(intent) final boolean excludeSetupWizardHomeActivity = isHomeIntent(intent)
&& !isDeviceProvisioned; && !isDeviceProvisioned;
final boolean allowSetMutation = !excludeSetupWizardHomeActivity
&& !queryMayBeFiltered;
if (ai == null) { if (ai == null) {
// Do not remove launcher's preferred activity during SetupWizard // Do not remove launcher's preferred activity during SetupWizard
// due to it may not install yet // due to it may not install yet
if (excludeSetupWizardHomeActivity) { if (!allowSetMutation) {
continue; continue;
} }
@@ -6931,7 +6947,7 @@ public class PackageManagerService extends IPackageManager.Stub
continue; continue;
} }
if (removeMatches) { if (removeMatches && allowSetMutation) {
pir.removeFilter(pa); pir.removeFilter(pa);
changed = true; changed = true;
if (DEBUG_PREFERRED) { if (DEBUG_PREFERRED) {
@@ -6948,7 +6964,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (always && !pa.mPref.sameSet(query, excludeSetupWizardHomeActivity)) { if (always && !pa.mPref.sameSet(query, excludeSetupWizardHomeActivity)) {
if (pa.mPref.isSuperset(query, excludeSetupWizardHomeActivity)) { if (pa.mPref.isSuperset(query, excludeSetupWizardHomeActivity)) {
if (!excludeSetupWizardHomeActivity) { if (allowSetMutation) {
// some components of the set are no longer present in // some components of the set are no longer present in
// the query, but the preferred activity can still be reused // the query, but the preferred activity can still be reused
if (DEBUG_PREFERRED) { if (DEBUG_PREFERRED) {
@@ -6969,24 +6985,28 @@ public class PackageManagerService extends IPackageManager.Stub
changed = true; changed = true;
} else { } else {
if (DEBUG_PREFERRED) { if (DEBUG_PREFERRED) {
Slog.i(TAG, "Do not remove preferred activity for launcher" Slog.i(TAG, "Do not remove preferred activity");
+ " during SetupWizard");
} }
} }
} else { } else {
Slog.i(TAG, if (allowSetMutation) {
"Result set changed, dropping preferred activity for " Slog.i(TAG,
+ intent + " type " + resolvedType); "Result set changed, dropping preferred activity "
if (DEBUG_PREFERRED) { + "for " + intent + " type "
Slog.v(TAG, "Removing preferred activity since set changed " + resolvedType);
+ pa.mPref.mComponent); if (DEBUG_PREFERRED) {
Slog.v(TAG,
"Removing preferred activity since set changed "
+ pa.mPref.mComponent);
}
pir.removeFilter(pa);
// Re-add the filter as a "last chosen" entry (!always)
PreferredActivity lastChosen = new PreferredActivity(
pa, pa.mPref.mMatch, null, pa.mPref.mComponent,
false);
pir.addFilter(lastChosen);
changed = true;
} }
pir.removeFilter(pa);
// Re-add the filter as a "last chosen" entry (!always)
PreferredActivity lastChosen = new PreferredActivity(
pa, pa.mPref.mMatch, null, pa.mPref.mComponent, false);
pir.addFilter(lastChosen);
changed = true;
return null; return null;
} }
} }