diff --git a/api/current.txt b/api/current.txt index c8fd8a33810f2..f4ef18dff63f2 100644 --- a/api/current.txt +++ b/api/current.txt @@ -27230,14 +27230,19 @@ package android.service.notification { method public final void cancelNotification(java.lang.String); method public final void cancelNotifications(java.lang.String[]); method public android.service.notification.StatusBarNotification[] getActiveNotifications(); + method public final int getCurrentListenerFlags(); method public android.service.notification.NotificationListenerService.RankingMap getCurrentRanking(); method public android.os.IBinder onBind(android.content.Intent); method public void onListenerConnected(); + method public void onListenerFlagsChanged(int); method public void onNotificationPosted(android.service.notification.StatusBarNotification); method public void onNotificationPosted(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap); method public void onNotificationRankingUpdate(android.service.notification.NotificationListenerService.RankingMap); method public void onNotificationRemoved(android.service.notification.StatusBarNotification); method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap); + method public final void requestListenerFlags(int); + field public static final int FLAG_DISABLE_HOST_ALERTS = 1; // 0x1 + field public static final int FLAG_NONE = 0; // 0x0 field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationListenerService"; } diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 5b92538fa4131..113c5330bc5aa 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -59,6 +59,8 @@ interface INotificationManager void cancelNotificationsFromListener(in INotificationListener token, in String[] keys); ParceledListSlice getActiveNotificationsFromListener(in INotificationListener token); + void requestFlagsFromListener(in INotificationListener token, int flags); + int getFlagsFromListener(in INotificationListener token); ZenModeConfig getZenModeConfig(); boolean setZenModeConfig(in ZenModeConfig config); diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl index b3705d83ab65b..19a8ef594508d 100644 --- a/core/java/android/service/notification/INotificationListener.aidl +++ b/core/java/android/service/notification/INotificationListener.aidl @@ -28,4 +28,5 @@ oneway interface INotificationListener void onNotificationRemoved(in StatusBarNotification notification, in NotificationRankingUpdate update); void onNotificationRankingUpdate(in NotificationRankingUpdate update); + void onListenerFlagsChanged(int flags); } \ No newline at end of file diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 7d5ff33dcffa0..1fc64e4d3e812 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -53,6 +53,12 @@ public abstract class NotificationListenerService extends Service { private final String TAG = NotificationListenerService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]"; + /** {@link #getCurrentListenerFlags() Listener flags} constant - default state. **/ + public static final int FLAG_NONE = 0; + /** {@link #getCurrentListenerFlags() Listener flags} constant - the primary device UI + * should disable notification sound, vibrating and other visual or aural effects. **/ + public static final int FLAG_DISABLE_HOST_ALERTS = 1; + private INotificationListenerWrapper mWrapper = null; private RankingMap mRankingMap; @@ -156,6 +162,16 @@ public abstract class NotificationListenerService extends Service { // optional } + /** + * Implement this method to be notified when the + * {@link #getCurrentListenerFlags() listener flags} change. + * + * @param flags The current {@link #getCurrentListenerFlags() listener flags}. + */ + public void onListenerFlagsChanged(int flags) { + // optional + } + private final INotificationManager getNotificationInterface() { if (mNoMan == null) { mNoMan = INotificationManager.Stub.asInterface( @@ -278,6 +294,46 @@ public abstract class NotificationListenerService extends Service { return null; } + /** + * Gets the set of flags representing current state. + * + *
+ * The current state may differ from the requested state if the flag represents state + * shared across all listeners or a feature the notification host does not support or refuses + * to grant. + * + * @return One or more of the FLAG_ constants. + */ + public final int getCurrentListenerFlags() { + if (!isBound()) return FLAG_NONE; + try { + return getNotificationInterface().getFlagsFromListener(mWrapper); + } catch (android.os.RemoteException ex) { + Log.v(TAG, "Unable to contact notification manager", ex); + return FLAG_NONE; + } + } + + /** + * Sets the desired {@link #getCurrentListenerFlags() listener flags}. + * + *
+ * This is merely a request, the host may or not choose to take action depending + * on other listener requests or other global state. + *
+ * Listen for updates using {@link #onListenerFlagsChanged(int)}.
+ *
+ * @param flags One or more of the FLAG_ constants.
+ */
+ public final void requestListenerFlags(int flags) {
+ if (!isBound()) return;
+ try {
+ getNotificationInterface().requestFlagsFromListener(mWrapper, flags);
+ } catch (android.os.RemoteException ex) {
+ Log.v(TAG, "Unable to contact notification manager", ex);
+ }
+ }
+
/**
* Returns current ranking information.
*
@@ -402,6 +458,14 @@ public abstract class NotificationListenerService extends Service {
}
}
}
+ @Override
+ public void onListenerFlagsChanged(int flags) throws RemoteException {
+ try {
+ NotificationListenerService.this.onListenerFlagsChanged(flags);
+ } catch (Throwable t) {
+ Log.w(TAG, "Error running onListenerFlagsChanged", t);
+ }
+ }
}
private void applyUpdate(NotificationRankingUpdate update) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index f69c066f2d4a4..a6711c3023e6d 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
+import static android.service.notification.NotificationListenerService.FLAG_DISABLE_HOST_ALERTS;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.END_TAG;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
@@ -71,6 +72,7 @@ import android.service.notification.ZenModeConfig;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.Log;
import android.util.Slog;
@@ -121,6 +123,7 @@ public class NotificationManagerService extends SystemService {
static final int MESSAGE_RECONSIDER_RANKING = 4;
static final int MESSAGE_RANKING_CONFIG_CHANGE = 5;
static final int MESSAGE_SEND_RANKING_UPDATE = 6;
+ static final int MESSAGE_LISTENER_FLAGS_CHANGED = 7;
static final int LONG_DELAY = 3500; // 3.5 seconds
static final int SHORT_DELAY = 2000; // 2 seconds
@@ -169,6 +172,9 @@ public class NotificationManagerService extends SystemService {
NotificationRecord mSoundNotification;
NotificationRecord mVibrateNotification;
+ private final ArraySet