From 68f9c816283cb43ec050bab59eecb322cd69b4bc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Nov 2023 11:55:16 +0100 Subject: [PATCH 1/2] Let the user choose theme (#1499) --- .../io/element/android/x/MainActivity.kt | 14 ++++- .../io/element/android/x/di/AppBindings.kt | 2 + .../features/call/ui/ElementCallActivity.kt | 16 +++++- .../impl/advanced/AdvancedSettingsEvents.kt | 5 ++ .../advanced/AdvancedSettingsPresenter.kt | 19 ++++++- .../impl/advanced/AdvancedSettingsState.kt | 4 ++ .../advanced/AdvancedSettingsStateProvider.kt | 5 ++ .../impl/advanced/AdvancedSettingsView.kt | 55 +++++++++++++++++++ .../advanced/AdvancedSettingsPresenterTest.kt | 27 +++++++++ .../preferences/api/store/PreferencesStore.kt | 3 + .../impl/store/DefaultPreferencesStore.kt | 13 +++++ .../test/InMemoryPreferencesStore.kt | 10 ++++ .../android/libraries/theme/theme/Theme.kt | 46 ++++++++++++++++ 13 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 libraries/theme/src/main/kotlin/io/element/android/libraries/theme/theme/Theme.kt diff --git a/app/src/main/kotlin/io/element/android/x/MainActivity.kt b/app/src/main/kotlin/io/element/android/x/MainActivity.kt index 29f2d765273..c8e16f708e3 100644 --- a/app/src/main/kotlin/io/element/android/x/MainActivity.kt +++ b/app/src/main/kotlin/io/element/android/x/MainActivity.kt @@ -25,6 +25,9 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen @@ -38,6 +41,9 @@ import io.element.android.libraries.architecture.bindings import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.designsystem.utils.snackbar.LocalSnackbarDispatcher import io.element.android.libraries.theme.ElementTheme +import io.element.android.libraries.theme.theme.Theme +import io.element.android.libraries.theme.theme.isDark +import io.element.android.libraries.theme.theme.mapToTheme import io.element.android.x.di.AppBindings import io.element.android.x.intent.SafeUriHandler import timber.log.Timber @@ -77,7 +83,13 @@ class MainActivity : NodeActivity() { @Composable private fun MainContent(appBindings: AppBindings) { - ElementTheme { + val theme by remember { + appBindings.preferencesStore().getThemeFlow().mapToTheme() + } + .collectAsState(initial = Theme.System) + ElementTheme( + darkTheme = theme.isDark() + ) { CompositionLocalProvider( LocalSnackbarDispatcher provides appBindings.snackbarDispatcher(), LocalUriHandler provides SafeUriHandler(this), diff --git a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt index 512b5093d0b..96439ff9730 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt @@ -18,6 +18,7 @@ package io.element.android.x.di import com.squareup.anvil.annotations.ContributesTo import io.element.android.features.lockscreen.api.LockScreenService +import io.element.android.features.preferences.api.store.PreferencesStore import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.di.AppScope @@ -29,4 +30,5 @@ interface AppBindings { fun tracingService(): TracingService fun bugReporter(): BugReporter fun lockScreenService(): LockScreenService + fun preferencesStore(): PreferencesStore } diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/ElementCallActivity.kt b/features/call/src/main/kotlin/io/element/android/features/call/ui/ElementCallActivity.kt index 651a2176f3f..54a41ea31d3 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/ElementCallActivity.kt +++ b/features/call/src/main/kotlin/io/element/android/features/call/ui/ElementCallActivity.kt @@ -31,15 +31,22 @@ import android.webkit.PermissionRequest import androidx.activity.compose.setContent import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.core.content.IntentCompat import com.bumble.appyx.core.integrationpoint.NodeComponentActivity import io.element.android.features.call.CallForegroundService import io.element.android.features.call.CallType import io.element.android.features.call.di.CallBindings import io.element.android.features.call.utils.CallIntentDataParser +import io.element.android.features.preferences.api.store.PreferencesStore import io.element.android.libraries.architecture.bindings import io.element.android.libraries.theme.ElementTheme +import io.element.android.libraries.theme.theme.Theme +import io.element.android.libraries.theme.theme.isDark +import io.element.android.libraries.theme.theme.mapToTheme import javax.inject.Inject class ElementCallActivity : NodeComponentActivity(), CallScreenNavigator { @@ -60,6 +67,7 @@ class ElementCallActivity : NodeComponentActivity(), CallScreenNavigator { @Inject lateinit var callIntentDataParser: CallIntentDataParser @Inject lateinit var presenterFactory: CallScreenPresenter.Factory + @Inject lateinit var preferencesStore: PreferencesStore private lateinit var presenter: CallScreenPresenter @@ -92,8 +100,14 @@ class ElementCallActivity : NodeComponentActivity(), CallScreenNavigator { requestAudioFocus() setContent { + val theme by remember { + preferencesStore.getThemeFlow().mapToTheme() + } + .collectAsState(initial = Theme.System) val state = presenter.present() - ElementTheme { + ElementTheme( + darkTheme = theme.isDark() + ) { CallScreenView( state = state, requestPermissions = { permissions, callback -> diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt index 37641d684c9..f79c53335cf 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt @@ -16,7 +16,12 @@ package io.element.android.features.preferences.impl.advanced +import io.element.android.libraries.theme.theme.Theme + sealed interface AdvancedSettingsEvents { data class SetRichTextEditorEnabled(val enabled: Boolean) : AdvancedSettingsEvents data class SetDeveloperModeEnabled(val enabled: Boolean) : AdvancedSettingsEvents + data object ChangeTheme : AdvancedSettingsEvents + data object CancelChangeTheme : AdvancedSettingsEvents + data class SetTheme(val theme: Theme) : AdvancedSettingsEvents } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt index 4b6b0354b6d..bf438db4efa 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt @@ -19,9 +19,14 @@ package io.element.android.features.preferences.impl.advanced import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import io.element.android.features.preferences.api.store.PreferencesStore import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.theme.theme.Theme +import io.element.android.libraries.theme.theme.mapToTheme import kotlinx.coroutines.launch import javax.inject.Inject @@ -38,7 +43,11 @@ class AdvancedSettingsPresenter @Inject constructor( val isDeveloperModeEnabled by preferencesStore .isDeveloperModeEnabledFlow() .collectAsState(initial = false) - + val theme by remember { + preferencesStore.getThemeFlow().mapToTheme() + } + .collectAsState(initial = Theme.System) + var showChangeThemeDialog by remember { mutableStateOf(false) } fun handleEvents(event: AdvancedSettingsEvents) { when (event) { is AdvancedSettingsEvents.SetRichTextEditorEnabled -> localCoroutineScope.launch { @@ -47,12 +56,20 @@ class AdvancedSettingsPresenter @Inject constructor( is AdvancedSettingsEvents.SetDeveloperModeEnabled -> localCoroutineScope.launch { preferencesStore.setDeveloperModeEnabled(event.enabled) } + AdvancedSettingsEvents.CancelChangeTheme -> showChangeThemeDialog = false + AdvancedSettingsEvents.ChangeTheme -> showChangeThemeDialog = true + is AdvancedSettingsEvents.SetTheme -> localCoroutineScope.launch { + preferencesStore.setTheme(event.theme.name) + showChangeThemeDialog = false + } } } return AdvancedSettingsState( isRichTextEditorEnabled = isRichTextEditorEnabled, isDeveloperModeEnabled = isDeveloperModeEnabled, + theme = theme, + showChangeThemeDialog = showChangeThemeDialog, eventSink = { handleEvents(it) } ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt index 899eac27447..82586847506 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt @@ -16,8 +16,12 @@ package io.element.android.features.preferences.impl.advanced +import io.element.android.libraries.theme.theme.Theme + data class AdvancedSettingsState( val isRichTextEditorEnabled: Boolean, val isDeveloperModeEnabled: Boolean, + val theme: Theme, + val showChangeThemeDialog: Boolean, val eventSink: (AdvancedSettingsEvents) -> Unit ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt index 5ab50c8a164..012a39896c4 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt @@ -17,6 +17,7 @@ package io.element.android.features.preferences.impl.advanced import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.libraries.theme.theme.Theme open class AdvancedSettingsStateProvider : PreviewParameterProvider { override val values: Sequence @@ -24,14 +25,18 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider { + return themes.map { + ListOption(title = it.toHumanReadable()) + }.toImmutableList() +} + +@Composable +private fun Theme.toHumanReadable(): String { + return stringResource( + id = when (this) { + Theme.System -> CommonStrings.common_system + Theme.Dark -> CommonStrings.common_dark + Theme.Light -> CommonStrings.common_light + } + ) } @PreviewsDayNight diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt index 1ea04c11dd4..00ea3bbf149 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt @@ -21,6 +21,7 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.libraries.featureflag.test.InMemoryPreferencesStore +import io.element.android.libraries.theme.theme.Theme import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.awaitLastSequentialItem import kotlinx.coroutines.test.runTest @@ -42,6 +43,8 @@ class AdvancedSettingsPresenterTest { val initialState = awaitLastSequentialItem() assertThat(initialState.isDeveloperModeEnabled).isFalse() assertThat(initialState.isRichTextEditorEnabled).isFalse() + assertThat(initialState.showChangeThemeDialog).isFalse() + assertThat(initialState.theme).isEqualTo(Theme.System) } } @@ -76,4 +79,28 @@ class AdvancedSettingsPresenterTest { assertThat(awaitItem().isRichTextEditorEnabled).isFalse() } } + + @Test + fun `present - change theme`() = runTest { + val store = InMemoryPreferencesStore() + val presenter = AdvancedSettingsPresenter(store) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitLastSequentialItem() + initialState.eventSink.invoke(AdvancedSettingsEvents.ChangeTheme) + val withDialog = awaitItem() + assertThat(withDialog.showChangeThemeDialog).isTrue() + // Cancel + withDialog.eventSink(AdvancedSettingsEvents.CancelChangeTheme) + val withoutDialog = awaitItem() + assertThat(withoutDialog.showChangeThemeDialog).isFalse() + withDialog.eventSink.invoke(AdvancedSettingsEvents.ChangeTheme) + assertThat(awaitItem().showChangeThemeDialog).isTrue() + withDialog.eventSink(AdvancedSettingsEvents.SetTheme(Theme.Light)) + val withNewTheme = awaitItem() + assertThat(withNewTheme.showChangeThemeDialog).isFalse() + assertThat(withNewTheme.theme).isEqualTo(Theme.Light) + } + } } diff --git a/libraries/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/store/PreferencesStore.kt b/libraries/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/store/PreferencesStore.kt index d62fb7e6cf9..2bd1fc60644 100644 --- a/libraries/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/store/PreferencesStore.kt +++ b/libraries/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/store/PreferencesStore.kt @@ -28,5 +28,8 @@ interface PreferencesStore { suspend fun setCustomElementCallBaseUrl(string: String?) fun getCustomElementCallBaseUrlFlow(): Flow + suspend fun setTheme(theme: String) + fun getThemeFlow(): Flow + suspend fun reset() } diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesStore.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesStore.kt index 66a46d1ca3c..d00b7505d73 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesStore.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesStore.kt @@ -39,6 +39,7 @@ private val Context.dataStore: DataStore by preferencesDataStore(na private val richTextEditorKey = booleanPreferencesKey("richTextEditor") private val developerModeKey = booleanPreferencesKey("developerMode") private val customElementCallBaseUrlKey = stringPreferencesKey("elementCallBaseUrl") +private val themeKey = stringPreferencesKey("theme") @ContributesBinding(AppScope::class) class DefaultPreferencesStore @Inject constructor( @@ -89,6 +90,18 @@ class DefaultPreferencesStore @Inject constructor( } } + override suspend fun setTheme(theme: String) { + store.edit { prefs -> + prefs[themeKey] = theme + } + } + + override fun getThemeFlow(): Flow { + return store.data.map { prefs -> + prefs[themeKey] + } + } + override suspend fun reset() { store.edit { it.clear() } } diff --git a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/featureflag/test/InMemoryPreferencesStore.kt b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/featureflag/test/InMemoryPreferencesStore.kt index 6dea8910ed3..c4a26215c26 100644 --- a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/featureflag/test/InMemoryPreferencesStore.kt +++ b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/featureflag/test/InMemoryPreferencesStore.kt @@ -24,10 +24,12 @@ class InMemoryPreferencesStore( isRichTextEditorEnabled: Boolean = false, isDeveloperModeEnabled: Boolean = false, customElementCallBaseUrl: String? = null, + theme: String? = null, ) : PreferencesStore { private var _isRichTextEditorEnabled = MutableStateFlow(isRichTextEditorEnabled) private var _isDeveloperModeEnabled = MutableStateFlow(isDeveloperModeEnabled) private var _customElementCallBaseUrl = MutableStateFlow(customElementCallBaseUrl) + private var _theme = MutableStateFlow(theme) override suspend fun setRichTextEditorEnabled(enabled: Boolean) { _isRichTextEditorEnabled.value = enabled @@ -53,6 +55,14 @@ class InMemoryPreferencesStore( return _customElementCallBaseUrl } + override suspend fun setTheme(theme: String) { + _theme.value = theme + } + + override fun getThemeFlow(): Flow { + return _theme + } + override suspend fun reset() { // No op } diff --git a/libraries/theme/src/main/kotlin/io/element/android/libraries/theme/theme/Theme.kt b/libraries/theme/src/main/kotlin/io/element/android/libraries/theme/theme/Theme.kt new file mode 100644 index 00000000000..2d77a66c980 --- /dev/null +++ b/libraries/theme/src/main/kotlin/io/element/android/libraries/theme/theme/Theme.kt @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * 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. + */ + +package io.element.android.libraries.theme.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +enum class Theme { + System, + Dark, + Light; +} + +val themes = listOf(Theme.System, Theme.Dark, Theme.Light) + +@Composable +fun Theme.isDark(): Boolean { + return when (this) { + Theme.System -> isSystemInDarkTheme() + Theme.Dark -> true + Theme.Light -> false + } +} + +fun Flow.mapToTheme(): Flow = map { + when (it) { + null -> Theme.System + else -> Theme.valueOf(it) + } +} From 5e95da991137db2d6a49028fad38470f81c3fea1 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Tue, 21 Nov 2023 11:21:43 +0000 Subject: [PATCH 2/2] Update screenshots --- ...ll_AdvancedSettingsView-Day-1_1_null_0,NEXUS_5,1.0,en].png | 4 ++-- ...ll_AdvancedSettingsView-Day-1_1_null_1,NEXUS_5,1.0,en].png | 4 ++-- ...ll_AdvancedSettingsView-Day-1_1_null_2,NEXUS_5,1.0,en].png | 4 ++-- ...ll_AdvancedSettingsView-Day-1_1_null_3,NEXUS_5,1.0,en].png | 3 +++ ..._AdvancedSettingsView-Night-1_2_null_0,NEXUS_5,1.0,en].png | 4 ++-- ..._AdvancedSettingsView-Night-1_2_null_1,NEXUS_5,1.0,en].png | 4 ++-- ..._AdvancedSettingsView-Night-1_2_null_2,NEXUS_5,1.0,en].png | 4 ++-- ..._AdvancedSettingsView-Night-1_2_null_3,NEXUS_5,1.0,en].png | 3 +++ 8 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_3,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_0,NEXUS_5,1.0,en].png index 87469e8d76e..a8b6a93bdd0 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20ed65388204495106f428d0445c3091bac5b953e46931d21d5ee73c5ae876cc -size 37889 +oid sha256:d6bc45093c8a96a5446c18b42590d6b866a40ea34268e4764a29505dcf97965c +size 42565 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_1,NEXUS_5,1.0,en].png index 4588e60de30..05647b9c50a 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_1,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_1,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7bd91af47b7b336b5bd1abf52ebfcd588d29cb8b0bbb67115fbeaac8ba5bb469 -size 37473 +oid sha256:290bb5d6134171c6d3f343ee3bad95d244175fd18696c5c27a526b9d61948d5f +size 42232 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_2,NEXUS_5,1.0,en].png index d9d2d0a9f56..e8a91dae18b 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_2,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_2,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40bddbf21b6ca1d3f2647ff5168bd7b620b36d5cf3c88f15bab148963c3426b7 -size 37530 +oid sha256:a9ee0f94d9067eda01bc4b93bd5bf5c7493d0f6790bd5c1d1d542ed029e0a07d +size 42149 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_3,NEXUS_5,1.0,en].png new file mode 100644 index 00000000000..33ebf89295b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_1_null_3,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd3770364cdfb8804008c0cd86129e689f239a4685ec4690b2d8f65f73b57ac4 +size 36621 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_0,NEXUS_5,1.0,en].png index 11451941bff..ffd6bc821b7 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21e918bf1bbc6f024099d7bb8a1f38eaa356a50a244a9348411489a678579afa -size 35444 +oid sha256:917073ea5c55d001279b622a268a61ce2b56b94d396c99802f92013b6ddbb71c +size 39924 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_1,NEXUS_5,1.0,en].png index d9300615dc4..bf66ea47000 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_1,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_1,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c051bfc9f9eafd112ccc60eb77b7ffbc9d91c493f2b588fbf51476c2be39ab1a -size 35069 +oid sha256:e6e41d8672db7f6b89f3db5e174569c9ccec381e0f3c34ab410a85768234764f +size 39683 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_2,NEXUS_5,1.0,en].png index fe0e7dfff14..0fee0836a46 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_2,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_2,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:943800b5c6fbdda0c39569ab44375ec2e4487c54644663fc21417b077ce5b8e3 -size 35181 +oid sha256:577f6db9a8a987a685b3596644b0cae992694662aee10b5e64b4c748e21e1a5c +size 39647 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_3,NEXUS_5,1.0,en].png new file mode 100644 index 00000000000..f1949123008 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_2_null_3,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d14440500ffac475aa57cedbc3de507f182cb1e79b0b93b4f4b9b90c3c5c13a5 +size 32136