Merge "Begin disconnecting KeyguardStatusViewController from NPVC" into udc-qpr-dev

This commit is contained in:
Matt Pietal
2023-07-31 16:19:25 +00:00
committed by Android (Google) Code Review
18 changed files with 318 additions and 192 deletions

View File

@@ -20,6 +20,7 @@ import static androidx.constraintlayout.widget.ConstraintSet.END;
import static androidx.constraintlayout.widget.ConstraintSet.PARENT_ID; import static androidx.constraintlayout.widget.ConstraintSet.PARENT_ID;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_CLOCK_MOVE_ANIMATION; import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_CLOCK_MOVE_ANIMATION;
import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
import android.animation.Animator; import android.animation.Animator;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
@@ -51,6 +52,10 @@ import com.android.systemui.Dumpable;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.shared.model.ScreenModel;
import com.android.systemui.keyguard.shared.model.ScreenState;
import com.android.systemui.plugins.ClockController; import com.android.systemui.plugins.ClockController;
import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.PropertyAnimator;
@@ -62,6 +67,9 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
import kotlin.coroutines.CoroutineContext;
import kotlin.coroutines.EmptyCoroutineContext;
import java.io.PrintWriter; import java.io.PrintWriter;
import javax.inject.Inject; import javax.inject.Inject;
@@ -91,6 +99,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
private final FeatureFlags mFeatureFlags; private final FeatureFlags mFeatureFlags;
private final InteractionJankMonitor mInteractionJankMonitor; private final InteractionJankMonitor mInteractionJankMonitor;
private final Rect mClipBounds = new Rect(); private final Rect mClipBounds = new Rect();
private final KeyguardInteractor mKeyguardInteractor;
private Boolean mStatusViewCentered = true; private Boolean mStatusViewCentered = true;
@@ -122,6 +131,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
KeyguardLogger logger, KeyguardLogger logger,
FeatureFlags featureFlags, FeatureFlags featureFlags,
InteractionJankMonitor interactionJankMonitor, InteractionJankMonitor interactionJankMonitor,
KeyguardInteractor keyguardInteractor,
DumpManager dumpManager) { DumpManager dumpManager) {
super(keyguardStatusView); super(keyguardStatusView);
mKeyguardSliceViewController = keyguardSliceViewController; mKeyguardSliceViewController = keyguardSliceViewController;
@@ -134,12 +144,34 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
mInteractionJankMonitor = interactionJankMonitor; mInteractionJankMonitor = interactionJankMonitor;
mFeatureFlags = featureFlags; mFeatureFlags = featureFlags;
mDumpManager = dumpManager; mDumpManager = dumpManager;
mKeyguardInteractor = keyguardInteractor;
} }
@Override @Override
public void onInit() { public void onInit() {
mKeyguardClockSwitchController.init(); mKeyguardClockSwitchController.init();
mDumpManager.registerDumpable(this); mDumpManager.registerDumpable(this);
if (mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
startCoroutines(EmptyCoroutineContext.INSTANCE);
}
}
void startCoroutines(CoroutineContext context) {
collectFlow(mView, mKeyguardInteractor.getDozeTimeTick(),
(Long millis) -> {
dozeTimeTick();
}, context);
collectFlow(mView, mKeyguardInteractor.getScreenModel(),
(ScreenModel model) -> {
if (model.getState() == ScreenState.SCREEN_TURNING_ON) {
dozeTimeTick();
}
}, context);
}
public KeyguardStatusView getView() {
return mView;
} }
@Override @Override

View File

