summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java12
-rw-r--r--services/core/java/com/android/server/notification/PermissionHelper.java24
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java28
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java62
4 files changed, 113 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 65dcec702ef4..1eb66afc767a 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -6730,8 +6730,11 @@ public class NotificationManagerService extends SystemService {
handleSavePolicyFile();
}
- private void makeStickyHun(Notification notification) {
- notification.flags |= FLAG_FSI_REQUESTED_BUT_DENIED;
+ private void makeStickyHun(Notification notification, String pkg, @UserIdInt int userId) {
+ if (mPermissionHelper.hasRequestedPermission(
+ Manifest.permission.USE_FULL_SCREEN_INTENT, pkg, userId)) {
+ notification.flags |= FLAG_FSI_REQUESTED_BUT_DENIED;
+ }
if (notification.contentIntent == null) {
// On notification click, if contentIntent is null, SystemUI launches the
// fullScreenIntent instead.
@@ -6795,10 +6798,9 @@ public class NotificationManagerService extends SystemService {
SystemUiSystemPropertiesFlags.NotificationFlags.SHOW_STICKY_HUN_FOR_DENIED_FSI);
if (forceDemoteFsiToStickyHun) {
- makeStickyHun(notification);
+ makeStickyHun(notification, pkg, userId);
} else if (showStickyHunIfDenied) {
-
final AttributionSource source = new AttributionSource.Builder(notificationUid)
.setPackageName(pkg)
.build();
@@ -6807,7 +6809,7 @@ public class NotificationManagerService extends SystemService {
Manifest.permission.USE_FULL_SCREEN_INTENT, source, /* message= */ null);
if (permissionResult != PermissionManager.PERMISSION_GRANTED) {
- makeStickyHun(notification);
+ makeStickyHun(notification, pkg, userId);
}
} else {
diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java
index e6fd7ec06cdc..b6fd822b7687 100644
--- a/services/core/java/com/android/server/notification/PermissionHelper.java
+++ b/services/core/java/com/android/server/notification/PermissionHelper.java
@@ -78,6 +78,30 @@ public final class PermissionHelper {
}
/**
+ * Returns whether the given app requested the given permission. Must not be called
+ * with a lock held.
+ */
+ public boolean hasRequestedPermission(String permission, String pkg, @UserIdInt int userId) {
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ PackageInfo pi = mPackageManager.getPackageInfo(pkg, GET_PERMISSIONS, userId);
+ if (pi == null || pi.requestedPermissions == null) {
+ return false;
+ }
+ for (String perm : pi.requestedPermissions) {
+ if (permission.equals(perm)) {
+ return true;
+ }
+ }
+ } catch (RemoteException e) {
+ Slog.d(TAG, "Could not reach system server", e);
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ return false;
+ }
+
+ /**
* Returns all of the apps that have requested the notification permission in a given user.
* Must not be called with a lock held. Format: uid, packageName
*/
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 42d1ace37ba5..09b2485d3325 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -10462,8 +10462,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
verify(mMockNm, never()).notify(anyString(), anyInt(), any(Notification.class));
}
- private void verifyStickyHun(Flag flag, int permissionState, boolean isSticky)
- throws Exception {
+ private void verifyStickyHun(Flag flag, int permissionState, boolean appRequested,
+ boolean isSticky) throws Exception {
+
+ when(mPermissionHelper.hasRequestedPermission(Manifest.permission.USE_FULL_SCREEN_INTENT,
+ PKG, mUserId)).thenReturn(appRequested);
mTestFlagResolver.setFlagOverride(flag, true);
@@ -10491,7 +10494,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
throws Exception {
verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
- /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED,
+ /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED, true,
/* isSticky= */ true);
}
@@ -10500,16 +10503,25 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
throws Exception {
verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
- /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED,
+ /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED, true,
/* isSticky= */ true);
}
@Test
+ public void testFixNotification_fsiPermissionSoftDenied_appNotRequest_noShowStickyHun()
+ throws Exception {
+ verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
+ /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED, false,
+ /* isSticky= */ false);
+ }
+
+
+ @Test
public void testFixNotification_flagEnableStickyHun_fsiPermissionGranted_showFsi()
throws Exception {
verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
- /* permissionState= */ PermissionManager.PERMISSION_GRANTED,
+ /* permissionState= */ PermissionManager.PERMISSION_GRANTED, true,
/* isSticky= */ false);
}
@@ -10518,7 +10530,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
throws Exception {
verifyStickyHun(/* flag= */ FSI_FORCE_DEMOTE,
- /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED,
+ /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED, true,
/* isSticky= */ true);
}
@@ -10527,7 +10539,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
throws Exception {
verifyStickyHun(/* flag= */ FSI_FORCE_DEMOTE,
- /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED,
+ /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED, true,
/* isSticky= */ true);
}
@@ -10536,7 +10548,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
throws Exception {
verifyStickyHun(/* flag= */ FSI_FORCE_DEMOTE,
- /* permissionState= */ PermissionManager.PERMISSION_GRANTED,
+ /* permissionState= */ PermissionManager.PERMISSION_GRANTED, true,
/* isSticky= */ true);
}
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 f2b1dc9132d5..397e3c1f55a2 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
@@ -138,6 +138,68 @@ public class PermissionHelperTest extends UiServiceTestCase {
}
@Test
+ public void testHasRequestedPermission_otherPermission() throws Exception {
+ final String permission = "correct";
+
+ String packageName = "testHasRequestedPermission_otherPermission";
+
+ PackageInfo info = new PackageInfo();
+ info.packageName = packageName;
+ info.requestedPermissions = new String[]{"something else"};
+
+ when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+ assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isFalse();
+
+ }
+
+ @Test
+ public void testHasRequestedPermission_noPermissions() throws Exception {
+ final String permission = "correct";
+
+ String packageName = "testHasRequestedPermission_noPermissions";
+
+ PackageInfo info = new PackageInfo();
+ info.packageName = packageName;
+
+ when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+ assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isFalse();
+ }
+
+ @Test
+ public void testHasRequestedPermission_singlePermissions() throws Exception {
+ final String permission = "correct";
+
+ String packageName = "testHasRequestedPermission_twoPermissions";
+
+ PackageInfo info = new PackageInfo();
+ info.packageName = packageName;
+ info.requestedPermissions =
+ new String[]{permission};
+
+ when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+ assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isTrue();
+ }
+
+ @Test
+ public void testHasRequestedPermission_twoPermissions() throws Exception {
+ final String permission = "correct";
+
+ String packageName = "testHasRequestedPermission_twoPermissions";
+
+ PackageInfo info = new PackageInfo();
+ info.packageName = packageName;
+ info.requestedPermissions =
+ new String[]{"something else", permission};
+
+ when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+ assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isTrue();
+ }
+
+ @Test
public void testGetAppsGrantedPermission_noApps() throws Exception {
int userId = 1;
ParceledListSlice<PackageInfo> infos = ParceledListSlice.emptyList();