diff --git a/api/current.txt b/api/current.txt index 30d302093272b..743ce07e97633 100644 --- a/api/current.txt +++ b/api/current.txt @@ -33549,6 +33549,8 @@ package android.service.notification { method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap); method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); + method public static final void requestRebind(android.content.ComponentName) throws android.os.RemoteException; + method public final void requestUnbind() throws android.os.RemoteException; method public final void setNotificationsShown(java.lang.String[]); field public static final java.lang.String CATEGORY_VR_NOTIFICATIONS = "android.intent.category.vr.notifications"; field public static final int HINT_HOST_DISABLE_EFFECTS = 1; // 0x1 diff --git a/api/system-current.txt b/api/system-current.txt index d7393b738d140..fa3eaa2e184d4 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -35694,6 +35694,8 @@ package android.service.notification { method public void registerAsSystemService(android.content.Context, android.content.ComponentName, int) throws android.os.RemoteException; method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); + method public static final void requestRebind(android.content.ComponentName) throws android.os.RemoteException; + method public final void requestUnbind() throws android.os.RemoteException; method public final void setNotificationsShown(java.lang.String[]); method public final void setOnNotificationPostedTrim(int); method public void unregisterAsSystemService() throws android.os.RemoteException; diff --git a/api/test-current.txt b/api/test-current.txt index 9058fe7d8b888..3667ce5ad601f 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -33552,6 +33552,8 @@ package android.service.notification { method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap); method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); + method public static final void requestRebind(android.content.ComponentName) throws android.os.RemoteException; + method public final void requestUnbind() throws android.os.RemoteException; method public final void setNotificationsShown(java.lang.String[]); field public static final java.lang.String CATEGORY_VR_NOTIFICATIONS = "android.intent.category.vr.notifications"; field public static final int HINT_HOST_DISABLE_EFFECTS = 1; // 0x1 diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index e60cb0377e962..633f6995b9863 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -68,6 +68,9 @@ interface INotificationManager void cancelNotificationFromListener(in INotificationListener token, String pkg, String tag, int id); void cancelNotificationsFromListener(in INotificationListener token, in String[] keys); + void requestBindListener(in ComponentName component); + void requestUnbindListener(in INotificationListener token); + void setNotificationsShownFromListener(in INotificationListener token, in String[] keys); ParceledListSlice getActiveNotificationsFromListener(in INotificationListener token, in String[] keys, int trim); diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java index 3a8956ec15d9f..aba82fad0bfa7 100644 --- a/core/java/android/service/notification/NotificationAssistantService.java +++ b/core/java/android/service/notification/NotificationAssistantService.java @@ -17,13 +17,18 @@ package android.service.notification; import android.annotation.SdkConstant; +import android.annotation.SystemApi; +import android.app.INotificationManager; import android.app.Notification; +import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; +import android.os.ServiceManager; import android.util.Log; /** diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 6c99489d77090..47a3f5efedbf5 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -690,6 +690,36 @@ public abstract class NotificationListenerService extends Service { } } + /** + * Request that the listener be rebound, after a previous call to (@link requestUnbind). + * + *
This method will fail for assistants that have + * not been granted the permission by the user. + * + *
The service should wait for the {@link #onListenerConnected()} event + * before performing any operations. + */ + public static final void requestRebind(ComponentName componentName) + throws RemoteException { + INotificationManager noMan = INotificationManager.Stub.asInterface( + ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + noMan.requestBindListener(componentName); + } + + /** + * Request that the service be unbound. + * + *
This will no longer receive updates until
+ * {@link #requestRebind(ComponentName)} is called.
+ * The service will likely be kiled by the system after this call.
+ */
+ public final void requestUnbind() throws RemoteException {
+ if (mWrapper != null) {
+ INotificationManager noMan = getNotificationInterface();
+ noMan.requestUnbindListener(mWrapper);
+ }
+ }
+
/** Convert new-style Icons to legacy representations for pre-M clients. */
private void createLegacyIconExtras(Notification n) {
Icon smallIcon = n.getSmallIcon();
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 09e66475c1be0..f360dc2c42830 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -86,7 +86,7 @@ abstract public class ManagedServices {
protected final ArrayList