diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java index e057188851f6c..7acfbf64ce027 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java @@ -140,6 +140,7 @@ public abstract class KeyguardAbsKeyInputViewController /** Determines the message to show in the bouncer when it first appears. */ protected abstract int getInitialMessageResId(); + /** + * Binds the {@link KeyguardInputView#getBouncerMessageView()} view with the provided context. + */ + public void bindMessageView( + @NonNull BouncerMessageInteractor bouncerMessageInteractor, + KeyguardMessageAreaController.Factory messageAreaControllerFactory, + BouncerLogger bouncerLogger, + FeatureFlags featureFlags) { + BouncerMessageView bouncerMessageView = (BouncerMessageView) mView.getBouncerMessageView(); + if (bouncerMessageView != null) { + BouncerMessageViewBinder.bind(bouncerMessageView, + bouncerMessageInteractor, + messageAreaControllerFactory, + bouncerLogger, + featureFlags); + } + } + /** Factory for a {@link KeyguardInputViewController}. */ public static class Factory { private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index 64b1c502b2c31..bcf8e98a8106e 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -365,6 +365,7 @@ public class KeyguardPatternViewController final long elapsedRealtime = SystemClock.elapsedRealtime(); final long secondsInFuture = (long) Math.ceil( (elapsedRealtimeDeadline - elapsedRealtime) / 1000.0); + getKeyguardSecurityCallback().onAttemptLockoutStart(secondsInFuture); mCountdownTimer = new CountDownTimer(secondsInFuture * 1000, 1000) { @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java index bf9c3bbddc306..2878df2fe03fe 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java @@ -87,6 +87,11 @@ public interface KeyguardSecurityCallback { default void onUserInput() { } + /** + * Invoked when the auth input is disabled for specified number of seconds. + * @param seconds Number of seconds for which the auth input is disabled. + */ + default void onAttemptLockoutStart(long seconds) {} /** * Dismisses keyguard and go to unlocked state. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index b5e54209dab29..57df33e60b481 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -74,6 +74,7 @@ import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.ActivityStarter; @@ -116,6 +117,7 @@ public class KeyguardSecurityContainerController extends ViewController mSideFpsController; private final FalsingA11yDelegate mFalsingA11yDelegate; private final KeyguardFaceAuthInteractor mKeyguardFaceAuthInteractor; + private final BouncerMessageInteractor mBouncerMessageInteractor; private int mTranslationY; // Whether the volume keys should be handled by keyguard. If true, then // they will be handled here for specific media types such as music, otherwise @@ -178,6 +180,7 @@ public class KeyguardSecurityContainerController extends ViewController?, + view: BouncerKeyguardMessageArea?, + message: Message?, + allowTruncation: Boolean = false, + ) { + if (view == null || controller == null) return + if (message?.message != null || message?.messageResId != null) { + controller.setIsVisible(true) + var newMessage = message.message ?: "" + if (message.messageResId != null && message.messageResId != 0) { + newMessage = view.resources.getString(message.messageResId) + if (message.formatterArgs != null) { + newMessage = + PluralsMessageFormatter.format( + view.resources, + message.formatterArgs, + message.messageResId + ) + } + } + controller.setMessage(newMessage, message.animate) + } else { + controller.setIsVisible(false) + controller.setMessage(0) + } + message?.colorState?.let { controller.setNextMessageColor(it) } + view.ellipsize = + if (allowTruncation) TextUtils.TruncateAt.END else TextUtils.TruncateAt.MARQUEE + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt index c1aefc7bcbd73..dd1a9d21f2d6a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt @@ -22,16 +22,20 @@ import android.view.ViewGroup import android.window.OnBackAnimationCallback import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle +import com.android.keyguard.KeyguardMessageAreaController import com.android.keyguard.KeyguardSecurityContainerController import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardSecurityView import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.dagger.KeyguardBouncerComponent +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor import com.android.systemui.keyguard.data.BouncerViewDelegate import com.android.systemui.keyguard.shared.constants.KeyguardBouncerConstants.EXPANSION_VISIBLE import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.lifecycle.repeatWhenAttached +import com.android.systemui.log.BouncerLogger import com.android.systemui.plugins.ActivityStarter import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.filter @@ -44,7 +48,11 @@ object KeyguardBouncerViewBinder { view: ViewGroup, viewModel: KeyguardBouncerViewModel, primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel, - componentFactory: KeyguardBouncerComponent.Factory + componentFactory: KeyguardBouncerComponent.Factory, + messageAreaControllerFactory: KeyguardMessageAreaController.Factory, + bouncerMessageInteractor: BouncerMessageInteractor, + bouncerLogger: BouncerLogger, + featureFlags: FeatureFlags, ) { // Builds the KeyguardSecurityContainerController from bouncer view group. val securityContainerController: KeyguardSecurityContainerController = @@ -125,8 +133,16 @@ object KeyguardBouncerViewBinder { securityContainerController.onResume( KeyguardSecurityView.SCREEN_ON ) + bouncerLogger.bindingBouncerMessageView() + it.bindMessageView( + bouncerMessageInteractor, + messageAreaControllerFactory, + bouncerLogger, + featureFlags + ) } } else { + bouncerMessageInteractor.onBouncerBeingHidden() securityContainerController.onBouncerVisibilityChanged( /* isVisible= */ false ) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index 2f7644eb5c82d..f4485c9da4529 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -36,6 +36,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.keyguard.AuthKeyguardMessageArea; +import com.android.keyguard.KeyguardMessageAreaController; import com.android.keyguard.LockIconViewController; import com.android.keyguard.dagger.KeyguardBouncerComponent; import com.android.systemui.R; @@ -45,12 +46,14 @@ import com.android.systemui.dock.DockManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.shared.model.TransitionState; import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.keyguard.ui.binder.KeyguardBouncerViewBinder; import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel; import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel; +import com.android.systemui.log.BouncerLogger; import com.android.systemui.multishade.domain.interactor.MultiShadeInteractor; import com.android.systemui.multishade.domain.interactor.MultiShadeMotionEventInteractor; import com.android.systemui.multishade.ui.view.MultiShadeView; @@ -149,12 +152,15 @@ public class NotificationShadeWindowViewController { PulsingGestureListener pulsingGestureListener, KeyguardBouncerViewModel keyguardBouncerViewModel, KeyguardBouncerComponent.Factory keyguardBouncerComponentFactory, + KeyguardMessageAreaController.Factory messageAreaControllerFactory, KeyguardTransitionInteractor keyguardTransitionInteractor, PrimaryBouncerToGoneTransitionViewModel primaryBouncerToGoneTransitionViewModel, FeatureFlags featureFlags, Provider multiShadeInteractorProvider, SystemClock clock, - Provider multiShadeMotionEventInteractorProvider) { + Provider multiShadeMotionEventInteractorProvider, + BouncerMessageInteractor bouncerMessageInteractor, + BouncerLogger bouncerLogger) { mLockscreenShadeTransitionController = transitionController; mFalsingCollector = falsingCollector; mStatusBarStateController = statusBarStateController; @@ -183,7 +189,11 @@ public class NotificationShadeWindowViewController { mView.findViewById(R.id.keyguard_bouncer_container), keyguardBouncerViewModel, primaryBouncerToGoneTransitionViewModel, - keyguardBouncerComponentFactory); + keyguardBouncerComponentFactory, + messageAreaControllerFactory, + bouncerMessageInteractor, + bouncerLogger, + featureFlags); collectFlow(mView, keyguardTransitionInteractor.getLockscreenToDreamingTransition(), mLockscreenToDreamingTransition); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 12420ff5f4818..f409f80f95d05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -94,6 +94,7 @@ import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.KeyguardIndication; import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController; import com.android.systemui.keyguard.ScreenLifecycle; +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.log.LogLevel; import com.android.systemui.plugins.FalsingManager; @@ -147,6 +148,7 @@ public class KeyguardIndicationController { private final AuthController mAuthController; private final KeyguardLogger mKeyguardLogger; private final UserTracker mUserTracker; + private final BouncerMessageInteractor mBouncerMessageInteractor; private ViewGroup mIndicationArea; private KeyguardIndicationTextView mTopIndicationView; private KeyguardIndicationTextView mLockScreenIndicationView; @@ -253,7 +255,8 @@ public class KeyguardIndicationController { KeyguardLogger keyguardLogger, AlternateBouncerInteractor alternateBouncerInteractor, AlarmManager alarmManager, - UserTracker userTracker + UserTracker userTracker, + BouncerMessageInteractor bouncerMessageInteractor ) { mContext = context; mBroadcastDispatcher = broadcastDispatcher; @@ -278,7 +281,7 @@ public class KeyguardIndicationController { mScreenLifecycle.addObserver(mScreenObserver); mAlternateBouncerInteractor = alternateBouncerInteractor; mUserTracker = userTracker; - + mBouncerMessageInteractor = bouncerMessageInteractor; mFaceAcquiredMessageDeferral = faceHelpMessageDeferral; mCoExFaceAcquisitionMsgIdsToShow = new HashSet<>(); int[] msgIds = context.getResources().getIntArray( @@ -1151,6 +1154,11 @@ public class KeyguardIndicationController { msgId, helpString); } else if (mStatusBarKeyguardViewManager.isBouncerShowing()) { + if (biometricSourceType == FINGERPRINT && !fpAuthFailed) { + mBouncerMessageInteractor.setFingerprintAcquisitionMessage(helpString); + } else if (faceAuthSoftError) { + mBouncerMessageInteractor.setFaceAcquisitionMessage(helpString); + } mStatusBarKeyguardViewManager.setKeyguardMessage(helpString, mInitialTextColorState); } else if (mScreenLifecycle.getScreenState() == SCREEN_ON) { @@ -1206,6 +1214,8 @@ public class KeyguardIndicationController { if (biometricSourceType == FACE) { mFaceAcquiredMessageDeferral.reset(); } + mBouncerMessageInteractor.setFaceAcquisitionMessage(null); + mBouncerMessageInteractor.setFingerprintAcquisitionMessage(null); } @Override @@ -1226,6 +1236,8 @@ public class KeyguardIndicationController { } else if (biometricSourceType == FINGERPRINT) { onFingerprintAuthError(msgId, errString); } + mBouncerMessageInteractor.setFaceAcquisitionMessage(null); + mBouncerMessageInteractor.setFingerprintAcquisitionMessage(null); } private void onFaceAuthError(int msgId, String errString) { @@ -1310,6 +1322,8 @@ public class KeyguardIndicationController { showActionToUnlock(); } } + mBouncerMessageInteractor.setFaceAcquisitionMessage(null); + mBouncerMessageInteractor.setFingerprintAcquisitionMessage(null); } @Override diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java index d2e5a45c3a933..e1ba48809f1c6 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java @@ -67,6 +67,7 @@ import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.ActivityStarter; @@ -216,7 +217,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker, Optional.of(mSideFpsController), mFalsingA11yDelegate, mTelephonyManager, mViewMediatorCallback, mAudioManager, - mock(KeyguardFaceAuthInteractor.class)); + mock(KeyguardFaceAuthInteractor.class), + mock(BouncerMessageInteractor.class)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt index 16277de850d6f..0393bef165db5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt @@ -21,6 +21,7 @@ import android.testing.TestableLooper.RunWithLooper import android.view.MotionEvent import android.view.ViewGroup import androidx.test.filters.SmallTest +import com.android.keyguard.KeyguardMessageAreaController import com.android.keyguard.KeyguardSecurityContainerController import com.android.keyguard.LockIconViewController import com.android.keyguard.dagger.KeyguardBouncerComponent @@ -29,14 +30,20 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.dock.DockManager +import com.android.systemui.dump.logcatLogBuffer import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.KeyguardUnlockAnimationController +import com.android.systemui.keyguard.bouncer.data.factory.BouncerMessageFactory +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor +import com.android.systemui.keyguard.bouncer.domain.interactor.CountDownTimerUtil +import com.android.systemui.keyguard.data.repository.FakeBouncerMessageRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel +import com.android.systemui.log.BouncerLogger import com.android.systemui.multishade.data.remoteproxy.MultiShadeInputProxy import com.android.systemui.multishade.data.repository.MultiShadeRepository import com.android.systemui.multishade.domain.interactor.MultiShadeInteractor @@ -54,6 +61,7 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarViewController import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.window.StatusBarWindowStateController import com.android.systemui.unfold.UnfoldTransitionProgressProvider +import com.android.systemui.user.data.repository.FakeUserRepository import com.android.systemui.util.mockito.any import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat @@ -104,7 +112,8 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { @Mock lateinit var keyguardBouncerComponent: KeyguardBouncerComponent @Mock lateinit var keyguardSecurityContainerController: KeyguardSecurityContainerController @Mock - private lateinit var unfoldTransitionProgressProvider: Optional + private lateinit var unfoldTransitionProgressProvider: + Optional @Mock lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Mock lateinit var primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel @@ -134,6 +143,7 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { featureFlags.set(Flags.TRACKPAD_GESTURE_FEATURES, false) featureFlags.set(Flags.DUAL_SHADE, false) featureFlags.set(Flags.SPLIT_SHADE_SUBPIXEL_OPTIMIZATION, true) + featureFlags.set(Flags.REVAMPED_BOUNCER_MESSAGES, true) val inputProxy = MultiShadeInputProxy() testScope = TestScope() @@ -170,6 +180,7 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { pulsingGestureListener, keyguardBouncerViewModel, keyguardBouncerComponentFactory, + mock(KeyguardMessageAreaController.Factory::class.java), keyguardTransitionInteractor, primaryBouncerToGoneTransitionViewModel, featureFlags, @@ -189,6 +200,10 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { shadeController = shadeController, ) }, + BouncerMessageInteractor(FakeBouncerMessageRepository(), + mock(BouncerMessageFactory::class.java), + FakeUserRepository(), CountDownTimerUtil(), featureFlags), + BouncerLogger(logcatLogBuffer("BouncerLog")) ) underTest.setupExpandedStatusBar() diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt index 16af208fd5311..5ae8ee14678a6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt @@ -21,6 +21,7 @@ import android.testing.TestableLooper.RunWithLooper import android.view.MotionEvent import android.widget.FrameLayout import androidx.test.filters.SmallTest +import com.android.keyguard.KeyguardMessageAreaController import com.android.keyguard.KeyguardSecurityContainerController import com.android.keyguard.LockIconViewController import com.android.keyguard.dagger.KeyguardBouncerComponent @@ -29,13 +30,19 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.dock.DockManager +import com.android.systemui.dump.logcatLogBuffer import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.KeyguardUnlockAnimationController +import com.android.systemui.keyguard.bouncer.data.factory.BouncerMessageFactory +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor +import com.android.systemui.keyguard.bouncer.domain.interactor.CountDownTimerUtil +import com.android.systemui.keyguard.data.repository.FakeBouncerMessageRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel +import com.android.systemui.log.BouncerLogger import com.android.systemui.multishade.data.remoteproxy.MultiShadeInputProxy import com.android.systemui.multishade.data.repository.MultiShadeRepository import com.android.systemui.multishade.domain.interactor.MultiShadeInteractor @@ -54,11 +61,13 @@ import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.window.StatusBarWindowStateController import com.android.systemui.unfold.UnfoldTransitionProgressProvider +import com.android.systemui.user.data.repository.FakeUserRepository import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat +import java.util.Optional import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.test.TestScope @@ -69,10 +78,10 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations -import java.util.Optional @OptIn(ExperimentalCoroutinesApi::class) @RunWith(AndroidTestingRunner::class) @@ -106,7 +115,8 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { @Mock private lateinit var keyguardSecurityContainerController: KeyguardSecurityContainerController @Mock - private lateinit var unfoldTransitionProgressProvider: Optional + private lateinit var unfoldTransitionProgressProvider: + Optional @Mock private lateinit var notificationInsetsController: NotificationInsetsController @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Mock @@ -146,6 +156,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { featureFlags.set(Flags.TRACKPAD_GESTURE_FEATURES, false) featureFlags.set(Flags.DUAL_SHADE, false) featureFlags.set(Flags.SPLIT_SHADE_SUBPIXEL_OPTIMIZATION, true) + featureFlags.set(Flags.REVAMPED_BOUNCER_MESSAGES, true) val inputProxy = MultiShadeInputProxy() testScope = TestScope() val multiShadeInteractor = @@ -181,6 +192,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { pulsingGestureListener, keyguardBouncerViewModel, keyguardBouncerComponentFactory, + Mockito.mock(KeyguardMessageAreaController.Factory::class.java), keyguardTransitionInteractor, primaryBouncerToGoneTransitionViewModel, featureFlags, @@ -200,6 +212,14 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { shadeController = shadeController, ) }, + BouncerMessageInteractor( + FakeBouncerMessageRepository(), + Mockito.mock(BouncerMessageFactory::class.java), + FakeUserRepository(), + CountDownTimerUtil(), + featureFlags + ), + BouncerLogger(logcatLogBuffer("BouncerLog")) ) controller.setupExpandedStatusBar() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index 542e0cb728a31..c810f0cbf3286 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -102,6 +102,7 @@ import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.KeyguardIndication; import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController; import com.android.systemui.keyguard.ScreenLifecycle; +import com.android.systemui.keyguard.bouncer.domain.interactor.BouncerMessageInteractor; import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -297,7 +298,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mFaceHelpMessageDeferral, mock(KeyguardLogger.class), mAlternateBouncerInteractor, mAlarmManager, - mUserTracker + mUserTracker, + mock(BouncerMessageInteractor.class) ); mController.init(); mController.setIndicationArea(mIndicationArea);