diff --git a/features/login/impl/build.gradle.kts b/features/login/impl/build.gradle.kts index 1d92cf00c9..a4f20fb97d 100644 --- a/features/login/impl/build.gradle.kts +++ b/features/login/impl/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { implementation(projects.libraries.permissions.api) implementation(projects.libraries.qrcode) implementation(projects.libraries.oidc.api) + implementation(projects.libraries.uiUtils) implementation(libs.androidx.browser) implementation(platform(libs.network.retrofit.bom)) implementation(libs.androidx.webkit) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt index 6ea5bfa488..5e0cc054fc 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt @@ -12,5 +12,6 @@ sealed interface OnBoardingEvents { val defaultAccountProvider: String ) : OnBoardingEvents + data object OnVersionClick : OnBoardingEvents data object ClearError : OnBoardingEvents } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt index f4696133fe..37dce8e4b5 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt @@ -9,9 +9,12 @@ package io.element.android.features.login.impl.screens.onboarding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -24,6 +27,7 @@ import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.ui.utils.MultipleTapToUnlock class OnBoardingPresenter @AssistedInject constructor( @Assisted private val params: OnBoardingNode.Params, @@ -40,6 +44,8 @@ class OnBoardingPresenter @AssistedInject constructor( ): OnBoardingPresenter } + private val multipleTapToUnlock = MultipleTapToUnlock() + @Composable override fun present(): OnBoardingState { val localCoroutineScope = rememberCoroutineScope() @@ -70,6 +76,7 @@ class OnBoardingPresenter @AssistedInject constructor( featureFlagService.isFeatureEnabled(FeatureFlags.QrCodeLogin) } val canReportBug = remember { rageshakeFeatureAvailability.isAvailable() } + var showReportBug by rememberSaveable { mutableStateOf(false) } val loginMode by loginHelper.collectLoginMode() @@ -82,6 +89,13 @@ class OnBoardingPresenter @AssistedInject constructor( loginHint = params.loginHint?.takeIf { forcedAccountProvider == null }, ) OnBoardingEvents.ClearError -> loginHelper.clearError() + OnBoardingEvents.OnVersionClick -> { + if (canReportBug) { + if (multipleTapToUnlock.unlock(localCoroutineScope)) { + showReportBug = true + } + } + } } } @@ -91,8 +105,9 @@ class OnBoardingPresenter @AssistedInject constructor( mustChooseAccountProvider = mustChooseAccountProvider, canLoginWithQrCode = canLoginWithQrCode, canCreateAccount = defaultAccountProvider == null && canConnectToAnyHomeserver && OnBoardingConfig.CAN_CREATE_ACCOUNT, - canReportBug = canReportBug, + canReportBug = canReportBug && showReportBug, loginMode = loginMode, + version = buildMeta.versionName, eventSink = ::handleEvent, ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt index 98484a1fc2..1e55c3af2d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt @@ -17,6 +17,7 @@ data class OnBoardingState( val canLoginWithQrCode: Boolean, val canCreateAccount: Boolean, val canReportBug: Boolean, + val version: String, val loginMode: AsyncData, val eventSink: (OnBoardingEvents) -> Unit, ) { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt index 9be36719e2..cdf77da523 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt @@ -30,6 +30,7 @@ fun anOnBoardingState( canLoginWithQrCode: Boolean = false, canCreateAccount: Boolean = false, canReportBug: Boolean = false, + version: String = "1.0.0", loginMode: AsyncData = AsyncData.Uninitialized, eventSink: (OnBoardingEvents) -> Unit = {}, ) = OnBoardingState( @@ -39,6 +40,7 @@ fun anOnBoardingState( canLoginWithQrCode = canLoginWithQrCode, canCreateAccount = canCreateAccount, canReportBug = canReportBug, + version = version, loginMode = loginMode, eventSink = eventSink, ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt index 99ab348b06..6c67e75cd1 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt @@ -202,12 +202,23 @@ private fun OnBoardingButtons( // Add a report problem text button. Use a Text since we need a special theme here. Text( modifier = Modifier - .padding(16.dp) - .clickable(onClick = onReportProblem), + .clickable(onClick = onReportProblem) + .padding(16.dp), text = stringResource(id = CommonStrings.common_report_a_problem), style = ElementTheme.typography.fontBodySmRegular, color = ElementTheme.colors.textSecondary, ) + } else { + Text( + modifier = Modifier + .clickable { + state.eventSink(OnBoardingEvents.OnVersionClick) + } + .padding(16.dp), + text = stringResource(id = R.string.screen_onboarding_app_version, state.version), + style = ElementTheme.typography.fontBodySmRegular, + color = ElementTheme.colors.textSecondary, + ) } } } diff --git a/features/login/impl/src/main/res/values/localazy.xml b/features/login/impl/src/main/res/values/localazy.xml index 4f4d98baaf..d0840f1983 100644 --- a/features/login/impl/src/main/res/values/localazy.xml +++ b/features/login/impl/src/main/res/values/localazy.xml @@ -34,6 +34,7 @@ "Matrix is an open network for secure, decentralised communication." "Welcome back!" "Sign in to %1$s" + "Version %1$s" "Sign in manually" "Sign in to %1$s" "Sign in with QR code" diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt index 7749d1502b..3e59528427 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt @@ -83,19 +83,40 @@ class OnBoardingPresenterTest { assertThat(initialState.canLoginWithQrCode).isFalse() assertThat(initialState.productionApplicationName).isEqualTo("B") assertThat(initialState.canCreateAccount).isEqualTo(OnBoardingConfig.CAN_CREATE_ACCOUNT) - assertThat(initialState.canReportBug).isTrue() + assertThat(initialState.canReportBug).isFalse() assertThat(awaitItem().canLoginWithQrCode).isTrue() } } @Test - fun `present - rageshake not available`() = runTest { + fun `present - clicking on version 7 times has no effect if rageshake not available`() = runTest { val presenter = createPresenter( rageshakeFeatureAvailability = { false }, ) presenter.test { skipItems(1) - assertThat(awaitItem().canReportBug).isFalse() + awaitItem().also { state -> + assertThat(state.canReportBug).isFalse() + repeat(7) { + state.eventSink(OnBoardingEvents.OnVersionClick) + } + } + expectNoEvents() + } + } + + @Test + fun `present - clicking on version 7 times will reveal the report a problem button`() = runTest { + val presenter = createPresenter() + presenter.test { + skipItems(1) + awaitItem().also { state -> + assertThat(state.canReportBug).isFalse() + repeat(7) { + state.eventSink(OnBoardingEvents.OnVersionClick) + } + } + assertThat(awaitItem().canReportBug).isTrue() } } diff --git a/features/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts index 6fb6e4a55b..fa7aeb4bca 100644 --- a/features/preferences/impl/build.gradle.kts +++ b/features/preferences/impl/build.gradle.kts @@ -66,6 +66,7 @@ dependencies { implementation(projects.libraries.permissions.api) implementation(projects.libraries.push.api) implementation(projects.libraries.pushproviders.api) + implementation(projects.libraries.uiUtils) implementation(projects.libraries.fullscreenintent.api) implementation(projects.features.rageshake.api) implementation(projects.features.lockscreen.api) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt index 15a55f41ca..6fd2d635e1 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt @@ -15,6 +15,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.produceState import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import io.element.android.features.logout.api.direct.DirectLogoutState import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider @@ -49,6 +50,7 @@ class PreferencesRootPresenter @Inject constructor( ) : Presenter { @Composable override fun present(): PreferencesRootState { + val coroutineScope = rememberCoroutineScope() val matrixUser = matrixClient.userProfile.collectAsState() LaunchedEffect(Unit) { // Force a refresh of the profile @@ -103,7 +105,7 @@ class PreferencesRootPresenter @Inject constructor( fun handleEvent(event: PreferencesRootEvents) { when (event) { is PreferencesRootEvents.OnVersionInfoClick -> { - showDeveloperSettingsProvider.unlockDeveloperSettings() + showDeveloperSettingsProvider.unlockDeveloperSettings(coroutineScope) } } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt index 6589fd1c66..2ed16d6582 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt @@ -9,6 +9,8 @@ package io.element.android.features.preferences.impl.utils import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildType +import io.element.android.libraries.ui.utils.MultipleTapToUnlock +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import javax.inject.Inject @@ -19,18 +21,15 @@ class ShowDeveloperSettingsProvider @Inject constructor( companion object { const val DEVELOPER_SETTINGS_COUNTER = 7 } - private var counter = DEVELOPER_SETTINGS_COUNTER + + private val multipleTapToUnlock = MultipleTapToUnlock(DEVELOPER_SETTINGS_COUNTER) private val isDeveloperBuild = buildMeta.buildType != BuildType.RELEASE private val _showDeveloperSettings = MutableStateFlow(isDeveloperBuild) val showDeveloperSettings: StateFlow = _showDeveloperSettings - fun unlockDeveloperSettings() { - if (counter == 0) { - return - } - counter-- - if (counter == 0) { + fun unlockDeveloperSettings(scope: CoroutineScope) { + if (multipleTapToUnlock.unlock(scope)) { _showDeveloperSettings.value = true } } diff --git a/libraries/ui-utils/build.gradle.kts b/libraries/ui-utils/build.gradle.kts index 40530645dc..fc60dc277e 100644 --- a/libraries/ui-utils/build.gradle.kts +++ b/libraries/ui-utils/build.gradle.kts @@ -15,5 +15,7 @@ android { dependencies { testImplementation(libs.test.junit) testImplementation(libs.test.truth) + testImplementation(libs.coroutines.test) + testImplementation(libs.test.truth) } } diff --git a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt new file mode 100644 index 0000000000..15a8b82eee --- /dev/null +++ b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.ui.utils + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlin.time.Duration.Companion.seconds + +/** + * Returns true if the user has tapped [numberOfTapToUnlock] times in a short amount of time. + * The counter is reset after 2 seconds of inactivity. + * + * @param numberOfTapToUnlock The number of taps required to unlock. + */ +class MultipleTapToUnlock( + private val numberOfTapToUnlock: Int = 7, +) { + private var counter = numberOfTapToUnlock + private var currentJob: Job? = null + + fun unlock(scope: CoroutineScope): Boolean { + counter-- + currentJob?.cancel() + return if (counter > 0) { + currentJob = scope.launch { + delay(2.seconds) + // Reset counter if user is not fast enough + counter = numberOfTapToUnlock + } + false + } else { + true + } + } +} diff --git a/libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt b/libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt new file mode 100644 index 0000000000..1745f617d8 --- /dev/null +++ b/libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +@file:OptIn(ExperimentalCoroutinesApi::class) + +package io.element.android.libraries.ui.utils + +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runTest +import org.junit.Test +import kotlin.time.Duration.Companion.seconds + +class MultipleTapToUnlockTest { + @Test + fun `test multiple tap should unlock`() = runTest { + val sut = MultipleTapToUnlock(3) + assertThat(sut.unlock(backgroundScope)).isFalse() + assertThat(sut.unlock(backgroundScope)).isFalse() + assertThat(sut.unlock(backgroundScope)).isTrue() + assertThat(sut.unlock(backgroundScope)).isTrue() + // All next call returns true + advanceTimeBy(3.seconds) + assertThat(sut.unlock(backgroundScope)).isTrue() + } + @Test + fun `test waiting should reset counter`() = runTest { + val sut = MultipleTapToUnlock(3) + assertThat(sut.unlock(backgroundScope)).isFalse() + assertThat(sut.unlock(backgroundScope)).isFalse() + advanceTimeBy(3.seconds) + assertThat(sut.unlock(backgroundScope)).isFalse() + assertThat(sut.unlock(backgroundScope)).isFalse() + assertThat(sut.unlock(backgroundScope)).isTrue() + } +} diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png index 679efc4aaf..d77f4d1242 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ab623f806fc90bef41beccc5d5f444a882e6634cdadecbbc341e10369bbcfdb -size 315380 +oid sha256:f8dc4806d2d363c326ac777011b95a98111e69d8f7acaccf926dc959bf8e9636 +size 311242 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png index 4275f3eac1..a67a1981e4 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b73088b5af32e47d18d6961fe5622411f5342388d8a0d78c8f3fb5e27213146a -size 315116 +oid sha256:0b55b1c3f2f76ac40cba5f7d49d897a4ffe22d6718444ca8a1197173c660f182 +size 306017 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png index 69d4181bbe..2859c2cced 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:24735f133066c55c6d88b7f9930ad983cca431611c7e6833ca5a4d657eeb14a5 -size 313116 +oid sha256:644e67fd8ccb1754ba4bfec6de5bc8c75a6603b75faa96847076cc27ad18804b +size 309657 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png index 03edadc7be..48d2f299af 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d02a7ff9ff40f73d8c72b9378e10ba1f6580524cbdefcf290066b8047fdc33c -size 307633 +oid sha256:bcc26d88db59b7499a9e1894608831b418a8088b248c5fb390a43ba8cd5aa319 +size 304249 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png index f087a418d1..d3eec1107f 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f5ac9f2f168b895e8262181f789b0fe2ad2c97b1296a50c1453879438bfe436a -size 395942 +oid sha256:344fa6743ab2f43819abf6045d4d98ef0ff91f6b31e6de4a87235d6b96160e53 +size 392425 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png index 8ff0422506..0a84a5b632 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f7c1c7d34935986d01113069c25849fc860133de582fe94ee63f2e28b181e87f -size 397378 +oid sha256:ed48740f02725790f7de7a867d237449c07148367dc32ef7fbbd7b40d0ed9a4c +size 379715 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png index 1597b13f0a..a461b0fbc9 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a11f8383fc481255fb3fa6f1a5475d23c13c0460c33b04bc190cf3b5931893a3 -size 395108 +oid sha256:d6a6c752f1de16c4c64987d8f603d76ec0ed344b59d335b71004ce85500d852e +size 383032 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png index fb78588841..209ec00b37 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36424ccefbbbd35201800dbcbb743a2d22aa6fe7a606054fc3acf8b98aead272 -size 381588 +oid sha256:4b9101e8d1502445e3997230800ac1cd4adc50a5392cebdcdc4dfc3e5fe56abc +size 364584