From 675dd4b1090909e6d52d36752a4366e0a1deb0df Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Tue, 25 Jul 2023 16:47:25 +0200 Subject: [PATCH 1/8] Add permission request flow to ShowLocation feature too. TODO: - Presenter Tests - Add Dialogs in View --- .../location/impl/show/ShowLocationEvents.kt | 7 ++++ .../impl/show/ShowLocationPresenter.kt | 39 +++++++++++++++++-- .../location/impl/show/ShowLocationState.kt | 10 ++++- .../impl/show/ShowLocationStateProvider.kt | 14 +++++++ .../impl/show/ShowLocationPresenterTest.kt | 11 ++++-- 5 files changed, 73 insertions(+), 8 deletions(-) diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt index b725ec6db7..dd4428d0bb 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt @@ -16,7 +16,14 @@ package io.element.android.features.location.impl.show +import io.element.android.features.location.impl.send.SendLocationEvents + sealed interface ShowLocationEvents { object Share : ShowLocationEvents data class TrackMyLocation(val enabled: Boolean) : ShowLocationEvents + object DismissDialog : ShowLocationEvents + + object RequestPermissions : ShowLocationEvents + + object OpenAppSettings : ShowLocationEvents } diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt index 3ac5d90bb6..267f9e2dde 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt @@ -17,6 +17,8 @@ package io.element.android.features.location.impl.show import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -26,13 +28,16 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import io.element.android.features.location.api.Location import io.element.android.features.location.impl.MapDefaults +import io.element.android.features.location.impl.permissions.PermissionsEvents import io.element.android.features.location.impl.permissions.PermissionsPresenter import io.element.android.features.location.impl.permissions.PermissionsState import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.core.meta.BuildMeta class ShowLocationPresenter @AssistedInject constructor( permissionsPresenterFactory: PermissionsPresenter.Factory, - private val actions: LocationActions, + private val locationActions: LocationActions, + private val buildMeta: BuildMeta, @Assisted private val location: Location, @Assisted private val description: String? ) : Presenter { @@ -48,19 +53,47 @@ class ShowLocationPresenter @AssistedInject constructor( override fun present(): ShowLocationState { val permissionsState: PermissionsState = permissionsPresenter.present() var isTrackMyLocation by remember { mutableStateOf(false) } + val appName by remember { derivedStateOf { buildMeta.applicationName } } + var permissionDialog: ShowLocationState.Dialog by remember { + mutableStateOf(ShowLocationState.Dialog.None) + } + + LaunchedEffect(permissionsState.permissions) { + if (permissionsState.isAnyGranted) { + permissionDialog = ShowLocationState.Dialog.None + } + } fun handleEvents(event: ShowLocationEvents) { when (event) { - ShowLocationEvents.Share -> actions.share(location, description) - is ShowLocationEvents.TrackMyLocation -> isTrackMyLocation = event.enabled + ShowLocationEvents.Share -> locationActions.share(location, description) + is ShowLocationEvents.TrackMyLocation -> { + if (event.enabled) { + when { + permissionsState.isAnyGranted -> isTrackMyLocation = true + permissionsState.shouldShowRationale -> permissionDialog = ShowLocationState.Dialog.PermissionRationale + else -> permissionDialog = ShowLocationState.Dialog.PermissionDenied + } + } else { + isTrackMyLocation = false + } + } + ShowLocationEvents.DismissDialog -> permissionDialog = ShowLocationState.Dialog.None + ShowLocationEvents.OpenAppSettings -> { + locationActions.openSettings() + permissionDialog = ShowLocationState.Dialog.None + } + ShowLocationEvents.RequestPermissions -> permissionsState.eventSink(PermissionsEvents.RequestPermissions) } } return ShowLocationState( + permissionDialog = permissionDialog, location = location, description = description, hasLocationPermission = permissionsState.isAnyGranted, isTrackMyLocation = isTrackMyLocation, + appName = appName, eventSink = ::handleEvents, ) } diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationState.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationState.kt index c567dd3c94..0be6938ef6 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationState.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationState.kt @@ -19,9 +19,17 @@ package io.element.android.features.location.impl.show import io.element.android.features.location.api.Location data class ShowLocationState( + val permissionDialog: Dialog, val location: Location, val description: String?, val hasLocationPermission: Boolean, val isTrackMyLocation: Boolean, + val appName: String, val eventSink: (ShowLocationEvents) -> Unit, -) +) { + sealed interface Dialog { + object None : Dialog + object PermissionRationale : Dialog + object PermissionDenied : Dialog + } +} diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt index 73bb2d37a4..fd1aeb1d27 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt @@ -19,50 +19,64 @@ package io.element.android.features.location.impl.show import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.location.api.Location +private const val APP_NAME = "ApplicationName" + class ShowLocationStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( ShowLocationState( + ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), description = null, hasLocationPermission = false, isTrackMyLocation = false, + appName = APP_NAME, eventSink = {}, ), ShowLocationState( + ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), description = null, hasLocationPermission = true, isTrackMyLocation = false, + appName = APP_NAME, eventSink = {}, ), ShowLocationState( + ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), description = null, hasLocationPermission = true, isTrackMyLocation = true, + appName = APP_NAME, eventSink = {}, ), ShowLocationState( + ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), description = "My favourite place!", hasLocationPermission = false, isTrackMyLocation = false, + appName = APP_NAME, eventSink = {}, ), ShowLocationState( + ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), description = "For some reason I decided to to write a small essay that wraps at just two lines!", hasLocationPermission = false, isTrackMyLocation = false, + appName = APP_NAME, eventSink = {}, ), ShowLocationState( + ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), description = "For some reason I decided to write a small essay in the location description. " + "It is so long that it will wrap onto more than two lines!", hasLocationPermission = false, isTrackMyLocation = false, + appName = APP_NAME, eventSink = {}, ), ) diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt index 7fff766a9f..633d60b960 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt @@ -24,6 +24,7 @@ import io.element.android.features.location.api.Location import io.element.android.features.location.impl.permissions.PermissionsPresenter import io.element.android.features.location.impl.permissions.PermissionsPresenterFake import io.element.android.features.location.impl.permissions.PermissionsState +import io.element.android.libraries.matrix.test.core.aBuildMeta import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest import org.junit.Test @@ -31,13 +32,15 @@ import org.junit.Test class ShowLocationPresenterTest { private val permissionsPresenterFake = PermissionsPresenterFake() - private val actions = FakeLocationActions() + private val fakeLocationActions = FakeLocationActions() + private val fakeBuildMeta = aBuildMeta(applicationName = "app name") private val location = Location(1.23, 4.56, 7.8f) private val presenter = ShowLocationPresenter( permissionsPresenterFactory = object : PermissionsPresenter.Factory { override fun create(permissions: List): PermissionsPresenter = permissionsPresenterFake }, - actions, + fakeLocationActions, + fakeBuildMeta, location, A_DESCRIPTION, ) @@ -93,8 +96,8 @@ class ShowLocationPresenterTest { val initialState = awaitItem() initialState.eventSink(ShowLocationEvents.Share) - Truth.assertThat(actions.sharedLocation).isEqualTo(location) - Truth.assertThat(actions.sharedLabel).isEqualTo(A_DESCRIPTION) + Truth.assertThat(fakeLocationActions.sharedLocation).isEqualTo(location) + Truth.assertThat(fakeLocationActions.sharedLabel).isEqualTo(A_DESCRIPTION) } } From 917965a9b653ea33e8b43304e49c1c4cba1314b3 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 26 Jul 2023 05:27:56 +0200 Subject: [PATCH 2/8] Move AndroidLocationActions to impl package --- .../features/location/impl/{ => common}/MapDefaults.kt | 2 +- .../{ => common/actions}/AndroidLocationActions.kt | 3 +-- .../impl/{show => common/actions}/LocationActions.kt | 2 +- .../impl/{ => common}/permissions/PermissionsEvents.kt | 2 +- .../{ => common}/permissions/PermissionsPresenter.kt | 2 +- .../permissions/PermissionsPresenterImpl.kt | 2 +- .../impl/{ => common}/permissions/PermissionsState.kt | 2 +- .../location/impl/send/SendLocationPresenter.kt | 10 +++++----- .../features/location/impl/send/SendLocationView.kt | 2 +- .../location/impl/show/ShowLocationPresenter.kt | 9 +++++---- .../features/location/impl/show/ShowLocationView.kt | 2 +- .../actions}/AndroidLocationActionsTest.kt | 4 ++-- .../{show => common/actions}/FakeLocationActions.kt | 3 ++- .../permissions/PermissionsPresenterFake.kt | 5 ++++- .../location/impl/send/SendLocationPresenterTest.kt | 8 ++++---- .../location/impl/show/ShowLocationPresenterTest.kt | 5 +++-- 16 files changed, 34 insertions(+), 29 deletions(-) rename features/location/impl/src/main/kotlin/io/element/android/features/location/impl/{ => common}/MapDefaults.kt (97%) rename features/location/impl/src/main/kotlin/io/element/android/features/location/impl/{ => common/actions}/AndroidLocationActions.kt (95%) rename features/location/impl/src/main/kotlin/io/element/android/features/location/impl/{show => common/actions}/LocationActions.kt (92%) rename features/location/impl/src/main/kotlin/io/element/android/features/location/impl/{ => common}/permissions/PermissionsEvents.kt (90%) rename features/location/impl/src/main/kotlin/io/element/android/features/location/impl/{ => common}/permissions/PermissionsPresenter.kt (92%) rename features/location/impl/src/main/kotlin/io/element/android/features/location/impl/{ => common}/permissions/PermissionsPresenterImpl.kt (97%) rename features/location/impl/src/main/kotlin/io/element/android/features/location/impl/{ => common}/permissions/PermissionsState.kt (94%) rename features/location/impl/src/test/kotlin/io/element/android/features/location/impl/{show => common/actions}/AndroidLocationActionsTest.kt (93%) rename features/location/impl/src/test/kotlin/io/element/android/features/location/impl/{show => common/actions}/FakeLocationActions.kt (88%) rename features/location/impl/src/test/kotlin/io/element/android/features/location/impl/{ => common}/permissions/PermissionsPresenterFake.kt (77%) diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/MapDefaults.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/MapDefaults.kt similarity index 97% rename from features/location/impl/src/main/kotlin/io/element/android/features/location/impl/MapDefaults.kt rename to features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/MapDefaults.kt index 4709c78538..6fa74f04f0 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/MapDefaults.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/MapDefaults.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.location.impl +package io.element.android.features.location.impl.common import android.Manifest import android.view.Gravity diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/AndroidLocationActions.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt similarity index 95% rename from features/location/impl/src/main/kotlin/io/element/android/features/location/impl/AndroidLocationActions.kt rename to features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt index da88598251..b548f5c782 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/AndroidLocationActions.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.location.impl +package io.element.android.features.location.impl.common.actions import android.content.Context import android.content.Intent @@ -22,7 +22,6 @@ import android.net.Uri import androidx.annotation.VisibleForTesting import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.location.api.Location -import io.element.android.features.location.impl.show.LocationActions import io.element.android.libraries.androidutils.system.openAppSettingsPage import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/LocationActions.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/LocationActions.kt similarity index 92% rename from features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/LocationActions.kt rename to features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/LocationActions.kt index d93b15e5c5..319f332f6b 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/LocationActions.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/LocationActions.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.location.impl.show +package io.element.android.features.location.impl.common.actions import io.element.android.features.location.api.Location diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsEvents.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsEvents.kt similarity index 90% rename from features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsEvents.kt rename to features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsEvents.kt index 194bf31df7..fc18ec6ede 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsEvents.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsEvents.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.location.impl.permissions +package io.element.android.features.location.impl.common.permissions sealed interface PermissionsEvents { object RequestPermissions : PermissionsEvents diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenter.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenter.kt similarity index 92% rename from features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenter.kt rename to features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenter.kt index ccff16159e..1a3cd6677b 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenter.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.location.impl.permissions +package io.element.android.features.location.impl.common.permissions import io.element.android.libraries.architecture.Presenter diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenterImpl.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterImpl.kt similarity index 97% rename from features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenterImpl.kt rename to features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterImpl.kt index 85941ab7d3..1a334212a2 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenterImpl.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterImpl.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.location.impl.permissions +package io.element.android.features.location.impl.common.permissions import androidx.compose.runtime.Composable import com.google.accompanist.permissions.ExperimentalPermissionsApi diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsState.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsState.kt similarity index 94% rename from features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsState.kt rename to features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsState.kt index 626cf93c23..76b786c638 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/permissions/PermissionsState.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.location.impl.permissions +package io.element.android.features.location.impl.common.permissions data class PermissionsState( val permissions: Permissions = Permissions.NoneGranted, diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt index 595e26e32e..2ea7dc20e1 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt @@ -25,11 +25,11 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import im.vector.app.features.analytics.plan.Composer -import io.element.android.features.location.impl.MapDefaults -import io.element.android.features.location.impl.permissions.PermissionsEvents -import io.element.android.features.location.impl.permissions.PermissionsPresenter -import io.element.android.features.location.impl.permissions.PermissionsState -import io.element.android.features.location.impl.show.LocationActions +import io.element.android.features.location.impl.common.MapDefaults +import io.element.android.features.location.impl.common.permissions.PermissionsEvents +import io.element.android.features.location.impl.common.permissions.PermissionsPresenter +import io.element.android.features.location.impl.common.permissions.PermissionsState +import io.element.android.features.location.impl.common.actions.LocationActions import io.element.android.features.messages.api.MessageComposerContext import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt index cfb30a5523..5bf4354f24 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt @@ -47,7 +47,7 @@ import com.mapbox.mapboxsdk.camera.CameraPosition import io.element.android.features.location.api.Location import io.element.android.features.location.api.internal.centerBottomEdge import io.element.android.features.location.api.internal.rememberTileStyleUrl -import io.element.android.features.location.impl.MapDefaults +import io.element.android.features.location.impl.common.MapDefaults import io.element.android.features.location.impl.R import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt index 267f9e2dde..150a314ce7 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt @@ -27,10 +27,11 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import io.element.android.features.location.api.Location -import io.element.android.features.location.impl.MapDefaults -import io.element.android.features.location.impl.permissions.PermissionsEvents -import io.element.android.features.location.impl.permissions.PermissionsPresenter -import io.element.android.features.location.impl.permissions.PermissionsState +import io.element.android.features.location.impl.common.MapDefaults +import io.element.android.features.location.impl.common.actions.LocationActions +import io.element.android.features.location.impl.common.permissions.PermissionsEvents +import io.element.android.features.location.impl.common.permissions.PermissionsPresenter +import io.element.android.features.location.impl.common.permissions.PermissionsState import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt index 0e114a43b9..fb4f3ac1f8 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt @@ -39,7 +39,7 @@ import androidx.compose.ui.unit.dp import com.mapbox.mapboxsdk.camera.CameraPosition import com.mapbox.mapboxsdk.geometry.LatLng import io.element.android.features.location.api.internal.rememberTileStyleUrl -import io.element.android.features.location.impl.MapDefaults +import io.element.android.features.location.impl.common.MapDefaults import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/AndroidLocationActionsTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt similarity index 93% rename from features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/AndroidLocationActionsTest.kt rename to features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt index 29c0ba4d58..3bfa963664 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/AndroidLocationActionsTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.element.android.features.location.impl.show +package io.element.android.features.location.impl.common.actions import com.google.common.truth.Truth.assertThat import io.element.android.features.location.api.Location -import io.element.android.features.location.impl.buildUrl +import io.element.android.features.location.impl.common.actions.buildUrl import org.junit.Test import java.net.URLEncoder diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/FakeLocationActions.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt similarity index 88% rename from features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/FakeLocationActions.kt rename to features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt index c54aab6f28..a412d4e5ca 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/FakeLocationActions.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt @@ -14,9 +14,10 @@ * limitations under the License. */ -package io.element.android.features.location.impl.show +package io.element.android.features.location.impl.common.actions import io.element.android.features.location.api.Location +import io.element.android.features.location.impl.common.actions.LocationActions class FakeLocationActions : LocationActions { diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenterFake.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterFake.kt similarity index 77% rename from features/location/impl/src/test/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenterFake.kt rename to features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterFake.kt index a18e4cf2bf..cf2140a7a5 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/permissions/PermissionsPresenterFake.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterFake.kt @@ -14,9 +14,12 @@ * limitations under the License. */ -package io.element.android.features.location.impl.permissions +package io.element.android.features.location.impl.common.permissions import androidx.compose.runtime.Composable +import io.element.android.features.location.impl.common.permissions.PermissionsEvents +import io.element.android.features.location.impl.common.permissions.PermissionsPresenter +import io.element.android.features.location.impl.common.permissions.PermissionsState class PermissionsPresenterFake : PermissionsPresenter { diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt index 0aa89e89ba..02306b8d7e 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt @@ -23,11 +23,11 @@ import com.google.common.truth.Truth import im.vector.app.features.analytics.plan.Composer import io.element.android.features.analytics.test.FakeAnalyticsService import io.element.android.features.location.api.Location -import io.element.android.features.location.impl.permissions.PermissionsEvents -import io.element.android.features.location.impl.permissions.PermissionsPresenter +import io.element.android.features.location.impl.common.permissions.PermissionsEvents +import io.element.android.features.location.impl.common.permissions.PermissionsPresenter import io.element.android.features.location.impl.permissions.PermissionsPresenterFake -import io.element.android.features.location.impl.permissions.PermissionsState -import io.element.android.features.location.impl.show.FakeLocationActions +import io.element.android.features.location.impl.common.permissions.PermissionsState +import io.element.android.features.location.impl.common.actions.FakeLocationActions import io.element.android.features.messages.test.MessageComposerContextFake import io.element.android.libraries.matrix.api.room.location.AssetType import io.element.android.libraries.matrix.test.core.aBuildMeta diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt index 633d60b960..e3a0d6db2a 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt @@ -21,9 +21,10 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth import io.element.android.features.location.api.Location -import io.element.android.features.location.impl.permissions.PermissionsPresenter +import io.element.android.features.location.impl.common.actions.FakeLocationActions +import io.element.android.features.location.impl.common.permissions.PermissionsPresenter import io.element.android.features.location.impl.permissions.PermissionsPresenterFake -import io.element.android.features.location.impl.permissions.PermissionsState +import io.element.android.features.location.impl.common.permissions.PermissionsState import io.element.android.libraries.matrix.test.core.aBuildMeta import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest From 314c0499a54093e15f47131e6f7883d619bb1eb0 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 26 Jul 2023 05:40:26 +0200 Subject: [PATCH 3/8] Add location dialogs to show location. Always show FAB. --- .../impl/common/PermissionDeniedDialog.kt | 37 +++++++++++++++++++ .../impl/common/PermissionRationaleDialog.kt | 37 +++++++++++++++++++ .../location/impl/send/SendLocationView.kt | 33 +---------------- .../impl/show/ShowLocationStateProvider.kt | 36 ++++++++++++++++++ .../location/impl/show/ShowLocationView.kt | 30 +++++++++++---- 5 files changed, 134 insertions(+), 39 deletions(-) create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionDeniedDialog.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionRationaleDialog.kt diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionDeniedDialog.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionDeniedDialog.kt new file mode 100644 index 0000000000..0a488ded85 --- /dev/null +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionDeniedDialog.kt @@ -0,0 +1,37 @@ +/* + * 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.features.location.impl.common + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +internal fun PermissionDeniedDialog( + onContinue: () -> Unit, + onDismiss: () -> Unit, + appName: String, +) { + ConfirmationDialog( + content = stringResource(CommonStrings.error_missing_location_auth_android, appName), + onSubmitClicked = onContinue, + onDismiss = onDismiss, + submitText = stringResource(CommonStrings.action_continue), + cancelText = stringResource(CommonStrings.action_cancel), + ) +} diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionRationaleDialog.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionRationaleDialog.kt new file mode 100644 index 0000000000..4f4f19c6b3 --- /dev/null +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionRationaleDialog.kt @@ -0,0 +1,37 @@ +/* + * 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.features.location.impl.common + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +internal fun PermissionRationaleDialog( + onContinue: () -> Unit, + onDismiss: () -> Unit, + appName: String, +) { + ConfirmationDialog( + content = stringResource(CommonStrings.error_missing_location_rationale_android, appName), + onSubmitClicked = onContinue, + onDismiss = onDismiss, + submitText = stringResource(CommonStrings.action_continue), + cancelText = stringResource(CommonStrings.action_cancel), + ) +} diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt index 5bf4354f24..e06b60b1a7 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt @@ -49,8 +49,9 @@ import io.element.android.features.location.api.internal.centerBottomEdge import io.element.android.features.location.api.internal.rememberTileStyleUrl import io.element.android.features.location.impl.common.MapDefaults import io.element.android.features.location.impl.R +import io.element.android.features.location.impl.common.PermissionDeniedDialog +import io.element.android.features.location.impl.common.PermissionRationaleDialog import io.element.android.libraries.designsystem.components.button.BackButton -import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog import io.element.android.libraries.designsystem.preview.DayNightPreviews import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.theme.aliasScreenTitle @@ -232,33 +233,3 @@ internal fun SendLocationViewPreview( navigateUp = {}, ) } - -@Composable -private fun PermissionRationaleDialog( - onContinue: () -> Unit, - onDismiss: () -> Unit, - appName: String, -) { - ConfirmationDialog( - content = stringResource(CommonStrings.error_missing_location_rationale_android, appName), - onSubmitClicked = onContinue, - onDismiss = onDismiss, - submitText = stringResource(CommonStrings.action_continue), - cancelText = stringResource(CommonStrings.action_cancel), - ) -} - -@Composable -private fun PermissionDeniedDialog( - onContinue: () -> Unit, - onDismiss: () -> Unit, - appName: String, -) { - ConfirmationDialog( - content = stringResource(CommonStrings.error_missing_location_auth_android, appName), - onSubmitClicked = onContinue, - onDismiss = onDismiss, - submitText = stringResource(CommonStrings.action_continue), - cancelText = stringResource(CommonStrings.action_cancel), - ) -} diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt index fd1aeb1d27..36568bc99c 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt @@ -33,6 +33,42 @@ class ShowLocationStateProvider : PreviewParameterProvider { appName = APP_NAME, eventSink = {}, ), + ShowLocationState( + ShowLocationState.Dialog.PermissionDenied, + Location(1.23, 2.34, 4f), + description = null, + hasLocationPermission = false, + isTrackMyLocation = false, + appName = APP_NAME, + eventSink = {}, + ), + ShowLocationState( + ShowLocationState.Dialog.PermissionRationale, + Location(1.23, 2.34, 4f), + description = null, + hasLocationPermission = false, + isTrackMyLocation = false, + appName = APP_NAME, + eventSink = {}, + ), + ShowLocationState( + ShowLocationState.Dialog.None, + Location(1.23, 2.34, 4f), + description = null, + hasLocationPermission = true, + isTrackMyLocation = false, + appName = APP_NAME, + eventSink = {}, + ), + ShowLocationState( + ShowLocationState.Dialog.None, + Location(1.23, 2.34, 4f), + description = null, + hasLocationPermission = true, + isTrackMyLocation = true, + appName = APP_NAME, + eventSink = {}, + ), ShowLocationState( ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt index fb4f3ac1f8..8426d8b7b8 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt @@ -40,6 +40,8 @@ import com.mapbox.mapboxsdk.camera.CameraPosition import com.mapbox.mapboxsdk.geometry.LatLng import io.element.android.features.location.api.internal.rememberTileStyleUrl import io.element.android.features.location.impl.common.MapDefaults +import io.element.android.features.location.impl.common.PermissionDeniedDialog +import io.element.android.features.location.impl.common.PermissionRationaleDialog import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight @@ -70,6 +72,20 @@ fun ShowLocationView( modifier: Modifier = Modifier, onBackPressed: () -> Unit = {}, ) { + when (state.permissionDialog) { + ShowLocationState.Dialog.None -> Unit + ShowLocationState.Dialog.PermissionDenied -> PermissionDeniedDialog( + onContinue = { state.eventSink(ShowLocationEvents.OpenAppSettings) }, + onDismiss = { state.eventSink(ShowLocationEvents.DismissDialog) }, + appName = state.appName, + ) + ShowLocationState.Dialog.PermissionRationale -> PermissionRationaleDialog( + onContinue = { state.eventSink(ShowLocationEvents.RequestPermissions) }, + onDismiss = { state.eventSink(ShowLocationEvents.DismissDialog) }, + appName = state.appName, + ) + } + val cameraPositionState = rememberCameraPositionState { position = CameraPosition.Builder() .target(LatLng(state.location.lat, state.location.lon)) @@ -116,14 +132,12 @@ fun ShowLocationView( ) }, floatingActionButton = { - if (state.hasLocationPermission) { - FloatingActionButton( - onClick = { state.eventSink(ShowLocationEvents.TrackMyLocation(true)) }, - ) { - when (state.isTrackMyLocation) { - false -> Icon(imageVector = Icons.Default.LocationSearching, contentDescription = null) - true -> Icon(imageVector = Icons.Default.MyLocation, contentDescription = null) - } + FloatingActionButton( + onClick = { state.eventSink(ShowLocationEvents.TrackMyLocation(true)) }, + ) { + when (state.isTrackMyLocation) { + false -> Icon(imageVector = Icons.Default.LocationSearching, contentDescription = null) + true -> Icon(imageVector = Icons.Default.MyLocation, contentDescription = null) } } }, From 7c378dbdd588df4fda769f57332e04766bc15a19 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 26 Jul 2023 05:50:22 +0200 Subject: [PATCH 4/8] Remove redundant screenshots --- .../impl/show/ShowLocationStateProvider.kt | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt index 36568bc99c..84737c192b 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt @@ -69,24 +69,6 @@ class ShowLocationStateProvider : PreviewParameterProvider { appName = APP_NAME, eventSink = {}, ), - ShowLocationState( - ShowLocationState.Dialog.None, - Location(1.23, 2.34, 4f), - description = null, - hasLocationPermission = true, - isTrackMyLocation = false, - appName = APP_NAME, - eventSink = {}, - ), - ShowLocationState( - ShowLocationState.Dialog.None, - Location(1.23, 2.34, 4f), - description = null, - hasLocationPermission = true, - isTrackMyLocation = true, - appName = APP_NAME, - eventSink = {}, - ), ShowLocationState( ShowLocationState.Dialog.None, Location(1.23, 2.34, 4f), From ac32d724c1e4dd95c4f0ff543d1a11a0a1ff3e84 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 26 Jul 2023 05:53:10 +0200 Subject: [PATCH 5/8] Fix wrong packages after refactor --- .../features/location/impl/send/SendLocationPresenterTest.kt | 4 ++-- .../features/location/impl/show/ShowLocationPresenterTest.kt | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt index 02306b8d7e..34962081e2 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt @@ -23,11 +23,11 @@ import com.google.common.truth.Truth import im.vector.app.features.analytics.plan.Composer import io.element.android.features.analytics.test.FakeAnalyticsService import io.element.android.features.location.api.Location +import io.element.android.features.location.impl.common.actions.FakeLocationActions import io.element.android.features.location.impl.common.permissions.PermissionsEvents import io.element.android.features.location.impl.common.permissions.PermissionsPresenter -import io.element.android.features.location.impl.permissions.PermissionsPresenterFake +import io.element.android.features.location.impl.common.permissions.PermissionsPresenterFake import io.element.android.features.location.impl.common.permissions.PermissionsState -import io.element.android.features.location.impl.common.actions.FakeLocationActions import io.element.android.features.messages.test.MessageComposerContextFake import io.element.android.libraries.matrix.api.room.location.AssetType import io.element.android.libraries.matrix.test.core.aBuildMeta diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt index e3a0d6db2a..e0a59e0998 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt @@ -23,7 +23,7 @@ import com.google.common.truth.Truth import io.element.android.features.location.api.Location import io.element.android.features.location.impl.common.actions.FakeLocationActions import io.element.android.features.location.impl.common.permissions.PermissionsPresenter -import io.element.android.features.location.impl.permissions.PermissionsPresenterFake +import io.element.android.features.location.impl.common.permissions.PermissionsPresenterFake import io.element.android.features.location.impl.common.permissions.PermissionsState import io.element.android.libraries.matrix.test.core.aBuildMeta import kotlinx.coroutines.delay @@ -126,5 +126,4 @@ class ShowLocationPresenterTest { companion object { private const val A_DESCRIPTION = "My happy place" } - } From d1ca45232607986bef1df9cf88785edf32eeb445 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 26 Jul 2023 06:13:22 +0200 Subject: [PATCH 6/8] Add missing tests --- .../impl/show/ShowLocationPresenterTest.kt | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt index e0a59e0998..12ccdc16a5 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt @@ -22,6 +22,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth import io.element.android.features.location.api.Location import io.element.android.features.location.impl.common.actions.FakeLocationActions +import io.element.android.features.location.impl.common.permissions.PermissionsEvents import io.element.android.features.location.impl.common.permissions.PermissionsPresenter import io.element.android.features.location.impl.common.permissions.PermissionsPresenterFake import io.element.android.features.location.impl.common.permissions.PermissionsState @@ -48,6 +49,33 @@ class ShowLocationPresenterTest { @Test fun `emits initial state with no location permission`() = runTest { + permissionsPresenterFake.givenState( + PermissionsState( + permissions = PermissionsState.Permissions.NoneGranted, + shouldShowRationale = false, + ) + ) + + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + Truth.assertThat(initialState.location).isEqualTo(location) + Truth.assertThat(initialState.description).isEqualTo(A_DESCRIPTION) + Truth.assertThat(initialState.hasLocationPermission).isEqualTo(false) + Truth.assertThat(initialState.isTrackMyLocation).isEqualTo(false) + } + } + + @Test + fun `emits initial state location permission denied once`() = runTest { + permissionsPresenterFake.givenState( + PermissionsState( + permissions = PermissionsState.Permissions.NoneGranted, + shouldShowRationale = true, + ) + ) + moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -120,9 +148,144 @@ class ShowLocationPresenterTest { Truth.assertThat(trackMyLocationState.hasLocationPermission).isEqualTo(true) Truth.assertThat(trackMyLocationState.isTrackMyLocation).isEqualTo(true) + + // Swipe the map to switch mode + initialState.eventSink(ShowLocationEvents.TrackMyLocation(false)) + val trackLocationDisabledState = awaitItem() + Truth.assertThat(trackLocationDisabledState.permissionDialog).isEqualTo(ShowLocationState.Dialog.None) + Truth.assertThat(trackLocationDisabledState.isTrackMyLocation).isEqualTo(false) + Truth.assertThat(trackLocationDisabledState.hasLocationPermission).isEqualTo(true) } } + @Test + fun `rationale dialog dismiss`() = runTest { + permissionsPresenterFake.givenState( + PermissionsState( + permissions = PermissionsState.Permissions.NoneGranted, + shouldShowRationale = true, + ) + ) + + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip initial state + val initialState = awaitItem() + + // Click on the button to switch mode + initialState.eventSink(ShowLocationEvents.TrackMyLocation(true)) + val trackLocationState = awaitItem() + Truth.assertThat(trackLocationState.permissionDialog).isEqualTo(ShowLocationState.Dialog.PermissionRationale) + Truth.assertThat(trackLocationState.isTrackMyLocation).isEqualTo(false) + Truth.assertThat(trackLocationState.hasLocationPermission).isEqualTo(false) + + // Dismiss the dialog + initialState.eventSink(ShowLocationEvents.DismissDialog) + val dialogDismissedState = awaitItem() + Truth.assertThat(dialogDismissedState.permissionDialog).isEqualTo(ShowLocationState.Dialog.None) + Truth.assertThat(dialogDismissedState.isTrackMyLocation).isEqualTo(false) + Truth.assertThat(dialogDismissedState.hasLocationPermission).isEqualTo(false) + } + } + + @Test + fun `rationale dialog continue`() = runTest { + permissionsPresenterFake.givenState( + PermissionsState( + permissions = PermissionsState.Permissions.NoneGranted, + shouldShowRationale = true, + ) + ) + + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip initial state + val initialState = awaitItem() + + // Click on the button to switch mode + initialState.eventSink(ShowLocationEvents.TrackMyLocation(true)) + val trackLocationState = awaitItem() + Truth.assertThat(trackLocationState.permissionDialog).isEqualTo(ShowLocationState.Dialog.PermissionRationale) + Truth.assertThat(trackLocationState.isTrackMyLocation).isEqualTo(false) + Truth.assertThat(trackLocationState.hasLocationPermission).isEqualTo(false) + + // Continue the dialog sends permission request to the permissions presenter + trackLocationState.eventSink(ShowLocationEvents.RequestPermissions) + Truth.assertThat(permissionsPresenterFake.events.last()).isEqualTo(PermissionsEvents.RequestPermissions) + } + } + + @Test + fun `permission denied dialog dismiss`() = runTest { + permissionsPresenterFake.givenState( + PermissionsState( + permissions = PermissionsState.Permissions.NoneGranted, + shouldShowRationale = false, + ) + ) + + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip initial state + val initialState = awaitItem() + + // Click on the button to switch mode + initialState.eventSink(ShowLocationEvents.TrackMyLocation(true)) + val trackLocationState = awaitItem() + Truth.assertThat(trackLocationState.permissionDialog).isEqualTo(ShowLocationState.Dialog.PermissionDenied) + Truth.assertThat(trackLocationState.isTrackMyLocation).isEqualTo(false) + Truth.assertThat(trackLocationState.hasLocationPermission).isEqualTo(false) + + // Dismiss the dialog + initialState.eventSink(ShowLocationEvents.DismissDialog) + val dialogDismissedState = awaitItem() + Truth.assertThat(dialogDismissedState.permissionDialog).isEqualTo(ShowLocationState.Dialog.None) + Truth.assertThat(dialogDismissedState.isTrackMyLocation).isEqualTo(false) + Truth.assertThat(dialogDismissedState.hasLocationPermission).isEqualTo(false) + } + } + + @Test + fun `open settings activity`() = runTest { + permissionsPresenterFake.givenState( + PermissionsState( + permissions = PermissionsState.Permissions.NoneGranted, + shouldShowRationale = false, + ) + ) + + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip initial state + val initialState = awaitItem() + + initialState.eventSink(ShowLocationEvents.TrackMyLocation(true)) + val dialogShownState = awaitItem() + + // Open settings + dialogShownState.eventSink(ShowLocationEvents.OpenAppSettings) + val settingsOpenedState = awaitItem() + + Truth.assertThat(settingsOpenedState.permissionDialog).isEqualTo(ShowLocationState.Dialog.None) + Truth.assertThat(fakeLocationActions.openSettingsInvocationsCount).isEqualTo(1) + } + } + + @Test + fun `application name is in state`() = runTest { + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + Truth.assertThat(initialState.appName).isEqualTo("app name") + } + } + + companion object { private const val A_DESCRIPTION = "My happy place" } From 3609d419c472c96d9ea64100a7ce809584a630e7 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 26 Jul 2023 07:49:50 +0200 Subject: [PATCH 7/8] Fix detekt --- .../android/features/location/impl/show/ShowLocationEvents.kt | 2 -- .../location/impl/common/actions/AndroidLocationActionsTest.kt | 1 - .../location/impl/common/actions/FakeLocationActions.kt | 1 - .../impl/common/permissions/PermissionsPresenterFake.kt | 3 --- 4 files changed, 7 deletions(-) diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt index dd4428d0bb..f6c3c12528 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt @@ -16,8 +16,6 @@ package io.element.android.features.location.impl.show -import io.element.android.features.location.impl.send.SendLocationEvents - sealed interface ShowLocationEvents { object Share : ShowLocationEvents data class TrackMyLocation(val enabled: Boolean) : ShowLocationEvents diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt index 3bfa963664..a010d383a0 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt @@ -18,7 +18,6 @@ package io.element.android.features.location.impl.common.actions import com.google.common.truth.Truth.assertThat import io.element.android.features.location.api.Location -import io.element.android.features.location.impl.common.actions.buildUrl import org.junit.Test import java.net.URLEncoder diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt index a412d4e5ca..6fc3d51ae1 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt @@ -17,7 +17,6 @@ package io.element.android.features.location.impl.common.actions import io.element.android.features.location.api.Location -import io.element.android.features.location.impl.common.actions.LocationActions class FakeLocationActions : LocationActions { diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterFake.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterFake.kt index cf2140a7a5..ad653e4df4 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterFake.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenterFake.kt @@ -17,9 +17,6 @@ package io.element.android.features.location.impl.common.permissions import androidx.compose.runtime.Composable -import io.element.android.features.location.impl.common.permissions.PermissionsEvents -import io.element.android.features.location.impl.common.permissions.PermissionsPresenter -import io.element.android.features.location.impl.common.permissions.PermissionsState class PermissionsPresenterFake : PermissionsPresenter { From 51b0aefe6c409f97ab69c388d90624721e97ca2e Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 18 Aug 2023 14:07:50 +0000 Subject: [PATCH 8/8] Update screenshots --- ...how_null_ShowLocationViewDark_0_null_0,NEXUS_5,1.0,en].png | 4 ++-- ...how_null_ShowLocationViewDark_0_null_1,NEXUS_5,1.0,en].png | 4 ++-- ...how_null_ShowLocationViewDark_0_null_2,NEXUS_5,1.0,en].png | 4 ++-- ...how_null_ShowLocationViewDark_0_null_3,NEXUS_5,1.0,en].png | 4 ++-- ...how_null_ShowLocationViewDark_0_null_4,NEXUS_5,1.0,en].png | 4 ++-- ...how_null_ShowLocationViewDark_0_null_5,NEXUS_5,1.0,en].png | 4 ++-- ...how_null_ShowLocationViewDark_0_null_6,NEXUS_5,1.0,en].png | 3 +++ ...how_null_ShowLocationViewDark_0_null_7,NEXUS_5,1.0,en].png | 3 +++ ...ow_null_ShowLocationViewLight_0_null_0,NEXUS_5,1.0,en].png | 4 ++-- ...ow_null_ShowLocationViewLight_0_null_1,NEXUS_5,1.0,en].png | 4 ++-- ...ow_null_ShowLocationViewLight_0_null_2,NEXUS_5,1.0,en].png | 4 ++-- ...ow_null_ShowLocationViewLight_0_null_3,NEXUS_5,1.0,en].png | 4 ++-- ...ow_null_ShowLocationViewLight_0_null_4,NEXUS_5,1.0,en].png | 4 ++-- ...ow_null_ShowLocationViewLight_0_null_5,NEXUS_5,1.0,en].png | 4 ++-- ...ow_null_ShowLocationViewLight_0_null_6,NEXUS_5,1.0,en].png | 3 +++ ...ow_null_ShowLocationViewLight_0_null_7,NEXUS_5,1.0,en].png | 3 +++ 16 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_6,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_7,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_6,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_0,NEXUS_5,1.0,en].png index 5e6183eb3d..fe9329c1ed 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae35a760c5ac40cbe028383e76a008f593f2063a2e91fa37369c9e97299511d0 -size 8751 +oid sha256:d502b465f6f70ead5b9bc373b443d548053bc1d0867b4cbfb52d84e59fa253f1 +size 11596 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_1,NEXUS_5,1.0,en].png index fe9329c1ed..5d205c3650 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_1,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_1,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d502b465f6f70ead5b9bc373b443d548053bc1d0867b4cbfb52d84e59fa253f1 -size 11596 +oid sha256:81c29f9bb336e74a97189d8361490a3a29c4f4678d80f62c2e384396cb90a871 +size 32465 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_2,NEXUS_5,1.0,en].png index cdb697c87c..24894be572 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_2,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_2,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03769782960e9fc1abf6c609a318ca90debb03484d7b8d61d0703ef1374a0b55 -size 11786 +oid sha256:daf1ab743402e503ff6a5d0ec5f7a599b531c23fcbd9767570527828530bf5b3 +size 30817 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_3,NEXUS_5,1.0,en].png index 4d9982bbb0..fe9329c1ed 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_3,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_3,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ea0efb6bac4d8483e608d8b07f3d37cd6cb63b5251c9b2ac9769186ef0ad8488 -size 12207 +oid sha256:d502b465f6f70ead5b9bc373b443d548053bc1d0867b4cbfb52d84e59fa253f1 +size 11596 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_4,NEXUS_5,1.0,en].png index 3b639598a6..cdb697c87c 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_4,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_4,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:781943cf543d26f01072a5bf8405a84beb5b9fb993e67a450d31f02b906ffccc -size 19822 +oid sha256:03769782960e9fc1abf6c609a318ca90debb03484d7b8d61d0703ef1374a0b55 +size 11786 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_5,NEXUS_5,1.0,en].png index d33cbd5dd3..2cad2a5615 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_5,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_5,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eab11938f627cc6685e15e45ace5c8eaf97d5c2b50ee16fe4ac1f66fe04b61db -size 21969 +oid sha256:e0c113e7eb9d495ab2fa3d03a945fd6fac35810af2df4571703a8a3f2b55a079 +size 15018 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_6,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..36cf496a43 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_6,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92da6c43ebe2da8ad035e0f03ddd5261491e846212396240aee8287d4f4d9a10 +size 22631 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_7,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..aa84f464a9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewDark_0_null_7,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c23fded123579979a9b6acf41def9a864ff99de6adbf224014c6d77a552fb2fe +size 24754 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_0,NEXUS_5,1.0,en].png index 5c91e0ed5d..a4889e3b27 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:95cb3eb84f8c8e7465ceba921bf179c3b1bf074f2a148f3df82fccd4be5d1e7b -size 9446 +oid sha256:6519ea26cb85aa1cecdab38d9f3cd54f3e986d33a9d411c576714fb070835d6f +size 12503 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_1,NEXUS_5,1.0,en].png index a4889e3b27..1cae9d483f 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_1,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_1,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6519ea26cb85aa1cecdab38d9f3cd54f3e986d33a9d411c576714fb070835d6f -size 12503 +oid sha256:1cdb9c379d685e7664c76f4ae7c712665de8dc8ad1f65441121dde4475a92f57 +size 35269 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_2,NEXUS_5,1.0,en].png index cb89527934..b0da61c4b7 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_2,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_2,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d33eeef612e03599f835991ad70c5f128c51e0ac49e67fff445b2e98ed3b71ef -size 12706 +oid sha256:0c5285cb82229e84a7cf2c1f2ce375060ec4f99577c88a9840b6db3b8d0966cb +size 33736 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_3,NEXUS_5,1.0,en].png index b4c41bbc62..a4889e3b27 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_3,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_3,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec1557bf879d60052cb7c26525ed42a37998367dda9f99a3297586d3f862f18e -size 13488 +oid sha256:6519ea26cb85aa1cecdab38d9f3cd54f3e986d33a9d411c576714fb070835d6f +size 12503 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_4,NEXUS_5,1.0,en].png index e57b93995f..cb89527934 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_4,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_4,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30f4575fed8d33e614ad34311ea74caf069194a9a2651f2c40a53d74d52d450a -size 22487 +oid sha256:d33eeef612e03599f835991ad70c5f128c51e0ac49e67fff445b2e98ed3b71ef +size 12706 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_5,NEXUS_5,1.0,en].png index c5534a00c4..aafeea9a40 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_5,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_5,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cded4ea4d70f99e0283bd265e3b45a4ec314fc8f1f1a765b1449ac0c9610f304 -size 24797 +oid sha256:b47af4d036f0cf1275773fb8b81d3cae847626b49f5197e2249df1d9d9be2cbb +size 16501 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_6,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..c1de14e11e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_6,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1aca2f20b99dbbdbd70ca437c06949b634d10c30701f7634cfebaf78593c34d8 +size 25515 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_7,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..0833282d1f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.location.impl.show_null_ShowLocationViewLight_0_null_7,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f612c17dedc33b8c4089828673dd58d6f1b51faa0c6df3edb1a0f3398c4c55e2 +size 27885