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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user