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

Commit e23a89f8 authored by Jeff DeCew's avatar Jeff DeCew Committed by Android (Google) Code Review
Browse files

Revert "[flexiglass] Show the bouncer over the locked shade from notifications"

This reverts commit 59433771.

Reason for revert: b/383993636

Change-Id: Id1e4304703fee4a49e71a5257f26ac0205488b81
parent 59433771
Loading
Loading
Loading
Loading
+29 −98
Original line number Diff line number Diff line
@@ -27,39 +27,34 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.InitController
import com.android.systemui.SysuiTestCase
import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.runTest
import com.android.systemui.plugins.activityStarter
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.settings.FakeDisplayTracker
import com.android.systemui.shade.NotificationShadeWindowView
import com.android.systemui.shade.ShadeController
import com.android.systemui.shade.ShadeViewController
import com.android.systemui.shade.domain.interactor.panelExpansionInteractor
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.NotificationRemoteInputManager
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.statusbar.lockscreenShadeTransitionController
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.domain.interactor.notificationAlertsInteractor
import com.android.systemui.statusbar.notification.domain.interactor.NotificationAlertsInteractor
import com.android.systemui.statusbar.notification.dynamicPrivacyController
import com.android.systemui.statusbar.notification.headsup.headsUpManager
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor
import com.android.systemui.statusbar.notification.interruption.VisualInterruptionCondition
import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider
import com.android.systemui.statusbar.notification.interruption.VisualInterruptionFilter
import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor
import com.android.systemui.statusbar.notification.interruption.VisualInterruptionType
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.stack.notificationStackScrollLayoutController
import com.android.systemui.statusbar.notification.visualInterruptionDecisionProvider
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.notificationLockscreenUserManager
import com.android.systemui.statusbar.notificationRemoteInputManager
import com.android.systemui.statusbar.notificationShadeWindowController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.statusbar.policy.keyguardStateController
import com.android.systemui.statusbar.sysuiStatusBarStateController
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -67,9 +62,7 @@ import com.google.common.truth.Truth.assertWithMessage
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
@@ -79,7 +72,9 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
@RunWithLooper
class StatusBarNotificationPresenterTest : SysuiTestCase() {
    private lateinit var kosmos: Kosmos
    private val kosmos = testKosmos()

    private val visualInterruptionDecisionProvider: VisualInterruptionDecisionProvider = mock()

    private var interruptSuppressor: NotificationInterruptSuppressor? = null
    private var alertsDisabledCondition: VisualInterruptionCondition? = null
@@ -88,30 +83,20 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() {
    private var panelsDisabledCondition: VisualInterruptionCondition? = null

    private val commandQueue: CommandQueue = CommandQueue(mContext, FakeDisplayTracker(mContext))
    private val keyguardStateController: KeyguardStateController
        get() = kosmos.keyguardStateController

    private val notificationAlertsInteractor
        get() = kosmos.notificationAlertsInteractor

    private val visualInterruptionDecisionProvider
        get() = kosmos.visualInterruptionDecisionProvider
    private val shadeController: ShadeController = mock()
    private val notificationAlertsInteractor: NotificationAlertsInteractor = mock()
    private val keyguardStateController: KeyguardStateController = mock()

    private lateinit var underTest: StatusBarNotificationPresenter

    @Before
    fun setup() {
        kosmos =
            testKosmos().apply {
                whenever(notificationAlertsInteractor.areNotificationAlertsEnabled())
                    .thenReturn(true)
                whenever(notificationStackScrollLayoutController.expandHelperCallback)
                    .thenReturn(mock())
                lockscreenShadeTransitionController.setStackScroller(
                    notificationStackScrollLayoutController
                )
                lockscreenShadeTransitionController.centralSurfaces = mock()
            }
        mDependency.injectTestDependency(StatusBarStateController::class.java, mock())
        mDependency.injectTestDependency(ShadeController::class.java, shadeController)
        mDependency.injectMockDependency(NotificationRemoteInputManager.Callback::class.java)
        mDependency.injectMockDependency(NotificationShadeWindowController::class.java)

        whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()).thenReturn(true)

        underTest = createPresenter()
        if (VisualInterruptionRefactor.isEnabled) {
@@ -309,60 +294,14 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() {
        assertThat(types).contains(VisualInterruptionType.BUBBLE)
    }

    @Test
    @EnableSceneContainer
    fun testExpandSensitiveNotification_onLockScreen_opensShade() =
        kosmos.runTest {
            // Given we are on the keyguard
            kosmos.sysuiStatusBarStateController.state = StatusBarState.KEYGUARD
            // And the device is locked
            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                AuthenticationMethodModel.Pin
            )

            // When the user expands a sensitive Notification
            val entry =
                createRow().entry.apply {
                    setSensitive(/* sensitive= */ true, /* deviceSensitive= */ true)
                }
            underTest.onExpandClicked(entry, mock(), /* nowExpanded= */ true)

            // Then we open the locked shade
            assertThat(kosmos.sysuiStatusBarStateController.state)
                .isEqualTo(StatusBarState.SHADE_LOCKED)
        }

    @Test
    @EnableSceneContainer
    fun testExpandSensitiveNotification_onLockedShade_showsBouncer() =
        kosmos.runTest {
            // Given we are on the locked shade
            kosmos.sysuiStatusBarStateController.state = StatusBarState.SHADE_LOCKED
            // And the device is locked
            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                AuthenticationMethodModel.Pin
            )

            // When the user expands a sensitive Notification
            val entry =
                createRow().entry.apply {
                    setSensitive(/* sensitive= */ true, /* deviceSensitive= */ true)
                }
            underTest.onExpandClicked(entry, mock(), /* nowExpanded= */ true)

            // Then we show the bouncer
            verify(kosmos.activityStarter).dismissKeyguardThenExecute(any(), eq(null), eq(false))
            // AND we are still on the locked shade
            assertThat(kosmos.sysuiStatusBarStateController.state)
                .isEqualTo(StatusBarState.SHADE_LOCKED)
        }

