diff --git a/services/core/java/com/android/server/notification/NotificationRecordLogger.java b/services/core/java/com/android/server/notification/NotificationRecordLogger.java index b015a72a653e85e0d9f3dec0793bcdfdeb8ef6cc..d2e980b7e355efef574d973424441bfc6be68d74 100644 --- a/services/core/java/com/android/server/notification/NotificationRecordLogger.java +++ b/services/core/java/com/android/server/notification/NotificationRecordLogger.java @@ -39,6 +39,7 @@ import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; import com.android.internal.util.FrameworkStatsLog; +import java.time.Duration; import java.util.ArrayList; import java.util.Objects; @@ -497,6 +498,7 @@ interface NotificationRecordLogger { final boolean is_non_dismissible; final int fsi_state; final boolean is_locked; + final int age_in_minutes; @DurationMillisLong long post_duration_millis; // Not final; calculated at the end. NotificationReported(NotificationRecordPair p, @@ -541,6 +543,9 @@ interface NotificationRecordLogger { hasFullScreenIntent, hasFsiRequestedButDeniedFlag, eventType); this.is_locked = p.r.isLocked(); + + this.age_in_minutes = NotificationRecordLogger.getAgeInMinutes( + p.r.getSbn().getPostTime(), p.r.getSbn().getNotification().when); } } @@ -601,4 +606,13 @@ interface NotificationRecordLogger { } return FrameworkStatsLog.NOTIFICATION_REPORTED__FSI_STATE__NO_FSI; } + + /** + * @param postTimeMs time (in {@link System#currentTimeMillis} time) the notification was posted + * @param whenMs A timestamp related to this notification, in milliseconds since the epoch. + * @return difference in duration as an integer in minutes + */ + static int getAgeInMinutes(long postTimeMs, long whenMs) { + return (int) Duration.ofMillis(postTimeMs - whenMs).toMinutes(); + } } diff --git a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java index 9da0e98c177552a6b9a06f7cd2c357e281fc321d..fc0a7764963e5957519665e7f2db3c69223e2207 100644 --- a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java +++ b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java @@ -77,7 +77,8 @@ class NotificationRecordLoggerImpl implements NotificationRecordLogger { notificationReported.is_non_dismissible, notificationReported.post_duration_millis, notificationReported.fsi_state, - notificationReported.is_locked); + notificationReported.is_locked, + notificationReported.age_in_minutes); } @Override diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java index b522cab0801b37113cc58d5295f11bce0e5742a5..5147a08b52161fb2f27a68cdcdd255834e4dc989 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java @@ -28,6 +28,7 @@ import static com.android.server.notification.NotificationRecordLogger.Notificat import static com.android.server.notification.NotificationRecordLogger.NotificationCancelledEvent.NOTIFICATION_CANCEL_USER_OTHER; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_POSTED; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_UPDATED; +import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -48,6 +49,8 @@ import com.android.internal.util.FrameworkStatsLog; import org.junit.Test; import org.junit.runner.RunWith; +import java.time.Duration; + @SmallTest @RunWith(AndroidJUnit4.class) @@ -230,4 +233,12 @@ public class NotificationRecordLoggerTest extends UiServiceTestCase { NotificationRecordLogger.NotificationCancelledEvent.fromCancelReason( REASON_CANCEL, DISMISSAL_OTHER)); } + + @Test + public void testGetAgeInMinutes() { + long postTimeMs = Duration.ofMinutes(5).toMillis(); + long whenMs = Duration.ofMinutes(2).toMillis(); + int age = NotificationRecordLogger.getAgeInMinutes(postTimeMs, whenMs); + assertThat(age).isEqualTo(3); + } }