From ff8dbe52eb3452df4d2cbd7af90483969bb061f4 Mon Sep 17 00:00:00 2001 From: Christoph Studer Date: Wed, 30 Apr 2014 17:32:52 +0200 Subject: [PATCH 1/2] Add userId to StatusBarNotification key Change-Id: Id2db95ec128b364c8a7df1272b2ee3144e3da3de --- .../android/service/notification/StatusBarNotification.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java index 72720d197f3d4..e7cdc4ea49e24 100644 --- a/core/java/android/service/notification/StatusBarNotification.java +++ b/core/java/android/service/notification/StatusBarNotification.java @@ -87,7 +87,7 @@ public class StatusBarNotification implements Parcelable { } private String key() { - return pkg + '|' + id + '|' + tag + '|' + uid; + return user.getIdentifier() + "|" + pkg + "|" + id + "|" + tag + "|" + uid; } public void writeToParcel(Parcel out, int flags) { From 03b87a2f40c26948b7b0c9409c33ad44857218cf Mon Sep 17 00:00:00 2001 From: Christoph Studer Date: Wed, 30 Apr 2014 17:33:27 +0200 Subject: [PATCH 2/2] Log notification clicks Emit notification_clicked log events when a notification is clicked from SystemUI. Also refactor the onNotificationClicked method to work with a key instead of individual notification params. Change-Id: Iffd15e95d46371b2ae7bfd00b2c348d9f4cf5d14 --- .../internal/statusbar/IStatusBarService.aidl | 2 +- .../systemui/statusbar/BaseStatusBar.java | 30 +++++++------------ .../com/android/server/EventLogTags.logtags | 2 ++ .../notification/NotificationDelegate.java | 3 +- .../NotificationManagerService.java | 18 ++++++++--- .../statusbar/StatusBarManagerService.java | 4 +-- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index 6428e150a52b9..caa6b987e83a0 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -42,7 +42,7 @@ interface IStatusBarService out int[] switches, out List binders); void onPanelRevealed(); void onPanelHidden(); - void onNotificationClick(String pkg, String tag, int id, int userId); + void onNotificationClick(String key); void onNotificationError(String pkg, String tag, int id, int uid, int initialPid, String message, int userId); void onClearAllNotifications(int userId); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 9149e2d82ad6f..360f4bf4570f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -768,8 +768,8 @@ public abstract class BaseStatusBar extends SystemUI implements PendingIntent contentIntent = sbn.getNotification().contentIntent; if (contentIntent != null) { - final View.OnClickListener listener = makeClicker(contentIntent, - sbn.getPackageName(), sbn.getTag(), sbn.getId(), isHeadsUp, sbn.getUserId()); + final View.OnClickListener listener = makeClicker(contentIntent, sbn.getKey(), + isHeadsUp); row.setOnClickListener(listener); } else { row.setOnClickListener(null); @@ -879,27 +879,20 @@ public abstract class BaseStatusBar extends SystemUI implements return true; } - public NotificationClicker makeClicker(PendingIntent intent, String pkg, String tag, - int id, boolean forHun, int userId) { - return new NotificationClicker(intent, pkg, tag, id, forHun, userId); + public NotificationClicker makeClicker(PendingIntent intent, String notificationKey, + boolean forHun) { + return new NotificationClicker(intent, notificationKey, forHun); } protected class NotificationClicker implements View.OnClickListener { private PendingIntent mIntent; - private String mPkg; - private String mTag; - private int mId; + private final String mNotificationKey; private boolean mIsHeadsUp; - private int mUserId; - public NotificationClicker(PendingIntent intent, String pkg, String tag, int id, - boolean forHun, int userId) { + public NotificationClicker(PendingIntent intent, String notificationKey, boolean forHun) { mIntent = intent; - mPkg = pkg; - mTag = tag; - mId = id; + mNotificationKey = notificationKey; mIsHeadsUp = forHun; - mUserId = userId; } public void onClick(View v) { @@ -935,7 +928,7 @@ public abstract class BaseStatusBar extends SystemUI implements if (mIsHeadsUp) { mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP); } - mBarService.onNotificationClick(mPkg, mTag, mId, mUserId); + mBarService.onNotificationClick(mNotificationKey); } catch (RemoteException ex) { // system process is dead if we're here. } @@ -1338,9 +1331,8 @@ public abstract class BaseStatusBar extends SystemUI implements // update the contentIntent final PendingIntent contentIntent = notification.getNotification().contentIntent; if (contentIntent != null) { - final View.OnClickListener listener = makeClicker(contentIntent, - notification.getPackageName(), notification.getTag(), notification.getId(), - isHeadsUp, notification.getUserId()); + final View.OnClickListener listener = makeClicker(contentIntent, notification.getKey(), + isHeadsUp); entry.row.setOnClickListener(listener); } else { entry.row.setOnClickListener(null); diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags index 5083d44d2d829..6fab37c275156 100644 --- a/services/core/java/com/android/server/EventLogTags.logtags +++ b/services/core/java/com/android/server/EventLogTags.logtags @@ -65,6 +65,8 @@ option java_package com.android.server 27501 notification_panel_hidden # when notifications are newly displayed on screen, or disappear from screen 27510 notification_visibility_changed (newlyVisibleKeys|3),(noLongerVisibleKeys|3) +# when a notification has been clicked +27520 notification_clicked (key|3) # --------------------------- # Watchdog.java diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java index ce4c1ed98e37a..b41b47815c73a 100644 --- a/services/core/java/com/android/server/notification/NotificationDelegate.java +++ b/services/core/java/com/android/server/notification/NotificationDelegate.java @@ -21,8 +21,7 @@ import android.os.IBinder; public interface NotificationDelegate { void onSetDisabled(int status); void onClearAll(int callingUid, int callingPid, int userId); - void onNotificationClick(int callingUid, int callingPid, - String pkg, String tag, int id, int userId); + void onNotificationClick(int callingUid, int callingPid, String key); void onNotificationClear(int callingUid, int callingPid, String pkg, String tag, int id, int userId); void onNotificationError(int callingUid, int callingPid, diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 6e4eb565670f3..76b4c892d7296 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -602,10 +602,20 @@ public class NotificationManagerService extends SystemService { } @Override - public void onNotificationClick(int callingUid, int callingPid, - String pkg, String tag, int id, int userId) { - cancelNotification(callingUid, callingPid, pkg, tag, id, Notification.FLAG_AUTO_CANCEL, - Notification.FLAG_FOREGROUND_SERVICE, false, userId, REASON_DELEGATE_CLICK, null); + public void onNotificationClick(int callingUid, int callingPid, String key) { + synchronized (mNotificationList) { + EventLogTags.writeNotificationClicked(key); + NotificationRecord r = mNotificationsByKey.get(key); + if (r == null) { + Log.w(TAG, "No notification with key: " + key); + return; + } + StatusBarNotification sbn = r.sbn; + cancelNotification(callingUid, callingPid, sbn.getPackageName(), sbn.getTag(), + sbn.getId(), Notification.FLAG_AUTO_CANCEL, + Notification.FLAG_FOREGROUND_SERVICE, false, r.getUserId(), + REASON_DELEGATE_CLICK, null); + } } @Override diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 91f796be2b675..022bdae3997aa 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -546,13 +546,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub } @Override - public void onNotificationClick(String pkg, String tag, int id, int userId) { + public void onNotificationClick(String key) { enforceStatusBarService(); final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); long identity = Binder.clearCallingIdentity(); try { - mNotificationDelegate.onNotificationClick(callingUid, callingPid, pkg, tag, id, userId); + mNotificationDelegate.onNotificationClick(callingUid, callingPid, key); } finally { Binder.restoreCallingIdentity(identity); }