Merge "Defer recomputeComponentVisibility." into rvc-dev am: 77f5e88a44
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11881548 Change-Id: I1a4514e5a2f68c9f5dcf5b8f8433b6bdb46db3ec
This commit is contained in:
@@ -95,6 +95,14 @@ public class AppsFilter {
|
|||||||
*/
|
*/
|
||||||
private final SparseSetArray<Integer> mQueriesViaComponent = new SparseSetArray<>();
|
private final SparseSetArray<Integer> mQueriesViaComponent = new SparseSetArray<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pending full recompute of mQueriesViaComponent. Occurs when a package adds a new set of
|
||||||
|
* protected broadcast. This in turn invalidates all prior additions and require a very
|
||||||
|
* computationally expensive recomputing.
|
||||||
|
* Full recompute is done lazily at the point when we use mQueriesViaComponent to filter apps.
|
||||||
|
*/
|
||||||
|
private boolean mQueriesViaComponentRequireRecompute = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A set of App IDs that are always queryable by any package, regardless of their manifest
|
* A set of App IDs that are always queryable by any package, regardless of their manifest
|
||||||
* content.
|
* content.
|
||||||
@@ -278,7 +286,7 @@ public class AppsFilter {
|
|||||||
|
|
||||||
private void updateEnabledState(AndroidPackage pkg) {
|
private void updateEnabledState(AndroidPackage pkg) {
|
||||||
// TODO(b/135203078): Do not use toAppInfo
|
// TODO(b/135203078): Do not use toAppInfo
|
||||||
final boolean enabled = mInjector.getCompatibility().isChangeEnabled(
|
final boolean enabled = mInjector.getCompatibility().isChangeEnabledInternal(
|
||||||
PackageManager.FILTER_APPLICATION_QUERY, pkg.toAppInfoWithoutState());
|
PackageManager.FILTER_APPLICATION_QUERY, pkg.toAppInfoWithoutState());
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
mDisabledPackages.remove(pkg.getPackageName());
|
mDisabledPackages.remove(pkg.getPackageName());
|
||||||
@@ -523,9 +531,8 @@ public class AppsFilter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!newPkg.getProtectedBroadcasts().isEmpty()) {
|
if (mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts())) {
|
||||||
mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts());
|
mQueriesViaComponentRequireRecompute = true;
|
||||||
recomputeComponentVisibility(existingSettings, newPkg.getPackageName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean newIsForceQueryable =
|
final boolean newIsForceQueryable =
|
||||||
@@ -550,7 +557,8 @@ public class AppsFilter {
|
|||||||
final AndroidPackage existingPkg = existingSetting.pkg;
|
final AndroidPackage existingPkg = existingSetting.pkg;
|
||||||
// let's evaluate the ability of already added packages to see this new package
|
// let's evaluate the ability of already added packages to see this new package
|
||||||
if (!newIsForceQueryable) {
|
if (!newIsForceQueryable) {
|
||||||
if (canQueryViaComponents(existingPkg, newPkg, mProtectedBroadcasts)) {
|
if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(existingPkg,
|
||||||
|
newPkg, mProtectedBroadcasts)) {
|
||||||
mQueriesViaComponent.add(existingSetting.appId, newPkgSetting.appId);
|
mQueriesViaComponent.add(existingSetting.appId, newPkgSetting.appId);
|
||||||
}
|
}
|
||||||
if (canQueryViaPackage(existingPkg, newPkg)
|
if (canQueryViaPackage(existingPkg, newPkg)
|
||||||
@@ -560,7 +568,8 @@ public class AppsFilter {
|
|||||||
}
|
}
|
||||||
// now we'll evaluate our new package's ability to see existing packages
|
// now we'll evaluate our new package's ability to see existing packages
|
||||||
if (!mForceQueryable.contains(existingSetting.appId)) {
|
if (!mForceQueryable.contains(existingSetting.appId)) {
|
||||||
if (canQueryViaComponents(newPkg, existingPkg, mProtectedBroadcasts)) {
|
if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(newPkg,
|
||||||
|
existingPkg, mProtectedBroadcasts)) {
|
||||||
mQueriesViaComponent.add(newPkgSetting.appId, existingSetting.appId);
|
mQueriesViaComponent.add(newPkgSetting.appId, existingSetting.appId);
|
||||||
}
|
}
|
||||||
if (canQueryViaPackage(newPkg, existingPkg)
|
if (canQueryViaPackage(newPkg, existingPkg)
|
||||||
@@ -689,13 +698,11 @@ public class AppsFilter {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void recomputeComponentVisibility(ArrayMap<String, PackageSetting> existingSettings,
|
private void recomputeComponentVisibility(ArrayMap<String, PackageSetting> existingSettings) {
|
||||||
@Nullable String excludePackage) {
|
|
||||||
mQueriesViaComponent.clear();
|
mQueriesViaComponent.clear();
|
||||||
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
||||||
PackageSetting setting = existingSettings.valueAt(i);
|
PackageSetting setting = existingSettings.valueAt(i);
|
||||||
if (setting.pkg == null
|
if (setting.pkg == null
|
||||||
|| setting.pkg.getPackageName().equals(excludePackage)
|
|
||||||
|| mForceQueryable.contains(setting.appId)) {
|
|| mForceQueryable.contains(setting.appId)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -704,8 +711,7 @@ public class AppsFilter {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final PackageSetting otherSetting = existingSettings.valueAt(j);
|
final PackageSetting otherSetting = existingSettings.valueAt(j);
|
||||||
if (otherSetting.pkg == null
|
if (otherSetting.pkg == null) {
|
||||||
|| otherSetting.pkg.getPackageName().equals(excludePackage)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (canQueryViaComponents(setting.pkg, otherSetting.pkg, mProtectedBroadcasts)) {
|
if (canQueryViaComponents(setting.pkg, otherSetting.pkg, mProtectedBroadcasts)) {
|
||||||
@@ -713,6 +719,7 @@ public class AppsFilter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mQueriesViaComponentRequireRecompute = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -787,9 +794,11 @@ public class AppsFilter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mQueriesViaComponent.remove(setting.appId);
|
if (!mQueriesViaComponentRequireRecompute) {
|
||||||
for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
|
mQueriesViaComponent.remove(setting.appId);
|
||||||
mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i), setting.appId);
|
for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
|
||||||
|
mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i), setting.appId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mQueriesViaPackage.remove(setting.appId);
|
mQueriesViaPackage.remove(setting.appId);
|
||||||
for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
|
for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
|
||||||
@@ -810,10 +819,11 @@ public class AppsFilter {
|
|||||||
|
|
||||||
if (!setting.pkg.getProtectedBroadcasts().isEmpty()) {
|
if (!setting.pkg.getProtectedBroadcasts().isEmpty()) {
|
||||||
final String removingPackageName = setting.pkg.getPackageName();
|
final String removingPackageName = setting.pkg.getPackageName();
|
||||||
mProtectedBroadcasts.clear();
|
final Set<String> protectedBroadcasts = mProtectedBroadcasts;
|
||||||
mProtectedBroadcasts.addAll(
|
mProtectedBroadcasts = collectProtectedBroadcasts(settings, removingPackageName);
|
||||||
collectProtectedBroadcasts(settings, removingPackageName));
|
if (!mProtectedBroadcasts.containsAll(protectedBroadcasts)) {
|
||||||
recomputeComponentVisibility(settings, removingPackageName);
|
mQueriesViaComponentRequireRecompute = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mOverlayReferenceMapper.removePkg(setting.name);
|
mOverlayReferenceMapper.removePkg(setting.name);
|
||||||
@@ -1003,6 +1013,11 @@ public class AppsFilter {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaComponent");
|
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaComponent");
|
||||||
|
if (mQueriesViaComponentRequireRecompute) {
|
||||||
|
mStateProvider.runWithState((settings, users) -> {
|
||||||
|
recomputeComponentVisibility(settings);
|
||||||
|
});
|
||||||
|
}
|
||||||
if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
|
if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
|
||||||
if (DEBUG_LOGGING) {
|
if (DEBUG_LOGGING) {
|
||||||
log(callingSetting, targetPkgSetting, "queries component");
|
log(callingSetting, targetPkgSetting, "queries component");
|
||||||
|
|||||||
Reference in New Issue
Block a user