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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user