Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt +98 −29 Original line number Diff line number Diff line Loading @@ -27,34 +27,39 @@ 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.NotificationRemoteInputManager import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.StatusBarState 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.stack.NotificationStackScrollLayoutController 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.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 Loading @@ -62,7 +67,9 @@ 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 Loading @@ -72,9 +79,7 @@ import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) @RunWithLooper class StatusBarNotificationPresenterTest : SysuiTestCase() { private val kosmos = testKosmos() private val visualInterruptionDecisionProvider: VisualInterruptionDecisionProvider = mock() private lateinit var kosmos: Kosmos private var interruptSuppressor: NotificationInterruptSuppressor? = null private var alertsDisabledCondition: VisualInterruptionCondition? = null Loading @@ -83,20 +88,30 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { private var panelsDisabledCondition: VisualInterruptionCondition? = null private val commandQueue: CommandQueue = CommandQueue(mContext, FakeDisplayTracker(mContext)) private val shadeController: ShadeController = mock() private val notificationAlertsInteractor: NotificationAlertsInteractor = mock() private val keyguardStateController: KeyguardStateController = mock() private val keyguardStateController: KeyguardStateController get() = kosmos.keyguardStateController private val notificationAlertsInteractor get() = kosmos.notificationAlertsInteractor private val visualInterruptionDecisionProvider get() = kosmos.visualInterruptionDecisionProvider private lateinit var underTest: StatusBarNotificationPresenter @Before fun setup() { 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) kosmos = testKosmos().apply { whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()) .thenReturn(true) whenever(notificationStackScrollLayoutController.expandHelperCallback) .thenReturn(mock()) lockscreenShadeTransitionController.setStackScroller( notificationStackScrollLayoutController ) lockscreenShadeTransitionController.centralSurfaces = mock() } underTest = createPresenter() if (VisualInterruptionRefactor.isEnabled) { Loading Loading @@ -294,14 +309,60 @@ 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) val stackScrollLayoutController: NotificationStackScrollLayoutController = mock() whenever(stackScrollLayoutController.view).thenReturn(mock()) whenever(kosmos.notificationStackScrollLayoutController.view).thenReturn(mock()) val initController: InitController = InitController() Loading @@ -313,12 +374,12 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { kosmos.headsUpManager, notificationShadeWindowView, kosmos.activityStarter, stackScrollLayoutController, kosmos.notificationStackScrollLayoutController, kosmos.dozeScrimController, kosmos.notificationShadeWindowController, kosmos.dynamicPrivacyController, keyguardStateController, notificationAlertsInteractor, kosmos.keyguardStateController, kosmos.notificationAlertsInteractor, kosmos.lockscreenShadeTransitionController, kosmos.powerInteractor, commandQueue, Loading @@ -328,10 +389,11 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { /* notificationMediaManager = */ mock(), /* notificationGutsManager = */ mock(), initController, visualInterruptionDecisionProvider, kosmos.visualInterruptionDecisionProvider, kosmos.notificationRemoteInputManager, /* remoteInputManagerCallback = */ mock(), /* notificationListContainer = */ mock(), kosmos.deviceUnlockedInteractor, ) .also { initController.executePostInitTasks() } } Loading Loading @@ -362,14 +424,21 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { interruptSuppressor = suppressorCaptor.lastValue } private fun createNotificationEntry(): NotificationEntry { return NotificationEntryBuilder() 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() .setPkg("a") .setOpPkg("a") .setTag("a") .setNotification(Builder(mContext, "a").build()) .build() } private fun createFsiNotificationEntry(): NotificationEntry { val notification: Notification = Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +19 −3 Original line number Diff line number Diff line Loading @@ -37,10 +37,12 @@ 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; Loading @@ -59,6 +61,7 @@ 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; Loading @@ -69,7 +72,6 @@ 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; Loading Loading @@ -102,6 +104,7 @@ 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; Loading Loading @@ -133,7 +136,8 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu VisualInterruptionDecisionProvider visualInterruptionDecisionProvider, NotificationRemoteInputManager remoteInputManager, NotificationRemoteInputManager.Callback remoteInputManagerCallback, NotificationListContainer notificationListContainer) { NotificationListContainer notificationListContainer, DeviceUnlockedInteractor deviceUnlockedInteractor) { mActivityStarter = activityStarter; mKeyguardStateController = keyguardStateController; mNotificationPanel = panel; Loading @@ -160,6 +164,7 @@ 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)); Loading Loading @@ -248,14 +253,25 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { mShadeTransitionController.goToLockedShade(clickedEntry.getRow()); } else if (clickedEntry.isSensitive().getValue() && mDynamicPrivacyController.isInLockedDownShade()) { && 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; Loading packages/SystemUI/tests/utils/src/com/android/systemui/plugins/ActivityStarterKosmos.kt +1 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,6 @@ package com.android.systemui.plugins import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.mockito.mock import org.mockito.kotlin.mock var Kosmos.activityStarter by Kosmos.Fixture { mock<ActivityStarter>() } packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeKeyguardTransitionControllerKosmos.kt +9 −3 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * Copyright (C) 2024 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. Loading @@ -18,8 +18,14 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.util.mockito.mock import org.mockito.kotlin.mock var Kosmos.lockscreenShadeKeyguardTransitionController by Fixture { mock<LockscreenShadeKeyguardTransitionController>() } var Kosmos.lockscreenShadeKeyguardTransitionControllerFactory by Fixture { mock<LockscreenShadeKeyguardTransitionController.Factory>() LockscreenShadeKeyguardTransitionController.Factory { lockscreenShadeKeyguardTransitionController } } packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerKosmos.kt +6 −2 Original line number Diff line number Diff line Loading @@ -18,8 +18,12 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.util.mockito.mock import org.mockito.kotlin.mock var Kosmos.lockscreenShadeQsTransitionController by Fixture { mock<LockscreenShadeQsTransitionController>() } var Kosmos.lockscreenShadeQsTransitionControllerFactory by Fixture { mock<LockscreenShadeQsTransitionController.Factory>() LockscreenShadeQsTransitionController.Factory { lockscreenShadeQsTransitionController } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.kt +98 −29 Original line number Diff line number Diff line Loading @@ -27,34 +27,39 @@ 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.NotificationRemoteInputManager import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.StatusBarState 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.stack.NotificationStackScrollLayoutController 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.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 Loading @@ -62,7 +67,9 @@ 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 Loading @@ -72,9 +79,7 @@ import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) @RunWithLooper class StatusBarNotificationPresenterTest : SysuiTestCase() { private val kosmos = testKosmos() private val visualInterruptionDecisionProvider: VisualInterruptionDecisionProvider = mock() private lateinit var kosmos: Kosmos private var interruptSuppressor: NotificationInterruptSuppressor? = null private var alertsDisabledCondition: VisualInterruptionCondition? = null Loading @@ -83,20 +88,30 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { private var panelsDisabledCondition: VisualInterruptionCondition? = null private val commandQueue: CommandQueue = CommandQueue(mContext, FakeDisplayTracker(mContext)) private val shadeController: ShadeController = mock() private val notificationAlertsInteractor: NotificationAlertsInteractor = mock() private val keyguardStateController: KeyguardStateController = mock() private val keyguardStateController: KeyguardStateController get() = kosmos.keyguardStateController private val notificationAlertsInteractor get() = kosmos.notificationAlertsInteractor private val visualInterruptionDecisionProvider get() = kosmos.visualInterruptionDecisionProvider private lateinit var underTest: StatusBarNotificationPresenter @Before fun setup() { 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) kosmos = testKosmos().apply { whenever(notificationAlertsInteractor.areNotificationAlertsEnabled()) .thenReturn(true) whenever(notificationStackScrollLayoutController.expandHelperCallback) .thenReturn(mock()) lockscreenShadeTransitionController.setStackScroller( notificationStackScrollLayoutController ) lockscreenShadeTransitionController.centralSurfaces = mock() } underTest = createPresenter() if (VisualInterruptionRefactor.isEnabled) { Loading Loading @@ -294,14 +309,60 @@ 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) val stackScrollLayoutController: NotificationStackScrollLayoutController = mock() whenever(stackScrollLayoutController.view).thenReturn(mock()) whenever(kosmos.notificationStackScrollLayoutController.view).thenReturn(mock()) val initController: InitController = InitController() Loading @@ -313,12 +374,12 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { kosmos.headsUpManager, notificationShadeWindowView, kosmos.activityStarter, stackScrollLayoutController, kosmos.notificationStackScrollLayoutController, kosmos.dozeScrimController, kosmos.notificationShadeWindowController, kosmos.dynamicPrivacyController, keyguardStateController, notificationAlertsInteractor, kosmos.keyguardStateController, kosmos.notificationAlertsInteractor, kosmos.lockscreenShadeTransitionController, kosmos.powerInteractor, commandQueue, Loading @@ -328,10 +389,11 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { /* notificationMediaManager = */ mock(), /* notificationGutsManager = */ mock(), initController, visualInterruptionDecisionProvider, kosmos.visualInterruptionDecisionProvider, kosmos.notificationRemoteInputManager, /* remoteInputManagerCallback = */ mock(), /* notificationListContainer = */ mock(), kosmos.deviceUnlockedInteractor, ) .also { initController.executePostInitTasks() } } Loading Loading @@ -362,14 +424,21 @@ class StatusBarNotificationPresenterTest : SysuiTestCase() { interruptSuppressor = suppressorCaptor.lastValue } private fun createNotificationEntry(): NotificationEntry { return NotificationEntryBuilder() 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() .setPkg("a") .setOpPkg("a") .setTag("a") .setNotification(Builder(mContext, "a").build()) .build() } private fun createFsiNotificationEntry(): NotificationEntry { val notification: Notification = Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +19 −3 Original line number Diff line number Diff line Loading @@ -37,10 +37,12 @@ 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; Loading @@ -59,6 +61,7 @@ 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; Loading @@ -69,7 +72,6 @@ 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; Loading Loading @@ -102,6 +104,7 @@ 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; Loading Loading @@ -133,7 +136,8 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu VisualInterruptionDecisionProvider visualInterruptionDecisionProvider, NotificationRemoteInputManager remoteInputManager, NotificationRemoteInputManager.Callback remoteInputManagerCallback, NotificationListContainer notificationListContainer) { NotificationListContainer notificationListContainer, DeviceUnlockedInteractor deviceUnlockedInteractor) { mActivityStarter = activityStarter; mKeyguardStateController = keyguardStateController; mNotificationPanel = panel; Loading @@ -160,6 +164,7 @@ 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)); Loading Loading @@ -248,14 +253,25 @@ class StatusBarNotificationPresenter implements NotificationPresenter, CommandQu if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { mShadeTransitionController.goToLockedShade(clickedEntry.getRow()); } else if (clickedEntry.isSensitive().getValue() && mDynamicPrivacyController.isInLockedDownShade()) { && 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; Loading
packages/SystemUI/tests/utils/src/com/android/systemui/plugins/ActivityStarterKosmos.kt +1 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,6 @@ package com.android.systemui.plugins import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.mockito.mock import org.mockito.kotlin.mock var Kosmos.activityStarter by Kosmos.Fixture { mock<ActivityStarter>() }
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeKeyguardTransitionControllerKosmos.kt +9 −3 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * Copyright (C) 2024 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. Loading @@ -18,8 +18,14 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.util.mockito.mock import org.mockito.kotlin.mock var Kosmos.lockscreenShadeKeyguardTransitionController by Fixture { mock<LockscreenShadeKeyguardTransitionController>() } var Kosmos.lockscreenShadeKeyguardTransitionControllerFactory by Fixture { mock<LockscreenShadeKeyguardTransitionController.Factory>() LockscreenShadeKeyguardTransitionController.Factory { lockscreenShadeKeyguardTransitionController } }
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerKosmos.kt +6 −2 Original line number Diff line number Diff line Loading @@ -18,8 +18,12 @@ package com.android.systemui.statusbar import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.util.mockito.mock import org.mockito.kotlin.mock var Kosmos.lockscreenShadeQsTransitionController by Fixture { mock<LockscreenShadeQsTransitionController>() } var Kosmos.lockscreenShadeQsTransitionControllerFactory by Fixture { mock<LockscreenShadeQsTransitionController.Factory>() LockscreenShadeQsTransitionController.Factory { lockscreenShadeQsTransitionController } }