diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 99fdb2d884f39..f65deebdaf529 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5073,7 +5073,7 @@ public class NotificationManagerService extends SystemService { final DumpFilter filter = DumpFilter.parseFromArguments(args); final long token = Binder.clearCallingIdentity(); try { - final ArrayMap, Boolean> pkgPermissions = + final ArrayMap, Pair> pkgPermissions = getAllUsersNotificationPermissions(); if (filter.stats) { dumpJson(pw, filter, pkgPermissions); @@ -5911,17 +5911,18 @@ public class NotificationManagerService extends SystemService { // Returns a single map containing that info keyed by (uid, package name) for all users. // Because this calls into mPermissionHelper, this method must never be called with a lock held. @VisibleForTesting - protected ArrayMap, Boolean> getAllUsersNotificationPermissions() { + protected ArrayMap, Pair> + getAllUsersNotificationPermissions() { // don't bother if migration is not enabled if (!mEnableAppSettingMigration) { return null; } - ArrayMap, Boolean> allPermissions = new ArrayMap<>(); + ArrayMap, Pair> allPermissions = new ArrayMap<>(); final List allUsers = mUm.getUsers(); // for each of these, get the package notification permissions that are associated // with this user and add it to the map for (UserInfo ui : allUsers) { - ArrayMap, Boolean> userPermissions = + ArrayMap, Pair> userPermissions = mPermissionHelper.getNotificationPermissionValues( ui.getUserHandle().getIdentifier()); for (Pair pair : userPermissions.keySet()) { @@ -5932,7 +5933,7 @@ public class NotificationManagerService extends SystemService { } private void dumpJson(PrintWriter pw, @NonNull DumpFilter filter, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { JSONObject dump = new JSONObject(); try { dump.put("service", "Notification Manager"); @@ -5956,7 +5957,7 @@ public class NotificationManagerService extends SystemService { } private void dumpProto(FileDescriptor fd, @NonNull DumpFilter filter, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { final ProtoOutputStream proto = new ProtoOutputStream(fd); synchronized (mNotificationLock) { int N = mNotificationList.size(); @@ -6047,7 +6048,7 @@ public class NotificationManagerService extends SystemService { } void dumpImpl(PrintWriter pw, @NonNull DumpFilter filter, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { pw.print("Current Notification Manager state"); if (filter.filtered) { pw.print(" (filtered to "); pw.print(filter); pw.print(")"); diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java index f53bb756265cb..e64ec7792fcde 100644 --- a/services/core/java/com/android/server/notification/PermissionHelper.java +++ b/services/core/java/com/android/server/notification/PermissionHelper.java @@ -36,10 +36,8 @@ import android.util.Slog; import com.android.server.pm.permission.PermissionManagerServiceInternal; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Set; @@ -139,15 +137,17 @@ public final class PermissionHelper { return granted; } + // Key: (uid, package name); Value: (granted, user set) public @NonNull - ArrayMap, Boolean> getNotificationPermissionValues( - int userId) { + ArrayMap, Pair> + getNotificationPermissionValues(int userId) { assertFlag(); - ArrayMap, Boolean> notifPermissions = new ArrayMap<>(); + ArrayMap, Pair> notifPermissions = new ArrayMap<>(); Set> allRequestingUids = getAppsRequestingPermission(userId); Set> allApprovedUids = getAppsGrantedPermission(userId); for (Pair pair : allRequestingUids) { - notifPermissions.put(pair, allApprovedUids.contains(pair)); + notifPermissions.put(pair, new Pair(allApprovedUids.contains(pair), + isPermissionUserSet(pair.second /* package name */, userId))); } return notifPermissions; } @@ -196,6 +196,18 @@ public final class PermissionHelper { return false; } + boolean isPermissionUserSet(String packageName, @UserIdInt int userId) { + assertFlag(); + try { + int flags = mPermManager.getPermissionFlags(packageName, NOTIFICATION_PERMISSION, + userId); + return (flags & PackageManager.FLAG_PERMISSION_USER_SET) != 0; + } catch (RemoteException e) { + Slog.e(TAG, "Could not reach system server", e); + } + return false; + } + private void assertFlag() { if (!mMigrationEnabled) { throw new IllegalStateException("Method called without checking flag value"); diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 4e1279c598b73..49e223cb6a3d5 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -557,7 +557,7 @@ public class PreferencesHelper implements RankingConfig { out.attributeBoolean(null, ATT_HIDE_SILENT, mHideSilentStatusBarIcons); out.endTag(null, TAG_STATUS_ICONS); } - ArrayMap, Boolean> notifPermissions = new ArrayMap<>(); + ArrayMap, Pair> notifPermissions = new ArrayMap<>(); if (mPermissionHelper.isMigrationEnabled() && forBackup) { notifPermissions = mPermissionHelper.getNotificationPermissionValues(userId); } @@ -573,9 +573,8 @@ public class PreferencesHelper implements RankingConfig { out.attribute(null, ATT_NAME, r.pkg); if (!notifPermissions.isEmpty()) { Pair app = new Pair(r.uid, r.pkg); - out.attributeInt(null, ATT_IMPORTANCE, notifPermissions.get(app) - ? IMPORTANCE_DEFAULT - : IMPORTANCE_NONE); + out.attributeInt(null, ATT_IMPORTANCE, + notifPermissions.get(app).first ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); notifPermissions.remove(app); } else { if (r.importance != DEFAULT_IMPORTANCE) { @@ -642,7 +641,7 @@ public class PreferencesHelper implements RankingConfig { out.startTag(null, TAG_PACKAGE); out.attribute(null, ATT_NAME, app.second); out.attributeInt(null, ATT_IMPORTANCE, - notifPermissions.get(app) ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); + notifPermissions.get(app).first ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); out.endTag(null, TAG_PACKAGE); } } @@ -1932,7 +1931,7 @@ public class PreferencesHelper implements RankingConfig { public void dump(PrintWriter pw, String prefix, @NonNull NotificationManagerService.DumpFilter filter, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { pw.print(prefix); pw.println("per-package config version: " + XML_VERSION); @@ -1946,7 +1945,7 @@ public class PreferencesHelper implements RankingConfig { public void dump(ProtoOutputStream proto, @NonNull NotificationManagerService.DumpFilter filter, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { synchronized (mPackagePreferences) { dumpPackagePreferencesLocked(proto, RankingHelperProto.RECORDS, filter, mPackagePreferences, pkgPermissions); @@ -1958,7 +1957,7 @@ public class PreferencesHelper implements RankingConfig { private void dumpPackagePreferencesLocked(PrintWriter pw, String prefix, @NonNull NotificationManagerService.DumpFilter filter, ArrayMap packagePreferences, - ArrayMap, Boolean> packagePermissions) { + ArrayMap, Pair> packagePermissions) { // Used for tracking which package preferences we've seen already for notification // permission reasons; after handling packages with local preferences, we'll want to dump // the ones with notification permissions set but not local prefs. @@ -1987,8 +1986,10 @@ public class PreferencesHelper implements RankingConfig { if (packagePermissions != null && pkgsWithPermissionsToHandle.contains(key)) { pw.print(" importance="); pw.print(NotificationListenerService.Ranking.importanceToString( - packagePermissions.get(key) + packagePermissions.get(key).first ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE)); + pw.print(" userSet="); + pw.print(packagePermissions.get(key).second); pkgsWithPermissionsToHandle.remove(key); } } @@ -2042,7 +2043,10 @@ public class PreferencesHelper implements RankingConfig { pw.print(')'); pw.print(" importance="); pw.print(NotificationListenerService.Ranking.importanceToString( - packagePermissions.get(p) ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE)); + packagePermissions.get(p).first + ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE)); + pw.print(" userSet="); + pw.print(packagePermissions.get(p).second); pw.println(); } } @@ -2052,7 +2056,7 @@ public class PreferencesHelper implements RankingConfig { private void dumpPackagePreferencesLocked(ProtoOutputStream proto, long fieldId, @NonNull NotificationManagerService.DumpFilter filter, ArrayMap packagePreferences, - ArrayMap, Boolean> packagePermissions) { + ArrayMap, Pair> packagePermissions) { Set> pkgsWithPermissionsToHandle = null; if (packagePermissions != null) { pkgsWithPermissionsToHandle = packagePermissions.keySet(); @@ -2071,7 +2075,8 @@ public class PreferencesHelper implements RankingConfig { Pair key = new Pair<>(r.uid, r.pkg); if (packagePermissions != null && pkgsWithPermissionsToHandle.contains(key)) { proto.write(RankingHelperProto.RecordProto.IMPORTANCE, - packagePermissions.get(key) ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); + packagePermissions.get(key).first + ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); pkgsWithPermissionsToHandle.remove(key); } } else { @@ -2099,7 +2104,8 @@ public class PreferencesHelper implements RankingConfig { proto.write(RankingHelperProto.RecordProto.PACKAGE, p.second); proto.write(RankingHelperProto.RecordProto.UID, p.first); proto.write(RankingHelperProto.RecordProto.IMPORTANCE, - packagePermissions.get(p) ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); + packagePermissions.get(p).first + ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); proto.end(fToken); } } @@ -2110,7 +2116,7 @@ public class PreferencesHelper implements RankingConfig { * Fills out {@link PackageNotificationPreferences} proto and wraps it in a {@link StatsEvent}. */ public void pullPackagePreferencesStats(List events, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { Set> pkgsWithPermissionsToHandle = null; if (pkgPermissions != null) { pkgsWithPermissionsToHandle = pkgPermissions.keySet(); @@ -2134,7 +2140,8 @@ public class PreferencesHelper implements RankingConfig { int importance = IMPORTANCE_NONE; Pair key = new Pair<>(r.uid, r.pkg); if (pkgPermissions != null && pkgsWithPermissionsToHandle.contains(key)) { - importance = pkgPermissions.get(key) ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE; + importance = pkgPermissions.get(key).first + ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE; pkgsWithPermissionsToHandle.remove(key); } event.writeInt(importance); @@ -2158,7 +2165,7 @@ public class PreferencesHelper implements RankingConfig { .setAtomId(PACKAGE_NOTIFICATION_PREFERENCES); event.writeInt(p.first); event.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true); - event.writeInt(pkgPermissions.get(p) ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); + event.writeInt(pkgPermissions.get(p).first ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE); // fill out the rest of the fields with default values so as not to confuse the // builder @@ -2236,7 +2243,7 @@ public class PreferencesHelper implements RankingConfig { } public JSONObject dumpJson(NotificationManagerService.DumpFilter filter, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { JSONObject ranking = new JSONObject(); JSONArray PackagePreferencess = new JSONArray(); try { @@ -2266,7 +2273,7 @@ public class PreferencesHelper implements RankingConfig { && pkgsWithPermissionsToHandle.contains(key)) { PackagePreferences.put("importance", NotificationListenerService.Ranking.importanceToString( - pkgPermissions.get(key) + pkgPermissions.get(key).first ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE)); pkgsWithPermissionsToHandle.remove(key); } @@ -2316,7 +2323,7 @@ public class PreferencesHelper implements RankingConfig { PackagePreferences.put("packageName", p.second); PackagePreferences.put("importance", NotificationListenerService.Ranking.importanceToString( - pkgPermissions.get(p) + pkgPermissions.get(p).first ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE)); } catch (JSONException e) { // pass @@ -2344,7 +2351,7 @@ public class PreferencesHelper implements RankingConfig { * @return */ public JSONArray dumpBansJson(NotificationManagerService.DumpFilter filter, - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { JSONArray bans = new JSONArray(); Map packageBans = mPermissionHelper.isMigrationEnabled() ? getPermissionBasedPackageBans(pkgPermissions) : getPackageBans(); @@ -2383,11 +2390,11 @@ public class PreferencesHelper implements RankingConfig { // Same functionality as getPackageBans by extracting the set of packages from the provided // map that are disallowed from sending notifications. protected Map getPermissionBasedPackageBans( - ArrayMap, Boolean> pkgPermissions) { + ArrayMap, Pair> pkgPermissions) { ArrayMap packageBans = new ArrayMap<>(); if (pkgPermissions != null) { for (Pair p : pkgPermissions.keySet()) { - if (!pkgPermissions.get(p)) { + if (!pkgPermissions.get(p).first) { packageBans.put(p.first, p.second); } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java index 29ef339a6382a..d3faad7fc8dc3 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java @@ -839,21 +839,25 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase { when(mUm.getUsers()).thenReturn(userInfos); // construct the permissions for each of them - ArrayMap, Boolean> permissions0 = new ArrayMap<>(), + ArrayMap, Pair> permissions0 = new ArrayMap<>(), permissions1 = new ArrayMap<>(); - permissions0.put(new Pair<>(10, "package1"), true); - permissions0.put(new Pair<>(20, "package2"), false); - permissions1.put(new Pair<>(11, "package1"), false); - permissions1.put(new Pair<>(21, "package2"), true); + permissions0.put(new Pair<>(10, "package1"), new Pair<>(true, false)); + permissions0.put(new Pair<>(20, "package2"), new Pair<>(false, true)); + permissions1.put(new Pair<>(11, "package1"), new Pair<>(false, false)); + permissions1.put(new Pair<>(21, "package2"), new Pair<>(true, true)); when(mPermissionHelper.getNotificationPermissionValues(0)).thenReturn(permissions0); when(mPermissionHelper.getNotificationPermissionValues(1)).thenReturn(permissions1); when(mPermissionHelper.getNotificationPermissionValues(2)).thenReturn(new ArrayMap<>()); - ArrayMap, Boolean> combinedPermissions = + ArrayMap, Pair> combinedPermissions = mService.getAllUsersNotificationPermissions(); - assertTrue(combinedPermissions.get(new Pair<>(10, "package1"))); - assertFalse(combinedPermissions.get(new Pair<>(20, "package2"))); - assertFalse(combinedPermissions.get(new Pair<>(11, "package1"))); - assertTrue(combinedPermissions.get(new Pair<>(21, "package2"))); + assertTrue(combinedPermissions.get(new Pair<>(10, "package1")).first); + assertFalse(combinedPermissions.get(new Pair<>(10, "package1")).second); + assertFalse(combinedPermissions.get(new Pair<>(20, "package2")).first); + assertTrue(combinedPermissions.get(new Pair<>(20, "package2")).second); + assertFalse(combinedPermissions.get(new Pair<>(11, "package1")).first); + assertFalse(combinedPermissions.get(new Pair<>(11, "package1")).second); + assertTrue(combinedPermissions.get(new Pair<>(21, "package2")).first); + assertTrue(combinedPermissions.get(new Pair<>(21, "package2")).second); } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java index 4cdae88604093..bb35c79861717 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java @@ -42,7 +42,6 @@ import android.content.pm.ParceledListSlice; import android.permission.IPermissionManager; import android.test.suitebuilder.annotation.SmallTest; import android.util.Pair; -import android.util.Slog; import androidx.test.runner.AndroidJUnit4; @@ -312,11 +311,22 @@ public class PermissionHelperTest extends UiServiceTestCase { when(mPackageManager.getInstalledPackages(eq(GET_PERMISSIONS), anyInt())) .thenReturn(requesting); - Map, Boolean> expected = ImmutableMap.of(new Pair(1, "first"), true, - new Pair(2, "second"), true, - new Pair(3, "third"), false); + // 2 and 3 are user-set permissions + when(mPermManager.getPermissionFlags( + "first", Manifest.permission.POST_NOTIFICATIONS, userId)).thenReturn(0); + when(mPermManager.getPermissionFlags( + "second", Manifest.permission.POST_NOTIFICATIONS, userId)) + .thenReturn(FLAG_PERMISSION_USER_SET); + when(mPermManager.getPermissionFlags( + "third", Manifest.permission.POST_NOTIFICATIONS, userId)) + .thenReturn(FLAG_PERMISSION_USER_SET); - Map, Boolean> actual = + Map, Pair> expected = + ImmutableMap.of(new Pair(1, "first"), new Pair(true, false), + new Pair(2, "second"), new Pair(true, true), + new Pair(3, "third"), new Pair(false, true)); + + Map, Pair> actual = mPermissionHelper.getNotificationPermissionValues(userId); assertThat(actual).containsExactlyEntriesIn(expected); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index dd6d469ae15eb..c85e8768de0d3 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -707,12 +707,12 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mPermissionHelper, mLogger, mAppOpsManager, mStatsEventBuilderFactory); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); - appPermissions.put(new Pair(3, "third"), false); - appPermissions.put(new Pair(UID_P, PKG_P), true); - appPermissions.put(new Pair(UID_O, PKG_O), false); - appPermissions.put(new Pair(UID_N_MR1, PKG_N_MR1), true); + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); + appPermissions.put(new Pair(UID_P, PKG_P), new Pair(true, false)); + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); + appPermissions.put(new Pair(UID_N_MR1, PKG_N_MR1), new Pair(true, false)); when(mPermissionHelper.getNotificationPermissionValues(UserHandle.USER_SYSTEM)) .thenReturn(appPermissions); @@ -788,12 +788,12 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mPermissionHelper, mLogger, mAppOpsManager, mStatsEventBuilderFactory); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); - appPermissions.put(new Pair(3, "third"), false); - appPermissions.put(new Pair(UID_P, PKG_P), true); - appPermissions.put(new Pair(UID_O, PKG_O), false); - appPermissions.put(new Pair(UID_N_MR1, PKG_N_MR1), true); + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); + appPermissions.put(new Pair(UID_P, PKG_P), new Pair(true, false)); + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); + appPermissions.put(new Pair(UID_N_MR1, PKG_N_MR1), new Pair(true, false)); when(mPermissionHelper.getNotificationPermissionValues(UserHandle.USER_SYSTEM)) .thenReturn(appPermissions); @@ -875,9 +875,9 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mPermissionHelper, mLogger, mAppOpsManager, mStatsEventBuilderFactory); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(UID_P, PKG_P), true); - appPermissions.put(new Pair(UID_O, PKG_O), false); + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(UID_P, PKG_P), new Pair(true, false)); + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); when(mPermissionHelper.getNotificationPermissionValues(UserHandle.USER_SYSTEM)) .thenReturn(appPermissions); @@ -955,12 +955,12 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mPermissionHelper, mLogger, mAppOpsManager, mStatsEventBuilderFactory); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); - appPermissions.put(new Pair(3, "third"), false); - appPermissions.put(new Pair(UID_P, PKG_P), true); - appPermissions.put(new Pair(UID_O, PKG_O), false); - appPermissions.put(new Pair(UID_N_MR1, PKG_N_MR1), true); + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); + appPermissions.put(new Pair(UID_P, PKG_P), new Pair(true, false)); + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); + appPermissions.put(new Pair(UID_N_MR1, PKG_N_MR1), new Pair(true, false)); when(mPermissionHelper.getNotificationPermissionValues(UserHandle.USER_SYSTEM)) .thenReturn(appPermissions); @@ -2556,11 +2556,11 @@ public class PreferencesHelperTest extends UiServiceTestCase { // know about, those are ignored if migration is not enabled // package permissions map to be passed in - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_P, PKG_P), true); // in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_P, PKG_P), new Pair(true, false)); // in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs NotificationChannel channel1 = new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH); @@ -2618,11 +2618,11 @@ public class PreferencesHelperTest extends UiServiceTestCase { // know about, those should still be included // package permissions map to be passed in - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_P, PKG_P), true); // in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_P, PKG_P), new Pair(true, false)); // in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs NotificationChannel channel1 = new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH); @@ -2701,10 +2701,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { // not from the passed-in permissions map when(mPermissionHelper.isMigrationEnabled()).thenReturn(false); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // package preferences: only PKG_P is banned mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH); @@ -2726,10 +2726,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { // have their permission set to false, and not based on PackagePreferences importance when(mPermissionHelper.isMigrationEnabled()).thenReturn(true); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // package preferences: PKG_O not banned based on local importance, and PKG_P is mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH); @@ -2770,10 +2770,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { // confirm that the string resulting from dumpImpl contains only info from package prefs when(mPermissionHelper.isMigrationEnabled()).thenReturn(false); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, true)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // local package preferences: PKG_O is not banned even though the permissions would // indicate so @@ -2796,6 +2796,7 @@ public class PreferencesHelperTest extends UiServiceTestCase { ArrayList notExpected = new ArrayList<>(); notExpected.add("first (1) importance=DEFAULT"); notExpected.add("third (3) importance=NONE"); + notExpected.add("userSet="); // no user-set information pre migration for (String exp : expected) { assertTrue(actual.contains(exp)); @@ -2819,10 +2820,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { // confirm that the string resulting from dumpImpl contains only importances from permission when(mPermissionHelper.isMigrationEnabled()).thenReturn(true); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, true)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // local package preferences mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH); @@ -2837,9 +2838,9 @@ public class PreferencesHelperTest extends UiServiceTestCase { // expected (substring) output for each preference via permissions ArrayList expected = new ArrayList<>(); - expected.add("first (1) importance=DEFAULT"); - expected.add("third (3) importance=NONE"); - expected.add(PKG_O + " (" + UID_O + ") importance=NONE"); + expected.add("first (1) importance=DEFAULT userSet=false"); + expected.add("third (3) importance=NONE userSet=true"); + expected.add(PKG_O + " (" + UID_O + ") importance=NONE userSet=false"); expected.add(PKG_P + " (" + UID_P + ")"); // make sure we don't have package preference info @@ -2881,10 +2882,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { // test that dumping to proto gets the importances from the right place when(mPermissionHelper.isMigrationEnabled()).thenReturn(false); - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // local package preferences mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH); @@ -2921,10 +2922,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { when(mPermissionHelper.isMigrationEnabled()).thenReturn(true); // permissions -- these should take precedence - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // local package preferences mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH); @@ -4993,10 +4994,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { when(mPermissionHelper.isMigrationEnabled()).thenReturn(false); // build a collection of app permissions that should be passed in but ignored - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // package preferences: PKG_O not banned based on local importance, and PKG_P is mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH); @@ -5036,10 +5037,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { when(mPermissionHelper.isMigrationEnabled()).thenReturn(true); // build a collection of app permissions that should be passed in but ignored - ArrayMap, Boolean> appPermissions = new ArrayMap<>(); - appPermissions.put(new Pair(1, "first"), true); // not in local prefs - appPermissions.put(new Pair(3, "third"), false); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), false); // in local prefs + ArrayMap, Pair> appPermissions = new ArrayMap<>(); + appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs // package preferences: PKG_O not banned based on local importance, and PKG_P is mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH);