summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java94
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java53
3 files changed, 31 insertions, 118 deletions
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index d1d1eb00b114..06ff69176bb7 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -17,7 +17,6 @@
package com.android.server.pm;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
-import static android.os.UserHandle.USER_ALL;
import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE;
import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
@@ -686,7 +685,7 @@ public class AppsFilter implements Watchable, Snappable {
synchronized (mCacheLock) {
if (mShouldFilterCache != null) {
updateShouldFilterCacheForPackage(mShouldFilterCache, null, newPkgSetting,
- settings, users, USER_ALL, settings.size());
+ settings, users, settings.size());
if (additionalChangedPackages != null) {
for (int index = 0; index < additionalChangedPackages.size(); index++) {
String changedPackage = additionalChangedPackages.valueAt(index);
@@ -699,8 +698,7 @@ public class AppsFilter implements Watchable, Snappable {
}
updateShouldFilterCacheForPackage(mShouldFilterCache, null,
- changedPkgSetting, settings, users, USER_ALL,
- settings.size());
+ changedPkgSetting, settings, users, settings.size());
}
}
} // else, rebuild entire cache when system is ready
@@ -832,51 +830,24 @@ public class AppsFilter implements Watchable, Snappable {
}
}
}
- private void updateEntireShouldFilterCache() {
- updateEntireShouldFilterCache(USER_ALL);
- }
- private void updateEntireShouldFilterCache(int subjectUserId) {
+ private void updateEntireShouldFilterCache() {
mStateProvider.runWithState((settings, users) -> {
- int userId = subjectUserId;
- if (!ArrayUtils.contains(users, subjectUserId)) {
- Slog.e(TAG, "We encountered a new user that isn't a member of known users, "
- + "updating the whole cache");
- userId = USER_ALL;
- }
WatchedSparseBooleanMatrix cache =
- updateEntireShouldFilterCacheInner(settings, users, userId);
+ updateEntireShouldFilterCacheInner(settings, users);
synchronized (mCacheLock) {
- if (userId != USER_ALL) {
- // if we're only updating a single user id, we need to copy over the prior
- // cached values for the other users.
- int[] uids = mShouldFilterCache.keys();
- for (int i = 0; i < uids.length; i++) {
- int uid1 = uids[i];
- if (UserHandle.getUserId(uid1) == userId) {
- continue;
- }
- for (int j = 0; j < uids.length; j++) {
- int uid2 = uids[j];
- if (UserHandle.getUserId(uid2) == userId) {
- continue;
- }
- cache.setValueAt(uid1, uid2, mShouldFilterCache.valueAt(uid1, uid2));
- }
- }
- }
mShouldFilterCache = cache;
}
});
}
private WatchedSparseBooleanMatrix updateEntireShouldFilterCacheInner(
- ArrayMap<String, PackageSetting> settings, UserInfo[] users, int subjectUserId) {
+ ArrayMap<String, PackageSetting> settings, UserInfo[] users) {
WatchedSparseBooleanMatrix cache =
new WatchedSparseBooleanMatrix(users.length * settings.size());
for (int i = settings.size() - 1; i >= 0; i--) {
updateShouldFilterCacheForPackage(cache,
- null /*skipPackage*/, settings.valueAt(i), settings, users, subjectUserId, i);
+ null /*skipPackage*/, settings.valueAt(i), settings, users, i);
}
return cache;
}
@@ -897,8 +868,8 @@ public class AppsFilter implements Watchable, Snappable {
packagesCache.put(settings.keyAt(i), pkg);
}
});
- WatchedSparseBooleanMatrix cache = updateEntireShouldFilterCacheInner(
- settingsCopy, usersRef[0], USER_ALL);
+ WatchedSparseBooleanMatrix cache =
+ updateEntireShouldFilterCacheInner(settingsCopy, usersRef[0]);
boolean[] changed = new boolean[1];
// We have a cache, let's make sure the world hasn't changed out from under us.
mStateProvider.runWithState((settings, users) -> {
@@ -928,10 +899,10 @@ public class AppsFilter implements Watchable, Snappable {
});
}
- public void onUserCreated(int newUserId) {
+ public void onUsersChanged() {
synchronized (mCacheLock) {
if (mShouldFilterCache != null) {
- updateEntireShouldFilterCache(newUserId);
+ updateEntireShouldFilterCache();
onChanged();
}
}
@@ -942,7 +913,7 @@ public class AppsFilter implements Watchable, Snappable {
if (mShouldFilterCache != null) {
mStateProvider.runWithState((settings, users) -> {
updateShouldFilterCacheForPackage(mShouldFilterCache, null /* skipPackage */,
- settings.get(packageName), settings, users, USER_ALL,
+ settings.get(packageName), settings, users,
settings.size() /*maxIndex*/);
});
}
@@ -951,7 +922,7 @@ public class AppsFilter implements Watchable, Snappable {
private void updateShouldFilterCacheForPackage(WatchedSparseBooleanMatrix cache,
@Nullable String skipPackageName, PackageSetting subjectSetting, ArrayMap<String,
- PackageSetting> allSettings, UserInfo[] allUsers, int subjectUserId, int maxIndex) {
+ PackageSetting> allSettings, UserInfo[] allUsers, int maxIndex) {
for (int i = Math.min(maxIndex, allSettings.size() - 1); i >= 0; i--) {
PackageSetting otherSetting = allSettings.valueAt(i);
if (subjectSetting.appId == otherSetting.appId) {
@@ -961,34 +932,25 @@ public class AppsFilter implements Watchable, Snappable {
if (subjectSetting.name == skipPackageName || otherSetting.name == skipPackageName) {
continue;
}
- if (subjectUserId == USER_ALL) {
- for (int su = 0; su < allUsers.length; su++) {
- updateShouldFilterCacheForUser(cache, subjectSetting, allUsers, otherSetting,
- allUsers[su].id);
+ final int userCount = allUsers.length;
+ final int appxUidCount = userCount * allSettings.size();
+ for (int su = 0; su < userCount; su++) {
+ int subjectUser = allUsers[su].id;
+ for (int ou = 0; ou < userCount; ou++) {
+ int otherUser = allUsers[ou].id;
+ int subjectUid = UserHandle.getUid(subjectUser, subjectSetting.appId);
+ int otherUid = UserHandle.getUid(otherUser, otherSetting.appId);
+ cache.put(subjectUid, otherUid,
+ shouldFilterApplicationInternal(
+ subjectUid, subjectSetting, otherSetting, otherUser));
+ cache.put(otherUid, subjectUid,
+ shouldFilterApplicationInternal(
+ otherUid, otherSetting, subjectSetting, subjectUser));
}
- } else {
- updateShouldFilterCacheForUser(cache, subjectSetting, allUsers, otherSetting,
- subjectUserId);
}
}
}
- private void updateShouldFilterCacheForUser(WatchedSparseBooleanMatrix cache,
- PackageSetting subjectSetting, UserInfo[] allUsers, PackageSetting otherSetting,
- int subjectUserId) {
- for (int ou = 0; ou < allUsers.length; ou++) {
- int otherUser = allUsers[ou].id;
- int subjectUid = UserHandle.getUid(subjectUserId, subjectSetting.appId);
- int otherUid = UserHandle.getUid(otherUser, otherSetting.appId);
- cache.put(subjectUid, otherUid,
- shouldFilterApplicationInternal(
- subjectUid, subjectSetting, otherSetting, otherUser));
- cache.put(otherUid, subjectUid,
- shouldFilterApplicationInternal(
- otherUid, otherSetting, subjectSetting, subjectUserId));
- }
- }
-
private static boolean isSystemSigned(@NonNull PackageParser.SigningDetails sysSigningDetails,
PackageSetting pkgSetting) {
return pkgSetting.isSystem()
@@ -1183,7 +1145,7 @@ public class AppsFilter implements Watchable, Snappable {
continue;
}
updateShouldFilterCacheForPackage(mShouldFilterCache, setting.name,
- siblingSetting, settings, users, USER_ALL, settings.size());
+ siblingSetting, settings, users, settings.size());
}
}
@@ -1200,7 +1162,7 @@ public class AppsFilter implements Watchable, Snappable {
}
updateShouldFilterCacheForPackage(mShouldFilterCache, null,
- changedPkgSetting, settings, users, USER_ALL, settings.size());
+ changedPkgSetting, settings, users, settings.size());
}
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 2419873cdc41..7cde1b1af7e5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -26500,7 +26500,7 @@ public class PackageManagerService extends IPackageManager.Stub
synchronized (mLock) {
scheduleWritePackageRestrictionsLocked(userId);
scheduleWritePackageListLocked(userId);
- mAppsFilter.onUserCreated(userId);
+ mAppsFilter.onUsersChanged();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java
index dc745cdc0c84..67dd0556e098 100644
--- a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java
@@ -83,17 +83,9 @@ public class AppsFilterTest {
private static final int DUMMY_OVERLAY_APPID = 10756;
private static final int SYSTEM_USER = 0;
private static final int SECONDARY_USER = 10;
- private static final int ADDED_USER = 11;
private static final int[] USER_ARRAY = {SYSTEM_USER, SECONDARY_USER};
- private static final int[] USER_ARRAY_WITH_ADDED = {SYSTEM_USER, SECONDARY_USER, ADDED_USER};
- private static final UserInfo[] USER_INFO_LIST = toUserInfos(USER_ARRAY);
- private static final UserInfo[] USER_INFO_LIST_WITH_ADDED = toUserInfos(USER_ARRAY_WITH_ADDED);
-
- private static UserInfo[] toUserInfos(int[] userIds) {
- return Arrays.stream(userIds)
- .mapToObj(id -> new UserInfo(id, Integer.toString(id), 0))
- .toArray(UserInfo[]::new);
- }
+ private static final UserInfo[] USER_INFO_LIST = Arrays.stream(USER_ARRAY).mapToObj(
+ id -> new UserInfo(id, Integer.toString(id), 0)).toArray(UserInfo[]::new);
@Mock
AppsFilter.FeatureConfig mFeatureConfigMock;
@@ -327,47 +319,6 @@ public class AppsFilterTest {
}
@Test
- public void testOnUserCreated_FilterMatches() throws Exception {
- final AppsFilter appsFilter =
- new AppsFilter(mStateProvider, mFeatureConfigMock, new String[]{}, false, null,
- mMockExecutor);
- simulateAddBasicAndroid(appsFilter);
-
- appsFilter.onSystemReady();
-
- PackageSetting target = simulateAddPackage(appsFilter,
- pkgWithProvider("com.some.package", "com.some.authority"), DUMMY_TARGET_APPID);
- PackageSetting calling = simulateAddPackage(appsFilter,
- pkgQueriesProvider("com.some.other.package", "com.some.authority"),
- DUMMY_CALLING_APPID);
-
- for (int subjectUserId : USER_ARRAY) {
- for (int otherUserId : USER_ARRAY) {
- assertFalse(appsFilter.shouldFilterApplication(
- UserHandle.getUid(DUMMY_CALLING_APPID, subjectUserId), calling, target,
- otherUserId));
- }
- }
-
- // adds new user
- doAnswer(invocation -> {
- ((AppsFilter.StateProvider.CurrentStateCallback) invocation.getArgument(0))
- .currentState(mExisting, USER_INFO_LIST_WITH_ADDED);
- return new Object();
- }).when(mStateProvider)
- .runWithState(any(AppsFilter.StateProvider.CurrentStateCallback.class));
- appsFilter.onUserCreated(ADDED_USER);
-
- for (int subjectUserId : USER_ARRAY_WITH_ADDED) {
- for (int otherUserId : USER_ARRAY_WITH_ADDED) {
- assertFalse(appsFilter.shouldFilterApplication(
- UserHandle.getUid(DUMMY_CALLING_APPID, subjectUserId), calling, target,
- otherUserId));
- }
- }
- }
-
- @Test
public void testQueriesDifferentProvider_Filters() throws Exception {
final AppsFilter appsFilter =
new AppsFilter(mStateProvider, mFeatureConfigMock, new String[]{}, false, null,