    private fun createPresenter(): StatusBarNotificationPresenter {
        val shadeViewController: ShadeViewController = mock()

        val notificationShadeWindowView: NotificationShadeWindowView = mock()
        whenever(notificationShadeWindowView.resources).thenReturn(mContext.resources)
        whenever(kosmos.notificationStackScrollLayoutController.view).thenReturn(mock())

        val stackScrollLayoutController: NotificationStackScrollLayoutController = mock()
        whenever(stackScrollLayoutController.view).thenReturn(mock())

        val initController: InitController = InitController()

@@ -374,12 +313,12 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() {
                kosmos.headsUpManager,
                notificationShadeWindowView,
                kosmos.activityStarter,
                kosmos.notificationStackScrollLayoutController,
                stackScrollLayoutController,
                kosmos.dozeScrimController,
                kosmos.notificationShadeWindowController,
                kosmos.dynamicPrivacyController,
                kosmos.keyguardStateController,
                kosmos.notificationAlertsInteractor,
                keyguardStateController,
                notificationAlertsInteractor,
                kosmos.lockscreenShadeTransitionController,
                kosmos.powerInteractor,
                commandQueue,
@@ -389,11 +328,10 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() {
                /* notificationMediaManager = */ mock(),
                /* notificationGutsManager = */ mock(),
                initController,
                kosmos.visualInterruptionDecisionProvider,
                visualInterruptionDecisionProvider,
                kosmos.notificationRemoteInputManager,
                /* remoteInputManagerCallback = */ mock(),
                /* notificationListContainer = */ mock(),
                kosmos.deviceUnlockedInteractor,
            )
            .also { initController.executePostInitTasks() }
    }
@@ -424,21 +362,14 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() {
        interruptSuppressor = suppressorCaptor.lastValue
    }

    private fun createRow(): ExpandableNotificationRow {
        val row: ExpandableNotificationRow = mock()
        val entry: NotificationEntry = createNotificationEntry()
        whenever(row.entry).thenReturn(entry)
        entry.row = row
        return row
    }

    private fun createNotificationEntry(): NotificationEntry =
        NotificationEntryBuilder()
    private fun createNotificationEntry(): NotificationEntry {
        return NotificationEntryBuilder()
            .setPkg("a")
            .setOpPkg("a")
            .setTag("a")
            .setNotification(Builder(mContext, "a").build())
            .build()
    }

    private fun createFsiNotificationEntry(): NotificationEntry {
        val notification: Notification =
+3 −19
Original line number Diff line number Diff line
@@ -37,12 +37,10 @@ import androidx.annotation.NonNull;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.InitController;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import com.android.systemui.power.domain.interactor.PowerInteractor;
import com.android.systemui.res.R;
import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.shade.NotificationShadeWindowView;
import com.android.systemui.shade.QuickSettingsController;
import com.android.systemui.shade.ShadeViewController;
@@ -61,7 +59,6 @@ import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
import com.android.systemui.statusbar.notification.domain.interactor.NotificationAlertsInteractor;
import com.android.systemui.statusbar.notification.headsup.HeadsUpManager;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor;
import com.android.systemui.statusbar.notification.interruption.VisualInterruptionCondition;
import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider;
@@ -72,6 +69,7 @@ import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.notification.headsup.HeadsUpManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;

import java.util.Set;
@@ -104,7 +102,6 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu
    private final IStatusBarService mBarService;
    private final DynamicPrivacyController mDynamicPrivacyController;
    private final NotificationListContainer mNotifListContainer;
    private final DeviceUnlockedInteractor mDeviceUnlockedInteractor;
    private final QuickSettingsController mQsController;

    protected boolean mVrMode;
@@ -136,8 +133,7 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu
            VisualInterruptionDecisionProvider visualInterruptionDecisionProvider,
            NotificationRemoteInputManager remoteInputManager,
            NotificationRemoteInputManager.Callback remoteInputManagerCallback,
            NotificationListContainer notificationListContainer,
            DeviceUnlockedInteractor deviceUnlockedInteractor) {
            NotificationListContainer notificationListContainer) {
        mActivityStarter = activityStarter;
        mKeyguardStateController = keyguardStateController;
        mNotificationPanel = panel;
@@ -164,7 +160,6 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu
        mBarService = IStatusBarService.Stub.asInterface(
                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
        mNotifListContainer = notificationListContainer;
        mDeviceUnlockedInteractor = deviceUnlockedInteractor;

        IVrManager vrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
                Context.VR_SERVICE));
@@ -253,25 +248,14 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu
            if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) {
                mShadeTransitionController.goToLockedShade(clickedEntry.getRow());
            } else if (clickedEntry.isSensitive().getValue()
                    && isInLockedDownShade()) {
                    && mDynamicPrivacyController.isInLockedDownShade()) {
                mStatusBarStateController.setLeaveOpenOnKeyguardHide(true);
                // launch the bouncer
                mActivityStarter.dismissKeyguardThenExecute(() -> false /* dismissAction */
                        , null /* cancelRunnable */, false /* afterKeyguardGone */);
            }
        }
    }

    /** @return true if the Shade is shown over the Lockscreen, and the device is locked */
    private boolean isInLockedDownShade() {
        if (SceneContainerFlag.isEnabled()) {
            return mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED
                    && !mDeviceUnlockedInteractor.getDeviceUnlockStatus().getValue().isUnlocked();
        } else {
            return mDynamicPrivacyController.isInLockedDownShade();
        }
    }

    @Override
    public boolean isDeviceInVrMode() {
        return mVrMode;
+1 −1
Original line number Diff line number Diff line
@@ -17,6 +17,6 @@
package com.android.systemui.plugins

import com.android.systemui.kosmos.Kosmos
import org.mockito.kotlin.mock
import com.android.systemui.util.mockito.mock

var Kosmos.activityStarter by Kosmos.Fixture { mock<ActivityStarter>() }
+3 −9
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -18,14 +18,8 @@ package com.android.systemui.statusbar

import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import org.mockito.kotlin.mock

var Kosmos.lockscreenShadeKeyguardTransitionController by Fixture {
    mock<LockscreenShadeKeyguardTransitionController>()
}
import com.android.systemui.util.mockito.mock

var Kosmos.lockscreenShadeKeyguardTransitionControllerFactory by Fixture {
    LockscreenShadeKeyguardTransitionController.Factory {
        lockscreenShadeKeyguardTransitionController
    }
    mock<LockscreenShadeKeyguardTransitionController.Factory>()
}
+2 −6
Original line number Diff line number Diff line
@@ -18,12 +18,8 @@ package com.android.systemui.statusbar

import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import org.mockito.kotlin.mock

var Kosmos.lockscreenShadeQsTransitionController by Fixture {
    mock<LockscreenShadeQsTransitionController>()
}
import com.android.systemui.util.mockito.mock

var Kosmos.lockscreenShadeQsTransitionControllerFactory by Fixture {
    LockscreenShadeQsTransitionController.Factory { lockscreenShadeQsTransitionController }
    mock<LockscreenShadeQsTransitionController.Factory>()
}
Loading