Merge "Lock for AppsFilter" into tm-dev
This commit is contained in:
@@ -103,6 +103,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
* application B is implicitly allowed to query for application A; regardless of any manifest
|
||||
* entries.
|
||||
*/
|
||||
@GuardedBy("mLock")
|
||||
@Watched
|
||||
private final WatchedSparseSetArray<Integer> mImplicitlyQueryable;
|
||||
private final SnapshotCache<WatchedSparseSetArray<Integer>> mImplicitQueryableSnapshot;
|
||||
@@ -112,6 +113,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
* interacted with it, but could keep across package updates. For example, if application A
|
||||
* grants persistable uri permission to application B; regardless of any manifest entries.
|
||||
*/
|
||||
@GuardedBy("mLock")
|
||||
@Watched
|
||||
private final WatchedSparseSetArray<Integer> mRetainedImplicitlyQueryable;
|
||||
private final SnapshotCache<WatchedSparseSetArray<Integer>>
|
||||
@@ -121,6 +123,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
* A mapping from the set of App IDs that query other App IDs via package name to the
|
||||
* list of packages that they can see.
|
||||
*/
|
||||
@GuardedBy("mLock")
|
||||
@Watched
|
||||
private final WatchedSparseSetArray<Integer> mQueriesViaPackage;
|
||||
private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueriesViaPackageSnapshot;
|
||||
@@ -129,6 +132,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
* A mapping from the set of App IDs that query others via component match to the list
|
||||
* of packages that the they resolve to.
|
||||
*/
|
||||
@GuardedBy("mLock")
|
||||
@Watched
|
||||
private final WatchedSparseSetArray<Integer> mQueriesViaComponent;
|
||||
private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueriesViaComponentSnapshot;
|
||||
@@ -137,6 +141,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
* A mapping from the set of App IDs that query other App IDs via library name to the
|
||||
* list of packages that they can see.
|
||||
*/
|
||||
@GuardedBy("mLock")
|
||||
@Watched
|
||||
private final WatchedSparseSetArray<Integer> mQueryableViaUsesLibrary;
|
||||
private final SnapshotCache<WatchedSparseSetArray<Integer>> mQueryableViaUsesLibrarySnapshot;
|
||||
@@ -159,6 +164,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
* A set of App IDs that are always queryable by any package, regardless of their manifest
|
||||
* content.
|
||||
*/
|
||||
@GuardedBy("mLock")
|
||||
@Watched
|
||||
private final WatchedArraySet<Integer> mForceQueryable;
|
||||
private final SnapshotCache<WatchedArraySet<Integer>> mForceQueryableSnapshot;
|
||||
@@ -176,6 +182,7 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
private final StateProvider mStateProvider;
|
||||
private SigningDetails mSystemSigningDetails;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
@Watched
|
||||
private final WatchedArrayList<String> mProtectedBroadcasts;
|
||||
private final SnapshotCache<WatchedArrayList<String>> mProtectedBroadcastsSnapshot;
|
||||
@@ -196,6 +203,11 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
|
||||
private volatile boolean mSystemReady = false;
|
||||
|
||||
/**
|
||||
* Guards the accesses for the list/set fields except for {@link #mShouldFilterCache}
|
||||
*/
|
||||
private final Object mLock = new Object();
|
||||
|
||||
/**
|
||||
* A cached snapshot.
|
||||
*/
|
||||
@@ -328,20 +340,22 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
* The copy constructor is used by PackageManagerService to construct a snapshot.
|
||||
*/
|
||||
private AppsFilterImpl(AppsFilterImpl orig) {
|
||||
mImplicitlyQueryable = orig.mImplicitQueryableSnapshot.snapshot();
|
||||
mImplicitQueryableSnapshot = new SnapshotCache.Sealed<>();
|
||||
mRetainedImplicitlyQueryable = orig.mRetainedImplicitlyQueryableSnapshot.snapshot();
|
||||
mRetainedImplicitlyQueryableSnapshot = new SnapshotCache.Sealed<>();
|
||||
mQueriesViaPackage = orig.mQueriesViaPackageSnapshot.snapshot();
|
||||
mQueriesViaPackageSnapshot = new SnapshotCache.Sealed<>();
|
||||
mQueriesViaComponent = orig.mQueriesViaComponentSnapshot.snapshot();
|
||||
mQueriesViaComponentSnapshot = new SnapshotCache.Sealed<>();
|
||||
mQueryableViaUsesLibrary = orig.mQueryableViaUsesLibrarySnapshot.snapshot();
|
||||
mQueryableViaUsesLibrarySnapshot = new SnapshotCache.Sealed<>();
|
||||
mForceQueryable = orig.mForceQueryableSnapshot.snapshot();
|
||||
mForceQueryableSnapshot = new SnapshotCache.Sealed<>();
|
||||
mProtectedBroadcasts = orig.mProtectedBroadcastsSnapshot.snapshot();
|
||||
mProtectedBroadcastsSnapshot = new SnapshotCache.Sealed<>();
|
||||
synchronized (orig.mLock) {
|
||||
mImplicitlyQueryable = orig.mImplicitQueryableSnapshot.snapshot();
|
||||
mImplicitQueryableSnapshot = new SnapshotCache.Sealed<>();
|
||||
mRetainedImplicitlyQueryable = orig.mRetainedImplicitlyQueryableSnapshot.snapshot();
|
||||
mRetainedImplicitlyQueryableSnapshot = new SnapshotCache.Sealed<>();
|
||||
mQueriesViaPackage = orig.mQueriesViaPackageSnapshot.snapshot();
|
||||
mQueriesViaPackageSnapshot = new SnapshotCache.Sealed<>();
|
||||
mQueriesViaComponent = orig.mQueriesViaComponentSnapshot.snapshot();
|
||||
mQueriesViaComponentSnapshot = new SnapshotCache.Sealed<>();
|
||||
mQueryableViaUsesLibrary = orig.mQueryableViaUsesLibrarySnapshot.snapshot();
|
||||
mQueryableViaUsesLibrarySnapshot = new SnapshotCache.Sealed<>();
|
||||
mForceQueryable = orig.mForceQueryableSnapshot.snapshot();
|
||||
mForceQueryableSnapshot = new SnapshotCache.Sealed<>();
|
||||
mProtectedBroadcasts = orig.mProtectedBroadcastsSnapshot.snapshot();
|
||||
mProtectedBroadcastsSnapshot = new SnapshotCache.Sealed<>();
|
||||
}
|
||||
mQueriesViaComponentRequireRecompute = orig.mQueriesViaComponentRequireRecompute;
|
||||
mForceQueryableByDevicePackageNames =
|
||||
Arrays.copyOf(orig.mForceQueryableByDevicePackageNames,
|
||||
@@ -742,9 +756,11 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
return false;
|
||||
}
|
||||
final boolean changed;
|
||||
changed = retainOnUpdate
|
||||
? mRetainedImplicitlyQueryable.add(recipientUid, visibleUid)
|
||||
: mImplicitlyQueryable.add(recipientUid, visibleUid);
|
||||
synchronized (mLock) {
|
||||
changed = retainOnUpdate
|
||||
? mRetainedImplicitlyQueryable.add(recipientUid, visibleUid)
|
||||
: mImplicitlyQueryable.add(recipientUid, visibleUid);
|
||||
}
|
||||
if (changed && DEBUG_LOGGING) {
|
||||
Slog.i(TAG, (retainOnUpdate ? "retained " : "") + "implicit access granted: "
|
||||
+ recipientUid + " -> " + visibleUid);
|
||||
@@ -833,7 +849,9 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
// packages for signature matches
|
||||
for (PackageStateInternal setting : existingSettings.values()) {
|
||||
if (isSystemSigned(mSystemSigningDetails, setting)) {
|
||||
mForceQueryable.add(setting.getAppId());
|
||||
synchronized (mLock) {
|
||||
mForceQueryable.add(setting.getAppId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -843,75 +861,76 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
return null;
|
||||
}
|
||||
|
||||
if (mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts())) {
|
||||
mQueriesViaComponentRequireRecompute = true;
|
||||
}
|
||||
synchronized (mLock) {
|
||||
if (mProtectedBroadcasts.addAll(newPkg.getProtectedBroadcasts())) {
|
||||
mQueriesViaComponentRequireRecompute = true;
|
||||
}
|
||||
|
||||
final boolean newIsForceQueryable =
|
||||
mForceQueryable.contains(newPkgSetting.getAppId())
|
||||
/* shared user that is already force queryable */
|
||||
|| newPkgSetting.isForceQueryableOverride() /* adb override */
|
||||
|| (newPkgSetting.isSystem() && (mSystemAppsQueryable
|
||||
|| newPkg.isForceQueryable()
|
||||
|| ArrayUtils.contains(mForceQueryableByDevicePackageNames,
|
||||
newPkg.getPackageName())));
|
||||
if (newIsForceQueryable
|
||||
|| (mSystemSigningDetails != null
|
||||
&& isSystemSigned(mSystemSigningDetails, newPkgSetting))) {
|
||||
mForceQueryable.add(newPkgSetting.getAppId());
|
||||
}
|
||||
final boolean newIsForceQueryable =
|
||||
mForceQueryable.contains(newPkgSetting.getAppId())
|
||||
/* shared user that is already force queryable */
|
||||
|| newPkgSetting.isForceQueryableOverride() /* adb override */
|
||||
|| (newPkgSetting.isSystem() && (mSystemAppsQueryable
|
||||
|| newPkg.isForceQueryable()
|
||||
|| ArrayUtils.contains(mForceQueryableByDevicePackageNames,
|
||||
newPkg.getPackageName())));
|
||||
if (newIsForceQueryable
|
||||
|| (mSystemSigningDetails != null
|
||||
&& isSystemSigned(mSystemSigningDetails, newPkgSetting))) {
|
||||
mForceQueryable.add(newPkgSetting.getAppId());
|
||||
}
|
||||
|
||||
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
||||
final PackageStateInternal existingSetting = existingSettings.valueAt(i);
|
||||
if (existingSetting.getAppId() == newPkgSetting.getAppId()
|
||||
|| existingSetting.getPkg()
|
||||
== null) {
|
||||
continue;
|
||||
}
|
||||
final AndroidPackage existingPkg = existingSetting.getPkg();
|
||||
// let's evaluate the ability of already added packages to see this new package
|
||||
if (!newIsForceQueryable) {
|
||||
if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(existingPkg,
|
||||
newPkg, mProtectedBroadcasts)) {
|
||||
mQueriesViaComponent.add(existingSetting.getAppId(),
|
||||
newPkgSetting.getAppId());
|
||||
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
||||
final PackageStateInternal existingSetting = existingSettings.valueAt(i);
|
||||
if (existingSetting.getAppId() == newPkgSetting.getAppId()
|
||||
|| existingSetting.getPkg()
|
||||
== null) {
|
||||
continue;
|
||||
}
|
||||
if (canQueryViaPackage(existingPkg, newPkg)
|
||||
|| canQueryAsInstaller(existingSetting, newPkg)) {
|
||||
mQueriesViaPackage.add(existingSetting.getAppId(),
|
||||
newPkgSetting.getAppId());
|
||||
final AndroidPackage existingPkg = existingSetting.getPkg();
|
||||
// let's evaluate the ability of already added packages to see this new package
|
||||
if (!newIsForceQueryable) {
|
||||
if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(existingPkg,
|
||||
newPkg, mProtectedBroadcasts)) {
|
||||
mQueriesViaComponent.add(existingSetting.getAppId(),
|
||||
newPkgSetting.getAppId());
|
||||
}
|
||||
if (canQueryViaPackage(existingPkg, newPkg)
|
||||
|| canQueryAsInstaller(existingSetting, newPkg)) {
|
||||
mQueriesViaPackage.add(existingSetting.getAppId(),
|
||||
newPkgSetting.getAppId());
|
||||
}
|
||||
if (canQueryViaUsesLibrary(existingPkg, newPkg)) {
|
||||
mQueryableViaUsesLibrary.add(existingSetting.getAppId(),
|
||||
newPkgSetting.getAppId());
|
||||
}
|
||||
}
|
||||
if (canQueryViaUsesLibrary(existingPkg, newPkg)) {
|
||||
mQueryableViaUsesLibrary.add(existingSetting.getAppId(),
|
||||
newPkgSetting.getAppId());
|
||||
// now we'll evaluate our new package's ability to see existing packages
|
||||
if (!mForceQueryable.contains(existingSetting.getAppId())) {
|
||||
if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(newPkg,
|
||||
existingPkg, mProtectedBroadcasts)) {
|
||||
mQueriesViaComponent.add(newPkgSetting.getAppId(),
|
||||
existingSetting.getAppId());
|
||||
}
|
||||
if (canQueryViaPackage(newPkg, existingPkg)
|
||||
|| canQueryAsInstaller(newPkgSetting, existingPkg)) {
|
||||
mQueriesViaPackage.add(newPkgSetting.getAppId(),
|
||||
existingSetting.getAppId());
|
||||
}
|
||||
if (canQueryViaUsesLibrary(newPkg, existingPkg)) {
|
||||
mQueryableViaUsesLibrary.add(newPkgSetting.getAppId(),
|
||||
existingSetting.getAppId());
|
||||
}
|
||||
}
|
||||
}
|
||||
// now we'll evaluate our new package's ability to see existing packages
|
||||
if (!mForceQueryable.contains(existingSetting.getAppId())) {
|
||||
if (!mQueriesViaComponentRequireRecompute && canQueryViaComponents(newPkg,
|
||||
existingPkg, mProtectedBroadcasts)) {
|
||||
mQueriesViaComponent.add(newPkgSetting.getAppId(),
|
||||
existingSetting.getAppId());
|
||||
// if either package instruments the other, mark both as visible to one another
|
||||
if (newPkgSetting.getPkg() != null && existingSetting.getPkg() != null
|
||||
&& (pkgInstruments(newPkgSetting.getPkg(), existingSetting.getPkg())
|
||||
|| pkgInstruments(existingSetting.getPkg(), newPkgSetting.getPkg()))) {
|
||||
mQueriesViaPackage.add(newPkgSetting.getAppId(), existingSetting.getAppId());
|
||||
mQueriesViaPackage.add(existingSetting.getAppId(), newPkgSetting.getAppId());
|
||||
}
|
||||
if (canQueryViaPackage(newPkg, existingPkg)
|
||||
|| canQueryAsInstaller(newPkgSetting, existingPkg)) {
|
||||
mQueriesViaPackage.add(newPkgSetting.getAppId(),
|
||||
existingSetting.getAppId());
|
||||
}
|
||||
if (canQueryViaUsesLibrary(newPkg, existingPkg)) {
|
||||
mQueryableViaUsesLibrary.add(newPkgSetting.getAppId(),
|
||||
existingSetting.getAppId());
|
||||
}
|
||||
}
|
||||
// if either package instruments the other, mark both as visible to one another
|
||||
if (newPkgSetting.getPkg() != null && existingSetting.getPkg() != null
|
||||
&& (pkgInstruments(newPkgSetting.getPkg(), existingSetting.getPkg())
|
||||
|| pkgInstruments(existingSetting.getPkg(), newPkgSetting.getPkg()))) {
|
||||
mQueriesViaPackage.add(newPkgSetting.getAppId(), existingSetting.getAppId());
|
||||
mQueriesViaPackage.add(existingSetting.getAppId(), newPkgSetting.getAppId());
|
||||
}
|
||||
}
|
||||
|
||||
int existingSize = existingSettings.size();
|
||||
ArrayMap<String, AndroidPackage> existingPkgs = new ArrayMap<>(existingSize);
|
||||
for (int index = 0; index < existingSize; index++) {
|
||||
@@ -1138,16 +1157,18 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
private void collectProtectedBroadcasts(
|
||||
ArrayMap<String, ? extends PackageStateInternal> existingSettings,
|
||||
@Nullable String excludePackage) {
|
||||
mProtectedBroadcasts.clear();
|
||||
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
||||
PackageStateInternal setting = existingSettings.valueAt(i);
|
||||
if (setting.getPkg() == null || setting.getPkg().getPackageName().equals(
|
||||
excludePackage)) {
|
||||
continue;
|
||||
}
|
||||
final List<String> protectedBroadcasts = setting.getPkg().getProtectedBroadcasts();
|
||||
if (!protectedBroadcasts.isEmpty()) {
|
||||
mProtectedBroadcasts.addAll(protectedBroadcasts);
|
||||
synchronized (mLock) {
|
||||
mProtectedBroadcasts.clear();
|
||||
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
||||
PackageStateInternal setting = existingSettings.valueAt(i);
|
||||
if (setting.getPkg() == null || setting.getPkg().getPackageName().equals(
|
||||
excludePackage)) {
|
||||
continue;
|
||||
}
|
||||
final List<String> protectedBroadcasts = setting.getPkg().getProtectedBroadcasts();
|
||||
if (!protectedBroadcasts.isEmpty()) {
|
||||
mProtectedBroadcasts.addAll(protectedBroadcasts);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1158,24 +1179,26 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
*/
|
||||
private void recomputeComponentVisibility(
|
||||
ArrayMap<String, ? extends PackageStateInternal> existingSettings) {
|
||||
mQueriesViaComponent.clear();
|
||||
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
||||
PackageStateInternal setting = existingSettings.valueAt(i);
|
||||
if (setting.getPkg() == null || requestsQueryAllPackages(setting.getPkg())) {
|
||||
continue;
|
||||
}
|
||||
for (int j = existingSettings.size() - 1; j >= 0; j--) {
|
||||
if (i == j) {
|
||||
synchronized (mLock) {
|
||||
mQueriesViaComponent.clear();
|
||||
for (int i = existingSettings.size() - 1; i >= 0; i--) {
|
||||
PackageStateInternal setting = existingSettings.valueAt(i);
|
||||
if (setting.getPkg() == null || requestsQueryAllPackages(setting.getPkg())) {
|
||||
continue;
|
||||
}
|
||||
final PackageStateInternal otherSetting = existingSettings.valueAt(j);
|
||||
if (otherSetting.getPkg() == null || mForceQueryable.contains(
|
||||
otherSetting.getAppId())) {
|
||||
continue;
|
||||
}
|
||||
if (canQueryViaComponents(setting.getPkg(), otherSetting.getPkg(),
|
||||
mProtectedBroadcasts)) {
|
||||
mQueriesViaComponent.add(setting.getAppId(), otherSetting.getAppId());
|
||||
for (int j = existingSettings.size() - 1; j >= 0; j--) {
|
||||
if (i == j) {
|
||||
continue;
|
||||
}
|
||||
final PackageStateInternal otherSetting = existingSettings.valueAt(j);
|
||||
if (otherSetting.getPkg() == null || mForceQueryable.contains(
|
||||
otherSetting.getAppId())) {
|
||||
continue;
|
||||
}
|
||||
if (canQueryViaComponents(setting.getPkg(), otherSetting.getPkg(),
|
||||
mProtectedBroadcasts)) {
|
||||
mQueriesViaComponent.add(setting.getAppId(), otherSetting.getAppId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1189,8 +1212,10 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
@Nullable
|
||||
public SparseArray<int[]> getVisibilityAllowList(PackageStateInternal setting, int[] users,
|
||||
ArrayMap<String, ? extends PackageStateInternal> existingSettings) {
|
||||
if (mForceQueryable.contains(setting.getAppId())) {
|
||||
return null;
|
||||
synchronized (mLock) {
|
||||
if (mForceQueryable.contains(setting.getAppId())) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
// let's reserve max memory to limit the number of allocations
|
||||
SparseArray<int[]> result = new SparseArray<>(users.length);
|
||||
@@ -1256,54 +1281,56 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
mStateProvider.runWithState((settings, sharedUserSettings, users) -> {
|
||||
final ArraySet<String> additionalChangedPackages;
|
||||
final int userCount = users.length;
|
||||
for (int u = 0; u < userCount; u++) {
|
||||
final int userId = users[u].id;
|
||||
final int removingUid = UserHandle.getUid(userId, setting.getAppId());
|
||||
mImplicitlyQueryable.remove(removingUid);
|
||||
for (int i = mImplicitlyQueryable.size() - 1; i >= 0; i--) {
|
||||
mImplicitlyQueryable.remove(mImplicitlyQueryable.keyAt(i),
|
||||
removingUid);
|
||||
synchronized (mLock) {
|
||||
for (int u = 0; u < userCount; u++) {
|
||||
final int userId = users[u].id;
|
||||
final int removingUid = UserHandle.getUid(userId, setting.getAppId());
|
||||
mImplicitlyQueryable.remove(removingUid);
|
||||
for (int i = mImplicitlyQueryable.size() - 1; i >= 0; i--) {
|
||||
mImplicitlyQueryable.remove(mImplicitlyQueryable.keyAt(i),
|
||||
removingUid);
|
||||
}
|
||||
|
||||
if (isReplace) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mRetainedImplicitlyQueryable.remove(removingUid);
|
||||
for (int i = mRetainedImplicitlyQueryable.size() - 1; i >= 0; i--) {
|
||||
mRetainedImplicitlyQueryable.remove(
|
||||
mRetainedImplicitlyQueryable.keyAt(i), removingUid);
|
||||
}
|
||||
}
|
||||
|
||||
if (isReplace) {
|
||||
continue;
|
||||
if (!mQueriesViaComponentRequireRecompute) {
|
||||
mQueriesViaComponent.remove(setting.getAppId());
|
||||
for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
|
||||
mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i),
|
||||
setting.getAppId());
|
||||
}
|
||||
}
|
||||
|
||||
mRetainedImplicitlyQueryable.remove(removingUid);
|
||||
for (int i = mRetainedImplicitlyQueryable.size() - 1; i >= 0; i--) {
|
||||
mRetainedImplicitlyQueryable.remove(
|
||||
mRetainedImplicitlyQueryable.keyAt(i), removingUid);
|
||||
}
|
||||
}
|
||||
|
||||
if (!mQueriesViaComponentRequireRecompute) {
|
||||
mQueriesViaComponent.remove(setting.getAppId());
|
||||
for (int i = mQueriesViaComponent.size() - 1; i >= 0; i--) {
|
||||
mQueriesViaComponent.remove(mQueriesViaComponent.keyAt(i),
|
||||
mQueriesViaPackage.remove(setting.getAppId());
|
||||
for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
|
||||
mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i),
|
||||
setting.getAppId());
|
||||
}
|
||||
mQueryableViaUsesLibrary.remove(setting.getAppId());
|
||||
for (int i = mQueryableViaUsesLibrary.size() - 1; i >= 0; i--) {
|
||||
mQueryableViaUsesLibrary.remove(mQueryableViaUsesLibrary.keyAt(i),
|
||||
setting.getAppId());
|
||||
}
|
||||
}
|
||||
mQueriesViaPackage.remove(setting.getAppId());
|
||||
for (int i = mQueriesViaPackage.size() - 1; i >= 0; i--) {
|
||||
mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i),
|
||||
setting.getAppId());
|
||||
}
|
||||
mQueryableViaUsesLibrary.remove(setting.getAppId());
|
||||
for (int i = mQueryableViaUsesLibrary.size() - 1; i >= 0; i--) {
|
||||
mQueryableViaUsesLibrary.remove(mQueryableViaUsesLibrary.keyAt(i),
|
||||
setting.getAppId());
|
||||
}
|
||||
|
||||
mForceQueryable.remove(setting.getAppId());
|
||||
mForceQueryable.remove(setting.getAppId());
|
||||
|
||||
if (setting.getPkg() != null
|
||||
&& !setting.getPkg().getProtectedBroadcasts().isEmpty()) {
|
||||
final String removingPackageName = setting.getPkg().getPackageName();
|
||||
final ArrayList<String> protectedBroadcasts = new ArrayList<>();
|
||||
protectedBroadcasts.addAll(mProtectedBroadcasts.untrackedStorage());
|
||||
collectProtectedBroadcasts(settings, removingPackageName);
|
||||
if (!mProtectedBroadcasts.containsAll(protectedBroadcasts)) {
|
||||
mQueriesViaComponentRequireRecompute = true;
|
||||
if (setting.getPkg() != null
|
||||
&& !setting.getPkg().getProtectedBroadcasts().isEmpty()) {
|
||||
final String removingPackageName = setting.getPkg().getPackageName();
|
||||
final ArrayList<String> protectedBroadcasts = new ArrayList<>();
|
||||
protectedBroadcasts.addAll(mProtectedBroadcasts.untrackedStorage());
|
||||
collectProtectedBroadcasts(settings, removingPackageName);
|
||||
if (!mProtectedBroadcasts.containsAll(protectedBroadcasts)) {
|
||||
mQueriesViaComponentRequireRecompute = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1562,11 +1589,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
if (DEBUG_TRACING) {
|
||||
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mForceQueryable");
|
||||
}
|
||||
if (mForceQueryable.contains(targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "force queryable");
|
||||
synchronized (mLock) {
|
||||
if (mForceQueryable.contains(targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "force queryable");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (DEBUG_TRACING) {
|
||||
@@ -1577,11 +1606,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
if (DEBUG_TRACING) {
|
||||
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueriesViaPackage");
|
||||
}
|
||||
if (mQueriesViaPackage.contains(callingAppId, targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "queries package");
|
||||
synchronized (mLock) {
|
||||
if (mQueriesViaPackage.contains(callingAppId, targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "queries package");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (DEBUG_TRACING) {
|
||||
@@ -1597,11 +1628,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
recomputeComponentVisibility(settings);
|
||||
});
|
||||
}
|
||||
if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "queries component");
|
||||
synchronized (mLock) {
|
||||
if (mQueriesViaComponent.contains(callingAppId, targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "queries component");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (DEBUG_TRACING) {
|
||||
@@ -1614,11 +1647,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mImplicitlyQueryable");
|
||||
}
|
||||
final int targetUid = UserHandle.getUid(targetUserId, targetAppId);
|
||||
if (mImplicitlyQueryable.contains(callingUid, targetUid)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "implicitly queryable for user");
|
||||
synchronized (mLock) {
|
||||
if (mImplicitlyQueryable.contains(callingUid, targetUid)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "implicitly queryable for user");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (DEBUG_TRACING) {
|
||||
@@ -1631,12 +1666,14 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mRetainedImplicitlyQueryable");
|
||||
}
|
||||
final int targetUid = UserHandle.getUid(targetUserId, targetAppId);
|
||||
if (mRetainedImplicitlyQueryable.contains(callingUid, targetUid)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting,
|
||||
"retained implicitly queryable for user");
|
||||
synchronized (mLock) {
|
||||
if (mRetainedImplicitlyQueryable.contains(callingUid, targetUid)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting,
|
||||
"retained implicitly queryable for user");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (DEBUG_TRACING) {
|
||||
@@ -1682,11 +1719,13 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
if (DEBUG_TRACING) {
|
||||
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mQueryableViaUsesLibrary");
|
||||
}
|
||||
if (mQueryableViaUsesLibrary.contains(callingAppId, targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "queryable for library users");
|
||||
synchronized (mLock) {
|
||||
if (mQueryableViaUsesLibrary.contains(callingAppId, targetAppId)) {
|
||||
if (DEBUG_LOGGING) {
|
||||
log(callingSetting, targetPkgSetting, "queryable for library users");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (DEBUG_TRACING) {
|
||||
@@ -1802,23 +1841,25 @@ public class AppsFilterImpl implements AppsFilterSnapshot, Watchable, Snappable
|
||||
pw.println(" system apps queryable: " + mSystemAppsQueryable);
|
||||
dumpPackageSet(pw, filteringAppId, mForceQueryable.untrackedStorage(),
|
||||
"forceQueryable", " ", expandPackages);
|
||||
pw.println(" queries via package name:");
|
||||
dumpQueriesMap(pw, filteringAppId, mQueriesViaPackage, " ", expandPackages);
|
||||
pw.println(" queries via component:");
|
||||
dumpQueriesMap(pw, filteringAppId, mQueriesViaComponent, " ", expandPackages);
|
||||
pw.println(" queryable via interaction:");
|
||||
for (int user : users) {
|
||||
pw.append(" User ").append(Integer.toString(user)).println(":");
|
||||
dumpQueriesMap(pw,
|
||||
filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId),
|
||||
mImplicitlyQueryable, " ", expandPackages);
|
||||
dumpQueriesMap(pw,
|
||||
filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId),
|
||||
mRetainedImplicitlyQueryable, " ", expandPackages);
|
||||
synchronized (mLock) {
|
||||
pw.println(" queries via package name:");
|
||||
dumpQueriesMap(pw, filteringAppId, mQueriesViaPackage, " ", expandPackages);
|
||||
pw.println(" queries via component:");
|
||||
dumpQueriesMap(pw, filteringAppId, mQueriesViaComponent, " ", expandPackages);
|
||||
pw.println(" queryable via interaction:");
|
||||
for (int user : users) {
|
||||
pw.append(" User ").append(Integer.toString(user)).println(":");
|
||||
dumpQueriesMap(pw,
|
||||
filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId),
|
||||
mImplicitlyQueryable, " ", expandPackages);
|
||||
dumpQueriesMap(pw,
|
||||
filteringAppId == null ? null : UserHandle.getUid(user, filteringAppId),
|
||||
mRetainedImplicitlyQueryable, " ", expandPackages);
|
||||
}
|
||||
pw.println(" queryable via uses-library:");
|
||||
dumpQueriesMap(pw, filteringAppId, mQueryableViaUsesLibrary, " ",
|
||||
expandPackages);
|
||||
}
|
||||
pw.println(" queryable via uses-library:");
|
||||
dumpQueriesMap(pw, filteringAppId, mQueryableViaUsesLibrary, " ",
|
||||
expandPackages);
|
||||
}
|
||||
|
||||
private static void dumpQueriesMap(PrintWriter pw, @Nullable Integer filteringId,
|
||||
|
||||
Reference in New Issue
Block a user