Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9d78c6f authored by Austin Delgado's avatar Austin Delgado Committed by Android (Google) Code Review
Browse files

Merge "Fix BP rotations with 3 button nav" into main

parents 9dd91a6b 84e025b2
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
+54 −6
Original line number Original line Diff line number Diff line
@@ -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
@@ -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 ->
@@ -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"
    }
    }
}
}
+10 −3
Original line number Original line Diff line number Diff line
@@ -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
@@ -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)
}
}
@@ -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)
@@ -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)
+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")
    }
+12 −0
Original line number Original line Diff line number Diff line
@@ -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