Loading packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt +4 −3 Original line number Original line Diff line number Diff line Loading @@ -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.FingerprintPropertyRepositoryImpl import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl import com.android.systemui.biometrics.data.repository.RearDisplayStateRepository import com.android.systemui.biometrics.data.repository.DisplayStateRepository import com.android.systemui.biometrics.data.repository.RearDisplayStateRepositoryImpl import com.android.systemui.biometrics.data.repository.DisplayStateRepositoryImpl import com.android.systemui.biometrics.domain.interactor.CredentialInteractor import com.android.systemui.biometrics.domain.interactor.CredentialInteractor import com.android.systemui.biometrics.domain.interactor.CredentialInteractorImpl import com.android.systemui.biometrics.domain.interactor.CredentialInteractorImpl import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor Loading Loading @@ -65,9 +65,10 @@ interface BiometricsModule { @SysUISingleton @SysUISingleton fun fingerprintRepository(impl: FingerprintPropertyRepositoryImpl): fun fingerprintRepository(impl: FingerprintPropertyRepositoryImpl): FingerprintPropertyRepository FingerprintPropertyRepository @Binds @Binds @SysUISingleton @SysUISingleton fun rearDisplayStateRepository(impl: RearDisplayStateRepositoryImpl): RearDisplayStateRepository fun displayStateRepository(impl: DisplayStateRepositoryImpl): DisplayStateRepository @Binds @Binds @SysUISingleton @SysUISingleton Loading packages/SystemUI/src/com/android/systemui/biometrics/data/repository/RearDisplayStateRepository.kt→packages/SystemUI/src/com/android/systemui/biometrics/data/repository/DisplayStateRepository.kt +54 −6 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,14 @@ package com.android.systemui.biometrics.data.repository import android.content.Context import android.content.Context import android.hardware.devicestate.DeviceStateManager 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.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.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton Loading @@ -32,21 +39,26 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn /** Provide current rear display state. */ /** Repository for the current state of the display */ interface RearDisplayStateRepository { interface DisplayStateRepository { /** Provides the current rear display state. */ /** Provides the current rear display state. */ val isInRearDisplayMode: StateFlow<Boolean> val isInRearDisplayMode: StateFlow<Boolean> /** Provides the current display rotation */ val currentRotation: StateFlow<DisplayRotation> } } @SysUISingleton @SysUISingleton class RearDisplayStateRepositoryImpl class DisplayStateRepositoryImpl @Inject @Inject constructor( constructor( @Application applicationScope: CoroutineScope, @Application applicationScope: CoroutineScope, @Application context: Context, @Application val context: Context, deviceStateManager: DeviceStateManager, deviceStateManager: DeviceStateManager, displayManager: DisplayManager, @Main handler: Handler, @Main mainExecutor: Executor @Main mainExecutor: Executor ) : RearDisplayStateRepository { ) : DisplayStateRepository { override val isInRearDisplayMode: StateFlow<Boolean> = override val isInRearDisplayMode: StateFlow<Boolean> = conflatedCallbackFlow { conflatedCallbackFlow { val sendRearDisplayStateUpdate = { state: Boolean -> val sendRearDisplayStateUpdate = { state: Boolean -> Loading Loading @@ -79,7 +91,43 @@ constructor( initialValue = false, 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 { companion object { const val TAG = "RearDisplayStateRepositoryImpl" const val TAG = "DisplayStateRepositoryImpl" } } } } packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt +10 −3 Original line number Original line Diff line number Diff line Loading @@ -19,7 +19,8 @@ package com.android.systemui.biometrics.domain.interactor import android.content.Context import android.content.Context import android.content.res.Configuration import android.content.res.Configuration import android.view.Display 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.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application Loading Loading @@ -50,6 +51,9 @@ interface DisplayStateInteractor { /** Whether the device is currently folded. */ /** Whether the device is currently folded. */ val isFolded: Flow<Boolean> 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 */ /** Called on configuration changes, used to keep the display state in sync */ fun onConfigurationChanged(newConfig: Configuration) fun onConfigurationChanged(newConfig: Configuration) } } Loading @@ -61,7 +65,7 @@ constructor( @Application applicationScope: CoroutineScope, @Application applicationScope: CoroutineScope, @Application context: Context, @Application context: Context, @Main mainExecutor: Executor, @Main mainExecutor: Executor, rearDisplayStateRepository: RearDisplayStateRepository, displayStateRepository: DisplayStateRepository, displayRepository: DisplayRepository, displayRepository: DisplayRepository, ) : DisplayStateInteractor { ) : DisplayStateInteractor { private var screenSizeFoldProvider: ScreenSizeFoldProvider = ScreenSizeFoldProvider(context) private var screenSizeFoldProvider: ScreenSizeFoldProvider = ScreenSizeFoldProvider(context) Loading Loading @@ -98,7 +102,10 @@ constructor( ) ) override val isInRearDisplayMode: StateFlow<Boolean> = override val isInRearDisplayMode: StateFlow<Boolean> = rearDisplayStateRepository.isInRearDisplayMode displayStateRepository.isInRearDisplayMode override val currentRotation: StateFlow<DisplayRotation> = displayStateRepository.currentRotation override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) { screenSizeFoldProvider.onConfigurationChange(newConfig) screenSizeFoldProvider.onConfigurationChange(newConfig) Loading packages/SystemUI/src/com/android/systemui/biometrics/shared/model/DisplayRotation.kt 0 → 100644 +21 −0 Original line number Original line Diff line number Diff line 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") } packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt +12 −0 Original line number Original line Diff line number Diff line Loading @@ -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 // configure & hide/disable buttons launch { launch { viewModel.credentialKind viewModel.credentialKind Loading Loading
packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt +4 −3 Original line number Original line Diff line number Diff line Loading @@ -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.FingerprintPropertyRepositoryImpl import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl import com.android.systemui.biometrics.data.repository.RearDisplayStateRepository import com.android.systemui.biometrics.data.repository.DisplayStateRepository import com.android.systemui.biometrics.data.repository.RearDisplayStateRepositoryImpl import com.android.systemui.biometrics.data.repository.DisplayStateRepositoryImpl import com.android.systemui.biometrics.domain.interactor.CredentialInteractor import com.android.systemui.biometrics.domain.interactor.CredentialInteractor import com.android.systemui.biometrics.domain.interactor.CredentialInteractorImpl import com.android.systemui.biometrics.domain.interactor.CredentialInteractorImpl import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor Loading Loading @@ -65,9 +65,10 @@ interface BiometricsModule { @SysUISingleton @SysUISingleton fun fingerprintRepository(impl: FingerprintPropertyRepositoryImpl): fun fingerprintRepository(impl: FingerprintPropertyRepositoryImpl): FingerprintPropertyRepository FingerprintPropertyRepository @Binds @Binds @SysUISingleton @SysUISingleton fun rearDisplayStateRepository(impl: RearDisplayStateRepositoryImpl): RearDisplayStateRepository fun displayStateRepository(impl: DisplayStateRepositoryImpl): DisplayStateRepository @Binds @Binds @SysUISingleton @SysUISingleton Loading
packages/SystemUI/src/com/android/systemui/biometrics/data/repository/RearDisplayStateRepository.kt→packages/SystemUI/src/com/android/systemui/biometrics/data/repository/DisplayStateRepository.kt +54 −6 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,14 @@ package com.android.systemui.biometrics.data.repository import android.content.Context import android.content.Context import android.hardware.devicestate.DeviceStateManager 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.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.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton Loading @@ -32,21 +39,26 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn /** Provide current rear display state. */ /** Repository for the current state of the display */ interface RearDisplayStateRepository { interface DisplayStateRepository { /** Provides the current rear display state. */ /** Provides the current rear display state. */ val isInRearDisplayMode: StateFlow<Boolean> val isInRearDisplayMode: StateFlow<Boolean> /** Provides the current display rotation */ val currentRotation: StateFlow<DisplayRotation> } } @SysUISingleton @SysUISingleton class RearDisplayStateRepositoryImpl class DisplayStateRepositoryImpl @Inject @Inject constructor( constructor( @Application applicationScope: CoroutineScope, @Application applicationScope: CoroutineScope, @Application context: Context, @Application val context: Context, deviceStateManager: DeviceStateManager, deviceStateManager: DeviceStateManager, displayManager: DisplayManager, @Main handler: Handler, @Main mainExecutor: Executor @Main mainExecutor: Executor ) : RearDisplayStateRepository { ) : DisplayStateRepository { override val isInRearDisplayMode: StateFlow<Boolean> = override val isInRearDisplayMode: StateFlow<Boolean> = conflatedCallbackFlow { conflatedCallbackFlow { val sendRearDisplayStateUpdate = { state: Boolean -> val sendRearDisplayStateUpdate = { state: Boolean -> Loading Loading @@ -79,7 +91,43 @@ constructor( initialValue = false, 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 { companion object { const val TAG = "RearDisplayStateRepositoryImpl" const val TAG = "DisplayStateRepositoryImpl" } } } }
packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt +10 −3 Original line number Original line Diff line number Diff line Loading @@ -19,7 +19,8 @@ package com.android.systemui.biometrics.domain.interactor import android.content.Context import android.content.Context import android.content.res.Configuration import android.content.res.Configuration import android.view.Display 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.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application Loading Loading @@ -50,6 +51,9 @@ interface DisplayStateInteractor { /** Whether the device is currently folded. */ /** Whether the device is currently folded. */ val isFolded: Flow<Boolean> 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 */ /** Called on configuration changes, used to keep the display state in sync */ fun onConfigurationChanged(newConfig: Configuration) fun onConfigurationChanged(newConfig: Configuration) } } Loading @@ -61,7 +65,7 @@ constructor( @Application applicationScope: CoroutineScope, @Application applicationScope: CoroutineScope, @Application context: Context, @Application context: Context, @Main mainExecutor: Executor, @Main mainExecutor: Executor, rearDisplayStateRepository: RearDisplayStateRepository, displayStateRepository: DisplayStateRepository, displayRepository: DisplayRepository, displayRepository: DisplayRepository, ) : DisplayStateInteractor { ) : DisplayStateInteractor { private var screenSizeFoldProvider: ScreenSizeFoldProvider = ScreenSizeFoldProvider(context) private var screenSizeFoldProvider: ScreenSizeFoldProvider = ScreenSizeFoldProvider(context) Loading Loading @@ -98,7 +102,10 @@ constructor( ) ) override val isInRearDisplayMode: StateFlow<Boolean> = override val isInRearDisplayMode: StateFlow<Boolean> = rearDisplayStateRepository.isInRearDisplayMode displayStateRepository.isInRearDisplayMode override val currentRotation: StateFlow<DisplayRotation> = displayStateRepository.currentRotation override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) { screenSizeFoldProvider.onConfigurationChange(newConfig) screenSizeFoldProvider.onConfigurationChange(newConfig) Loading
packages/SystemUI/src/com/android/systemui/biometrics/shared/model/DisplayRotation.kt 0 → 100644 +21 −0 Original line number Original line Diff line number Diff line 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") }
packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt +12 −0 Original line number Original line Diff line number Diff line Loading @@ -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 // configure & hide/disable buttons launch { launch { viewModel.credentialKind viewModel.credentialKind Loading