@@ -47,16 +47,15 @@ import com.android.systemui.statusbar.phone.BiometricUnlockController.WakeAndUnl
import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
@@ -177,7 +176,7 @@ interface KeyguardRepository {
val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState>
/** Receive an event for doze time tick */ /** Receive an event for doze time tick */
val dozeTimeTick: Flow<Unit> val dozeTimeTick: Flow<Long>
/** /**
* Returns `true` if the keyguard is showing; `false` otherwise. * Returns `true` if the keyguard is showing; `false` otherwise.
@@ -248,6 +247,7 @@ constructor(
private val dreamOverlayCallbackController: DreamOverlayCallbackController, private val dreamOverlayCallbackController: DreamOverlayCallbackController,
@Main private val mainDispatcher: CoroutineDispatcher, @Main private val mainDispatcher: CoroutineDispatcher,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
private val systemClock: SystemClock,
) : KeyguardRepository { ) : KeyguardRepository {
private val _animateBottomAreaDozingTransitions = MutableStateFlow(false) private val _animateBottomAreaDozingTransitions = MutableStateFlow(false)
override val animateBottomAreaDozingTransitions = override val animateBottomAreaDozingTransitions =
@@ -398,11 +398,11 @@ constructor(
_isDozing.value = isDozing _isDozing.value = isDozing
} }
private val _dozeTimeTick = MutableSharedFlow<Unit>() private val _dozeTimeTick = MutableStateFlow<Long>(0)
override val dozeTimeTick = _dozeTimeTick.asSharedFlow() override val dozeTimeTick = _dozeTimeTick.asStateFlow()
override fun dozeTimeTick() { override fun dozeTimeTick() {
_dozeTimeTick.tryEmit(Unit) _dozeTimeTick.value = systemClock.uptimeMillis()
} }
private val _lastDozeTapToWakePosition = MutableStateFlow<Point?>(null) private val _lastDozeTapToWakePosition = MutableStateFlow<Point?>(null)

View File

@@ -24,14 +24,11 @@ import com.android.systemui.common.ui.data.repository.ConfigurationRepository
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.doze.util.BurnInHelperWrapper import com.android.systemui.doze.util.BurnInHelperWrapper
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
@@ -46,24 +43,17 @@ constructor(
private val burnInHelperWrapper: BurnInHelperWrapper, private val burnInHelperWrapper: BurnInHelperWrapper,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
private val configurationRepository: ConfigurationRepository, private val configurationRepository: ConfigurationRepository,
private val systemClock: SystemClock, private val keyguardInteractor: KeyguardInteractor,
) { ) {
private val _dozeTimeTick = MutableStateFlow<Long>(0)
val dozeTimeTick: StateFlow<Long> = _dozeTimeTick.asStateFlow()
val udfpsBurnInXOffset: StateFlow<Int> = val udfpsBurnInXOffset: StateFlow<Int> =
burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_x, isXAxis = true) burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_x, isXAxis = true)
val udfpsBurnInYOffset: StateFlow<Int> = val udfpsBurnInYOffset: StateFlow<Int> =
burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_y, isXAxis = false) burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_y, isXAxis = false)
val udfpsBurnInProgress: StateFlow<Float> = val udfpsBurnInProgress: StateFlow<Float> =
dozeTimeTick keyguardInteractor.dozeTimeTick
.mapLatest { burnInHelperWrapper.burnInProgressOffset() } .mapLatest { burnInHelperWrapper.burnInProgressOffset() }
.stateIn(scope, SharingStarted.Lazily, burnInHelperWrapper.burnInProgressOffset()) .stateIn(scope, SharingStarted.Lazily, burnInHelperWrapper.burnInProgressOffset())
fun dozeTimeTick() {
_dozeTimeTick.value = systemClock.uptimeMillis()
}
/** /**
* Use for max burn-in offsets that are NOT specified in pixels. This flow will recalculate the * Use for max burn-in offsets that are NOT specified in pixels. This flow will recalculate the
* max burn-in offset on any configuration changes. If the max burn-in offset is specified in * max burn-in offset on any configuration changes. If the max burn-in offset is specified in
@@ -77,7 +67,9 @@ constructor(
.flatMapLatest { .flatMapLatest {
val maxBurnInOffsetPixels = val maxBurnInOffsetPixels =
context.resources.getDimensionPixelSize(maxBurnInOffsetResourceId) context.resources.getDimensionPixelSize(maxBurnInOffsetResourceId)
dozeTimeTick.mapLatest { calculateOffset(maxBurnInOffsetPixels, isXAxis) } keyguardInteractor.dozeTimeTick.mapLatest {
calculateOffset(maxBurnInOffsetPixels, isXAxis)
}
} }
.stateIn( .stateIn(
scope, scope,
@@ -102,7 +94,9 @@ constructor(
.flatMapLatest { scale -> .flatMapLatest { scale ->
val maxBurnInOffsetPixels = val maxBurnInOffsetPixels =
context.resources.getDimensionPixelSize(maxBurnInOffsetResourceId) context.resources.getDimensionPixelSize(maxBurnInOffsetResourceId)
dozeTimeTick.mapLatest { calculateOffset(maxBurnInOffsetPixels, isXAxis, scale) } keyguardInteractor.dozeTimeTick.mapLatest {
calculateOffset(maxBurnInOffsetPixels, isXAxis, scale)
}
} }
.stateIn( .stateIn(
scope, scope,

View File

@@ -34,6 +34,7 @@ import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.DozeStateModel.Companion.isDozeOff import com.android.systemui.keyguard.shared.model.DozeStateModel.Companion.isDozeOff
import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel
import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.ScreenModel
import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.keyguard.shared.model.WakefulnessModel import com.android.systemui.keyguard.shared.model.WakefulnessModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
@@ -87,7 +88,7 @@ constructor(
/** Whether the system is in doze mode. */ /** Whether the system is in doze mode. */
val isDozing: Flow<Boolean> = repository.isDozing val isDozing: Flow<Boolean> = repository.isDozing
/** Receive an event for doze time tick */ /** Receive an event for doze time tick */
val dozeTimeTick: Flow<Unit> = repository.dozeTimeTick val dozeTimeTick: Flow<Long> = repository.dozeTimeTick
/** Whether Always-on Display mode is available. */ /** Whether Always-on Display mode is available. */
val isAodAvailable: Flow<Boolean> = repository.isAodAvailable val isAodAvailable: Flow<Boolean> = repository.isAodAvailable
/** Doze transition information. */ /** Doze transition information. */
@@ -122,6 +123,9 @@ constructor(
/** The device wake/sleep state */ /** The device wake/sleep state */
val wakefulnessModel: StateFlow<WakefulnessModel> = repository.wakefulness val wakefulnessModel: StateFlow<WakefulnessModel> = repository.wakefulness
/** The device screen state */
val screenModel: StateFlow<ScreenModel> = repository.screenModel
/** /**
* Dozing and dreaming have overlapping events. If the doze state remains in FINISH, it means * Dozing and dreaming have overlapping events. If the doze state remains in FINISH, it means
* that doze mode is not running and DREAMING is ok to commence. * that doze mode is not running and DREAMING is ok to commence.

View File

@@ -2820,7 +2820,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
@Override @Override
public void onScreenTurningOn() { public void onScreenTurningOn() {
mKeyguardStatusViewController.dozeTimeTick(); if (!mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
mKeyguardStatusViewController.dozeTimeTick();
}
} }
private void onMiddleClicked() { private void onMiddleClicked() {
@@ -3070,10 +3072,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
} }
} }
@Override
public void dozeTimeTick() { public void dozeTimeTick() {
mLockIconViewController.dozeTimeTick(); mLockIconViewController.dozeTimeTick();
mKeyguardStatusViewController.dozeTimeTick(); if (!mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
mKeyguardStatusViewController.dozeTimeTick();
}
if (mInterpolatedDarkAmount > 0) { if (mInterpolatedDarkAmount > 0) {
positionClockAndNotifications(); positionClockAndNotifications();
} }

View File

@@ -38,7 +38,6 @@ import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog; import com.android.systemui.doze.DozeLog;
import com.android.systemui.doze.DozeReceiver; import com.android.systemui.doze.DozeReceiver;
import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor;
import com.android.systemui.keyguard.domain.interactor.DozeInteractor; import com.android.systemui.keyguard.domain.interactor.DozeInteractor;
import com.android.systemui.shade.NotificationShadeWindowViewController; import com.android.systemui.shade.NotificationShadeWindowViewController;
import com.android.systemui.shade.ShadeViewController; import com.android.systemui.shade.ShadeViewController;
@@ -94,7 +93,6 @@ public final class DozeServiceHost implements DozeHost {
private NotificationShadeWindowViewController mNotificationShadeWindowViewController; private NotificationShadeWindowViewController mNotificationShadeWindowViewController;
private final AuthController mAuthController; private final AuthController mAuthController;
private final NotificationIconAreaController mNotificationIconAreaController; private final NotificationIconAreaController mNotificationIconAreaController;
private final BurnInInteractor mBurnInInteractor;
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private ShadeViewController mNotificationPanel; private ShadeViewController mNotificationPanel;
private View mAmbientIndicationContainer; private View mAmbientIndicationContainer;
@@ -118,8 +116,7 @@ public final class DozeServiceHost implements DozeHost {
NotificationWakeUpCoordinator notificationWakeUpCoordinator, NotificationWakeUpCoordinator notificationWakeUpCoordinator,
AuthController authController, AuthController authController,
NotificationIconAreaController notificationIconAreaController, NotificationIconAreaController notificationIconAreaController,
DozeInteractor dozeInteractor, DozeInteractor dozeInteractor) {
BurnInInteractor burnInInteractor) {
super(); super();
mDozeLog = dozeLog; mDozeLog = dozeLog;
mPowerManager = powerManager; mPowerManager = powerManager;
@@ -138,7 +135,6 @@ public final class DozeServiceHost implements DozeHost {
mNotificationWakeUpCoordinator = notificationWakeUpCoordinator; mNotificationWakeUpCoordinator = notificationWakeUpCoordinator;
mAuthController = authController; mAuthController = authController;
mNotificationIconAreaController = notificationIconAreaController; mNotificationIconAreaController = notificationIconAreaController;
mBurnInInteractor = burnInInteractor;
mHeadsUpManagerPhone.addListener(mOnHeadsUpChangedListener); mHeadsUpManagerPhone.addListener(mOnHeadsUpChangedListener);
mDozeInteractor = dozeInteractor; mDozeInteractor = dozeInteractor;
} }
@@ -317,7 +313,6 @@ public final class DozeServiceHost implements DozeHost {
if (mAmbientIndicationContainer instanceof DozeReceiver) { if (mAmbientIndicationContainer instanceof DozeReceiver) {
((DozeReceiver) mAmbientIndicationContainer).dozeTimeTick(); ((DozeReceiver) mAmbientIndicationContainer).dozeTimeTick();
} }
mBurnInInteractor.dozeTimeTick();
} }
@Override @Override

View File

@@ -0,0 +1,107 @@
/*
* Copyright (C) 2020 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.keyguard;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.view.View;
import android.view.ViewTreeObserver;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.keyguard.logging.KeyguardLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import org.junit.Before;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class KeyguardStatusViewControllerBaseTest extends SysuiTestCase {
@Mock protected KeyguardStatusView mKeyguardStatusView;
@Mock protected KeyguardSliceViewController mKeyguardSliceViewController;
@Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController;
@Mock protected KeyguardStateController mKeyguardStateController;
@Mock protected KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock protected ConfigurationController mConfigurationController;
@Mock protected DozeParameters mDozeParameters;
@Mock protected ScreenOffAnimationController mScreenOffAnimationController;
@Mock protected KeyguardLogger mKeyguardLogger;
@Mock protected KeyguardStatusViewController mControllerMock;
@Mock protected FeatureFlags mFeatureFlags;
@Mock protected InteractionJankMonitor mInteractionJankMonitor;
@Mock protected ViewTreeObserver mViewTreeObserver;
@Mock protected DumpManager mDumpManager;
protected FakeKeyguardRepository mFakeKeyguardRepository;
protected KeyguardStatusViewController mController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
KeyguardInteractorFactory.WithDependencies deps = KeyguardInteractorFactory.create();
mFakeKeyguardRepository = deps.getRepository();
mController = new KeyguardStatusViewController(
mKeyguardStatusView,
mKeyguardSliceViewController,
mKeyguardClockSwitchController,
mKeyguardStateController,
mKeyguardUpdateMonitor,
mConfigurationController,
mDozeParameters,
mScreenOffAnimationController,
mKeyguardLogger,
mFeatureFlags,
mInteractionJankMonitor,
deps.getKeyguardInteractor(),
mDumpManager) {
@Override
void setProperty(
AnimatableProperty property,
float value,
boolean animate) {
// Route into the mock version for verification
mControllerMock.setProperty(property, value, animate);
}
};
when(mKeyguardStatusView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
}
protected void givenViewAttached() {
ArgumentCaptor<View.OnAttachStateChangeListener> captor =
ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class);
verify(mKeyguardStatusView, atLeast(1)).addOnAttachStateChangeListener(captor.capture());
for (View.OnAttachStateChangeListener listener : captor.getAllValues()) {
listener.onViewAttachedToWindow(mKeyguardStatusView);
}
}
}

View File

@@ -23,80 +23,21 @@ import static org.mockito.Mockito.when;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.keyguard.logging.KeyguardLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.ClockConfig; import com.android.systemui.plugins.ClockConfig;
import com.android.systemui.plugins.ClockController; import com.android.systemui.plugins.ClockController;
import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@SmallTest @SmallTest
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class KeyguardStatusViewControllerTest extends SysuiTestCase { public class KeyguardStatusViewControllerTest extends KeyguardStatusViewControllerBaseTest {
@Mock private KeyguardStatusView mKeyguardStatusView;
@Mock private KeyguardSliceViewController mKeyguardSliceViewController;
@Mock private KeyguardClockSwitchController mKeyguardClockSwitchController;
@Mock private KeyguardStateController mKeyguardStateController;
@Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock private ConfigurationController mConfigurationController;
@Mock private DozeParameters mDozeParameters;
@Mock private ScreenOffAnimationController mScreenOffAnimationController;
@Mock private KeyguardLogger mKeyguardLogger;
@Mock private KeyguardStatusViewController mControllerMock;
@Mock private FeatureFlags mFeatureFlags;
@Mock private InteractionJankMonitor mInteractionJankMonitor;
@Mock private DumpManager mDumpManager;
@Captor
private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor;
private KeyguardStatusViewController mController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mController = new KeyguardStatusViewController(
mKeyguardStatusView,
mKeyguardSliceViewController,
mKeyguardClockSwitchController,
mKeyguardStateController,
mKeyguardUpdateMonitor,
mConfigurationController,
mDozeParameters,
mScreenOffAnimationController,
mKeyguardLogger,
mFeatureFlags,
mInteractionJankMonitor,
mDumpManager) {
@Override
void setProperty(
AnimatableProperty property,
float value,
boolean animate) {
// Route into the mock version for verification
mControllerMock.setProperty(property, value, animate);
}
};
}
@Test @Test
public void dozeTimeTick_updatesSlice() { public void dozeTimeTick_updatesSlice() {

View File

@@ -0,0 +1,71 @@
/*
* 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.keyguard
import android.test.suitebuilder.annotation.SmallTest
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import com.android.systemui.keyguard.shared.model.ScreenModel
import com.android.systemui.keyguard.shared.model.ScreenState
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
class KeyguardStatusViewControllerWithCoroutinesTest : KeyguardStatusViewControllerBaseTest() {
@Test
fun dozeTimeTickUpdatesSlices() = runTest {
mController.startCoroutines(coroutineContext)
givenViewAttached()
runCurrent()
clearInvocations(mKeyguardSliceViewController)
mFakeKeyguardRepository.dozeTimeTick()
runCurrent()
verify(mKeyguardSliceViewController).refresh()
coroutineContext.cancelChildren()
}
@Test
fun onScreenTurningOnUpdatesSlices() = runTest {
mController.startCoroutines(coroutineContext)
givenViewAttached()
runCurrent()
clearInvocations(mKeyguardSliceViewController)
mFakeKeyguardRepository.setScreenModel(ScreenModel(ScreenState.SCREEN_ON))
runCurrent()
verify(mKeyguardSliceViewController, never()).refresh()
// Should only be called during a 'turning on' event
mFakeKeyguardRepository.setScreenModel(ScreenModel(ScreenState.SCREEN_TURNING_ON))
runCurrent()
verify(mKeyguardSliceViewController).refresh()
coroutineContext.cancelChildren()
}
}

View File

@@ -49,6 +49,7 @@ import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.mockito.withArgCaptor import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
@@ -85,13 +86,14 @@ class KeyguardRepositoryImplTest : SysuiTestCase() {
private val mainDispatcher = StandardTestDispatcher() private val mainDispatcher = StandardTestDispatcher()
private val testDispatcher = StandardTestDispatcher() private val testDispatcher = StandardTestDispatcher()
private val testScope = TestScope(testDispatcher) private val testScope = TestScope(testDispatcher)
private lateinit var systemClock: FakeSystemClock
private lateinit var underTest: KeyguardRepositoryImpl private lateinit var underTest: KeyguardRepositoryImpl
@Before @Before
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
systemClock = FakeSystemClock()
underTest = underTest =
KeyguardRepositoryImpl( KeyguardRepositoryImpl(
statusBarStateController, statusBarStateController,
@@ -107,6 +109,7 @@ class KeyguardRepositoryImplTest : SysuiTestCase() {
dreamOverlayCallbackController, dreamOverlayCallbackController,
mainDispatcher, mainDispatcher,
testScope.backgroundScope, testScope.backgroundScope,
systemClock,
) )
} }
@@ -167,11 +170,15 @@ class KeyguardRepositoryImplTest : SysuiTestCase() {
@Test @Test
fun dozeTimeTick() = fun dozeTimeTick() =
testScope.runTest { testScope.runTest {
var dozeTimeTickValue = collectLastValue(underTest.dozeTimeTick) val lastDozeTimeTick by collectLastValue(underTest.dozeTimeTick)
underTest.dozeTimeTick() assertThat(lastDozeTimeTick).isEqualTo(0L)
runCurrent()
assertThat(dozeTimeTickValue()).isNull() // WHEN dozeTimeTick updated
systemClock.setUptimeMillis(systemClock.uptimeMillis() + 5)
underTest.dozeTimeTick()
// THEN listeners were updated to the latest uptime millis
assertThat(systemClock.uptimeMillis()).isEqualTo(lastDozeTimeTick)
} }
@Test @Test

View File

@@ -23,10 +23,9 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.doze.util.BurnInHelperWrapper import com.android.systemui.doze.util.BurnInHelperWrapper
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import junit.framework.Assert.assertEquals
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
@@ -48,7 +47,8 @@ class BurnInInteractorTest : SysuiTestCase() {
@Mock private lateinit var burnInHelperWrapper: BurnInHelperWrapper @Mock private lateinit var burnInHelperWrapper: BurnInHelperWrapper
private lateinit var configurationRepository: FakeConfigurationRepository private lateinit var configurationRepository: FakeConfigurationRepository
private lateinit var systemClock: FakeSystemClock private lateinit var keyguardInteractor: KeyguardInteractor
private lateinit var fakeKeyguardRepository: FakeKeyguardRepository
private lateinit var testScope: TestScope private lateinit var testScope: TestScope
private lateinit var underTest: BurnInInteractor private lateinit var underTest: BurnInInteractor
@@ -56,8 +56,10 @@ class BurnInInteractorTest : SysuiTestCase() {
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
configurationRepository = FakeConfigurationRepository() configurationRepository = FakeConfigurationRepository()
systemClock = FakeSystemClock() KeyguardInteractorFactory.create().let {
keyguardInteractor = it.keyguardInteractor
fakeKeyguardRepository = it.repository
}
whenever(burnInHelperWrapper.burnInOffset(anyInt(), anyBoolean())).thenReturn(burnInOffset) whenever(burnInHelperWrapper.burnInOffset(anyInt(), anyBoolean())).thenReturn(burnInOffset)
setBurnInProgress(.65f) setBurnInProgress(.65f)
@@ -68,25 +70,10 @@ class BurnInInteractorTest : SysuiTestCase() {
burnInHelperWrapper, burnInHelperWrapper,
testScope.backgroundScope, testScope.backgroundScope,
configurationRepository, configurationRepository,
systemClock, keyguardInteractor,
) )
} }
@Test
fun dozeTimeTick_updatesOnDozeTimeTick() =
testScope.runTest {
// Initial state set to 0
val lastDozeTimeTick by collectLastValue(underTest.dozeTimeTick)
assertEquals(0L, lastDozeTimeTick)
// WHEN dozeTimeTick updated
incrementUptimeMillis()
underTest.dozeTimeTick()
// THEN listeners were updated to the latest uptime millis
assertThat(systemClock.uptimeMillis()).isEqualTo(lastDozeTimeTick)
}
@Test @Test
fun udfpsBurnInOffset_updatesOnResolutionScaleChange() = fun udfpsBurnInOffset_updatesOnResolutionScaleChange() =
testScope.runTest { testScope.runTest {
@@ -111,25 +98,18 @@ class BurnInInteractorTest : SysuiTestCase() {
assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress)
setBurnInProgress(.88f) setBurnInProgress(.88f)
incrementUptimeMillis() fakeKeyguardRepository.dozeTimeTick(10)
underTest.dozeTimeTick()
assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress)
setBurnInProgress(.92f) setBurnInProgress(.92f)
incrementUptimeMillis() fakeKeyguardRepository.dozeTimeTick(20)
underTest.dozeTimeTick()
assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress)
setBurnInProgress(.32f) setBurnInProgress(.32f)
incrementUptimeMillis() fakeKeyguardRepository.dozeTimeTick(30)
underTest.dozeTimeTick()
assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress)
} }
private fun incrementUptimeMillis() {
systemClock.setUptimeMillis(systemClock.uptimeMillis() + 5)
}
private fun setBurnInProgress(progress: Float) { private fun setBurnInProgress(progress: Float) {
burnInProgress = progress burnInProgress = progress
whenever(burnInHelperWrapper.burnInProgressOffset()).thenReturn(burnInProgress) whenever(burnInHelperWrapper.burnInProgressOffset()).thenReturn(burnInProgress)

View File

@@ -38,7 +38,6 @@ import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.TestScope
@@ -68,6 +67,7 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() {
private lateinit var featureFlags: FakeFeatureFlags private lateinit var featureFlags: FakeFeatureFlags
private lateinit var burnInInteractor: BurnInInteractor private lateinit var burnInInteractor: BurnInInteractor
private lateinit var shadeRepository: FakeShadeRepository private lateinit var shadeRepository: FakeShadeRepository
private lateinit var keyguardInteractor: KeyguardInteractor
@Mock private lateinit var burnInHelper: BurnInHelperWrapper @Mock private lateinit var burnInHelper: BurnInHelperWrapper
@Mock private lateinit var dialogManager: SystemUIDialogManager @Mock private lateinit var dialogManager: SystemUIDialogManager
@@ -79,35 +79,32 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
testScope = TestScope() testScope = TestScope()
configRepository = FakeConfigurationRepository() configRepository = FakeConfigurationRepository()
keyguardRepository = FakeKeyguardRepository()
bouncerRepository = FakeKeyguardBouncerRepository()
shadeRepository = FakeShadeRepository()
fakeCommandQueue = FakeCommandQueue()
featureFlags = featureFlags =
FakeFeatureFlags().apply { FakeFeatureFlags().apply {
set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true) set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true)
set(Flags.FACE_AUTH_REFACTOR, false) set(Flags.FACE_AUTH_REFACTOR, false)
} }
KeyguardInteractorFactory.create(featureFlags = featureFlags).let {
keyguardInteractor = it.keyguardInteractor
keyguardRepository = it.repository
}
bouncerRepository = FakeKeyguardBouncerRepository()
shadeRepository = FakeShadeRepository()
fakeCommandQueue = FakeCommandQueue()
burnInInteractor = burnInInteractor =
BurnInInteractor( BurnInInteractor(
context, context,
burnInHelper, burnInHelper,
testScope.backgroundScope, testScope.backgroundScope,
configRepository, configRepository,
FakeSystemClock(), keyguardInteractor
) )
underTest = underTest =
UdfpsKeyguardInteractor( UdfpsKeyguardInteractor(
configRepository, configRepository,
burnInInteractor, burnInInteractor,
KeyguardInteractor( keyguardInteractor,
keyguardRepository,
fakeCommandQueue,
featureFlags,
bouncerRepository,
configRepository,
),
shadeRepository, shadeRepository,
dialogManager, dialogManager,
) )
@@ -215,7 +212,7 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() {
private fun setAwake() { private fun setAwake() {
keyguardRepository.setDozeAmount(0f) keyguardRepository.setDozeAmount(0f)
burnInInteractor.dozeTimeTick() keyguardRepository.dozeTimeTick()
bouncerRepository.setAlternateVisible(false) bouncerRepository.setAlternateVisible(false)
keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD) keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)

View File

@@ -20,21 +20,19 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.RoboPilotTest import com.android.systemui.RoboPilotTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.doze.util.BurnInHelperWrapper import com.android.systemui.doze.util.BurnInHelperWrapper
import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.repository.FakeCommandQueue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
import com.android.systemui.keyguard.domain.interactor.UdfpsKeyguardInteractor import com.android.systemui.keyguard.domain.interactor.UdfpsKeyguardInteractor
import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.shade.data.repository.FakeShadeRepository
import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.TestScope
@@ -58,9 +56,9 @@ class UdfpsAodViewModelTest : SysuiTestCase() {
private lateinit var configRepository: FakeConfigurationRepository private lateinit var configRepository: FakeConfigurationRepository
private lateinit var bouncerRepository: KeyguardBouncerRepository private lateinit var bouncerRepository: KeyguardBouncerRepository
private lateinit var keyguardRepository: FakeKeyguardRepository private lateinit var keyguardRepository: FakeKeyguardRepository
private lateinit var fakeCommandQueue: FakeCommandQueue
private lateinit var featureFlags: FakeFeatureFlags private lateinit var featureFlags: FakeFeatureFlags
private lateinit var shadeRepository: FakeShadeRepository private lateinit var shadeRepository: FakeShadeRepository
private lateinit var keyguardInteractor: KeyguardInteractor
@Mock private lateinit var dialogManager: SystemUIDialogManager @Mock private lateinit var dialogManager: SystemUIDialogManager
@Mock private lateinit var burnInHelper: BurnInHelperWrapper @Mock private lateinit var burnInHelper: BurnInHelperWrapper
@@ -70,17 +68,21 @@ class UdfpsAodViewModelTest : SysuiTestCase() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
overrideResource(com.android.systemui.R.dimen.lock_icon_padding, defaultPadding) overrideResource(com.android.systemui.R.dimen.lock_icon_padding, defaultPadding)
testScope = TestScope() testScope = TestScope()
configRepository = FakeConfigurationRepository()
keyguardRepository = FakeKeyguardRepository()
bouncerRepository = FakeKeyguardBouncerRepository()
fakeCommandQueue = FakeCommandQueue()
shadeRepository = FakeShadeRepository() shadeRepository = FakeShadeRepository()
featureFlags = featureFlags =
FakeFeatureFlags().apply { FakeFeatureFlags().apply {
set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true) set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true)
set(Flags.FACE_AUTH_REFACTOR, false) set(Flags.FACE_AUTH_REFACTOR, false)
} }
KeyguardInteractorFactory.create(
featureFlags = featureFlags,
)
.also {
keyguardInteractor = it.keyguardInteractor
keyguardRepository = it.repository
configRepository = it.configurationRepository
bouncerRepository = it.bouncerRepository
}
val udfpsKeyguardInteractor = val udfpsKeyguardInteractor =
UdfpsKeyguardInteractor( UdfpsKeyguardInteractor(
configRepository, configRepository,
@@ -89,15 +91,9 @@ class UdfpsAodViewModelTest : SysuiTestCase() {
burnInHelper, burnInHelper,
testScope.backgroundScope, testScope.backgroundScope,
configRepository, configRepository,
FakeSystemClock(), keyguardInteractor,
),
KeyguardInteractor(
keyguardRepository,
fakeCommandQueue,
featureFlags,
bouncerRepository,
configRepository,
), ),
keyguardInteractor,
shadeRepository, shadeRepository,
dialogManager, dialogManager,
) )

View File

@@ -30,12 +30,11 @@ import com.android.systemui.keyguard.data.repository.FakeCommandQueue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.UdfpsKeyguardInteractor import com.android.systemui.keyguard.domain.interactor.UdfpsKeyguardInteractor
import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.shade.data.repository.FakeShadeRepository
import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.TestScope
@@ -90,14 +89,10 @@ class UdfpsFingerprintViewModelTest : SysuiTestCase() {
testScope.backgroundScope, testScope.backgroundScope,
) )
val keyguardInteractor = val keyguardInteractor =
KeyguardInteractor( KeyguardInteractorFactory.create(
keyguardRepository, featureFlags = featureFlags,
fakeCommandQueue, )
featureFlags, .keyguardInteractor
bouncerRepository,
configRepository,
)
underTest = underTest =
FingerprintViewModel( FingerprintViewModel(
context, context,
@@ -109,7 +104,7 @@ class UdfpsFingerprintViewModelTest : SysuiTestCase() {
burnInHelper, burnInHelper,
testScope.backgroundScope, testScope.backgroundScope,
configRepository, configRepository,
FakeSystemClock(), keyguardInteractor,
), ),
keyguardInteractor, keyguardInteractor,
shadeRepository, shadeRepository,

View File

@@ -29,6 +29,7 @@ import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.UdfpsKeyguardInteractor import com.android.systemui.keyguard.domain.interactor.UdfpsKeyguardInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -39,7 +40,6 @@ import com.android.systemui.shade.data.repository.FakeShadeRepository
import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.mock
import com.android.systemui.util.time.FakeSystemClock
import com.android.wm.shell.animation.Interpolators import com.android.wm.shell.animation.Interpolators
import com.google.common.collect.Range import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
@@ -72,6 +72,7 @@ class UdfpsLockscreenViewModelTest : SysuiTestCase() {
private lateinit var transitionRepository: FakeKeyguardTransitionRepository private lateinit var transitionRepository: FakeKeyguardTransitionRepository
private lateinit var configRepository: FakeConfigurationRepository private lateinit var configRepository: FakeConfigurationRepository
private lateinit var keyguardRepository: FakeKeyguardRepository private lateinit var keyguardRepository: FakeKeyguardRepository
private lateinit var keyguardInteractor: KeyguardInteractor
private lateinit var bouncerRepository: FakeKeyguardBouncerRepository private lateinit var bouncerRepository: FakeKeyguardBouncerRepository
private lateinit var shadeRepository: FakeShadeRepository private lateinit var shadeRepository: FakeShadeRepository
private lateinit var featureFlags: FakeFeatureFlags private lateinit var featureFlags: FakeFeatureFlags
@@ -81,23 +82,21 @@ class UdfpsLockscreenViewModelTest : SysuiTestCase() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
testScope = TestScope() testScope = TestScope()
transitionRepository = FakeKeyguardTransitionRepository() transitionRepository = FakeKeyguardTransitionRepository()
configRepository = FakeConfigurationRepository()
keyguardRepository = FakeKeyguardRepository()
bouncerRepository = FakeKeyguardBouncerRepository()
shadeRepository = FakeShadeRepository() shadeRepository = FakeShadeRepository()
featureFlags = featureFlags =
FakeFeatureFlags().apply { FakeFeatureFlags().apply {
set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true) set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true)
set(Flags.FACE_AUTH_REFACTOR, false) set(Flags.FACE_AUTH_REFACTOR, false)
} }
val keyguardInteractor = KeyguardInteractorFactory.create(
KeyguardInteractor( featureFlags = featureFlags,
keyguardRepository,
commandQueue = mock(),
featureFlags,
bouncerRepository,
configRepository,
) )
.also {
keyguardInteractor = it.keyguardInteractor
keyguardRepository = it.repository
configRepository = it.configurationRepository
bouncerRepository = it.bouncerRepository
}
underTest = underTest =
UdfpsLockscreenViewModel( UdfpsLockscreenViewModel(
@@ -115,7 +114,7 @@ class UdfpsLockscreenViewModelTest : SysuiTestCase() {
burnInHelperWrapper = mock(), burnInHelperWrapper = mock(),
testScope.backgroundScope, testScope.backgroundScope,
configRepository, configRepository,
FakeSystemClock(), keyguardInteractor,
), ),
keyguardInteractor, keyguardInteractor,
shadeRepository, shadeRepository,

View File

@@ -371,6 +371,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
mKeyguardLogger, mKeyguardLogger,
mFeatureFlags, mFeatureFlags,
mInteractionJankMonitor, mInteractionJankMonitor,
mKeyguardInteractor,
mDumpManager)); mDumpManager));
when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false);

View File

@@ -43,7 +43,6 @@ import com.android.systemui.biometrics.AuthController;
import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog; import com.android.systemui.doze.DozeLog;
import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor;
import com.android.systemui.keyguard.domain.interactor.DozeInteractor; import com.android.systemui.keyguard.domain.interactor.DozeInteractor;
import com.android.systemui.shade.NotificationShadeWindowViewController; import com.android.systemui.shade.NotificationShadeWindowViewController;
import com.android.systemui.shade.ShadeViewController; import com.android.systemui.shade.ShadeViewController;
@@ -96,7 +95,6 @@ public class DozeServiceHostTest extends SysuiTestCase {
@Mock private BiometricUnlockController mBiometricUnlockController; @Mock private BiometricUnlockController mBiometricUnlockController;
@Mock private AuthController mAuthController; @Mock private AuthController mAuthController;
@Mock private DozeHost.Callback mCallback; @Mock private DozeHost.Callback mCallback;
@Mock private BurnInInteractor mBurnInInteractor;
@Mock private DozeInteractor mDozeInteractor; @Mock private DozeInteractor mDozeInteractor;
@Before @Before
@@ -108,8 +106,7 @@ public class DozeServiceHostTest extends SysuiTestCase {
() -> mAssistManager, mDozeScrimController, () -> mAssistManager, mDozeScrimController,
mKeyguardUpdateMonitor, mPulseExpansionHandler, mKeyguardUpdateMonitor, mPulseExpansionHandler,
mNotificationShadeWindowController, mNotificationWakeUpCoordinator, mNotificationShadeWindowController, mNotificationWakeUpCoordinator,
mAuthController, mNotificationIconAreaController, mDozeInteractor, mAuthController, mNotificationIconAreaController, mDozeInteractor);
mBurnInInteractor);
mDozeServiceHost.initialize( mDozeServiceHost.initialize(
mCentralSurfaces, mCentralSurfaces,
@@ -234,11 +231,11 @@ public class DozeServiceHostTest extends SysuiTestCase {
verifyZeroInteractions(mDozeInteractor); verifyZeroInteractions(mDozeInteractor);
} }
@Test @Test
public void dozeTimeTickSentTBurnInInteractor() { public void dozeTimeTickSentToDozeInteractor() {
// WHEN dozeTimeTick // WHEN dozeTimeTick
mDozeServiceHost.dozeTimeTick(); mDozeServiceHost.dozeTimeTick();
// THEN burnInInteractor's dozeTimeTick is updated // THEN dozeInteractor's dozeTimeTick is updated
verify(mBurnInInteractor).dozeTimeTick(); verify(mDozeInteractor).dozeTimeTick();
} }
} }

View File

@@ -30,7 +30,6 @@ import com.android.systemui.keyguard.shared.model.WakeSleepReason
import com.android.systemui.keyguard.shared.model.WakefulnessModel import com.android.systemui.keyguard.shared.model.WakefulnessModel
import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.keyguard.shared.model.WakefulnessState
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
@@ -60,7 +59,7 @@ class FakeKeyguardRepository : KeyguardRepository {
private val _isDozing = MutableStateFlow(false) private val _isDozing = MutableStateFlow(false)
override val isDozing: StateFlow<Boolean> = _isDozing override val isDozing: StateFlow<Boolean> = _isDozing
private val _dozeTimeTick = MutableSharedFlow<Unit>() private val _dozeTimeTick = MutableStateFlow<Long>(0L)
override val dozeTimeTick = _dozeTimeTick override val dozeTimeTick = _dozeTimeTick
private val _lastDozeTapToWakePosition = MutableStateFlow<Point?>(null) private val _lastDozeTapToWakePosition = MutableStateFlow<Point?>(null)
@@ -174,7 +173,11 @@ class FakeKeyguardRepository : KeyguardRepository {
} }
override fun dozeTimeTick() { override fun dozeTimeTick() {
_dozeTimeTick.tryEmit(Unit) _dozeTimeTick.value = _dozeTimeTick.value + 1
}
fun dozeTimeTick(millis: Long) {
_dozeTimeTick.value = millis
} }
override fun setLastDozeTapToWakePosition(position: Point) { override fun setLastDozeTapToWakePosition(position: Point) {
@@ -237,6 +240,10 @@ class FakeKeyguardRepository : KeyguardRepository {
_isBypassEnabled = isEnabled _isBypassEnabled = isEnabled
} }
fun setScreenModel(screenModel: ScreenModel) {
_screenModel.value = screenModel
}
override fun isUdfpsSupported(): Boolean { override fun isUdfpsSupported(): Boolean {
return _isUdfpsSupported.value return _isUdfpsSupported.value
} }