Merge "API: Expose whether bubbles are enabled or not" into sc-dev

This commit is contained in:
Mady Mellor
2021-03-31 16:53:16 +00:00
committed by Android (Google) Code Review
5 changed files with 59 additions and 1 deletions

View File

@@ -6202,6 +6202,7 @@ package android.app {
public class NotificationManager {
method public String addAutomaticZenRule(android.app.AutomaticZenRule);
method @Deprecated public boolean areBubblesAllowed();
method public boolean areBubblesEnabled();
method public boolean areNotificationsEnabled();
method public boolean areNotificationsPaused();
method public boolean canNotifyAsPackage(@NonNull String);

View File

@@ -85,6 +85,7 @@ interface INotificationManager
void setBubblesAllowed(String pkg, int uid, int bubblePreference);
boolean areBubblesAllowed(String pkg);
boolean areBubblesEnabled(in UserHandle user);
int getBubblePreferenceForPackage(String pkg, int uid);
void createNotificationChannelGroups(String pkg, in ParceledListSlice channelGroupList);

View File

@@ -1326,7 +1326,6 @@ public class NotificationManager {
}
}
/**
* Gets whether all notifications posted by this app can appear outside of the
* notification shade, floating over other apps' content.
@@ -1347,6 +1346,21 @@ public class NotificationManager {
}
}
/**
* Returns whether bubbles are enabled at the feature level for the current user. When enabled,
* notifications able to bubble will display an affordance allowing the user to bubble them.
*
* @see Notification.Builder#setBubbleMetadata(Notification.BubbleMetadata)
*/
public boolean areBubblesEnabled() {
INotificationManager service = getService();
try {
return service.areBubblesEnabled(mContext.getUser());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Gets the bubble preference for the app. This preference only applies to notifications that
* have been properly configured to bubble.

View File

@@ -3304,6 +3304,20 @@ public class NotificationManagerService extends SystemService {
== BUBBLE_PREFERENCE_ALL;
}
/**
* @return true if this user has bubbles enabled at the feature-level.
*/
@Override
public boolean areBubblesEnabled(UserHandle user) {
if (UserHandle.getCallingUserId() != user.getIdentifier()) {
getContext().enforceCallingPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS,
"areBubblesEnabled for user " + user.getIdentifier());
}
// TODO: incorporate uid / per-user prefs once settings moves off global table.
return mPreferencesHelper.bubblesEnabled();
}
@Override
public int getBubblePreferenceForPackage(String pkg, int uid) {
enforceSystemOrSystemUIOrSamePackage(pkg,

View File

@@ -4706,6 +4706,34 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
assertFalse(mBinderService.areBubblesAllowed(PKG));
}
@Test
public void testAreBubblesEnabled() throws Exception {
assertTrue(mBinderService.areBubblesEnabled(UserHandle.getUserHandleForUid(mUid)));
}
@Test
public void testAreBubblesEnabled_false() throws Exception {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.NOTIFICATION_BUBBLES, 0);
mService.mPreferencesHelper.updateBubblesEnabled();
assertFalse(mBinderService.areBubblesEnabled(UserHandle.getUserHandleForUid(mUid)));
}
@Test
public void testAreBubblesEnabled_exception() throws Exception {
try {
assertTrue(mBinderService.areBubblesEnabled(
UserHandle.getUserHandleForUid(mUid + UserHandle.PER_USER_RANGE)));
fail("Cannot call cross user without permission");
} catch (SecurityException e) {
// pass
}
// cross user, with permission, no problem
enableInteractAcrossUsers();
assertTrue(mBinderService.areBubblesEnabled(
UserHandle.getUserHandleForUid(mUid + UserHandle.PER_USER_RANGE)));
}
@Test
public void testIsCallerInstantApp_primaryUser() throws Exception {
ApplicationInfo info = new ApplicationInfo();