From 1d7db5b9eef729aff7606a87c19768bfcb2d86a5 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Wed, 27 May 2020 23:46:32 -0400 Subject: [PATCH] Allow interrupting notifications to bypass lifetime extension Notifications which have interruped the UI (usually a HUN) can safely bypass FGS lifetime extension because the system has done the best it can to show the user this notification. This valve is important in particular for things like a dialer which might want to interrupt a user but need to do so again on the same channel, for instance when getting multiple phone calls quickly in succession. Bug: 155594347 Test: atest ForegroundServiceNotificationListenerTest Change-Id: Id80fba3191cc133d1e73ca04015f9cbed62fc086 --- .../systemui/ForegroundServiceLifetimeExtender.java | 6 ++++++ .../ForegroundServiceNotificationListenerTest.java | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/ForegroundServiceLifetimeExtender.java b/packages/SystemUI/src/com/android/systemui/ForegroundServiceLifetimeExtender.java index 77abffc82d68c..c0f8cae607cad 100644 --- a/packages/SystemUI/src/com/android/systemui/ForegroundServiceLifetimeExtender.java +++ b/packages/SystemUI/src/com/android/systemui/ForegroundServiceLifetimeExtender.java @@ -66,6 +66,12 @@ public class ForegroundServiceLifetimeExtender implements NotificationLifetimeEx return false; } + // Entry has triggered a HUN or some other interruption, therefore it has been seen and the + // interrupter might be retaining it anyway. + if (entry.hasInterrupted()) { + return false; + } + boolean hasInteracted = mInteractionTracker.hasUserInteractedWith(entry.getKey()); long aliveTime = mSystemClock.uptimeMillis() - entry.getCreationTime(); return aliveTime < MIN_FGS_TIME_MS && !hasInteracted; diff --git a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceNotificationListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceNotificationListenerTest.java index 050b5538773d9..9a40421a353f6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceNotificationListenerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceNotificationListenerTest.java @@ -95,4 +95,16 @@ public class ForegroundServiceNotificationListenerTest extends SysuiTestCase { mClock.advanceTime(MIN_FGS_TIME_MS + 1); assertFalse(mExtender.shouldExtendLifetime(mEntry)); } + + @Test + public void testShouldExtendLifetime_shouldNot_interruped() { + // GIVEN a notification that would trigger lifetime extension + mNotif.flags |= Notification.FLAG_FOREGROUND_SERVICE; + + // GIVEN the notification has alerted + mEntry.setInterruption(); + + // THEN the notification does not need to have its lifetime extended by this extender + assertFalse(mExtender.shouldExtendLifetime(mEntry)); + } }