Loading core/java/android/app/notification.aconfig +11 −2 Original line number Original line Diff line number Diff line Loading @@ -283,6 +283,15 @@ flag { purpose: PURPOSE_BUGFIX purpose: PURPOSE_BUGFIX } } } } flag { name: "notif_entry_creation_time_use_elapsed_realtime" namespace: "systemui" description: "makes the notification entry expect its creation time to be elapsedRealtime, not uptimeMillis" bug: "343631648" metadata { purpose: PURPOSE_BUGFIX } } flag { flag { name: "api_rich_ongoing" name: "api_rich_ongoing" Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -58,6 +58,7 @@ import com.android.systemui.res.R; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.SbnBuilder; import com.android.systemui.statusbar.SbnBuilder; import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.notification.collection.UseElapsedRealtimeForCreationTime; import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi; import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.FakeSystemClock; Loading Loading @@ -151,7 +152,8 @@ public class NotificationEntryTest extends SysuiTestCase { .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertFalse(entry.isBlockable()); assertFalse(entry.isBlockable()); } } Loading Loading @@ -251,7 +253,8 @@ public class NotificationEntryTest extends SysuiTestCase { .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertEquals(systemGeneratedSmartActions, entry.getSmartActions()); assertEquals(systemGeneratedSmartActions, entry.getSmartActions()); assertEquals(NOTIFICATION_CHANNEL, entry.getChannel()); assertEquals(NOTIFICATION_CHANNEL, entry.getChannel()); Loading Loading @@ -365,7 +368,8 @@ public class NotificationEntryTest extends SysuiTestCase { .setKey(sbn.getKey()) .setKey(sbn.getKey()) .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertFalse(entry.isChannelVisibilityPrivate()); assertFalse(entry.isChannelVisibilityPrivate()); } } Loading @@ -378,7 +382,8 @@ public class NotificationEntryTest extends SysuiTestCase { .setKey(sbn.getKey()) .setKey(sbn.getKey()) .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertFalse(entry.isChannelVisibilityPrivate()); assertFalse(entry.isChannelVisibilityPrivate()); } } Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.kt +21 −5 Original line number Original line Diff line number Diff line Loading @@ -50,6 +50,7 @@ import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.UseElapsedRealtimeForCreationTime import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable.PluggableListener import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable.PluggableListener import com.android.systemui.statusbar.notification.collection.notifPipeline import com.android.systemui.statusbar.notification.collection.notifPipeline Loading Loading @@ -323,7 +324,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(true) setPulsing(true) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN group changes aren't allowed // THEN group changes aren't allowed assertThat(notifStabilityManager.isGroupChangeAllowed(entry)).isFalse() assertThat(notifStabilityManager.isGroupChangeAllowed(entry)).isFalse() Loading @@ -349,7 +353,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(false) setPulsing(false) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.uptimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN the notification list is invalidated // THEN the notification list is invalidated verifyStabilityManagerWasInvalidated(times(1)) verifyStabilityManagerWasInvalidated(times(1)) Loading @@ -365,7 +372,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(false) setPulsing(false) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN invalidate is not called because this entry was never suppressed from reordering // THEN invalidate is not called because this entry was never suppressed from reordering verifyStabilityManagerWasInvalidated(never()) verifyStabilityManagerWasInvalidated(never()) Loading @@ -382,7 +392,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa assertThat(notifStabilityManager.isSectionChangeAllowed(entry)).isTrue() assertThat(notifStabilityManager.isSectionChangeAllowed(entry)).isTrue() // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN invalidate is not called because this entry was never suppressed from // THEN invalidate is not called because this entry was never suppressed from // reordering; // reordering; Loading Loading @@ -415,7 +428,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(true) setPulsing(true) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // can now reorder, so invalidates // can now reorder, so invalidates verifyStabilityManagerWasInvalidated(times(1)) verifyStabilityManagerWasInvalidated(times(1)) Loading packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +4 −2 Original line number Original line Diff line number Diff line Loading @@ -47,7 +47,6 @@ import android.database.ExecutorContentObserver; import android.net.Uri; import android.net.Uri; import android.os.Looper; import android.os.Looper; import android.os.Process; import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserHandle; import android.os.UserManager; import android.os.UserManager; import android.provider.Settings; import android.provider.Settings; Loading Loading @@ -78,6 +77,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag; import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.UseElapsedRealtimeForCreationTime; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; import com.android.systemui.statusbar.notification.row.shared.LockscreenOtpRedaction; import com.android.systemui.statusbar.notification.row.shared.LockscreenOtpRedaction; Loading Loading @@ -920,7 +920,9 @@ public class NotificationLockscreenUserManagerImpl implements // notification's "when" time, or the notification entry creation time // notification's "when" time, or the notification entry creation time private long getEarliestNotificationTime(NotificationEntry notif) { private long getEarliestNotificationTime(NotificationEntry notif) { long notifWhenWallClock = notif.getSbn().getNotification().getWhen(); long notifWhenWallClock = notif.getSbn().getNotification().getWhen(); long creationTimeDelta = SystemClock.uptimeMillis() - notif.getCreationTime(); long creationTimeDelta = UseElapsedRealtimeForCreationTime.getCurrentTime() - notif.getCreationTime(); long creationTimeWallClock = System.currentTimeMillis() - creationTimeDelta; long creationTimeWallClock = System.currentTimeMillis() - creationTimeDelta; return Math.min(notifWhenWallClock, creationTimeWallClock); return Math.min(notifWhenWallClock, creationTimeWallClock); } } Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,7 @@ public abstract class ListEntry extends PipelineEntry { } } /** /** * The SystemClock.uptimeMillis() when this object was created. In general, this means the * The SystemClock.elapsedRealtime() when this object was created. In general, this means the * moment when NotificationManager notifies our listener about the existence of this entry. * moment when NotificationManager notifies our listener about the existence of this entry. * * * This value will not change if the notification is updated, although it will change if the * This value will not change if the notification is updated, although it will change if the Loading Loading
core/java/android/app/notification.aconfig +11 −2 Original line number Original line Diff line number Diff line Loading @@ -283,6 +283,15 @@ flag { purpose: PURPOSE_BUGFIX purpose: PURPOSE_BUGFIX } } } } flag { name: "notif_entry_creation_time_use_elapsed_realtime" namespace: "systemui" description: "makes the notification entry expect its creation time to be elapsedRealtime, not uptimeMillis" bug: "343631648" metadata { purpose: PURPOSE_BUGFIX } } flag { flag { name: "api_rich_ongoing" name: "api_rich_ongoing" Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -58,6 +58,7 @@ import com.android.systemui.res.R; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.SbnBuilder; import com.android.systemui.statusbar.SbnBuilder; import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.notification.collection.UseElapsedRealtimeForCreationTime; import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi; import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.FakeSystemClock; Loading Loading @@ -151,7 +152,8 @@ public class NotificationEntryTest extends SysuiTestCase { .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertFalse(entry.isBlockable()); assertFalse(entry.isBlockable()); } } Loading Loading @@ -251,7 +253,8 @@ public class NotificationEntryTest extends SysuiTestCase { .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertEquals(systemGeneratedSmartActions, entry.getSmartActions()); assertEquals(systemGeneratedSmartActions, entry.getSmartActions()); assertEquals(NOTIFICATION_CHANNEL, entry.getChannel()); assertEquals(NOTIFICATION_CHANNEL, entry.getChannel()); Loading Loading @@ -365,7 +368,8 @@ public class NotificationEntryTest extends SysuiTestCase { .setKey(sbn.getKey()) .setKey(sbn.getKey()) .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertFalse(entry.isChannelVisibilityPrivate()); assertFalse(entry.isChannelVisibilityPrivate()); } } Loading @@ -378,7 +382,8 @@ public class NotificationEntryTest extends SysuiTestCase { .setKey(sbn.getKey()) .setKey(sbn.getKey()) .build(); .build(); NotificationEntry entry = NotificationEntry entry = new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); new NotificationEntry(sbn, ranking, UseElapsedRealtimeForCreationTime.getCurrentTime(mClock)); assertFalse(entry.isChannelVisibilityPrivate()); assertFalse(entry.isChannelVisibilityPrivate()); } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.kt +21 −5 Original line number Original line Diff line number Diff line Loading @@ -50,6 +50,7 @@ import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.UseElapsedRealtimeForCreationTime import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable.PluggableListener import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable.PluggableListener import com.android.systemui.statusbar.notification.collection.notifPipeline import com.android.systemui.statusbar.notification.collection.notifPipeline Loading Loading @@ -323,7 +324,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(true) setPulsing(true) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN group changes aren't allowed // THEN group changes aren't allowed assertThat(notifStabilityManager.isGroupChangeAllowed(entry)).isFalse() assertThat(notifStabilityManager.isGroupChangeAllowed(entry)).isFalse() Loading @@ -349,7 +353,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(false) setPulsing(false) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.uptimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN the notification list is invalidated // THEN the notification list is invalidated verifyStabilityManagerWasInvalidated(times(1)) verifyStabilityManagerWasInvalidated(times(1)) Loading @@ -365,7 +372,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(false) setPulsing(false) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN invalidate is not called because this entry was never suppressed from reordering // THEN invalidate is not called because this entry was never suppressed from reordering verifyStabilityManagerWasInvalidated(never()) verifyStabilityManagerWasInvalidated(never()) Loading @@ -382,7 +392,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa assertThat(notifStabilityManager.isSectionChangeAllowed(entry)).isTrue() assertThat(notifStabilityManager.isSectionChangeAllowed(entry)).isTrue() // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // THEN invalidate is not called because this entry was never suppressed from // THEN invalidate is not called because this entry was never suppressed from // reordering; // reordering; Loading Loading @@ -415,7 +428,10 @@ class VisualStabilityCoordinatorTest(flags: FlagsParameterization) : SysuiTestCa setPulsing(true) setPulsing(true) // WHEN we temporarily allow section changes for this notification entry // WHEN we temporarily allow section changes for this notification entry underTest.temporarilyAllowSectionChanges(entry, fakeSystemClock.currentTimeMillis()) underTest.temporarilyAllowSectionChanges( entry, UseElapsedRealtimeForCreationTime.getCurrentTime(fakeSystemClock), ) // can now reorder, so invalidates // can now reorder, so invalidates verifyStabilityManagerWasInvalidated(times(1)) verifyStabilityManagerWasInvalidated(times(1)) Loading
packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +4 −2 Original line number Original line Diff line number Diff line Loading @@ -47,7 +47,6 @@ import android.database.ExecutorContentObserver; import android.net.Uri; import android.net.Uri; import android.os.Looper; import android.os.Looper; import android.os.Process; import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserHandle; import android.os.UserManager; import android.os.UserManager; import android.provider.Settings; import android.provider.Settings; Loading Loading @@ -78,6 +77,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag; import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.UseElapsedRealtimeForCreationTime; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; import com.android.systemui.statusbar.notification.row.shared.LockscreenOtpRedaction; import com.android.systemui.statusbar.notification.row.shared.LockscreenOtpRedaction; Loading Loading @@ -920,7 +920,9 @@ public class NotificationLockscreenUserManagerImpl implements // notification's "when" time, or the notification entry creation time // notification's "when" time, or the notification entry creation time private long getEarliestNotificationTime(NotificationEntry notif) { private long getEarliestNotificationTime(NotificationEntry notif) { long notifWhenWallClock = notif.getSbn().getNotification().getWhen(); long notifWhenWallClock = notif.getSbn().getNotification().getWhen(); long creationTimeDelta = SystemClock.uptimeMillis() - notif.getCreationTime(); long creationTimeDelta = UseElapsedRealtimeForCreationTime.getCurrentTime() - notif.getCreationTime(); long creationTimeWallClock = System.currentTimeMillis() - creationTimeDelta; long creationTimeWallClock = System.currentTimeMillis() - creationTimeDelta; return Math.min(notifWhenWallClock, creationTimeWallClock); return Math.min(notifWhenWallClock, creationTimeWallClock); } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,7 @@ public abstract class ListEntry extends PipelineEntry { } } /** /** * The SystemClock.uptimeMillis() when this object was created. In general, this means the * The SystemClock.elapsedRealtime() when this object was created. In general, this means the * moment when NotificationManager notifies our listener about the existence of this entry. * moment when NotificationManager notifies our listener about the existence of this entry. * * * This value will not change if the notification is updated, although it will change if the * This value will not change if the notification is updated, although it will change if the Loading