From d6e679f471ce4900d62e8fca32a7f44a832bb45f Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 1 Dec 2021 16:58:46 -0500 Subject: [PATCH] Add user-set boolean to notification permission values. This change allows for logs and dumps to collect whether any package bans were set by the user or not, and adds that info to the string (logcat) dump. This is also in preparation for adding this field to the PackageNotificationPreferences pulled atom (will be in a future CL). Bug: 194833441 Test: NotificationmanagerServiceTest, NotificationPermissionMigrationTest, PermissionHelperTest, PreferencesHelperTest Change-Id: Ic119522a7fedd1869697f320e57813292f4115ce --- .../NotificationManagerService.java | 15 +- .../server/notification/PermissionHelper.java | 24 +++- .../notification/PreferencesHelper.java | 51 ++++--- .../NotificationPermissionMigrationTest.java | 24 ++-- .../notification/PermissionHelperTest.java | 20 ++- .../notification/PreferencesHelperTest.java | 133 +++++++++--------- 6 files changed, 151 insertions(+), 116 deletions(-) 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);