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

Commit 34d9130c authored by Matt Pietal's avatar Matt Pietal
Browse files

Migrate OCCLUDED<->LOCKSCREEN alpha/translation

It is currently in NotificationPanelViewController and needs to be
migrated to use the new keyguard root view. Move that logic to the
corresponding transition view models.

Also add ConfigurationInteractor and refactor code to use this instead
of ConfigurationRepository.

Also remove unused KeyguardVisibility data class and methods.

Test: atest OccludedToLockscreenTransitionViewModelTest
LockscreenToOccludedTransitionViewModelTest
ConfigurationInteractorTest
Bug: 288081969
Flag: ACONFIG com.android.systemui.keyguard_shade_migration_nssl DEVELOPMENT

Change-Id: Ia9c0f23d55bde09df24b4492567a104beafbf4d3
parent dffa7b8c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeCommandQueue
import com.android.systemui.keyguard.shared.model.CameraLaunchSourceModel
@@ -53,7 +54,6 @@ class KeyguardInteractorTest : SysuiTestCase() {
    private val sceneInteractor = testUtils.sceneInteractor()
    private val commandQueue = FakeCommandQueue()
    private val bouncerRepository = FakeKeyguardBouncerRepository()
    private val configurationRepository = FakeConfigurationRepository()
    private val shadeRepository = FakeShadeRepository()
    private val transitionState: MutableStateFlow<ObservableTransitionState> =
        MutableStateFlow(ObservableTransitionState.Idle(SceneKey.Gone))
@@ -65,7 +65,7 @@ class KeyguardInteractorTest : SysuiTestCase() {
            powerInteractor = PowerInteractorFactory.create().powerInteractor,
            sceneContainerFlags = testUtils.sceneContainerFlags,
            bouncerRepository = bouncerRepository,
            configurationRepository = configurationRepository,
            configurationInteractor = ConfigurationInteractor(FakeConfigurationRepository()),
            shadeRepository = shadeRepository,
            sceneInteractorProvider = { sceneInteractor },
        )
+1 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.flags.Flags
import com.android.systemui.flags.featureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
@@ -46,7 +47,6 @@ import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
class LockscreenToOccludedTransitionViewModelTest : SysuiTestCase() {

    private val kosmos =
        testKosmos().apply {
            featureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
+15 −6
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
@@ -28,9 +29,11 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.util.mockito.whenever
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.test.TestScope
@@ -39,6 +42,9 @@ import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.anyInt
import org.mockito.MockitoAnnotations

@ExperimentalCoroutinesApi
@SmallTest
@@ -48,12 +54,16 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() {
    private lateinit var repository: FakeKeyguardTransitionRepository
    private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
    @Mock private lateinit var configurationInteractor: ConfigurationInteractor
    private val dimenFlow = MutableStateFlow(0)

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        repository = FakeKeyguardTransitionRepository()
        fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
        biometricSettingsRepository = FakeBiometricSettingsRepository()
        whenever(configurationInteractor.dimensionPixelSize(anyInt())).thenReturn(dimenFlow)
        underTest =
            OccludedToLockscreenTransitionViewModel(
                interactor =
@@ -68,6 +78,7 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() {
                        fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
                        biometricSettingsRepository = biometricSettingsRepository,
                    ),
                configurationInteractor,
            )
    }

@@ -98,11 +109,10 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() {
    @Test
    fun lockscreenTranslationY() =
        runTest(UnconfinedTestDispatcher()) {
            dimenFlow.value = 100
            val values = mutableListOf<Float>()

            val pixels = 100
            val job =
                underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
            val job = underTest.lockscreenTranslationY.onEach { values.add(it) }.launchIn(this)

            repository.sendTransitionStep(step(0f, TransitionState.STARTED))
            repository.sendTransitionStep(step(0f))
@@ -119,11 +129,10 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() {
    @Test
    fun lockscreenTranslationYResettedAfterJobCancelled() =
        runTest(UnconfinedTestDispatcher()) {
            dimenFlow.value = 100
            val values = mutableListOf<Float>()

            val pixels = 100
            val job =
                underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
            val job = underTest.lockscreenTranslationY.onEach { values.add(it) }.launchIn(this)
            repository.sendTransitionStep(step(0.5f, TransitionState.CANCELED))

            assertThat(values.last()).isEqualTo(0f)
+46 −0
Original line number Diff line number Diff line
@@ -11,21 +11,36 @@
 * 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.
 *
 * limitations under the License
 */
@file:OptIn(ExperimentalCoroutinesApi::class)

package com.android.systemui.keyguard.shared.model
package com.android.systemui.common.ui.domain.interactor

/**
 * Provides a stateful representation of the visibility of the KeyguardRootView
 *
 * @param statusBarState State of the status bar represented by [StatusBarState]
 * @param goingToFullShade Whether status bar is going to full shade
 * @param occlusionTransitionRunning Whether the occlusion transition is running in this instant
 */
data class KeyguardRootViewVisibilityState(
    val statusBarState: Int,
    val goingToFullShade: Boolean,
    val occlusionTransitionRunning: Boolean,
)
import com.android.systemui.common.ui.data.repository.ConfigurationRepository
import com.android.systemui.dagger.SysUISingleton
import javax.inject.Inject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onStart

/** Business logic related to configuration changes. */
@SysUISingleton
class ConfigurationInteractor @Inject constructor(private val repository: ConfigurationRepository) {
    /** Given [resourceId], emit the dimension pixel size on config change */
    fun dimensionPixelSize(resourceId: Int): Flow<Int> {
        return onAnyConfigurationChange.mapLatest { repository.getDimensionPixelSize(resourceId) }
    }

    /** Given a set of [resourceId]s, emit Map<ResourceId, DimensionPixelSize> on config change */
    fun dimensionPixelSize(resourceIds: Set<Int>): Flow<Map<Int, Int>> {
        return onAnyConfigurationChange.mapLatest {
            resourceIds.associateWith { repository.getDimensionPixelSize(it) }
        }
    }

    /** Emit an event on any config change */
    val onAnyConfigurationChange: Flow<Unit> =
        repository.onAnyConfigurationChange.onStart { emit(Unit) }
}
+0 −34
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ import com.android.systemui.keyguard.shared.model.DismissAction
import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.DozeTransitionModel
import com.android.systemui.keyguard.shared.model.KeyguardDone
import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -180,9 +179,6 @@ interface KeyguardRepository {
    /** Whether quick settings or quick-quick settings is visible. */
    val isQuickSettingsVisible: Flow<Boolean>

    /** Represents the current state of the KeyguardRootView visibility */
    val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState>

    /** Receive an event for doze time tick */
    val dozeTimeTick: Flow<Long>

@@ -216,12 +212,6 @@ interface KeyguardRepository {
    /** Sets the current amount of alpha that should be used for rendering the keyguard. */
    fun setKeyguardAlpha(alpha: Float)

    fun setKeyguardVisibility(
        statusBarState: Int,
        goingToFullShade: Boolean,
        occlusionTransitionRunning: Boolean
    )

    /**
     * Sets the relative offset of the lock-screen clock from its natural position on the screen.
     */
@@ -631,17 +621,6 @@ constructor(
    private val _isActiveDreamLockscreenHosted = MutableStateFlow(false)
    override val isActiveDreamLockscreenHosted = _isActiveDreamLockscreenHosted.asStateFlow()

    private val _keyguardRootViewVisibility =
        MutableStateFlow(
            KeyguardRootViewVisibilityState(
                com.android.systemui.statusbar.StatusBarState.SHADE,
                goingToFullShade = false,
                occlusionTransitionRunning = false,
            )
        )
    override val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> =
        _keyguardRootViewVisibility.asStateFlow()

    override fun setAnimateDozingTransitions(animate: Boolean) {
        _animateBottomAreaDozingTransitions.value = animate
    }
@@ -654,19 +633,6 @@ constructor(
        _keyguardAlpha.value = alpha
    }

    override fun setKeyguardVisibility(
        statusBarState: Int,
        goingToFullShade: Boolean,
        occlusionTransitionRunning: Boolean
    ) {
        _keyguardRootViewVisibility.value =
            KeyguardRootViewVisibilityState(
                statusBarState,
                goingToFullShade,
                occlusionTransitionRunning
            )
    }

    override fun setClockPosition(x: Int, y: Int) {
        _clockPosition.value = Position(x, y)
    }
Loading