diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 879fc9e6ceb7e..997f045ea8220 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2988,6 +2988,12 @@ + + true + 0x00000051 diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2e1c6c2afc788..ce78f850cb20e 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4765,5 +4765,6 @@ + diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index d65dc13b72e36..ee7f1f2f8befa 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -630,6 +630,7 @@ public class NotificationManagerService extends SystemService { private int mWarnRemoteViewsSizeBytes; private int mStripRemoteViewsSizeBytes; final boolean mEnableAppSettingMigration; + private boolean mForceUserSetOnUpgrade; private MetricsLogger mMetricsLogger; private TriPredicate mAllowedManagedServicePackages; @@ -2312,6 +2313,7 @@ public class NotificationManagerService extends SystemService { mMsgPkgsAllowedAsConvos = Set.of(getStringArrayResource( com.android.internal.R.array.config_notificationMsgPkgsAllowedAsConvos)); + mStatsManager = statsManager; mToastRateLimiter = toastRateLimiter; @@ -2404,6 +2406,9 @@ public class NotificationManagerService extends SystemService { WorkerHandler handler = new WorkerHandler(Looper.myLooper()); + mForceUserSetOnUpgrade = getContext().getResources().getBoolean( + R.bool.config_notificationForceUserSetOnUpgrade); + init(handler, new RankingHandlerWorker(mRankingThread.getLooper()), AppGlobals.getPackageManager(), getContext().getPackageManager(), getLocalService(LightsManager.class), @@ -2432,7 +2437,8 @@ public class NotificationManagerService extends SystemService { LocalServices.getService(ActivityManagerInternal.class), createToastRateLimiter(), new PermissionHelper(LocalServices.getService( PermissionManagerServiceInternal.class), AppGlobals.getPackageManager(), - AppGlobals.getPermissionManager(), mEnableAppSettingMigration), + AppGlobals.getPermissionManager(), mEnableAppSettingMigration, + mForceUserSetOnUpgrade), LocalServices.getService(UsageStatsManagerInternal.class)); publishBinderService(Context.NOTIFICATION_SERVICE, mService, /* allowIsolated= */ false, @@ -6086,6 +6092,7 @@ public class NotificationManagerService extends SystemService { pw.println(" mMaxPackageEnqueueRate=" + mMaxPackageEnqueueRate); pw.println(" hideSilentStatusBar=" + mPreferencesHelper.shouldHideSilentStatusIcons()); + pw.println(" mForceUserSetOnUpgrade=" + mForceUserSetOnUpgrade); } pw.println(" mArchive=" + mArchive.toString()); mArchive.dumpImpl(pw, filter); diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java index e551f1056b24f..b4230c11bcab3 100644 --- a/services/core/java/com/android/server/notification/PermissionHelper.java +++ b/services/core/java/com/android/server/notification/PermissionHelper.java @@ -57,13 +57,16 @@ public final class PermissionHelper { private final IPermissionManager mPermManager; // TODO (b/194833441): Remove when the migration is enabled private final boolean mMigrationEnabled; + private final boolean mForceUserSetOnUpgrade; public PermissionHelper(PermissionManagerServiceInternal pmi, IPackageManager packageManager, - IPermissionManager permManager, boolean migrationEnabled) { + IPermissionManager permManager, boolean migrationEnabled, + boolean forceUserSetOnUpgrade) { mPmi = pmi; mPackageManager = packageManager; mPermManager = permManager; mMigrationEnabled = migrationEnabled; + mForceUserSetOnUpgrade = forceUserSetOnUpgrade; } public boolean isMigrationEnabled() { @@ -223,8 +226,9 @@ public final class PermissionHelper { return; } if (!isPermissionFixed(pkgPerm.packageName, pkgPerm.userId)) { + boolean userSet = mForceUserSetOnUpgrade ? true : pkgPerm.userModifiedSettings; setNotificationPermission(pkgPerm.packageName, pkgPerm.userId, pkgPerm.granted, - pkgPerm.userSet, !pkgPerm.userSet); + userSet, !userSet); } } @@ -305,13 +309,13 @@ public final class PermissionHelper { public final String packageName; public final @UserIdInt int userId; public final boolean granted; - public final boolean userSet; + public final boolean userModifiedSettings; public PackagePermission(String pkg, int userId, boolean granted, boolean userSet) { this.packageName = pkg; this.userId = userId; this.granted = granted; - this.userSet = userSet; + this.userModifiedSettings = userSet; } @Override @@ -319,13 +323,14 @@ public final class PermissionHelper { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PackagePermission that = (PackagePermission) o; - return userId == that.userId && granted == that.granted && userSet == that.userSet + return userId == that.userId && granted == that.granted && userModifiedSettings + == that.userModifiedSettings && Objects.equals(packageName, that.packageName); } @Override public int hashCode() { - return Objects.hash(packageName, userId, granted, userSet); + return Objects.hash(packageName, userId, granted, userModifiedSettings); } @Override @@ -334,7 +339,7 @@ public final class PermissionHelper { "packageName='" + packageName + '\'' + ", userId=" + userId + ", granted=" + granted + - ", userSet=" + userSet + + ", userSet=" + userModifiedSettings + '}'; } } 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 50151bfb71917..46b47f4dcfdd9 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java @@ -88,7 +88,7 @@ public class PermissionHelperTest extends UiServiceTestCase { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mPermissionHelper = new PermissionHelper(mPmi, mPackageManager, mPermManager, true); + mPermissionHelper = new PermissionHelper(mPmi, mPackageManager, mPermManager, true, false); PackageInfo testPkgInfo = new PackageInfo(); testPkgInfo.requestedPermissions = new String[]{ Manifest.permission.POST_NOTIFICATIONS }; when(mPackageManager.getPackageInfo(anyString(), anyLong(), anyInt())) @@ -100,7 +100,7 @@ public class PermissionHelperTest extends UiServiceTestCase { public void testMethodsThrowIfMigrationDisabled() throws IllegalAccessException, InvocationTargetException { PermissionHelper permHelper = - new PermissionHelper(mPmi, mPackageManager, mPermManager, false); + new PermissionHelper(mPmi, mPackageManager, mPermManager, false, false); Method[] allMethods = PermissionHelper.class.getDeclaredMethods(); for (Method method : allMethods) { @@ -301,6 +301,26 @@ public class PermissionHelperTest extends UiServiceTestCase { FLAG_PERMISSION_USER_SET, true, 10); } + @Test + public void testSetNotificationPermission_pkgPerm_grantedByDefaultPermSet_allUserSet() + throws Exception { + mPermissionHelper = new PermissionHelper(mPmi, mPackageManager, mPermManager, true, true); + when(mPmi.checkPermission(anyString(), anyString(), anyInt())) + .thenReturn(PERMISSION_DENIED); + when(mPermManager.getPermissionFlags(anyString(), + eq(Manifest.permission.POST_NOTIFICATIONS), + anyInt())).thenReturn(FLAG_PERMISSION_GRANTED_BY_DEFAULT); + PermissionHelper.PackagePermission pkgPerm = new PermissionHelper.PackagePermission( + "pkg", 10, true, false); + + mPermissionHelper.setNotificationPermission(pkgPerm); + verify(mPermManager).grantRuntimePermission( + "pkg", Manifest.permission.POST_NOTIFICATIONS, 10); + verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS, + FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_REVIEW_REQUIRED, + FLAG_PERMISSION_USER_SET, true, 10); + } + @Test public void testSetNotificationPermission_revokeUserSet() throws Exception { when(mPmi.checkPermission(anyString(), anyString(), anyInt()))