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

Commit 959c10ba authored by Bryce Lee's avatar Bryce Lee
Browse files

Support RTL for Glanceable Hub Transition View Models.

This changelist adds RTL support in Transition View Models for
Glanceable Hub. Values controlling directional movement are negated
when the language direction differs from the originally intended
direction when the value was originally defined.

A new method has been added to ConfigurationInteractor for creating a
flow to track a resource value while considering the layout direction.

Test: atest ConfigurationInteractorTest#directionalDimensionPixelSize
Bug: 320786721
Flag: com.android.systemui.communal_hub
Change-Id: I5bd5282152923a29193ff01408751762c96260ab
parent e69f6148
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.content.res.Configuration
import android.util.LayoutDirection
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -33,6 +35,8 @@ import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -73,6 +77,9 @@ class DreamingToGlanceableHubTransitionViewModelTest : SysuiTestCase() {
                R.dimen.dreaming_to_hub_transition_dream_overlay_translation_x,
                -100
            )
            val configuration: Configuration = mock()
            whenever(configuration.layoutDirection).thenReturn(LayoutDirection.LTR)
            configurationRepository.onConfigurationChange(configuration)

            val values by collectValues(underTest.dreamOverlayTranslationX)
            assertThat(values).isEmpty()
+7 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.content.res.Configuration
import android.util.LayoutDirection
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -33,6 +35,8 @@ import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -69,6 +73,9 @@ class GlanceableHubToDreamingTransitionViewModelTest : SysuiTestCase() {
    @Test
    fun dreamOverlayTranslationX() =
        testScope.runTest {
            val config: Configuration = mock()
            whenever(config.layoutDirection).thenReturn(LayoutDirection.LTR)
            configurationRepository.onConfigurationChange(config)
            configurationRepository.setDimensionPixelSize(
                R.dimen.hub_to_dreaming_transition_dream_overlay_translation_x,
                100
+12 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.content.res.Configuration
import android.util.LayoutDirection
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -34,6 +36,8 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -77,6 +81,10 @@ class GlanceableHubToLockscreenTransitionViewModelTest : SysuiTestCase() {
    @Test
    fun lockscreenTranslationX() =
        testScope.runTest {
            val config: Configuration = mock()
            whenever(config.layoutDirection).thenReturn(LayoutDirection.LTR)
            configurationRepository.onConfigurationChange(config)

            configurationRepository.setDimensionPixelSize(
                R.dimen.hub_to_lockscreen_transition_lockscreen_translation_x,
                100
@@ -102,6 +110,10 @@ class GlanceableHubToLockscreenTransitionViewModelTest : SysuiTestCase() {
    @Test
    fun lockscreenTranslationX_resetsAfterCancellation() =
        testScope.runTest {
            val config: Configuration = mock()
            whenever(config.layoutDirection).thenReturn(LayoutDirection.LTR)
            configurationRepository.onConfigurationChange(config)

            configurationRepository.setDimensionPixelSize(
                R.dimen.hub_to_lockscreen_transition_lockscreen_translation_x,
                100
+8 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.content.res.Configuration
import android.util.LayoutDirection
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -34,6 +36,9 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.mock
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -82,6 +87,9 @@ class LockscreenToGlanceableHubTransitionViewModelTest : SysuiTestCase() {
                R.dimen.lockscreen_to_hub_transition_lockscreen_translation_x,
                -100
            )
            val configuration = mock<Configuration>()
            whenever(configuration.layoutDirection).thenReturn(LayoutDirection.LTR)
            configurationRepository.onConfigurationChange(configuration)
            val values by collectValues(underTest.keyguardTranslationX)
            assertThat(values).isEmpty()

+8 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.systemui.dagger.SysUISingleton
import javax.inject.Inject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
@@ -74,6 +75,13 @@ class ConfigurationInteractor @Inject constructor(private val repository: Config
        return onAnyConfigurationChange.mapLatest { repository.getDimensionPixelSize(resourceId) }
    }

    /** Emits the dimensional pixel size of the given resource, inverting it for RTL if necessary */
    fun directionalDimensionPixelSize(originLayoutDirection: Int, resourceId: Int): Flow<Int> {
        return dimensionPixelSize(resourceId).combine(layoutDirection) { size, direction ->
            if (originLayoutDirection == direction) size else -size
        }
    }

    /** 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 {
Loading