diff options
| author | 2018-09-12 10:39:30 -0400 | |
|---|---|---|
| committer | 2018-09-13 14:04:18 -0400 | |
| commit | 4703bacf0018572431ca4ca3e44aade3aa6968ac (patch) | |
| tree | 4037d843cef0a0a48ebfa92897b40cadc5b58287 | |
| parent | d4bd94d644fbb8353ac362165963984e4c37d318 (diff) | |
Allow listeners to reset their requested hints.
Test: cts
Bug: 79340461
Change-Id: I55a3f55d69dd47078e9a2226616d2b89434d32d8
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); } } } |