Merge "Remove HeadsUpCoordiator's lifetime extension on action press." into tm-qpr-dev am: 1ec95ed15c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18595495

Change-Id: I94686b64afdbeab9cd5b770dd3b0498da059e7e2
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jeff DeCew
2022-05-27 20:27:58 +00:00
committed by Automerger Merge Worker
3 changed files with 43 additions and 1 deletions

View File

@@ -68,6 +68,7 @@ import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.RemoteInputView;
import com.android.systemui.util.DumpUtilsKt;
import com.android.systemui.util.ListenerSet;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -75,6 +76,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import dagger.Lazy;
@@ -118,6 +120,8 @@ public class NotificationRemoteInputManager implements Dumpable {
protected Callback mCallback;
private final List<RemoteInputController.Callback> mControllerCallbacks = new ArrayList<>();
private final ListenerSet<Consumer<NotificationEntry>> mActionPressListeners =
new ListenerSet<>();
private final InteractionHandler mInteractionHandler = new InteractionHandler() {
@@ -401,6 +405,14 @@ public class NotificationRemoteInputManager implements Dumpable {
}
}
public void addActionPressListener(Consumer<NotificationEntry> listener) {
mActionPressListeners.addIfAbsent(listener);
}
public void removeActionPressListener(Consumer<NotificationEntry> listener) {
mActionPressListeners.remove(listener);
}
/**
* Activates a given {@link RemoteInput}
*
@@ -634,6 +646,9 @@ public class NotificationRemoteInputManager implements Dumpable {
if (mRemoteInputListener != null) {
mRemoteInputListener.releaseNotificationIfKeptForRemoteInputHistory(entry);
}
for (Consumer<NotificationEntry> listener : mActionPressListeners) {
listener.accept(entry);
}
}
/** Returns whether the notification should be lifetime extended for smart reply history */

View File

@@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.collection.coordinator
import android.app.Notification
import android.app.Notification.GROUP_ALERT_SUMMARY
import android.util.ArrayMap
import android.util.ArraySet
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.NotificationRemoteInputManager
import com.android.systemui.statusbar.notification.collection.GroupEntry
@@ -41,6 +40,7 @@ import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.time.SystemClock
import java.util.function.Consumer
import javax.inject.Inject
/**
@@ -85,6 +85,7 @@ class HeadsUpCoordinator @Inject constructor(
pipeline.addOnBeforeFinalizeFilterListener(::onBeforeFinalizeFilter)
pipeline.addPromoter(mNotifPromoter)
pipeline.addNotificationLifetimeExtender(mLifetimeExtender)
mRemoteInputManager.addActionPressListener(mActionPressListener)
}
private fun onHeadsUpViewBound(entry: NotificationEntry) {
@@ -448,6 +449,14 @@ class HeadsUpCoordinator @Inject constructor(
(entry.sbn.notification.flags and Notification.FLAG_ONLY_ALERT_ONCE) == 0)
}
/** When an action is pressed on a notification, end HeadsUp lifetime extension. */
private val mActionPressListener = Consumer<NotificationEntry> { entry ->
if (mNotifsExtendingLifetime.contains(entry)) {
val removeInMillis = mHeadsUpManager.getEarliestRemovalTime(entry.key)
mExecutor.executeDelayed({ endNotifLifetimeExtensionIfExtended(entry) }, removeInMillis)
}
}
private val mLifetimeExtender = object : NotifLifetimeExtender {
override fun getName() = TAG

View File

@@ -59,6 +59,7 @@ import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import java.util.ArrayList
import java.util.function.Consumer
import org.mockito.Mockito.`when` as whenever
@SmallTest
@@ -75,6 +76,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() {
private lateinit var mBeforeFinalizeFilterListener: OnBeforeFinalizeFilterListener
private lateinit var mOnHeadsUpChangedListener: OnHeadsUpChangedListener
private lateinit var mNotifSectioner: NotifSectioner
private lateinit var mActionPressListener: Consumer<NotificationEntry>
private val mNotifPipeline: NotifPipeline = mock()
private val mLogger = HeadsUpCoordinatorLogger(logcatLogBuffer(), verbose = true)
@@ -131,6 +133,9 @@ class HeadsUpCoordinatorTest : SysuiTestCase() {
mOnHeadsUpChangedListener = withArgCaptor {
verify(mHeadsUpManager).addListener(capture())
}
mActionPressListener = withArgCaptor {
verify(mRemoteInputManager).addActionPressListener(capture())
}
given(mHeadsUpManager.allEntries).willAnswer { mHuns.stream() }
given(mHeadsUpManager.isAlerting(anyString())).willAnswer { invocation ->
val key = invocation.getArgument<String>(0)
@@ -198,6 +203,19 @@ class HeadsUpCoordinatorTest : SysuiTestCase() {
verify(mHeadsUpManager, times(0)).removeNotification(anyString(), any())
}
@Test
fun hunExtensionCancelledWhenHunActionPressed() {
whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
addHUN(mEntry)
whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false)
whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
mActionPressListener.accept(mEntry)
mExecutor.advanceClockToLast()
mExecutor.runAllReady()
verify(mHeadsUpManager, times(1)).removeNotification(eq(mEntry.key), eq(true))
}
@Test
fun testCancelUpdatedStickyNotification() {
whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)