diff options
| author | 2023-09-14 19:46:53 +0000 | |
|---|---|---|
| committer | 2023-09-14 19:46:53 +0000 | |
| commit | c9d78c6fb783145604cd67297b585d0f9e7191cf (patch) | |
| tree | e3f9dc8f2e40875fc21a4036548dbc71becd84a1 | |
| parent | 9dd91a6b7738bc38f2cb1dc5d7f5ffcc62ce7b7d (diff) | |
| parent | 84e025b217547e8f5b3ff9355b457665d7e73539 (diff) | |
Merge "Fix BP rotations with 3 button nav" into main
14 files changed, 236 insertions, 53 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt index f43285f9004a..599e9fcc0c7d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt @@ -25,8 +25,8 @@ import com.android.systemui.biometrics.data.repository.FingerprintPropertyReposi import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepositoryImpl import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl -import com.android.systemui.biometrics.data.repository.RearDisplayStateRepository -import com.android.systemui.biometrics.data.repository.RearDisplayStateRepositoryImpl +import com.android.systemui.biometrics.data.repository.DisplayStateRepository +import com.android.systemui.biometrics.data.repository.DisplayStateRepositoryImpl import com.android.systemui.biometrics.domain.interactor.CredentialInteractor import com.android.systemui.biometrics.domain.interactor.CredentialInteractorImpl import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor @@ -65,9 +65,10 @@ interface BiometricsModule { @SysUISingleton fun fingerprintRepository(impl: FingerprintPropertyRepositoryImpl): FingerprintPropertyRepository + @Binds @SysUISingleton - fun rearDisplayStateRepository(impl: RearDisplayStateRepositoryImpl): RearDisplayStateRepository + fun displayStateRepository(impl: DisplayStateRepositoryImpl): DisplayStateRepository @Binds @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/RearDisplayStateRepository.kt b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/DisplayStateRepository.kt index d17d961b5279..7a9efcf78999 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/RearDisplayStateRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/DisplayStateRepository.kt @@ -18,7 +18,14 @@ package com.android.systemui.biometrics.data.repository import android.content.Context import android.hardware.devicestate.DeviceStateManager +import android.hardware.display.DisplayManager +import android.hardware.display.DisplayManager.DisplayListener +import android.hardware.display.DisplayManager.EVENT_FLAG_DISPLAY_CHANGED +import android.os.Handler +import android.view.DisplayInfo import com.android.internal.util.ArrayUtils +import com.android.systemui.biometrics.shared.model.DisplayRotation +import com.android.systemui.biometrics.shared.model.toDisplayRotation import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton @@ -32,21 +39,26 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn -/** Provide current rear display state. */ -interface RearDisplayStateRepository { +/** Repository for the current state of the display */ +interface DisplayStateRepository { /** Provides the current rear display state. */ val isInRearDisplayMode: StateFlow<Boolean> + + /** Provides the current display rotation */ + val currentRotation: StateFlow<DisplayRotation> } @SysUISingleton -class RearDisplayStateRepositoryImpl +class DisplayStateRepositoryImpl @Inject constructor( @Application applicationScope: CoroutineScope, - @Application context: Context, + @Application val context: Context, deviceStateManager: DeviceStateManager, + displayManager: DisplayManager, + @Main handler: Handler, @Main mainExecutor: Executor -) : RearDisplayStateRepository { +) : DisplayStateRepository { override val isInRearDisplayMode: StateFlow<Boolean> = conflatedCallbackFlow { val sendRearDisplayStateUpdate = { state: Boolean -> @@ -79,7 +91,43 @@ constructor( initialValue = false, ) + private fun getDisplayRotation(): DisplayRotation { + val cachedDisplayInfo = DisplayInfo() + context.display?.getDisplayInfo(cachedDisplayInfo) + return cachedDisplayInfo.rotation.toDisplayRotation() + } + + override val currentRotation: StateFlow<DisplayRotation> = + conflatedCallbackFlow { + val callback = + object : DisplayListener { + override fun onDisplayRemoved(displayId: Int) {} + + override fun onDisplayAdded(displayId: Int) {} + + override fun onDisplayChanged(displayId: Int) { + val rotation = getDisplayRotation() + trySendWithFailureLogging( + rotation, + TAG, + "Error sending display rotation to $rotation" + ) + } + } + displayManager.registerDisplayListener( + callback, + handler, + EVENT_FLAG_DISPLAY_CHANGED + ) + awaitClose { displayManager.unregisterDisplayListener(callback) } + } + .stateIn( + applicationScope, + started = SharingStarted.Eagerly, + initialValue = getDisplayRotation(), + ) + companion object { - const val TAG = "RearDisplayStateRepositoryImpl" + const val TAG = "DisplayStateRepositoryImpl" } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt index 2e734a315194..f36a3ec89e3f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt @@ -19,7 +19,8 @@ package com.android.systemui.biometrics.domain.interactor import android.content.Context import android.content.res.Configuration import android.view.Display -import com.android.systemui.biometrics.data.repository.RearDisplayStateRepository +import com.android.systemui.biometrics.data.repository.DisplayStateRepository +import com.android.systemui.biometrics.shared.model.DisplayRotation import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.qualifiers.Application @@ -50,6 +51,9 @@ interface DisplayStateInteractor { /** Whether the device is currently folded. */ val isFolded: Flow<Boolean> + /** Current rotation of the display */ + val currentRotation: StateFlow<DisplayRotation> + /** Called on configuration changes, used to keep the display state in sync */ fun onConfigurationChanged(newConfig: Configuration) } @@ -61,7 +65,7 @@ constructor( @Application applicationScope: CoroutineScope, @Application context: Context, @Main mainExecutor: Executor, - rearDisplayStateRepository: RearDisplayStateRepository, + displayStateRepository: DisplayStateRepository, displayRepository: DisplayRepository, ) : DisplayStateInteractor { private var screenSizeFoldProvider: ScreenSizeFoldProvider = ScreenSizeFoldProvider(context) @@ -98,7 +102,10 @@ constructor( ) override val isInRearDisplayMode: StateFlow<Boolean> = - rearDisplayStateRepository.isInRearDisplayMode + displayStateRepository.isInRearDisplayMode + + override val currentRotation: StateFlow<DisplayRotation> = + displayStateRepository.currentRotation override fun onConfigurationChanged(newConfig: Configuration) { screenSizeFoldProvider.onConfigurationChange(newConfig) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/DisplayRotation.kt b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/DisplayRotation.kt new file mode 100644 index 000000000000..10a3e915fe80 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/DisplayRotation.kt @@ -0,0 +1,21 @@ +package com.android.systemui.biometrics.shared.model + +import android.view.Surface + +/** Shadows [Surface.Rotation] for kotlin use within SysUI. */ +enum class DisplayRotation { + ROTATION_0, + ROTATION_90, + ROTATION_180, + ROTATION_270, +} + +/** Converts [Surface.Rotation] to corresponding [DisplayRotation] */ +fun Int.toDisplayRotation(): DisplayRotation = + when (this) { + Surface.ROTATION_0 -> DisplayRotation.ROTATION_0 + Surface.ROTATION_90 -> DisplayRotation.ROTATION_90 + Surface.ROTATION_180 -> DisplayRotation.ROTATION_180 + Surface.ROTATION_270 -> DisplayRotation.ROTATION_270 + else -> throw IllegalArgumentException("Invalid DisplayRotation value: $this") + } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt index d616dcca338f..02847c283738 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt @@ -252,6 +252,18 @@ object BiometricViewBinder { } } + // set padding + launch { + viewModel.promptPadding.collect { promptPadding -> + view.setPadding( + promptPadding.left, + promptPadding.top, + promptPadding.right, + promptPadding.bottom + ) + } + } + // configure & hide/disable buttons launch { viewModel.credentialKind diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt index 6269700d5419..267afae118e6 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt @@ -15,16 +15,21 @@ */ package com.android.systemui.biometrics.ui.viewmodel +import android.content.Context +import android.graphics.Rect import android.hardware.biometrics.BiometricPrompt import android.util.Log import android.view.HapticFeedbackConstants import android.view.MotionEvent +import com.android.systemui.biometrics.Utils import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.PromptSelectorInteractor import com.android.systemui.biometrics.shared.model.BiometricModalities import com.android.systemui.biometrics.shared.model.BiometricModality +import com.android.systemui.biometrics.shared.model.DisplayRotation import com.android.systemui.biometrics.shared.model.PromptKind import com.android.systemui.biometrics.ui.binder.Spaghetti +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION import com.android.systemui.statusbar.VibratorHelper @@ -49,6 +54,7 @@ constructor( private val displayStateInteractor: DisplayStateInteractor, private val promptSelectorInteractor: PromptSelectorInteractor, private val vibrator: VibratorHelper, + @Application context: Context, private val featureFlags: FeatureFlags, ) { /** Models UI of [BiometricPromptLayout.iconView] */ @@ -135,6 +141,23 @@ constructor( !isOverlayTouched && size.isNotSmall } + /** Padding for prompt UI elements */ + val promptPadding: Flow<Rect> = + combine(size, displayStateInteractor.currentRotation) { size, rotation -> + if (size != PromptSize.LARGE) { + val navBarInsets = Utils.getNavbarInsets(context) + if (rotation == DisplayRotation.ROTATION_90) { + Rect(0, 0, navBarInsets.right, 0) + } else if (rotation == DisplayRotation.ROTATION_270) { + Rect(navBarInsets.left, 0, 0, 0) + } else { + Rect(0, 0, 0, navBarInsets.bottom) + } + } else { + Rect(0, 0, 0, 0) + } + } + /** Title for the prompt. */ val title: Flow<String> = promptSelectorInteractor.prompt.map { it?.title ?: "" }.distinctUntilChanged() diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt index 7775a05568e8..969a01164734 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt @@ -41,7 +41,7 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository import com.android.systemui.biometrics.data.repository.FakePromptRepository -import com.android.systemui.biometrics.data.repository.FakeRearDisplayStateRepository +import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl import com.android.systemui.biometrics.domain.interactor.FakeCredentialInteractor @@ -109,7 +109,7 @@ open class AuthContainerViewTest : SysuiTestCase() { private val fakeExecutor = FakeExecutor(FakeSystemClock()) private val biometricPromptRepository = FakePromptRepository() private val fingerprintRepository = FakeFingerprintPropertyRepository() - private val rearDisplayStateRepository = FakeRearDisplayStateRepository() + private val displayStateRepository = FakeDisplayStateRepository() private val credentialInteractor = FakeCredentialInteractor() private val bpCredentialInteractor = PromptCredentialInteractor( Dispatchers.Main.immediate, @@ -141,7 +141,7 @@ open class AuthContainerViewTest : SysuiTestCase() { testScope.backgroundScope, mContext, fakeExecutor, - rearDisplayStateRepository, + displayStateRepository, displayRepository, ) } @@ -520,6 +520,7 @@ open class AuthContainerViewTest : SysuiTestCase() { displayStateInteractor, promptSelectorInteractor, vibrator, + context, featureFlags ), { credentialViewModel }, diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt index 3ebc2d6174ad..17928a3da140 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt @@ -56,7 +56,7 @@ import com.android.systemui.R import com.android.systemui.RoboPilotTest import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestableContext -import com.android.systemui.biometrics.data.repository.FakeRearDisplayStateRepository +import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository @@ -117,7 +117,7 @@ class SideFpsControllerTest : SysuiTestCase() { @Captor lateinit var overlayViewParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams> private lateinit var displayRepository: FakeDisplayRepository - private lateinit var rearDisplayStateRepository: FakeRearDisplayStateRepository + private lateinit var displayStateRepository: FakeDisplayStateRepository private lateinit var keyguardBouncerRepository: FakeKeyguardBouncerRepository private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor private lateinit var displayStateInteractor: DisplayStateInteractor @@ -145,7 +145,7 @@ class SideFpsControllerTest : SysuiTestCase() { @Before fun setup() { displayRepository = FakeDisplayRepository() - rearDisplayStateRepository = FakeRearDisplayStateRepository() + displayStateRepository = FakeDisplayStateRepository() keyguardBouncerRepository = FakeKeyguardBouncerRepository() alternateBouncerInteractor = AlternateBouncerInteractor( @@ -161,7 +161,7 @@ class SideFpsControllerTest : SysuiTestCase() { testScope.backgroundScope, context, executor, - rearDisplayStateRepository, + displayStateRepository, displayRepository, ) @@ -273,7 +273,7 @@ class SideFpsControllerTest : SysuiTestCase() { TestCoroutineScope(), dumpManager ) - rearDisplayStateRepository.setIsInRearDisplayMode(inRearDisplayMode) + displayStateRepository.setIsInRearDisplayMode(inRearDisplayMode) overlayController = ArgumentCaptor.forClass(ISidefpsController::class.java) diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/RearDisplayStateRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/DisplayStateRepositoryTest.kt index dfe8d36504d0..c9c46cbe8420 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/RearDisplayStateRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/DisplayStateRepositoryTest.kt @@ -17,13 +17,21 @@ package com.android.systemui.keyguard.data.repository import android.hardware.devicestate.DeviceStateManager +import android.hardware.display.DisplayManager +import android.os.Handler +import android.view.Display +import android.view.DisplayInfo +import android.view.Surface import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.biometrics.data.repository.RearDisplayStateRepository -import com.android.systemui.biometrics.data.repository.RearDisplayStateRepositoryImpl +import com.android.systemui.biometrics.data.repository.DisplayStateRepository +import com.android.systemui.biometrics.data.repository.DisplayStateRepositoryImpl +import com.android.systemui.biometrics.shared.model.DisplayRotation import com.android.systemui.coroutines.collectLastValue import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.eq +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 @@ -38,8 +46,10 @@ import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers.same import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoRule @@ -50,16 +60,19 @@ private const val REAR_DISPLAY_MODE_DEVICE_STATE = 3 @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWith(JUnit4::class) -class RearDisplayStateRepositoryTest : SysuiTestCase() { +class DisplayStateRepositoryTest : SysuiTestCase() { @JvmField @Rule var mockitoRule: MockitoRule = MockitoJUnit.rule() @Mock private lateinit var deviceStateManager: DeviceStateManager - private lateinit var underTest: RearDisplayStateRepository + @Mock private lateinit var displayManager: DisplayManager + @Mock private lateinit var handler: Handler + @Mock private lateinit var display: Display + private lateinit var underTest: DisplayStateRepository private val testScope = TestScope(StandardTestDispatcher()) private val fakeExecutor = FakeExecutor(FakeSystemClock()) @Captor - private lateinit var callbackCaptor: ArgumentCaptor<DeviceStateManager.DeviceStateCallback> + private lateinit var displayListenerCaptor: ArgumentCaptor<DisplayManager.DisplayListener> @Before fun setUp() { @@ -69,11 +82,16 @@ class RearDisplayStateRepositoryTest : SysuiTestCase() { rearDisplayDeviceStates ) + mContext = spy(mContext) + whenever(mContext.display).thenReturn(display) + underTest = - RearDisplayStateRepositoryImpl( + DisplayStateRepositoryImpl( testScope.backgroundScope, mContext, deviceStateManager, + displayManager, + handler, fakeExecutor ) } @@ -81,16 +99,46 @@ class RearDisplayStateRepositoryTest : SysuiTestCase() { @Test fun updatesIsInRearDisplayMode_whenRearDisplayStateChanges() = testScope.runTest { - val isInRearDisplayMode = collectLastValue(underTest.isInRearDisplayMode) + val isInRearDisplayMode by collectLastValue(underTest.isInRearDisplayMode) runCurrent() val callback = deviceStateManager.captureCallback() callback.onStateChanged(NORMAL_DISPLAY_MODE_DEVICE_STATE) - assertThat(isInRearDisplayMode()).isFalse() + assertThat(isInRearDisplayMode).isFalse() callback.onStateChanged(REAR_DISPLAY_MODE_DEVICE_STATE) - assertThat(isInRearDisplayMode()).isTrue() + assertThat(isInRearDisplayMode).isTrue() + } + + @Test + fun updatesCurrentRotation_whenDisplayStateChanges() = + testScope.runTest { + val currentRotation by collectLastValue(underTest.currentRotation) + runCurrent() + + verify(displayManager) + .registerDisplayListener( + displayListenerCaptor.capture(), + same(handler), + eq(DisplayManager.EVENT_FLAG_DISPLAY_CHANGED) + ) + + whenever(display.getDisplayInfo(any())).then { + val info = it.getArgument<DisplayInfo>(0) + info.rotation = Surface.ROTATION_90 + return@then true + } + displayListenerCaptor.value.onDisplayChanged(Surface.ROTATION_90) + assertThat(currentRotation).isEqualTo(DisplayRotation.ROTATION_90) + + whenever(display.getDisplayInfo(any())).then { + val info = it.getArgument<DisplayInfo>(0) + info.rotation = Surface.ROTATION_180 + return@then true + } + displayListenerCaptor.value.onDisplayChanged(Surface.ROTATION_180) + assertThat(currentRotation).isEqualTo(DisplayRotation.ROTATION_180) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt index 524f2547ea4c..bf6caad688e2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt @@ -3,7 +3,8 @@ package com.android.systemui.biometrics.domain.interactor import android.view.Display import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.biometrics.data.repository.FakeRearDisplayStateRepository +import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository +import com.android.systemui.biometrics.shared.model.DisplayRotation import com.android.systemui.coroutines.collectLastValue import com.android.systemui.display.data.repository.FakeDisplayRepository import com.android.systemui.display.data.repository.display @@ -37,7 +38,7 @@ class DisplayStateInteractorImplTest : SysuiTestCase() { private val fakeExecutor = FakeExecutor(FakeSystemClock()) private val testScope = TestScope(StandardTestDispatcher()) - private lateinit var rearDisplayStateRepository: FakeRearDisplayStateRepository + private lateinit var displayStateRepository: FakeDisplayStateRepository private lateinit var displayRepository: FakeDisplayRepository @Mock private lateinit var screenSizeFoldProvider: ScreenSizeFoldProvider @@ -45,14 +46,14 @@ class DisplayStateInteractorImplTest : SysuiTestCase() { @Before fun setup() { - rearDisplayStateRepository = FakeRearDisplayStateRepository() + displayStateRepository = FakeDisplayStateRepository() displayRepository = FakeDisplayRepository() interactor = DisplayStateInteractorImpl( testScope.backgroundScope, mContext, fakeExecutor, - rearDisplayStateRepository, + displayStateRepository, displayRepository, ) interactor.setScreenSizeFoldProvider(screenSizeFoldProvider) @@ -61,27 +62,39 @@ class DisplayStateInteractorImplTest : SysuiTestCase() { @Test fun isInRearDisplayModeChanges() = testScope.runTest { - val isInRearDisplayMode = collectLastValue(interactor.isInRearDisplayMode) + val isInRearDisplayMode by collectLastValue(interactor.isInRearDisplayMode) - rearDisplayStateRepository.setIsInRearDisplayMode(false) - assertThat(isInRearDisplayMode()).isFalse() + displayStateRepository.setIsInRearDisplayMode(false) + assertThat(isInRearDisplayMode).isFalse() - rearDisplayStateRepository.setIsInRearDisplayMode(true) - assertThat(isInRearDisplayMode()).isTrue() + displayStateRepository.setIsInRearDisplayMode(true) + assertThat(isInRearDisplayMode).isTrue() + } + + @Test + fun currentRotationChanges() = + testScope.runTest { + val currentRotation by collectLastValue(interactor.currentRotation) + + displayStateRepository.setCurrentRotation(DisplayRotation.ROTATION_180) + assertThat(currentRotation).isEqualTo(DisplayRotation.ROTATION_180) + + displayStateRepository.setCurrentRotation(DisplayRotation.ROTATION_90) + assertThat(currentRotation).isEqualTo(DisplayRotation.ROTATION_90) } @Test fun isFoldedChanges() = testScope.runTest { - val isFolded = collectLastValue(interactor.isFolded) + val isFolded by collectLastValue(interactor.isFolded) runCurrent() val callback = screenSizeFoldProvider.captureCallback() callback.onFoldUpdated(isFolded = true) - assertThat(isFolded()).isTrue() + assertThat(isFolded).isTrue() callback.onFoldUpdated(isFolded = false) - assertThat(isFolded()).isFalse() + assertThat(isFolded).isFalse() } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptFingerprintIconViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptFingerprintIconViewModelTest.kt index b3964b619505..fd86486aeff8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptFingerprintIconViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptFingerprintIconViewModelTest.kt @@ -4,9 +4,9 @@ import android.content.res.Configuration import androidx.test.filters.SmallTest import com.android.internal.widget.LockPatternUtils import com.android.systemui.SysuiTestCase +import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository import com.android.systemui.biometrics.data.repository.FakePromptRepository -import com.android.systemui.biometrics.data.repository.FakeRearDisplayStateRepository import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl import com.android.systemui.biometrics.domain.interactor.PromptSelectorInteractor @@ -43,7 +43,7 @@ class PromptFingerprintIconViewModelTest : SysuiTestCase() { private lateinit var displayRepository: FakeDisplayRepository private lateinit var fingerprintRepository: FakeFingerprintPropertyRepository private lateinit var promptRepository: FakePromptRepository - private lateinit var rearDisplayStateRepository: FakeRearDisplayStateRepository + private lateinit var displayStateRepository: FakeDisplayStateRepository private val testScope = TestScope(StandardTestDispatcher()) private val fakeExecutor = FakeExecutor(FakeSystemClock()) @@ -57,7 +57,7 @@ class PromptFingerprintIconViewModelTest : SysuiTestCase() { displayRepository = FakeDisplayRepository() fingerprintRepository = FakeFingerprintPropertyRepository() promptRepository = FakePromptRepository() - rearDisplayStateRepository = FakeRearDisplayStateRepository() + displayStateRepository = FakeDisplayStateRepository() promptSelectorInteractor = PromptSelectorInteractorImpl(fingerprintRepository, promptRepository, lockPatternUtils) @@ -66,7 +66,7 @@ class PromptFingerprintIconViewModelTest : SysuiTestCase() { testScope.backgroundScope, mContext, fakeExecutor, - rearDisplayStateRepository, + displayStateRepository, displayRepository, ) viewModel = PromptFingerprintIconViewModel(displayStateInteractor, promptSelectorInteractor) diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt index 5834e31cb591..ca6df4027ea9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt @@ -24,9 +24,9 @@ import android.view.MotionEvent import androidx.test.filters.SmallTest import com.android.internal.widget.LockPatternUtils import com.android.systemui.SysuiTestCase +import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository import com.android.systemui.biometrics.data.repository.FakePromptRepository -import com.android.systemui.biometrics.data.repository.FakeRearDisplayStateRepository import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl import com.android.systemui.biometrics.domain.interactor.PromptSelectorInteractor @@ -82,7 +82,7 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa private lateinit var fingerprintRepository: FakeFingerprintPropertyRepository private lateinit var promptRepository: FakePromptRepository - private lateinit var rearDisplayStateRepository: FakeRearDisplayStateRepository + private lateinit var displayStateRepository: FakeDisplayStateRepository private lateinit var displayRepository: FakeDisplayRepository private lateinit var displayStateInteractor: DisplayStateInteractor @@ -94,21 +94,22 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa fun setup() { fingerprintRepository = FakeFingerprintPropertyRepository() promptRepository = FakePromptRepository() - rearDisplayStateRepository = FakeRearDisplayStateRepository() + displayStateRepository = FakeDisplayStateRepository() displayRepository = FakeDisplayRepository() displayStateInteractor = DisplayStateInteractorImpl( testScope.backgroundScope, mContext, fakeExecutor, - rearDisplayStateRepository, + displayStateRepository, displayRepository, ) selector = PromptSelectorInteractorImpl(fingerprintRepository, promptRepository, lockPatternUtils) selector.resetPrompt() - viewModel = PromptViewModel(displayStateInteractor, selector, vibrator, featureFlags) + viewModel = + PromptViewModel(displayStateInteractor, selector, vibrator, mContext, featureFlags) featureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt index f234582d792b..a76c88579dca 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt @@ -41,8 +41,8 @@ import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.R import com.android.systemui.RoboPilotTest import com.android.systemui.SysuiTestCase +import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository import com.android.systemui.biometrics.data.repository.FakeFacePropertyRepository -import com.android.systemui.biometrics.data.repository.FakeRearDisplayStateRepository import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository @@ -208,7 +208,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { applicationScope = testScope.backgroundScope, context = context, mainExecutor = FakeExecutor(FakeSystemClock()), - rearDisplayStateRepository = FakeRearDisplayStateRepository(), + displayStateRepository = FakeDisplayStateRepository(), displayRepository = displayRepository, ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeRearDisplayStateRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeDisplayStateRepository.kt index fd9139165c85..60291eece70b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeRearDisplayStateRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeDisplayStateRepository.kt @@ -17,15 +17,23 @@ package com.android.systemui.biometrics.data.repository +import com.android.systemui.biometrics.shared.model.DisplayRotation import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -class FakeRearDisplayStateRepository : RearDisplayStateRepository { +class FakeDisplayStateRepository : DisplayStateRepository { private val _isInRearDisplayMode = MutableStateFlow<Boolean>(false) override val isInRearDisplayMode: StateFlow<Boolean> = _isInRearDisplayMode.asStateFlow() + private val _currentRotation = MutableStateFlow<DisplayRotation>(DisplayRotation.ROTATION_0) + override val currentRotation: StateFlow<DisplayRotation> = _currentRotation.asStateFlow() + fun setIsInRearDisplayMode(isInRearDisplayMode: Boolean) { _isInRearDisplayMode.value = isInRearDisplayMode } + + fun setCurrentRotation(currentRotation: DisplayRotation) { + _currentRotation.value = currentRotation + } } |