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

Commit db78c254 authored by András Kurucz's avatar András Kurucz Committed by Android (Google) Code Review
Browse files

Merge "Inject SystemUiSystemPropertiesFlags.FlagResolver across SystemUI"

parents 65962568 6b0944af
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import com.android.systemui.smartspace.dagger.SmartspaceModule;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
@@ -266,6 +267,7 @@ public abstract class SystemUIModule {
            NotifPipeline notifPipeline,
            SysUiState sysUiState,
            FeatureFlags featureFlags,
            NotifPipelineFlags notifPipelineFlags,
            @Main Executor sysuiMainExecutor) {
        return Optional.ofNullable(BubblesManager.create(context,
                bubblesOptional,
@@ -283,6 +285,7 @@ public abstract class SystemUIModule {
                notifPipeline,
                sysUiState,
                featureFlags,
                notifPipelineFlags,
                sysuiMainExecutor));
    }

+5 −5
Original line number Diff line number Diff line
@@ -17,11 +17,10 @@
package com.android.systemui.statusbar.notification.collection.provider

import androidx.annotation.VisibleForTesting
import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags
import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags.NotificationFlags.ALLOW_DISMISS_ONGOING
import com.android.systemui.Dumpable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.notification.NotifPipelineFlags
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.util.asIndenting
import com.android.systemui.util.withIncreasedIndent
@@ -29,7 +28,9 @@ import java.io.PrintWriter
import javax.inject.Inject

@SysUISingleton
class NotificationDismissibilityProviderImpl @Inject constructor(dumpManager: DumpManager) :
class NotificationDismissibilityProviderImpl
@Inject
constructor(private val notifPipelineFlags: NotifPipelineFlags, dumpManager: DumpManager) :
    NotificationDismissibilityProvider, Dumpable {

    init {
@@ -42,8 +43,7 @@ class NotificationDismissibilityProviderImpl @Inject constructor(dumpManager: Du
        private set

    override fun isDismissable(entry: NotificationEntry): Boolean {
        // TODO(b/268380968): inject FlagResolver
        return if (SystemUiSystemPropertiesFlags.getResolver().isEnabled(ALLOW_DISMISS_ONGOING)) {
        return if (notifPipelineFlags.allowDismissOngoing()) {
            entry.key !in nonDismissableEntryKeys
        } else {
            entry.legacyIsDismissableRecursive()
+10 −6
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import static android.service.notification.NotificationListenerService.REASON_GR
import static android.service.notification.NotificationStats.DISMISSAL_BUBBLE;
import static android.service.notification.NotificationStats.DISMISS_SENTIMENT_NEUTRAL;

import static com.android.internal.config.sysui.SystemUiSystemPropertiesFlags.NotificationFlags.ALLOW_DISMISS_ONGOING;
import static com.android.systemui.flags.Flags.WM_BUBBLE_BAR;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
@@ -51,7 +50,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.flags.FeatureFlags;
@@ -60,6 +58,7 @@ import com.android.systemui.shade.ShadeController;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationChannelHelper;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
@@ -106,6 +105,7 @@ public class BubblesManager {
    private final NotificationLockscreenUserManager mNotifUserManager;
    private final CommonNotifCollection mCommonNotifCollection;
    private final NotifPipeline mNotifPipeline;
    private final NotifPipelineFlags mNotifPipelineFlags;
    private final Executor mSysuiMainExecutor;

    private final Bubbles.SysuiProxy mSysuiProxy;
@@ -134,6 +134,7 @@ public class BubblesManager {
            NotifPipeline notifPipeline,
            SysUiState sysUiState,
            FeatureFlags featureFlags,
            NotifPipelineFlags notifPipelineFlags,
            Executor sysuiMainExecutor) {
        if (bubblesOptional.isPresent()) {
            return new BubblesManager(context,
@@ -152,6 +153,7 @@ public class BubblesManager {
                    notifPipeline,
                    sysUiState,
                    featureFlags,
                    notifPipelineFlags,
                    sysuiMainExecutor);
        } else {
            return null;
@@ -175,6 +177,7 @@ public class BubblesManager {
            NotifPipeline notifPipeline,
            SysUiState sysUiState,
            FeatureFlags featureFlags,
            NotifPipelineFlags notifPipelineFlags,
            Executor sysuiMainExecutor) {
        mContext = context;
        mBubbles = bubbles;
@@ -187,6 +190,7 @@ public class BubblesManager {
        mNotifUserManager = notifUserManager;
        mCommonNotifCollection = notifCollection;
        mNotifPipeline = notifPipeline;
        mNotifPipelineFlags = notifPipelineFlags;
        mSysuiMainExecutor = sysuiMainExecutor;

        mBarService = statusBarService == null
@@ -618,15 +622,15 @@ public class BubblesManager {
        }
    }

    static BubbleEntry notifToBubbleEntry(NotificationEntry e) {
    @VisibleForTesting
    BubbleEntry notifToBubbleEntry(NotificationEntry e) {
        return new BubbleEntry(e.getSbn(), e.getRanking(), isDismissableFromBubbles(e),
                e.shouldSuppressNotificationDot(), e.shouldSuppressNotificationList(),
                e.shouldSuppressPeek());
    }

    private static boolean isDismissableFromBubbles(NotificationEntry e) {
        // TODO(b/268380968): inject FlagResolver
        if (SystemUiSystemPropertiesFlags.getResolver().isEnabled(ALLOW_DISMISS_ONGOING)) {
    private boolean isDismissableFromBubbles(NotificationEntry e) {
        if (mNotifPipelineFlags.allowDismissOngoing()) {
            // Bubbles are only accessible from the unlocked state,
            // so we can calculate this from the Notification flags only.
            return e.isDismissableForState(/*isLocked=*/ false);
+7 −9
Original line number Diff line number Diff line
@@ -19,10 +19,9 @@ package com.android.systemui.statusbar.notification.collection.coordinator
import android.app.Notification
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags
import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags.NotificationFlags
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.notification.NotifPipelineFlags
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
@@ -48,15 +47,14 @@ class DismissibilityCoordinatorTest : SysuiTestCase() {
    private lateinit var onBeforeRenderListListener: OnBeforeRenderListListener
    private val keyguardStateController: KeyguardStateController = mock()
    private val pipeline: NotifPipeline = mock()
    private val flagResolver: SystemUiSystemPropertiesFlags.FlagResolver = mock()
    private val flags: NotifPipelineFlags = mock()
    private val dumpManager: DumpManager = mock()

    @Before
    fun setUp() {
        setTestFlagResolver(flagResolver)
        whenever(flagResolver.isEnabled(NotificationFlags.ALLOW_DISMISS_ONGOING)).thenReturn(true)
        whenever(flags.allowDismissOngoing()).thenReturn(true)

        dismissibilityProvider = NotificationDismissibilityProviderImpl(dumpManager)
        dismissibilityProvider = NotificationDismissibilityProviderImpl(flags, dumpManager)
        coordinator = DismissibilityCoordinator(keyguardStateController, dismissibilityProvider)
        coordinator.attach(pipeline)
        onBeforeRenderListListener = withArgCaptor {
@@ -314,7 +312,7 @@ class DismissibilityCoordinatorTest : SysuiTestCase() {

    @Test
    fun testFeatureToggleOffNonDismissibleEntry() {
        whenever(flagResolver.isEnabled(NotificationFlags.ALLOW_DISMISS_ONGOING)).thenReturn(false)
        whenever(flags.allowDismissOngoing()).thenReturn(false)
        val entry =
            NotificationEntryBuilder()
                .setTag("entry")
@@ -331,7 +329,7 @@ class DismissibilityCoordinatorTest : SysuiTestCase() {

    @Test
    fun testFeatureToggleOffOngoingNotifWhenPhoneIsLocked() {
        whenever(flagResolver.isEnabled(NotificationFlags.ALLOW_DISMISS_ONGOING)).thenReturn(false)
        whenever(flags.allowDismissOngoing()).thenReturn(false)
        whenever(keyguardStateController.isUnlocked).thenReturn(false)
        val entry =
            NotificationEntryBuilder()
@@ -349,7 +347,7 @@ class DismissibilityCoordinatorTest : SysuiTestCase() {

    @Test
    fun testFeatureToggleOffOngoingNotifWhenPhoneIsUnLocked() {
        whenever(flagResolver.isEnabled(NotificationFlags.ALLOW_DISMISS_ONGOING)).thenReturn(false)
        whenever(flags.allowDismissOngoing()).thenReturn(false)
        whenever(keyguardStateController.isUnlocked).thenReturn(true)
        val entry =
            NotificationEntryBuilder()
+30 −33
Original line number Diff line number Diff line
@@ -82,8 +82,6 @@ import android.view.WindowManager;
import androidx.test.filters.SmallTest;

import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags;
import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags.NotificationFlags;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.SysuiTestCase;
@@ -285,7 +283,7 @@ public class BubblesTest extends SysuiTestCase {
    @Mock
    private ShadeWindowLogger mShadeWindowLogger;
    @Mock
    private SystemUiSystemPropertiesFlags.FlagResolver mFlagResolver;
    private NotifPipelineFlags mNotifPipelineFlags;

    private TestableBubblePositioner mPositioner;

@@ -298,8 +296,6 @@ public class BubblesTest extends SysuiTestCase {
    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        setTestFlagResolver(mFlagResolver);

        mTestableLooper = TestableLooper.get(this);

        // For the purposes of this test, just run everything synchronously
@@ -318,24 +314,6 @@ public class BubblesTest extends SysuiTestCase {
        mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
        mNotificationShadeWindowController.attach();

        // Need notifications for bubbles
        mNotificationTestHelper = new NotificationTestHelper(
                mContext,
                mDependency,
                TestableLooper.get(this));
        mRow = mNotificationTestHelper.createBubble(mDeleteIntent);
        mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent);
        mNonBubbleNotifRow = mNotificationTestHelper.createRow();
        mBubbleEntry = BubblesManager.notifToBubbleEntry(mRow);
        mBubbleEntry2 = BubblesManager.notifToBubbleEntry(mRow2);

        UserHandle handle = mock(UserHandle.class);
        when(handle.getIdentifier()).thenReturn(11);
        mBubbleEntryUser11 = BubblesManager.notifToBubbleEntry(
                mNotificationTestHelper.createBubble(handle));
        mBubbleEntry2User11 = BubblesManager.notifToBubbleEntry(
                mNotificationTestHelper.createBubble(handle));

        mAppBubbleIntent = new Intent(mContext, BubblesTestActivity.class);
        mAppBubbleIntent.setPackage(mContext.getPackageName());

@@ -420,9 +398,28 @@ public class BubblesTest extends SysuiTestCase {
                mNotifPipeline,
                mSysUiState,
                mock(FeatureFlags.class),
                mNotifPipelineFlags,
                syncExecutor);
        mBubblesManager.addNotifCallback(mNotifCallback);

        // Need notifications for bubbles
        mNotificationTestHelper = new NotificationTestHelper(
                mContext,
                mDependency,
                TestableLooper.get(this));
        mRow = mNotificationTestHelper.createBubble(mDeleteIntent);
        mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent);
        mNonBubbleNotifRow = mNotificationTestHelper.createRow();
        mBubbleEntry = mBubblesManager.notifToBubbleEntry(mRow);
        mBubbleEntry2 = mBubblesManager.notifToBubbleEntry(mRow2);

        UserHandle handle = mock(UserHandle.class);
        when(handle.getIdentifier()).thenReturn(11);
        mBubbleEntryUser11 = mBubblesManager.notifToBubbleEntry(
                mNotificationTestHelper.createBubble(handle));
        mBubbleEntry2User11 = mBubblesManager.notifToBubbleEntry(
                mNotificationTestHelper.createBubble(handle));

        // Get a reference to the BubbleController's entry listener
        verify(mNotifPipeline, atLeastOnce())
                .addCollectionListener(mNotifListenerCaptor.capture());
@@ -1185,7 +1182,7 @@ public class BubblesTest extends SysuiTestCase {
    @Test
    public void testDeleteShortcutsDeletesXml() throws Exception {
        ExpandableNotificationRow row = mNotificationTestHelper.createShortcutBubble("shortcutId");
        BubbleEntry shortcutBubbleEntry = BubblesManager.notifToBubbleEntry(row.getEntry());
        BubbleEntry shortcutBubbleEntry = mBubblesManager.notifToBubbleEntry(row.getEntry());
        mBubbleController.updateBubble(shortcutBubbleEntry);

        mBubbleData.dismissBubbleWithKey(shortcutBubbleEntry.getKey(),
@@ -1297,7 +1294,7 @@ public class BubblesTest extends SysuiTestCase {
        entry.getChannel().setConversationId(
                row.getEntry().getChannel().getParentChannelId(),
                "shortcutId");
        mBubbleController.updateBubble(BubblesManager.notifToBubbleEntry(row.getEntry()));
        mBubbleController.updateBubble(mBubblesManager.notifToBubbleEntry(row.getEntry()));
        assertTrue(mBubbleController.hasBubbles());

        // Overflow it
@@ -1323,7 +1320,7 @@ public class BubblesTest extends SysuiTestCase {
        entry.getChannel().setConversationId(
                row.getEntry().getChannel().getParentChannelId(),
                "shortcutId");
        mBubbleController.updateBubble(BubblesManager.notifToBubbleEntry(row.getEntry()));
        mBubbleController.updateBubble(mBubblesManager.notifToBubbleEntry(row.getEntry()));
        assertTrue(mBubbleController.hasBubbles());

        // Overflow it
@@ -1706,13 +1703,13 @@ public class BubblesTest extends SysuiTestCase {

    @Test
    public void testCreateBubbleFromOngoingNotification_OngoingDismissalEnabled() {
        when(mFlagResolver.isEnabled(NotificationFlags.ALLOW_DISMISS_ONGOING)).thenReturn(true);
        when(mNotifPipelineFlags.allowDismissOngoing()).thenReturn(true);
        NotificationEntry notif = new NotificationEntryBuilder()
                .setFlag(mContext, Notification.FLAG_ONGOING_EVENT, true)
                .setCanBubble(true)
                .build();

        BubbleEntry bubble = BubblesManager.notifToBubbleEntry(notif);
        BubbleEntry bubble = mBubblesManager.notifToBubbleEntry(notif);

        assertTrue("Ongoing Notifis should be dismissable", bubble.isDismissable());
    }
@@ -1720,13 +1717,13 @@ public class BubblesTest extends SysuiTestCase {

    @Test
    public void testCreateBubbleFromNoDismissNotification_OngoingDismissalEnabled() {
        when(mFlagResolver.isEnabled(NotificationFlags.ALLOW_DISMISS_ONGOING)).thenReturn(true);
        when(mNotifPipelineFlags.allowDismissOngoing()).thenReturn(true);
        NotificationEntry notif = new NotificationEntryBuilder()
                .setFlag(mContext, Notification.FLAG_NO_DISMISS, true)
                .setCanBubble(true)
                .build();

        BubbleEntry bubble = BubblesManager.notifToBubbleEntry(notif);
        BubbleEntry bubble = mBubblesManager.notifToBubbleEntry(notif);

        assertFalse("FLAG_NO_DISMISS Notifs should be non-dismissable", bubble.isDismissable());
    }
@@ -1738,7 +1735,7 @@ public class BubblesTest extends SysuiTestCase {
                .setCanBubble(true)
                .build();

        BubbleEntry bubble = BubblesManager.notifToBubbleEntry(notif);
        BubbleEntry bubble = mBubblesManager.notifToBubbleEntry(notif);

        assertFalse(
                "Ongoing Notifis should be dismissable, if the feature is off",
@@ -1754,7 +1751,7 @@ public class BubblesTest extends SysuiTestCase {
                .setCanBubble(true)
                .build();

        BubbleEntry bubble = BubblesManager.notifToBubbleEntry(notif);
        BubbleEntry bubble = mBubblesManager.notifToBubbleEntry(notif);

        assertTrue(
                "FLAG_NO_DISMISS should be ignored, if the feature is off",
@@ -1772,7 +1769,7 @@ public class BubblesTest extends SysuiTestCase {
        workEntry.setBubbleMetadata(getMetadata());
        workEntry.setFlagBubble(true);

        return new Bubble(BubblesManager.notifToBubbleEntry(workEntry),
        return new Bubble(mBubblesManager.notifToBubbleEntry(workEntry),
                null,
                mock(Bubbles.PendingIntentCanceledListener.class), new SyncExecutor());
    }
Loading