From 60748e7122c6cfbcebcf4a283d1a78ca796d07a7 Mon Sep 17 00:00:00 2001 From: Christoph Studer Date: Thu, 22 May 2014 16:51:41 +0200 Subject: [PATCH] SysUI: Implement NotificationListenerService in StatusBar This is currently disabled by constant that is off. Bug: 15131411 Change-Id: I0da6e5b3b81c87004f0794d3056c4cf0ecbb1d61 --- .../systemui/statusbar/BaseStatusBar.java | 94 ++++++++++++++++++- .../statusbar/InterceptedNotifications.java | 8 +- .../statusbar/phone/PhoneStatusBar.java | 4 +- .../systemui/statusbar/tv/TvStatusBar.java | 8 ++ 4 files changed, 103 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 0495f46f9e13a..b244ae18ef1d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -22,6 +22,7 @@ import android.app.Notification; import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -46,6 +47,7 @@ import android.os.UserManager; import android.provider.Settings; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; +import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.text.TextUtils; import android.util.Log; @@ -79,6 +81,7 @@ import com.android.systemui.statusbar.phone.KeyguardTouchDelegate; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import java.util.ArrayList; +import java.util.Arrays; import java.util.Locale; public abstract class BaseStatusBar extends SystemUI implements @@ -86,6 +89,7 @@ public abstract class BaseStatusBar extends SystemUI implements public static final String TAG = "StatusBar"; public static final boolean DEBUG = false; public static final boolean MULTIUSER_DEBUG = false; + private static final boolean USE_NOTIFICATION_LISTENER = false; protected static final int MSG_SHOW_RECENT_APPS = 1019; protected static final int MSG_HIDE_RECENT_APPS = 1020; @@ -158,6 +162,7 @@ public abstract class BaseStatusBar extends SystemUI implements protected WindowManager mWindowManager; protected IWindowManager mWindowManagerService; + protected abstract void refreshLayout(int layoutDirection); protected Display mDisplay; @@ -253,6 +258,49 @@ public abstract class BaseStatusBar extends SystemUI implements } }; + private final NotificationListenerService mNotificationListener = + new NotificationListenerService() { + @Override + public void onListenerConnected() { + if (DEBUG) Log.d(TAG, "onListenerConnected"); + final StatusBarNotification[] notifications = getActiveNotifications(); + mHandler.post(new Runnable() { + @Override + public void run() { + for (StatusBarNotification sbn : notifications) { + addNotificationInternal(sbn); + } + } + }); + } + + @Override + public void onNotificationPosted(final StatusBarNotification sbn) { + if (DEBUG) Log.d(TAG, "onNotificationPosted: " + sbn); + mHandler.post(new Runnable() { + @Override + public void run() { + if (mNotificationData.findByKey(sbn.getKey()) != null) { + updateNotificationInternal(sbn); + } else { + addNotificationInternal(sbn); + } + } + }); + } + + @Override + public void onNotificationRemoved(final StatusBarNotification sbn) { + if (DEBUG) Log.d(TAG, "onNotificationRemoved: " + sbn); + mHandler.post(new Runnable() { + @Override + public void run() { + removeNotificationInternal(sbn.getKey()); + } + }); + } + }; + private void updateCurrentProfilesCache() { synchronized (mCurrentProfiles) { mCurrentProfiles.clear(); @@ -332,11 +380,22 @@ public abstract class BaseStatusBar extends SystemUI implements } // Set up the initial notification state. - N = notifications.size(); - for (int i=0; i