summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Julia Reynolds <juliacr@google.com> 2018-09-12 10:39:30 -0400
committer Julia Reynolds <juliacr@google.com> 2018-09-13 14:04:18 -0400
commit4703bacf0018572431ca4ca3e44aade3aa6968ac (patch)
tree4037d843cef0a0a48ebfa92897b40cadc5b58287
parentd4bd94d644fbb8353ac362165963984e4c37d318 (diff)
Allow listeners to reset their requested hints.
Test: cts Bug: 79340461 Change-Id: I55a3f55d69dd47078e9a2226616d2b89434d32d8
-rwxr-xr-xapi/current.txt1
-rw-r--r--core/java/android/app/INotificationManager.aidl1
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java15
-rw-r--r--core/proto/android/service/notification.proto3
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java50
5 files changed, 51 insertions, 19 deletions
diff --git a/api/current.txt b/api/current.txt
index 2c2bc5f4d21c..41a2f90f057c 100755
--- a/api/current.txt
+++ b/api/current.txt
@@ -39565,6 +39565,7 @@ package android.service.notification {
method public final deprecated void cancelNotification(java.lang.String, java.lang.String, int);
method public final void cancelNotification(java.lang.String);
method public final void cancelNotifications(java.lang.String[]);
+ method public final void clearRequestedListenerHints();
method public android.service.notification.StatusBarNotification[] getActiveNotifications();
method public android.service.notification.StatusBarNotification[] getActiveNotifications(java.lang.String[]);
method public final int getCurrentInterruptionFilter();
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 4f004d93e3bf..357420bd0217 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -112,6 +112,7 @@ interface INotificationManager
ParceledListSlice getActiveNotificationsFromListener(in INotificationListener token, in String[] keys, int trim);
ParceledListSlice getSnoozedNotificationsFromListener(in INotificationListener token, int trim);
+ void clearRequestedListenerHints(in INotificationListener token);
void requestHintsFromListener(in INotificationListener token, int hints);
int getHintsFromListener(in INotificationListener token);
void requestInterruptionFilterFromListener(in INotificationListener token, int interruptionFilter);
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index d9ed2aafc9cd..3319c9ecb605 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -989,6 +989,21 @@ public abstract class NotificationListenerService extends Service {
}
/**
+ * Clears listener hints set via {@link #getCurrentListenerHints()}.
+ *
+ * <p>The service should wait for the {@link #onListenerConnected()} event
+ * before performing this operation.
+ */
+ public final void clearRequestedListenerHints() {
+ if (!isBound()) return;
+ try {
+ getNotificationInterface().clearRequestedListenerHints(mWrapper);
+ } catch (android.os.RemoteException ex) {
+ Log.v(TAG, "Unable to contact notification manager", ex);
+ }
+ }
+
+ /**
* Sets the desired {@link #getCurrentListenerHints() listener hints}.
*
* <p>
diff --git a/core/proto/android/service/notification.proto b/core/proto/android/service/notification.proto
index 25059bea8bfd..ccbd02764d7e 100644
--- a/core/proto/android/service/notification.proto
+++ b/core/proto/android/service/notification.proto
@@ -72,7 +72,8 @@ message ListenersDisablingEffectsProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
optional int32 hint = 1;
- repeated ManagedServiceInfoProto listeners = 2;
+ reserved 2; // ManagedServiceInfoProto listeners
+ repeated android.content.ComponentNameProto listener_components = 3;
}
message ManagedServiceInfoProto {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 03b7652e32ec..6e4d9e03f28f 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -345,7 +345,7 @@ public class NotificationManagerService extends SystemService {
private String mSoundNotificationKey;
private String mVibrateNotificationKey;
- private final SparseArray<ArraySet<ManagedServiceInfo>> mListenersDisablingEffects =
+ private final SparseArray<ArraySet<ComponentName>> mListenersDisablingEffects =
new SparseArray<>();
private List<ComponentName> mEffectsSuppressors = new ArrayList<>();
private int mListenerHints; // right now, all hints are global
@@ -1784,10 +1784,10 @@ public class NotificationManagerService extends SystemService {
private ArrayList<ComponentName> getSuppressors() {
ArrayList<ComponentName> names = new ArrayList<ComponentName>();
for (int i = mListenersDisablingEffects.size() - 1; i >= 0; --i) {
- ArraySet<ManagedServiceInfo> serviceInfoList = mListenersDisablingEffects.valueAt(i);
+ ArraySet<ComponentName> serviceInfoList = mListenersDisablingEffects.valueAt(i);
- for (ManagedServiceInfo info : serviceInfoList) {
- names.add(info.component);
+ for (ComponentName info : serviceInfoList) {
+ names.add(info);
}
}
@@ -1803,11 +1803,10 @@ public class NotificationManagerService extends SystemService {
for (int i = mListenersDisablingEffects.size() - 1; i >= 0; --i) {
final int hint = mListenersDisablingEffects.keyAt(i);
- final ArraySet<ManagedServiceInfo> listeners =
- mListenersDisablingEffects.valueAt(i);
+ final ArraySet<ComponentName> listeners = mListenersDisablingEffects.valueAt(i);
if (hints == 0 || (hint & hints) == hint) {
- removed = removed || listeners.remove(info);
+ removed |= listeners.remove(info.component);
}
}
@@ -1830,18 +1829,18 @@ public class NotificationManagerService extends SystemService {
private void addDisabledHint(ManagedServiceInfo info, int hint) {
if (mListenersDisablingEffects.indexOfKey(hint) < 0) {
- mListenersDisablingEffects.put(hint, new ArraySet<ManagedServiceInfo>());
+ mListenersDisablingEffects.put(hint, new ArraySet<>());
}
- ArraySet<ManagedServiceInfo> hintListeners = mListenersDisablingEffects.get(hint);
- hintListeners.add(info);
+ ArraySet<ComponentName> hintListeners = mListenersDisablingEffects.get(hint);
+ hintListeners.add(info.component);
}
private int calculateHints() {
int hints = 0;
for (int i = mListenersDisablingEffects.size() - 1; i >= 0; --i) {
int hint = mListenersDisablingEffects.keyAt(i);
- ArraySet<ManagedServiceInfo> serviceInfoList = mListenersDisablingEffects.valueAt(i);
+ ArraySet<ComponentName> serviceInfoList = mListenersDisablingEffects.valueAt(i);
if (!serviceInfoList.isEmpty()) {
hints |= hint;
@@ -2955,6 +2954,21 @@ public class NotificationManagerService extends SystemService {
}
@Override
+ public void clearRequestedListenerHints(INotificationListener token) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mNotificationLock) {
+ final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
+ removeDisabledHints(info);
+ updateListenerHintsLocked();
+ updateEffectsSuppressorLocked();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public void requestHintsFromListener(INotificationListener token, int hints) {
final long identity = Binder.clearCallingIdentity();
try {
@@ -3860,11 +3874,12 @@ public class NotificationManagerService extends SystemService {
proto.write(
ListenersDisablingEffectsProto.HINT, mListenersDisablingEffects.keyAt(i));
- final ArraySet<ManagedServiceInfo> listeners =
+ final ArraySet<ComponentName> listeners =
mListenersDisablingEffects.valueAt(i);
for (int j = 0; j < listeners.size(); j++) {
- final ManagedServiceInfo listener = listeners.valueAt(i);
- listener.writeToProto(proto, ListenersDisablingEffectsProto.LISTENERS, null);
+ final ComponentName componentName = listeners.valueAt(i);
+ componentName.writeToProto(proto,
+ ListenersDisablingEffectsProto.LISTENER_COMPONENTS);
}
proto.end(effectsToken);
@@ -4003,15 +4018,14 @@ public class NotificationManagerService extends SystemService {
if (i > 0) pw.print(';');
pw.print("hint[" + hint + "]:");
- final ArraySet<ManagedServiceInfo> listeners =
- mListenersDisablingEffects.valueAt(i);
+ final ArraySet<ComponentName> listeners = mListenersDisablingEffects.valueAt(i);
final int listenerSize = listeners.size();
for (int j = 0; j < listenerSize; j++) {
if (i > 0) pw.print(',');
- final ManagedServiceInfo listener = listeners.valueAt(i);
+ final ComponentName listener = listeners.valueAt(i);
if (listener != null) {
- pw.print(listener.component);
+ pw.print(listener);
}
}
}