From a3933a7d147ec196ef897d9b3ccb9147be232dbb Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Thu, 20 Jul 2023 12:48:58 +0000 Subject: [PATCH] Begin disconnecting KeyguardStatusViewController from NPVC As the status view will (eventually) no longer be in the shade, begin disconnecting it from NotificationPanelViewController piece by piece. First, remove dozeTimeTick and onScreenTurningOn calls from NPVC. This rewires the flow of events but does not change any functionality. Also, refactor burn in to use KeyguardRepository as the source of truth for dozeTimeTick information Bug: 288242803 Test: atest KeyguardStatusViewControllerTest KeyguardStatusViewControllerWithCoroutinesTest BurnInInteractorTest UdfpsFingerprintViewModelTest UdfpsKeyguardInteractorTest Change-Id: Ic9061bd67eb78995eb38ff88315dd9e0c4899e6b --- .../KeyguardStatusViewController.java | 32 ++++++ .../data/repository/KeyguardRepository.kt | 12 +- .../domain/interactor/BurnInInteractor.kt | 22 ++-- .../domain/interactor/KeyguardInteractor.kt | 6 +- .../NotificationPanelViewController.java | 9 +- .../statusbar/phone/DozeServiceHost.java | 7 +- .../KeyguardStatusViewControllerBaseTest.java | 107 ++++++++++++++++++ .../KeyguardStatusViewControllerTest.java | 65 +---------- ...dStatusViewControllerWithCoroutinesTest.kt | 71 ++++++++++++ .../repository/KeyguardRepositoryImplTest.kt | 17 ++- .../domain/interactor/BurnInInteractorTest.kt | 42 ++----- .../interactor/UdfpsKeyguardInteractorTest.kt | 25 ++-- .../ui/viewmodel/UdfpsAodViewModelTest.kt | 30 +++-- .../UdfpsFingerprintViewModelTest.kt | 17 +-- .../viewmodel/UdfpsLockscreenViewModelTest.kt | 23 ++-- ...tificationPanelViewControllerBaseTest.java | 1 + .../statusbar/phone/DozeServiceHostTest.java | 11 +- .../data/repository/FakeKeyguardRepository.kt | 13 ++- 18 files changed, 318 insertions(+), 192 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index a04d13b93ddd9..fe6bbc16ef9f6 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -20,6 +20,7 @@ import static androidx.constraintlayout.widget.ConstraintSet.END; import static androidx.constraintlayout.widget.ConstraintSet.PARENT_ID; 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.ValueAnimator; @@ -51,6 +52,10 @@ import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.dump.DumpManager; 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.statusbar.notification.AnimatableProperty; 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.util.ViewController; +import kotlin.coroutines.CoroutineContext; +import kotlin.coroutines.EmptyCoroutineContext; + import java.io.PrintWriter; import javax.inject.Inject; @@ -91,6 +99,7 @@ public class KeyguardStatusViewController extends ViewController { + dozeTimeTick(); + }, context); + + collectFlow(mView, mKeyguardInteractor.getScreenModel(), + (ScreenModel model) -> { + if (model.getState() == ScreenState.SCREEN_TURNING_ON) { + dozeTimeTick(); + } + }, context); + } + + public KeyguardStatusView getView() { + return mView; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 9ee990243b96d..f1b3441995168 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -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.KeyguardBypassController import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.util.time.SystemClock import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn @@ -177,7 +176,7 @@ interface KeyguardRepository { val keyguardRootViewVisibility: Flow /** Receive an event for doze time tick */ - val dozeTimeTick: Flow + val dozeTimeTick: Flow /** * Returns `true` if the keyguard is showing; `false` otherwise. @@ -248,6 +247,7 @@ constructor( private val dreamOverlayCallbackController: DreamOverlayCallbackController, @Main private val mainDispatcher: CoroutineDispatcher, @Application private val scope: CoroutineScope, + private val systemClock: SystemClock, ) : KeyguardRepository { private val _animateBottomAreaDozingTransitions = MutableStateFlow(false) override val animateBottomAreaDozingTransitions = @@ -398,11 +398,11 @@ constructor( _isDozing.value = isDozing } - private val _dozeTimeTick = MutableSharedFlow() - override val dozeTimeTick = _dozeTimeTick.asSharedFlow() + private val _dozeTimeTick = MutableStateFlow(0) + override val dozeTimeTick = _dozeTimeTick.asStateFlow() override fun dozeTimeTick() { - _dozeTimeTick.tryEmit(Unit) + _dozeTimeTick.value = systemClock.uptimeMillis() } private val _lastDozeTapToWakePosition = MutableStateFlow(null) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractor.kt index 252982fd019ff..ac936b10fe43f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractor.kt @@ -24,14 +24,11 @@ import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.doze.util.BurnInHelperWrapper -import com.android.systemui.util.time.SystemClock import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn @@ -46,24 +43,17 @@ constructor( private val burnInHelperWrapper: BurnInHelperWrapper, @Application private val scope: CoroutineScope, private val configurationRepository: ConfigurationRepository, - private val systemClock: SystemClock, + private val keyguardInteractor: KeyguardInteractor, ) { - private val _dozeTimeTick = MutableStateFlow(0) - val dozeTimeTick: StateFlow = _dozeTimeTick.asStateFlow() - val udfpsBurnInXOffset: StateFlow = burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_x, isXAxis = true) val udfpsBurnInYOffset: StateFlow = burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_y, isXAxis = false) val udfpsBurnInProgress: StateFlow = - dozeTimeTick + keyguardInteractor.dozeTimeTick .mapLatest { 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 * max burn-in offset on any configuration changes. If the max burn-in offset is specified in @@ -77,7 +67,9 @@ constructor( .flatMapLatest { val maxBurnInOffsetPixels = context.resources.getDimensionPixelSize(maxBurnInOffsetResourceId) - dozeTimeTick.mapLatest { calculateOffset(maxBurnInOffsetPixels, isXAxis) } + keyguardInteractor.dozeTimeTick.mapLatest { + calculateOffset(maxBurnInOffsetPixels, isXAxis) + } } .stateIn( scope, @@ -102,7 +94,9 @@ constructor( .flatMapLatest { scale -> val maxBurnInOffsetPixels = context.resources.getDimensionPixelSize(maxBurnInOffsetResourceId) - dozeTimeTick.mapLatest { calculateOffset(maxBurnInOffsetPixels, isXAxis, scale) } + keyguardInteractor.dozeTimeTick.mapLatest { + calculateOffset(maxBurnInOffsetPixels, isXAxis, scale) + } } .stateIn( scope, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index cc159168009e8..864c4dbb19410 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -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.DozeTransitionModel 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.WakefulnessModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel @@ -87,7 +88,7 @@ constructor( /** Whether the system is in doze mode. */ val isDozing: Flow = repository.isDozing /** Receive an event for doze time tick */ - val dozeTimeTick: Flow = repository.dozeTimeTick + val dozeTimeTick: Flow = repository.dozeTimeTick /** Whether Always-on Display mode is available. */ val isAodAvailable: Flow = repository.isAodAvailable /** Doze transition information. */ @@ -122,6 +123,9 @@ constructor( /** The device wake/sleep state */ val wakefulnessModel: StateFlow = repository.wakefulness + /** The device screen state */ + val screenModel: StateFlow = repository.screenModel + /** * 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. diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 773f35e0c6659..2192b436c905d 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -2820,7 +2820,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public void onScreenTurningOn() { - mKeyguardStatusViewController.dozeTimeTick(); + if (!mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) { + mKeyguardStatusViewController.dozeTimeTick(); + } } private void onMiddleClicked() { @@ -3070,10 +3072,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } } - @Override public void dozeTimeTick() { mLockIconViewController.dozeTimeTick(); - mKeyguardStatusViewController.dozeTimeTick(); + if (!mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) { + mKeyguardStatusViewController.dozeTimeTick(); + } if (mInterpolatedDarkAmount > 0) { positionClockAndNotifications(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java index ed9722e04da0e..801cdbf0e83e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java @@ -38,7 +38,6 @@ import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeLog; import com.android.systemui.doze.DozeReceiver; 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.shade.NotificationShadeWindowViewController; import com.android.systemui.shade.ShadeViewController; @@ -94,7 +93,6 @@ public final class DozeServiceHost implements DozeHost { private NotificationShadeWindowViewController mNotificationShadeWindowViewController; private final AuthController mAuthController; private final NotificationIconAreaController mNotificationIconAreaController; - private final BurnInInteractor mBurnInInteractor; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private ShadeViewController mNotificationPanel; private View mAmbientIndicationContainer; @@ -118,8 +116,7 @@ public final class DozeServiceHost implements DozeHost { NotificationWakeUpCoordinator notificationWakeUpCoordinator, AuthController authController, NotificationIconAreaController notificationIconAreaController, - DozeInteractor dozeInteractor, - BurnInInteractor burnInInteractor) { + DozeInteractor dozeInteractor) { super(); mDozeLog = dozeLog; mPowerManager = powerManager; @@ -138,7 +135,6 @@ public final class DozeServiceHost implements DozeHost { mNotificationWakeUpCoordinator = notificationWakeUpCoordinator; mAuthController = authController; mNotificationIconAreaController = notificationIconAreaController; - mBurnInInteractor = burnInInteractor; mHeadsUpManagerPhone.addListener(mOnHeadsUpChangedListener); mDozeInteractor = dozeInteractor; } @@ -317,7 +313,6 @@ public final class DozeServiceHost implements DozeHost { if (mAmbientIndicationContainer instanceof DozeReceiver) { ((DozeReceiver) mAmbientIndicationContainer).dozeTimeTick(); } - mBurnInInteractor.dozeTimeTick(); } @Override diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java new file mode 100644 index 0000000000000..ba3dbf0a0cb7b --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java @@ -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 captor = + ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class); + verify(mKeyguardStatusView, atLeast(1)).addOnAttachStateChangeListener(captor.capture()); + + for (View.OnAttachStateChangeListener listener : captor.getAllValues()) { + listener.onViewAttachedToWindow(mKeyguardStatusView); + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java index 7114c22b57010..20d9ef1e86b19 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java @@ -23,80 +23,21 @@ import static org.mockito.Mockito.when; import android.test.suitebuilder.annotation.SmallTest; 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.ClockController; 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.KeyguardStateController; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; @SmallTest +@TestableLooper.RunWithLooper(setAsMainLooper = true) @RunWith(AndroidTestingRunner.class) -public class KeyguardStatusViewControllerTest extends SysuiTestCase { - - @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 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); - } - }; - } +public class KeyguardStatusViewControllerTest extends KeyguardStatusViewControllerBaseTest { @Test public void dozeTimeTick_updatesSlice() { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt new file mode 100644 index 0000000000000..2b9797ee56d4c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt @@ -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() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt index ba7d3490e56d2..5e3376a45488e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt @@ -49,6 +49,7 @@ import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.withArgCaptor +import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.launchIn @@ -85,13 +86,14 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { private val mainDispatcher = StandardTestDispatcher() private val testDispatcher = StandardTestDispatcher() private val testScope = TestScope(testDispatcher) + private lateinit var systemClock: FakeSystemClock private lateinit var underTest: KeyguardRepositoryImpl @Before fun setUp() { MockitoAnnotations.initMocks(this) - + systemClock = FakeSystemClock() underTest = KeyguardRepositoryImpl( statusBarStateController, @@ -107,6 +109,7 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { dreamOverlayCallbackController, mainDispatcher, testScope.backgroundScope, + systemClock, ) } @@ -167,11 +170,15 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { @Test fun dozeTimeTick() = testScope.runTest { - var dozeTimeTickValue = collectLastValue(underTest.dozeTimeTick) - underTest.dozeTimeTick() - runCurrent() + val lastDozeTimeTick by collectLastValue(underTest.dozeTimeTick) + assertThat(lastDozeTimeTick).isEqualTo(0L) - 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 diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorTest.kt index 069a4862ccdcc..630826954057d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorTest.kt @@ -23,10 +23,9 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository import com.android.systemui.coroutines.collectLastValue 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.time.FakeSystemClock import com.google.common.truth.Truth.assertThat -import junit.framework.Assert.assertEquals import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runTest @@ -48,7 +47,8 @@ class BurnInInteractorTest : SysuiTestCase() { @Mock private lateinit var burnInHelperWrapper: BurnInHelperWrapper 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 underTest: BurnInInteractor @@ -56,8 +56,10 @@ class BurnInInteractorTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) configurationRepository = FakeConfigurationRepository() - systemClock = FakeSystemClock() - + KeyguardInteractorFactory.create().let { + keyguardInteractor = it.keyguardInteractor + fakeKeyguardRepository = it.repository + } whenever(burnInHelperWrapper.burnInOffset(anyInt(), anyBoolean())).thenReturn(burnInOffset) setBurnInProgress(.65f) @@ -68,25 +70,10 @@ class BurnInInteractorTest : SysuiTestCase() { burnInHelperWrapper, testScope.backgroundScope, 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 fun udfpsBurnInOffset_updatesOnResolutionScaleChange() = testScope.runTest { @@ -111,25 +98,18 @@ class BurnInInteractorTest : SysuiTestCase() { assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) setBurnInProgress(.88f) - incrementUptimeMillis() - underTest.dozeTimeTick() + fakeKeyguardRepository.dozeTimeTick(10) assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) setBurnInProgress(.92f) - incrementUptimeMillis() - underTest.dozeTimeTick() + fakeKeyguardRepository.dozeTimeTick(20) assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) setBurnInProgress(.32f) - incrementUptimeMillis() - underTest.dozeTimeTick() + fakeKeyguardRepository.dozeTimeTick(30) assertThat(udfpsBurnInProgress).isEqualTo(burnInProgress) } - private fun incrementUptimeMillis() { - systemClock.setUptimeMillis(systemClock.uptimeMillis() + 5) - } - private fun setBurnInProgress(progress: Float) { burnInProgress = progress whenever(burnInHelperWrapper.burnInProgressOffset()).thenReturn(burnInProgress) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt index b019a21387dad..6efec99ba834e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt @@ -38,7 +38,6 @@ import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.whenever -import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope @@ -68,6 +67,7 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() { private lateinit var featureFlags: FakeFeatureFlags private lateinit var burnInInteractor: BurnInInteractor private lateinit var shadeRepository: FakeShadeRepository + private lateinit var keyguardInteractor: KeyguardInteractor @Mock private lateinit var burnInHelper: BurnInHelperWrapper @Mock private lateinit var dialogManager: SystemUIDialogManager @@ -79,35 +79,32 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) testScope = TestScope() configRepository = FakeConfigurationRepository() - keyguardRepository = FakeKeyguardRepository() - bouncerRepository = FakeKeyguardBouncerRepository() - shadeRepository = FakeShadeRepository() - fakeCommandQueue = FakeCommandQueue() featureFlags = FakeFeatureFlags().apply { set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true) 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( context, burnInHelper, testScope.backgroundScope, configRepository, - FakeSystemClock(), + keyguardInteractor ) underTest = UdfpsKeyguardInteractor( configRepository, burnInInteractor, - KeyguardInteractor( - keyguardRepository, - fakeCommandQueue, - featureFlags, - bouncerRepository, - configRepository, - ), + keyguardInteractor, shadeRepository, dialogManager, ) @@ -215,7 +212,7 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() { private fun setAwake() { keyguardRepository.setDozeAmount(0f) - burnInInteractor.dozeTimeTick() + keyguardRepository.dozeTimeTick() bouncerRepository.setAlternateVisible(false) keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsAodViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsAodViewModelTest.kt index b985b3ca83da0..bd17de3ee9397 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsAodViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsAodViewModelTest.kt @@ -20,21 +20,19 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.RoboPilotTest 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.common.ui.data.repository.FakeConfigurationRepository import com.android.systemui.coroutines.collectLastValue import com.android.systemui.doze.util.BurnInHelperWrapper import com.android.systemui.flags.FakeFeatureFlags 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.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.UdfpsKeyguardInteractor import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.statusbar.phone.SystemUIDialogManager -import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope @@ -58,9 +56,9 @@ class UdfpsAodViewModelTest : SysuiTestCase() { private lateinit var configRepository: FakeConfigurationRepository private lateinit var bouncerRepository: KeyguardBouncerRepository private lateinit var keyguardRepository: FakeKeyguardRepository - private lateinit var fakeCommandQueue: FakeCommandQueue private lateinit var featureFlags: FakeFeatureFlags private lateinit var shadeRepository: FakeShadeRepository + private lateinit var keyguardInteractor: KeyguardInteractor @Mock private lateinit var dialogManager: SystemUIDialogManager @Mock private lateinit var burnInHelper: BurnInHelperWrapper @@ -70,17 +68,21 @@ class UdfpsAodViewModelTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) overrideResource(com.android.systemui.R.dimen.lock_icon_padding, defaultPadding) testScope = TestScope() - configRepository = FakeConfigurationRepository() - keyguardRepository = FakeKeyguardRepository() - bouncerRepository = FakeKeyguardBouncerRepository() - fakeCommandQueue = FakeCommandQueue() shadeRepository = FakeShadeRepository() featureFlags = FakeFeatureFlags().apply { set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true) 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 = UdfpsKeyguardInteractor( configRepository, @@ -89,15 +91,9 @@ class UdfpsAodViewModelTest : SysuiTestCase() { burnInHelper, testScope.backgroundScope, configRepository, - FakeSystemClock(), - ), - KeyguardInteractor( - keyguardRepository, - fakeCommandQueue, - featureFlags, - bouncerRepository, - configRepository, + keyguardInteractor, ), + keyguardInteractor, shadeRepository, dialogManager, ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsFingerprintViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsFingerprintViewModelTest.kt index 0fbcec23f2478..80ab418fbd303 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsFingerprintViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsFingerprintViewModelTest.kt @@ -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.FakeKeyguardTransitionRepository 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.UdfpsKeyguardInteractor import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.statusbar.phone.SystemUIDialogManager -import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope @@ -90,14 +89,10 @@ class UdfpsFingerprintViewModelTest : SysuiTestCase() { testScope.backgroundScope, ) val keyguardInteractor = - KeyguardInteractor( - keyguardRepository, - fakeCommandQueue, - featureFlags, - bouncerRepository, - configRepository, - ) - + KeyguardInteractorFactory.create( + featureFlags = featureFlags, + ) + .keyguardInteractor underTest = FingerprintViewModel( context, @@ -109,7 +104,7 @@ class UdfpsFingerprintViewModelTest : SysuiTestCase() { burnInHelper, testScope.backgroundScope, configRepository, - FakeSystemClock(), + keyguardInteractor, ), keyguardInteractor, shadeRepository, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsLockscreenViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsLockscreenViewModelTest.kt index 41ae931838504..0456824abfbc6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsLockscreenViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/UdfpsLockscreenViewModelTest.kt @@ -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.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.UdfpsKeyguardInteractor 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.util.mockito.argumentCaptor import com.android.systemui.util.mockito.mock -import com.android.systemui.util.time.FakeSystemClock import com.android.wm.shell.animation.Interpolators import com.google.common.collect.Range import com.google.common.truth.Truth.assertThat @@ -72,6 +72,7 @@ class UdfpsLockscreenViewModelTest : SysuiTestCase() { private lateinit var transitionRepository: FakeKeyguardTransitionRepository private lateinit var configRepository: FakeConfigurationRepository private lateinit var keyguardRepository: FakeKeyguardRepository + private lateinit var keyguardInteractor: KeyguardInteractor private lateinit var bouncerRepository: FakeKeyguardBouncerRepository private lateinit var shadeRepository: FakeShadeRepository private lateinit var featureFlags: FakeFeatureFlags @@ -81,23 +82,21 @@ class UdfpsLockscreenViewModelTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) testScope = TestScope() transitionRepository = FakeKeyguardTransitionRepository() - configRepository = FakeConfigurationRepository() - keyguardRepository = FakeKeyguardRepository() - bouncerRepository = FakeKeyguardBouncerRepository() shadeRepository = FakeShadeRepository() featureFlags = FakeFeatureFlags().apply { set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true) set(Flags.FACE_AUTH_REFACTOR, false) } - val keyguardInteractor = - KeyguardInteractor( - keyguardRepository, - commandQueue = mock(), - featureFlags, - bouncerRepository, - configRepository, + KeyguardInteractorFactory.create( + featureFlags = featureFlags, ) + .also { + keyguardInteractor = it.keyguardInteractor + keyguardRepository = it.repository + configRepository = it.configurationRepository + bouncerRepository = it.bouncerRepository + } underTest = UdfpsLockscreenViewModel( @@ -115,7 +114,7 @@ class UdfpsLockscreenViewModelTest : SysuiTestCase() { burnInHelperWrapper = mock(), testScope.backgroundScope, configRepository, - FakeSystemClock(), + keyguardInteractor, ), keyguardInteractor, shadeRepository, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index 47ca49d03cc7d..c759e078a56d8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -371,6 +371,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mKeyguardLogger, mFeatureFlags, mInteractionJankMonitor, + mKeyguardInteractor, mDumpManager)); when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java index 57037e0c9c63a..ff6f40d539fc7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java @@ -43,7 +43,6 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeLog; 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.shade.NotificationShadeWindowViewController; import com.android.systemui.shade.ShadeViewController; @@ -96,7 +95,6 @@ public class DozeServiceHostTest extends SysuiTestCase { @Mock private BiometricUnlockController mBiometricUnlockController; @Mock private AuthController mAuthController; @Mock private DozeHost.Callback mCallback; - @Mock private BurnInInteractor mBurnInInteractor; @Mock private DozeInteractor mDozeInteractor; @Before @@ -108,8 +106,7 @@ public class DozeServiceHostTest extends SysuiTestCase { () -> mAssistManager, mDozeScrimController, mKeyguardUpdateMonitor, mPulseExpansionHandler, mNotificationShadeWindowController, mNotificationWakeUpCoordinator, - mAuthController, mNotificationIconAreaController, mDozeInteractor, - mBurnInInteractor); + mAuthController, mNotificationIconAreaController, mDozeInteractor); mDozeServiceHost.initialize( mCentralSurfaces, @@ -234,11 +231,11 @@ public class DozeServiceHostTest extends SysuiTestCase { verifyZeroInteractions(mDozeInteractor); } @Test - public void dozeTimeTickSentTBurnInInteractor() { + public void dozeTimeTickSentToDozeInteractor() { // WHEN dozeTimeTick mDozeServiceHost.dozeTimeTick(); - // THEN burnInInteractor's dozeTimeTick is updated - verify(mBurnInInteractor).dozeTimeTick(); + // THEN dozeInteractor's dozeTimeTick is updated + verify(mDozeInteractor).dozeTimeTick(); } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index e6894d7240f87..15ce055bcc63e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -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.WakefulnessState import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -60,7 +59,7 @@ class FakeKeyguardRepository : KeyguardRepository { private val _isDozing = MutableStateFlow(false) override val isDozing: StateFlow = _isDozing - private val _dozeTimeTick = MutableSharedFlow() + private val _dozeTimeTick = MutableStateFlow(0L) override val dozeTimeTick = _dozeTimeTick private val _lastDozeTapToWakePosition = MutableStateFlow(null) @@ -174,7 +173,11 @@ class FakeKeyguardRepository : KeyguardRepository { } override fun dozeTimeTick() { - _dozeTimeTick.tryEmit(Unit) + _dozeTimeTick.value = _dozeTimeTick.value + 1 + } + + fun dozeTimeTick(millis: Long) { + _dozeTimeTick.value = millis } override fun setLastDozeTapToWakePosition(position: Point) { @@ -237,6 +240,10 @@ class FakeKeyguardRepository : KeyguardRepository { _isBypassEnabled = isEnabled } + fun setScreenModel(screenModel: ScreenModel) { + _screenModel.value = screenModel + } + override fun isUdfpsSupported(): Boolean { return _isUdfpsSupported.value }