Merge "Begin disconnecting KeyguardStatusViewController from NPVC" into udc-qpr-dev
This commit is contained in:
@@ -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<KeyguardStatusV
|
||||
private final FeatureFlags mFeatureFlags;
|
||||
private final InteractionJankMonitor mInteractionJankMonitor;
|
||||
private final Rect mClipBounds = new Rect();
|
||||
private final KeyguardInteractor mKeyguardInteractor;
|
||||
|
||||
private Boolean mStatusViewCentered = true;
|
||||
|
||||
@@ -122,6 +131,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
|
||||
KeyguardLogger logger,
|
||||
FeatureFlags featureFlags,
|
||||
InteractionJankMonitor interactionJankMonitor,
|
||||
KeyguardInteractor keyguardInteractor,
|
||||
DumpManager dumpManager) {
|
||||
super(keyguardStatusView);
|
||||
mKeyguardSliceViewController = keyguardSliceViewController;
|
||||
@@ -134,12 +144,34 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
|
||||
mInteractionJankMonitor = interactionJankMonitor;
|
||||
mFeatureFlags = featureFlags;
|
||||
mDumpManager = dumpManager;
|
||||
mKeyguardInteractor = keyguardInteractor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
mKeyguardClockSwitchController.init();
|
||||
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
|
||||
|
||||
@@ -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<KeyguardRootViewVisibilityState>
|
||||
|
||||
/** Receive an event for doze time tick */
|
||||
val dozeTimeTick: Flow<Unit>
|
||||
val dozeTimeTick: Flow<Long>
|
||||
|
||||
/**
|
||||
* 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<Unit>()
|
||||
override val dozeTimeTick = _dozeTimeTick.asSharedFlow()
|
||||
private val _dozeTimeTick = MutableStateFlow<Long>(0)
|
||||
override val dozeTimeTick = _dozeTimeTick.asStateFlow()
|
||||
|
||||
override fun dozeTimeTick() {
|
||||
_dozeTimeTick.tryEmit(Unit)
|
||||
_dozeTimeTick.value = systemClock.uptimeMillis()
|
||||
}
|
||||
|
||||
private val _lastDozeTapToWakePosition = MutableStateFlow<Point?>(null)
|
||||
|
||||
@@ -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<Long>(0)
|
||||
val dozeTimeTick: StateFlow<Long> = _dozeTimeTick.asStateFlow()
|
||||
|
||||
val udfpsBurnInXOffset: StateFlow<Int> =
|
||||
burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_x, isXAxis = true)
|
||||
val udfpsBurnInYOffset: StateFlow<Int> =
|
||||
burnInOffsetDefinedInPixels(R.dimen.udfps_burn_in_offset_y, isXAxis = false)
|
||||
val udfpsBurnInProgress: StateFlow<Float> =
|
||||
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,
|
||||
|
||||
@@ -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<Boolean> = repository.isDozing
|
||||
/** 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. */
|
||||
val isAodAvailable: Flow<Boolean> = repository.isAodAvailable
|
||||
/** Doze transition information. */
|
||||
@@ -122,6 +123,9 @@ constructor(
|
||||
/** The device wake/sleep state */
|
||||
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
|
||||
* that doze mode is not running and DREAMING is ok to commence.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<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);
|
||||
}
|
||||
};
|
||||
}
|
||||
public class KeyguardStatusViewControllerTest extends KeyguardStatusViewControllerBaseTest {
|
||||
|
||||
@Test
|
||||
public void dozeTimeTick_updatesSlice() {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -371,6 +371,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
|
||||
mKeyguardLogger,
|
||||
mFeatureFlags,
|
||||
mInteractionJankMonitor,
|
||||
mKeyguardInteractor,
|
||||
mDumpManager));
|
||||
|
||||
when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Boolean> = _isDozing
|
||||
|
||||
private val _dozeTimeTick = MutableSharedFlow<Unit>()
|
||||
private val _dozeTimeTick = MutableStateFlow<Long>(0L)
|
||||
override val dozeTimeTick = _dozeTimeTick
|
||||
|
||||
private val _lastDozeTapToWakePosition = MutableStateFlow<Point?>(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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user