To avoid stale data in logs, and avoid risk of race conditions, have
StatusBarNotification create a new LogMaker each time it is requested,
instead of trying to keep and reuse one.
Bug: 124924850
Test: atest frameworks/base/services/tests/uiservicestests/src/com/android/server/notification frameworks/base/core/tests/coretests/src/android/service/notification SystemUITests
Change-Id: I0fe3c17b5c9534fd486575b6a3c20fdd43cc28f5
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 4315100..cc74e1a 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -63,9 +63,6 @@
private Context mContext; // used for inflation & icon expansion
- // Contains the basic logging data of the notification.
- private LogMaker mLogMaker;
-
/** @hide */
public StatusBarNotification(String pkg, String opPkg, int id,
String tag, int uid, int initialPid, Notification notification, UserHandle user,
@@ -404,24 +401,15 @@
* @hide
*/
public LogMaker getLogMaker() {
- if (mLogMaker == null) {
- // Initialize fields that only change on update (so a new record).
- mLogMaker = new LogMaker(MetricsEvent.VIEW_UNKNOWN)
- .setPackageName(getPackageName())
+ return new LogMaker(MetricsEvent.VIEW_UNKNOWN).setPackageName(getPackageName())
.addTaggedData(MetricsEvent.NOTIFICATION_ID, getId())
.addTaggedData(MetricsEvent.NOTIFICATION_TAG, getTag())
- .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID, getChannelIdLogTag());
- }
- // Reset fields that can change between updates, or are used by multiple logs.
- return mLogMaker
- .clearCategory()
- .clearType()
- .clearSubtype()
- .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID, getGroupLogTag())
- .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_SUMMARY,
- getNotification().isGroupSummary() ? 1 : 0)
- .addTaggedData(MetricsProto.MetricsEvent.FIELD_NOTIFICATION_CATEGORY,
- getNotification().category);
+ .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID, getChannelIdLogTag())
+ .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID, getGroupLogTag())
+ .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_SUMMARY,
+ getNotification().isGroupSummary() ? 1 : 0)
+ .addTaggedData(MetricsProto.MetricsEvent.FIELD_NOTIFICATION_CATEGORY,
+ getNotification().category);
}
private String getGroupLogTag() {
diff --git a/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
index c99777b..0f32a82 100644
--- a/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
+++ b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
@@ -89,6 +89,17 @@
assertNull(logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CATEGORY));
}
+ /** Verify that modifying the returned logMaker won't leave stale data behind for
+ * the next caller.*/
+ @Test
+ public void testLogMakerNoStaleData() {
+ StatusBarNotification sbn = getNotification(PKG, GROUP_ID_1, CHANNEL_ID);
+ final LogMaker logMaker = sbn.getLogMaker();
+ int extraTag = MetricsEvent.FIELD_NOTIFICATION_CHANNEL_GROUP_ID; // An arbitrary new tag
+ logMaker.addTaggedData(extraTag, 1);
+ assertNull(sbn.getLogMaker().getTaggedData(extraTag));
+ }
+
@Test
public void testLogMakerWithCategory() {
Notification.Builder builder = getNotificationBuilder(GROUP_ID_1, CHANNEL_ID)