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()))