Merge "Fixes NON_BROWSER flag behavior" into rvc-dev

This commit is contained in:
Patrick Baumann
2020-04-30 16:03:48 +00:00
committed by Android (Google) Code Review
2 changed files with 21 additions and 18 deletions

View File

@@ -33,7 +33,6 @@ import android.content.pm.AuxiliaryResolveInfo;
import android.content.pm.InstantAppResolveInfo; import android.content.pm.InstantAppResolveInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManagerInternal.PrivateResolveFlags;
import android.content.pm.PackageUserState; import android.content.pm.PackageUserState;
import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
@@ -261,10 +260,9 @@ public class ComponentResolver {
@Nullable @Nullable
List<ResolveInfo> queryActivities(Intent intent, String resolvedType, int flags, List<ResolveInfo> queryActivities(Intent intent, String resolvedType, int flags,
@PrivateResolveFlags int privateResolveFlags, int userId) { int userId) {
synchronized (mLock) { synchronized (mLock) {
return mActivities.queryIntent( return mActivities.queryIntent(intent, resolvedType, flags, userId);
intent, resolvedType, flags, privateResolveFlags, userId);
} }
} }
@@ -427,7 +425,7 @@ public class ComponentResolver {
@Nullable @Nullable
List<ResolveInfo> queryReceivers(Intent intent, String resolvedType, int flags, int userId) { List<ResolveInfo> queryReceivers(Intent intent, String resolvedType, int flags, int userId) {
synchronized (mLock) { synchronized (mLock) {
return mReceivers.queryIntent(intent, resolvedType, flags, 0, userId); return mReceivers.queryIntent(intent, resolvedType, flags, userId);
} }
} }
@@ -1293,12 +1291,11 @@ public class ComponentResolver {
} }
List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags, List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags,
int privateResolveFlags, int userId) { int userId) {
if (!sUserManager.exists(userId)) { if (!sUserManager.exists(userId)) {
return null; return null;
} }
mFlags = flags; mFlags = flags;
mPrivateResolveFlags = privateResolveFlags;
return super.queryIntent(intent, resolvedType, return super.queryIntent(intent, resolvedType,
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0,
userId); userId);
@@ -1495,11 +1492,6 @@ public class ComponentResolver {
} }
return null; return null;
} }
final boolean matchNonBrowserOnly =
(mPrivateResolveFlags & PackageManagerInternal.RESOLVE_NON_BROWSER_ONLY) != 0;
if (matchNonBrowserOnly && info.handleAllWebDataURI()) {
return null;
}
final ResolveInfo res = new ResolveInfo(); final ResolveInfo res = new ResolveInfo();
res.activityInfo = ai; res.activityInfo = ai;
if ((mFlags & PackageManager.GET_RESOLVED_FILTER) != 0) { if ((mFlags & PackageManager.GET_RESOLVED_FILTER) != 0) {
@@ -1579,7 +1571,6 @@ public class ComponentResolver {
private final ArrayMap<ComponentName, ParsedActivity> mActivities = private final ArrayMap<ComponentName, ParsedActivity> mActivities =
new ArrayMap<>(); new ArrayMap<>();
private int mFlags; private int mFlags;
private int mPrivateResolveFlags;
} }
// Both receivers and activities share a class, but point to different get methods // Both receivers and activities share a class, but point to different get methods

View File

@@ -6414,6 +6414,11 @@ public class PackageManagerService extends IPackageManager.Stub
final ResolveInfo bestChoice = final ResolveInfo bestChoice =
chooseBestActivity( chooseBestActivity(
intent, resolvedType, flags, privateResolveFlags, query, userId); intent, resolvedType, flags, privateResolveFlags, query, userId);
final boolean nonBrowserOnly =
(privateResolveFlags & PackageManagerInternal.RESOLVE_NON_BROWSER_ONLY) != 0;
if (nonBrowserOnly && bestChoice != null && bestChoice.handleAllWebDataURI) {
return null;
}
return bestChoice; return bestChoice;
} finally { } finally {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
@@ -6601,9 +6606,13 @@ public class PackageManagerService extends IPackageManager.Stub
if (ri != null) { if (ri != null) {
return ri; return ri;
} }
// If we have an ephemeral app, use it int browserCount = 0;
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
ri = query.get(i); ri = query.get(i);
if (ri.handleAllWebDataURI) {
browserCount++;
}
// If we have an ephemeral app, use it
if (ri.activityInfo.applicationInfo.isInstantApp()) { if (ri.activityInfo.applicationInfo.isInstantApp()) {
final String packageName = ri.activityInfo.packageName; final String packageName = ri.activityInfo.packageName;
final PackageSetting ps = mSettings.mPackages.get(packageName); final PackageSetting ps = mSettings.mPackages.get(packageName);
@@ -6619,6 +6628,9 @@ public class PackageManagerService extends IPackageManager.Stub
return null; return null;
} }
ri = new ResolveInfo(mResolveInfo); ri = new ResolveInfo(mResolveInfo);
// if all resolve options are browsers, mark the resolver's info as if it were
// also a browser.
ri.handleAllWebDataURI = browserCount == N;
ri.activityInfo = new ActivityInfo(ri.activityInfo); ri.activityInfo = new ActivityInfo(ri.activityInfo);
ri.activityInfo.labelRes = ResolverActivity.getLabelRes(intent.getAction()); ri.activityInfo.labelRes = ResolverActivity.getLabelRes(intent.getAction());
// If all of the options come from the same package, show the application's // If all of the options come from the same package, show the application's
@@ -7129,7 +7141,7 @@ public class PackageManagerService extends IPackageManager.Stub
// Check for results in the current profile. // Check for results in the current profile.
result = filterIfNotSystemUser(mComponentResolver.queryActivities( result = filterIfNotSystemUser(mComponentResolver.queryActivities(
intent, resolvedType, flags, privateResolveFlags, userId), userId); intent, resolvedType, flags, userId), userId);
addInstant = isInstantAppResolutionAllowed(intent, result, userId, addInstant = isInstantAppResolutionAllowed(intent, result, userId,
false /*skipPackageCheck*/); false /*skipPackageCheck*/);
// Check for cross profile results. // Check for cross profile results.
@@ -7228,7 +7240,7 @@ public class PackageManagerService extends IPackageManager.Stub
| PackageManager.GET_RESOLVED_FILTER | PackageManager.GET_RESOLVED_FILTER
| PackageManager.MATCH_INSTANT | PackageManager.MATCH_INSTANT
| PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY, | PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY,
0, userId); userId);
for (int i = instantApps.size() - 1; i >= 0; --i) { for (int i = instantApps.size() - 1; i >= 0; --i) {
final ResolveInfo info = instantApps.get(i); final ResolveInfo info = instantApps.get(i);
final String packageName = info.activityInfo.packageName; final String packageName = info.activityInfo.packageName;
@@ -7332,7 +7344,7 @@ public class PackageManagerService extends IPackageManager.Stub
return null; return null;
} }
List<ResolveInfo> resultTargetUser = mComponentResolver.queryActivities(intent, List<ResolveInfo> resultTargetUser = mComponentResolver.queryActivities(intent,
resolvedType, flags, 0, parentUserId); resolvedType, flags, parentUserId);
if (resultTargetUser == null || resultTargetUser.isEmpty()) { if (resultTargetUser == null || resultTargetUser.isEmpty()) {
return null; return null;
@@ -7780,7 +7792,7 @@ public class PackageManagerService extends IPackageManager.Stub
String resolvedType, int flags, int sourceUserId) { String resolvedType, int flags, int sourceUserId) {
int targetUserId = filter.getTargetUserId(); int targetUserId = filter.getTargetUserId();
List<ResolveInfo> resultTargetUser = mComponentResolver.queryActivities(intent, List<ResolveInfo> resultTargetUser = mComponentResolver.queryActivities(intent,
resolvedType, flags, 0, targetUserId); resolvedType, flags, targetUserId);
if (resultTargetUser != null && isUserEnabled(targetUserId)) { if (resultTargetUser != null && isUserEnabled(targetUserId)) {
// If all the matches in the target profile are suspended, return null. // If all the matches in the target profile are suspended, return null.
for (int i = resultTargetUser.size() - 1; i >= 0; i--) { for (int i = resultTargetUser.size() - 1; i >= 0; i--) {