Add BouncerMessageViewBinder and wire-up BouncerMessageInteractor across sysui

Bug: 275600559
Test: verified manually for all triggers
Change-Id: I522463a976347a1af06c7ef492007ce70cadfe6b
Merged-In: I522463a976347a1af06c7ef492007ce70cadfe6b
This commit is contained in:
Chandru S
2023-05-08 07:12:45 -07:00
parent 05ca0c877b
commit 86f5f3c186
13 changed files with 241 additions and 11 deletions

View File

@@ -140,6 +140,7 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
long elapsedRealtime = SystemClock.elapsedRealtime();
long secondsInFuture = (long) Math.ceil(
(elapsedRealtimeDeadline - elapsedRealtime) / 1000.0);
getKeyguardSecurityCallback().onAttemptLockoutStart(secondsInFuture);
mCountdownTimer = new CountDownTimer(secondsInFuture * 1000, 1000) {
@Override

View File

@@ -17,6 +17,7 @@
package com.android.keyguard;
import android.annotation.CallSuper;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -33,6 +34,10 @@ import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dagger.qualifiers.Main;
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.bouncer.ui.BouncerMessageView;
import com.android.systemui.keyguard.ui.binder.BouncerMessageViewBinder;
import com.android.systemui.log.BouncerLogger;
import com.android.systemui.statusbar.policy.DevicePostureController;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -168,6 +173,24 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
/** 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;

View File

@@ -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

View File

@@ -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.

View File

@@ -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<Keyguard
private final Optional<SideFpsController> 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<Keyguard
@Override
public void onUserInput() {
mBouncerMessageInteractor.onPrimaryBouncerUserInput();
mKeyguardFaceAuthInteractor.onPrimaryBouncerUserInput();
mUpdateMonitor.cancelFaceAuth();
}
@@ -206,8 +209,16 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
return false;
}
@Override
public void onAttemptLockoutStart(long seconds) {
mBouncerMessageInteractor.onPrimaryAuthLockedOut(seconds);
}
@Override
public void reportUnlockAttempt(int userId, boolean success, int timeoutMs) {
if (timeoutMs == 0 && !success) {
mBouncerMessageInteractor.onPrimaryAuthIncorrectAttempt();
}
int bouncerSide = SysUiStatsLog.KEYGUARD_BOUNCER_PASSWORD_ENTERED__SIDE__DEFAULT;
if (mView.isSidedSecurityMode()) {
bouncerSide = mView.isSecurityLeftAligned()
@@ -392,7 +403,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
TelephonyManager telephonyManager,
ViewMediatorCallback viewMediatorCallback,
AudioManager audioManager,
KeyguardFaceAuthInteractor keyguardFaceAuthInteractor
KeyguardFaceAuthInteractor keyguardFaceAuthInteractor,
BouncerMessageInteractor bouncerMessageInteractor
) {
super(view);
mLockPatternUtils = lockPatternUtils;
@@ -418,6 +430,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
mViewMediatorCallback = viewMediatorCallback;
mAudioManager = audioManager;
mKeyguardFaceAuthInteractor = keyguardFaceAuthInteractor;
mBouncerMessageInteractor = bouncerMessageInteractor;
}
@Override
@@ -438,6 +451,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
// Update ViewMediator with the current input method requirements
mViewMediatorCallback.setNeedsInput(needsInput());
mView.setOnKeyListener(mOnKeyListener);
showPrimarySecurityScreen(false);
}

View File

@@ -0,0 +1,107 @@
/*
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.keyguard.ui.binder
import android.text.TextUtils
import android.util.PluralsMessageFormatter
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.keyguard.BouncerKeyguardMessageArea
import com.android.keyguard.KeyguardMessageArea
import com.android.keyguard.KeyguardMessageAreaController
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.bouncer.shared.model.Message
import com.android.systemui.keyguard.bouncer.ui.BouncerMessageView
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.log.BouncerLogger
import kotlinx.coroutines.launch
object BouncerMessageViewBinder {
@JvmStatic
fun bind(
view: BouncerMessageView,
interactor: BouncerMessageInteractor,
factory: KeyguardMessageAreaController.Factory,
bouncerLogger: BouncerLogger,
featureFlags: FeatureFlags
) {
view.repeatWhenAttached {
if (!featureFlags.isEnabled(Flags.REVAMPED_BOUNCER_MESSAGES)) {
view.primaryMessageView?.disable()
view.secondaryMessageView?.disable()
return@repeatWhenAttached
}
view.init(factory)
view.primaryMessage?.setIsVisible(true)
view.secondaryMessage?.setIsVisible(true)
repeatOnLifecycle(Lifecycle.State.STARTED) {
bouncerLogger.startBouncerMessageInteractor()
launch {
interactor.bouncerMessage.collect {
bouncerLogger.bouncerMessageUpdated(it)
updateView(
view.primaryMessage,
view.primaryMessageView,
message = it?.message,
allowTruncation = true,
)
updateView(
view.secondaryMessage,
view.secondaryMessageView,
message = it?.secondaryMessage,
allowTruncation = false,
)
view.requestLayout()
}
}
}
}
}
private fun updateView(
controller: KeyguardMessageAreaController<KeyguardMessageArea>?,
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
}
}

View File

@@ -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
)

View File

@@ -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<MultiShadeInteractor> multiShadeInteractorProvider,
SystemClock clock,
Provider<MultiShadeMotionEventInteractor> multiShadeMotionEventInteractorProvider) {
Provider<MultiShadeMotionEventInteractor> 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);

View File

@@ -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

View File

@@ -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

View File

@@ -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<UnfoldTransitionProgressProvider>
private lateinit var unfoldTransitionProgressProvider:
Optional<UnfoldTransitionProgressProvider>
@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()

View File

@@ -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<UnfoldTransitionProgressProvider>
private lateinit var unfoldTransitionProgressProvider:
Optional<UnfoldTransitionProgressProvider>
@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()

View File

@@ -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);