Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cacea0e4 authored by Jeff DeCew's avatar Jeff DeCew Committed by Automerger Merge Worker
Browse files

Merge "Remove HeadsUpCoordiator's lifetime extension on action press." into...

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

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



Change-Id: I94686b64afdbeab9cd5b770dd3b0498da059e7e2
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 71f34acd 1ec95ed1
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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 */
+10 −1
Original line number Diff line number Diff line
@@ -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

+18 −0
Original line number Diff line number Diff line
@@ -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)