Code cleanup
This commit is contained in:
parent
8274ef220d
commit
fb775833c7
28 changed files with 44 additions and 113 deletions
|
|
@ -79,4 +79,3 @@ internal class LocationKtTest {
|
||||||
.isEqualTo("geo:1.0,2.0;u=3.0")
|
.isEqualTo("geo:1.0,2.0;u=3.0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2025 Element Creations Ltd.
|
* Copyright (c) 2026 Element Creations Ltd.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
|
|
@ -11,35 +11,35 @@ import io.element.android.features.location.impl.common.actions.LocationActions
|
||||||
import io.element.android.features.location.impl.common.permissions.PermissionsState
|
import io.element.android.features.location.impl.common.permissions.PermissionsState
|
||||||
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialogState
|
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialogState
|
||||||
|
|
||||||
sealed interface LocationConstraintsCheckResult {
|
sealed interface LocationConstraintsCheck {
|
||||||
data object Success : LocationConstraintsCheckResult
|
data object Success : LocationConstraintsCheck
|
||||||
data object PermissionRationale : LocationConstraintsCheckResult
|
data object PermissionRationale : LocationConstraintsCheck
|
||||||
data object PermissionDenied : LocationConstraintsCheckResult
|
data object PermissionDenied : LocationConstraintsCheck
|
||||||
data object LocationServiceDisabled : LocationConstraintsCheckResult
|
data object LocationServiceDisabled : LocationConstraintsCheck
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkLocationConstraints(
|
fun checkLocationConstraints(
|
||||||
permissionsState: PermissionsState,
|
permissionsState: PermissionsState,
|
||||||
locationActions: LocationActions,
|
locationActions: LocationActions,
|
||||||
): LocationConstraintsCheckResult {
|
): LocationConstraintsCheck {
|
||||||
return when {
|
return when {
|
||||||
permissionsState.isAnyGranted -> {
|
permissionsState.isAnyGranted -> {
|
||||||
if (locationActions.isLocationEnabled()) {
|
if (locationActions.isLocationEnabled()) {
|
||||||
LocationConstraintsCheckResult.Success
|
LocationConstraintsCheck.Success
|
||||||
} else {
|
} else {
|
||||||
LocationConstraintsCheckResult.LocationServiceDisabled
|
LocationConstraintsCheck.LocationServiceDisabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
permissionsState.shouldShowRationale -> LocationConstraintsCheckResult.PermissionRationale
|
permissionsState.shouldShowRationale -> LocationConstraintsCheck.PermissionRationale
|
||||||
else -> LocationConstraintsCheckResult.PermissionDenied
|
else -> LocationConstraintsCheck.PermissionDenied
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LocationConstraintsCheckResult.toDialogState(): LocationConstraintsDialogState {
|
fun LocationConstraintsCheck.toDialogState(): LocationConstraintsDialogState {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
LocationConstraintsCheckResult.Success -> LocationConstraintsDialogState.None
|
LocationConstraintsCheck.Success -> LocationConstraintsDialogState.None
|
||||||
LocationConstraintsCheckResult.PermissionRationale -> LocationConstraintsDialogState.PermissionRationale
|
LocationConstraintsCheck.PermissionRationale -> LocationConstraintsDialogState.PermissionRationale
|
||||||
LocationConstraintsCheckResult.PermissionDenied -> LocationConstraintsDialogState.PermissionDenied
|
LocationConstraintsCheck.PermissionDenied -> LocationConstraintsDialogState.PermissionDenied
|
||||||
LocationConstraintsCheckResult.LocationServiceDisabled -> LocationConstraintsDialogState.LocationServiceDisabled
|
LocationConstraintsCheck.LocationServiceDisabled -> LocationConstraintsDialogState.LocationServiceDisabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,6 @@ package io.element.android.features.location.impl.common.ui
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
||||||
import androidx.compose.material3.FloatingActionButtonDefaults
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
|
|
||||||
|
|
@ -77,8 +77,8 @@ fun LocationShareRow(
|
||||||
tint = ElementTheme.colors.iconAccentPrimary,
|
tint = ElementTheme.colors.iconAccentPrimary,
|
||||||
modifier = Modifier.size(16.dp),
|
modifier = Modifier.size(16.dp),
|
||||||
)
|
)
|
||||||
}else {
|
} else {
|
||||||
val icon = if(item.assetType == AssetType.PIN) CompoundIcons.LocationNavigator() else CompoundIcons.LocationNavigatorCentred()
|
val icon = if (item.assetType == AssetType.PIN) CompoundIcons.LocationNavigator() else CompoundIcons.LocationNavigatorCentred()
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = icon,
|
imageVector = icon,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
|
|
@ -122,7 +122,7 @@ internal fun LocationShareRowPreview() = ElementPreview {
|
||||||
formattedTimestamp = "Shared 1 min ago",
|
formattedTimestamp = "Shared 1 min ago",
|
||||||
assetType = AssetType.SENDER,
|
assetType = AssetType.SENDER,
|
||||||
isLive = true,
|
isLive = true,
|
||||||
location = Location(0.0,0.0)
|
location = Location(0.0, 0.0)
|
||||||
),
|
),
|
||||||
onShareClick = {},
|
onShareClick = {},
|
||||||
)
|
)
|
||||||
|
|
@ -139,7 +139,7 @@ internal fun LocationShareRowPreview() = ElementPreview {
|
||||||
assetType = AssetType.PIN,
|
assetType = AssetType.PIN,
|
||||||
formattedTimestamp = "Shared 5 hours ago",
|
formattedTimestamp = "Shared 5 hours ago",
|
||||||
isLive = false,
|
isLive = false,
|
||||||
location = Location(0.0,0.0)
|
location = Location(0.0, 0.0)
|
||||||
),
|
),
|
||||||
onShareClick = {},
|
onShareClick = {},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2025 Element Creations Ltd.
|
* Copyright (c) 2026 Element Creations Ltd.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
|
|
@ -7,7 +7,6 @@
|
||||||
|
|
||||||
package io.element.android.features.location.impl.common.ui
|
package io.element.android.features.location.impl.common.ui
|
||||||
|
|
||||||
import androidx.compose.foundation.background
|
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.BoxScope
|
import androidx.compose.foundation.layout.BoxScope
|
||||||
import androidx.compose.foundation.layout.BoxWithConstraints
|
import androidx.compose.foundation.layout.BoxWithConstraints
|
||||||
|
|
@ -37,7 +36,6 @@ import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberUpdatedState
|
import androidx.compose.runtime.rememberUpdatedState
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
@ -124,7 +122,7 @@ fun MapBottomSheetScaffold(
|
||||||
) {
|
) {
|
||||||
val ornamentOptions = mapOptions.ornamentOptions.copy(padding = sheetPadding)
|
val ornamentOptions = mapOptions.ornamentOptions.copy(padding = sheetPadding)
|
||||||
val mapOptions = mapOptions.copy(ornamentOptions = ornamentOptions)
|
val mapOptions = mapOptions.copy(ornamentOptions = ornamentOptions)
|
||||||
Box{
|
Box {
|
||||||
MaplibreMap(
|
MaplibreMap(
|
||||||
options = mapOptions,
|
options = mapOptions,
|
||||||
baseStyle = BaseStyle.Uri(rememberTileStyleUrl()),
|
baseStyle = BaseStyle.Uri(rememberTileStyleUrl()),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2025 Element Creations Ltd.
|
* Copyright (c) 2026 Element Creations Ltd.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
|
|
@ -17,5 +17,5 @@ enum class LiveLocationDuration(
|
||||||
) {
|
) {
|
||||||
FifteenMinutes(15.minutes, "15 minutes"),
|
FifteenMinutes(15.minutes, "15 minutes"),
|
||||||
OneHour(1.hours, "1 hour"),
|
OneHour(1.hours, "1 hour"),
|
||||||
EightHours(8.hours, "8 hours");
|
EightHours(8.hours, "8 hours")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ sealed interface ShareLocationEvent {
|
||||||
data object StopTrackingUserLocation : ShareLocationEvent
|
data object StopTrackingUserLocation : ShareLocationEvent
|
||||||
data object DismissDialog : ShareLocationEvent
|
data object DismissDialog : ShareLocationEvent
|
||||||
|
|
||||||
data object RequestPermissions: ShareLocationEvent
|
data object RequestPermissions : ShareLocationEvent
|
||||||
data object OpenAppSettings : ShareLocationEvent
|
data object OpenAppSettings : ShareLocationEvent
|
||||||
data object OpenLocationSettings : ShareLocationEvent
|
data object OpenLocationSettings : ShareLocationEvent
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ import dev.zacsweers.metro.Assisted
|
||||||
import dev.zacsweers.metro.AssistedFactory
|
import dev.zacsweers.metro.AssistedFactory
|
||||||
import dev.zacsweers.metro.AssistedInject
|
import dev.zacsweers.metro.AssistedInject
|
||||||
import im.vector.app.features.analytics.plan.Composer
|
import im.vector.app.features.analytics.plan.Composer
|
||||||
import io.element.android.features.location.impl.common.LocationConstraintsCheckResult
|
import io.element.android.features.location.impl.common.LocationConstraintsCheck
|
||||||
import io.element.android.features.location.impl.common.MapDefaults
|
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.actions.LocationActions
|
||||||
import io.element.android.features.location.impl.common.checkLocationConstraints
|
import io.element.android.features.location.impl.common.checkLocationConstraints
|
||||||
|
|
@ -81,7 +81,7 @@ class ShareLocationPresenter(
|
||||||
fun checkLocationConstraints() {
|
fun checkLocationConstraints() {
|
||||||
val locationConstraints = checkLocationConstraints(permissionsState, locationActions)
|
val locationConstraints = checkLocationConstraints(permissionsState, locationActions)
|
||||||
dialogState = Constraints(locationConstraints.toDialogState())
|
dialogState = Constraints(locationConstraints.toDialogState())
|
||||||
trackUserPosition = locationConstraints is LocationConstraintsCheckResult.Success
|
trackUserPosition = locationConstraints is LocationConstraintsCheck.Success
|
||||||
}
|
}
|
||||||
|
|
||||||
LaunchedEffect(permissionsState.permissions) { checkLocationConstraints() }
|
LaunchedEffect(permissionsState.permissions) { checkLocationConstraints() }
|
||||||
|
|
@ -104,7 +104,7 @@ class ShareLocationPresenter(
|
||||||
}
|
}
|
||||||
ShareLocationEvent.ShowLiveLocationDurationPicker -> {
|
ShareLocationEvent.ShowLiveLocationDurationPicker -> {
|
||||||
val constraintsResult = checkLocationConstraints(permissionsState, locationActions)
|
val constraintsResult = checkLocationConstraints(permissionsState, locationActions)
|
||||||
dialogState = if (constraintsResult is LocationConstraintsCheckResult.Success) {
|
dialogState = if (constraintsResult is LocationConstraintsCheck.Success) {
|
||||||
ShareLocationState.Dialog.LiveLocationDuration
|
ShareLocationState.Dialog.LiveLocationDuration
|
||||||
} else {
|
} else {
|
||||||
Constraints(constraintsResult.toDialogState())
|
Constraints(constraintsResult.toDialogState())
|
||||||
|
|
@ -112,7 +112,7 @@ class ShareLocationPresenter(
|
||||||
}
|
}
|
||||||
is ShareLocationEvent.StartLiveLocationShare -> scope.launch {
|
is ShareLocationEvent.StartLiveLocationShare -> scope.launch {
|
||||||
dialogState = ShareLocationState.Dialog.None
|
dialogState = ShareLocationState.Dialog.None
|
||||||
//room.startLiveLocationShare(event.duration.inWholeMilliseconds)
|
// room.startLiveLocationShare(event.duration.inWholeMilliseconds)
|
||||||
}
|
}
|
||||||
ShareLocationEvent.RequestPermissions -> {
|
ShareLocationEvent.RequestPermissions -> {
|
||||||
dialogState = ShareLocationState.Dialog.None
|
dialogState = ShareLocationState.Dialog.None
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,11 @@
|
||||||
|
|
||||||
package io.element.android.features.location.impl.share
|
package io.element.android.features.location.impl.share
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.lazy.itemsIndexed
|
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.SheetValue
|
import androidx.compose.material3.SheetValue
|
||||||
import androidx.compose.material3.rememberBottomSheetScaffoldState
|
import androidx.compose.material3.rememberBottomSheetScaffoldState
|
||||||
|
|
@ -22,8 +20,6 @@ import androidx.compose.material3.rememberStandardBottomSheetState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
|
@ -44,9 +40,7 @@ import io.element.android.libraries.designsystem.components.LocationPin
|
||||||
import io.element.android.libraries.designsystem.components.PinVariant
|
import io.element.android.libraries.designsystem.components.PinVariant
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
import io.element.android.libraries.designsystem.components.button.BackButton
|
||||||
import io.element.android.libraries.designsystem.components.dialogs.ListDialog
|
|
||||||
import io.element.android.libraries.designsystem.components.list.ListItemContent
|
import io.element.android.libraries.designsystem.components.list.ListItemContent
|
||||||
import io.element.android.libraries.designsystem.components.list.RadioButtonListItem
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.theme.components.IconSource
|
import io.element.android.libraries.designsystem.theme.components.IconSource
|
||||||
|
|
@ -249,6 +243,7 @@ private fun LiveLocationDurationDialog(
|
||||||
onSelectDuration: (Duration) -> Unit,
|
onSelectDuration: (Duration) -> Unit,
|
||||||
onDismiss: () -> Unit,
|
onDismiss: () -> Unit,
|
||||||
) {
|
) {
|
||||||
|
/*
|
||||||
var selectedIndex by remember { mutableIntStateOf(0) }
|
var selectedIndex by remember { mutableIntStateOf(0) }
|
||||||
ListDialog(
|
ListDialog(
|
||||||
title = "Choose how long to share your live location.",
|
title = "Choose how long to share your live location.",
|
||||||
|
|
@ -268,6 +263,7 @@ private fun LiveLocationDurationDialog(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,7 @@ import dev.zacsweers.metro.Assisted
|
||||||
import dev.zacsweers.metro.AssistedFactory
|
import dev.zacsweers.metro.AssistedFactory
|
||||||
import dev.zacsweers.metro.AssistedInject
|
import dev.zacsweers.metro.AssistedInject
|
||||||
import io.element.android.features.location.api.ShowLocationMode
|
import io.element.android.features.location.api.ShowLocationMode
|
||||||
import io.element.android.features.location.impl.common.LocationConstraintsCheckResult
|
import io.element.android.features.location.impl.common.LocationConstraintsCheck
|
||||||
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialogState
|
|
||||||
import io.element.android.features.location.impl.common.MapDefaults
|
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.actions.LocationActions
|
||||||
import io.element.android.features.location.impl.common.checkLocationConstraints
|
import io.element.android.features.location.impl.common.checkLocationConstraints
|
||||||
|
|
@ -28,6 +27,7 @@ import io.element.android.features.location.impl.common.permissions.PermissionsE
|
||||||
import io.element.android.features.location.impl.common.permissions.PermissionsPresenter
|
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.permissions.PermissionsState
|
||||||
import io.element.android.features.location.impl.common.toDialogState
|
import io.element.android.features.location.impl.common.toDialogState
|
||||||
|
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialogState
|
||||||
import io.element.android.features.location.impl.common.ui.LocationMarkerData
|
import io.element.android.features.location.impl.common.ui.LocationMarkerData
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.core.meta.BuildMeta
|
import io.element.android.libraries.core.meta.BuildMeta
|
||||||
|
|
@ -76,7 +76,7 @@ class ShowLocationPresenter(
|
||||||
is ShowLocationEvents.TrackMyLocation -> {
|
is ShowLocationEvents.TrackMyLocation -> {
|
||||||
if (event.enabled) {
|
if (event.enabled) {
|
||||||
val locationConstraints = checkLocationConstraints(permissionsState, locationActions)
|
val locationConstraints = checkLocationConstraints(permissionsState, locationActions)
|
||||||
isTrackMyLocation = locationConstraints is LocationConstraintsCheckResult.Success
|
isTrackMyLocation = locationConstraints is LocationConstraintsCheck.Success
|
||||||
dialogState = locationConstraints.toDialogState()
|
dialogState = locationConstraints.toDialogState()
|
||||||
} else {
|
} else {
|
||||||
isTrackMyLocation = false
|
isTrackMyLocation = false
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.compound.theme.ElementTheme
|
import io.element.android.compound.theme.ElementTheme
|
||||||
import io.element.android.features.location.api.ShowLocationMode
|
import io.element.android.features.location.api.ShowLocationMode
|
||||||
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialog
|
|
||||||
import io.element.android.features.location.impl.common.MapDefaults
|
import io.element.android.features.location.impl.common.MapDefaults
|
||||||
|
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialog
|
||||||
import io.element.android.features.location.impl.common.ui.LocationFloatingActionButton
|
import io.element.android.features.location.impl.common.ui.LocationFloatingActionButton
|
||||||
import io.element.android.features.location.impl.common.ui.LocationPinMarkers
|
import io.element.android.features.location.impl.common.ui.LocationPinMarkers
|
||||||
import io.element.android.features.location.impl.common.ui.LocationShareRow
|
import io.element.android.features.location.impl.common.ui.LocationShareRow
|
||||||
|
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="26dp"
|
|
||||||
android:height="28dp"
|
|
||||||
android:viewportWidth="26"
|
|
||||||
android:viewportHeight="28">
|
|
||||||
<path
|
|
||||||
android:pathData="M12.962,28L9.819,24.889L16.105,24.889L12.962,28Z"
|
|
||||||
android:fillColor="#EBEEF2"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M12.963,12.963m-12.963,0a12.963,12.963 0,1 1,25.926 0a12.963,12.963 0,1 1,-25.926 0"
|
|
||||||
android:fillColor="#EBEEF2"/>
|
|
||||||
<group>
|
|
||||||
<clip-path
|
|
||||||
android:pathData="M6.74,6.74h12.444v12.444h-12.444z"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M12.962,6.74C10.554,6.74 8.606,8.741 8.606,11.215C8.606,13.88 11.357,17.555 12.489,18.955C12.738,19.262 13.192,19.262 13.441,18.955C14.567,17.555 17.318,13.88 17.318,11.215C17.318,8.741 15.37,6.74 12.962,6.74ZM12.962,12.813C12.103,12.813 11.406,12.097 11.406,11.215C11.406,10.333 12.103,9.617 12.962,9.617C13.821,9.617 14.518,10.333 14.518,11.215C14.518,12.097 13.821,12.813 12.962,12.813Z"
|
|
||||||
android:fillColor="#101317"/>
|
|
||||||
</group>
|
|
||||||
</vector>
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="26dp"
|
|
||||||
android:height="28dp"
|
|
||||||
android:viewportWidth="26"
|
|
||||||
android:viewportHeight="28">
|
|
||||||
<path
|
|
||||||
android:pathData="M12.962,28L9.819,24.889L16.105,24.889L12.962,28Z"
|
|
||||||
android:fillColor="#1B1D22"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M12.963,12.963m-12.963,0a12.963,12.963 0,1 1,25.926 0a12.963,12.963 0,1 1,-25.926 0"
|
|
||||||
android:fillColor="#1B1D22"/>
|
|
||||||
<group>
|
|
||||||
<clip-path
|
|
||||||
android:pathData="M6.74,6.741h12.444v12.444h-12.444z"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M12.962,6.741C10.554,6.741 8.606,8.741 8.606,11.215C8.606,13.88 11.357,17.555 12.489,18.955C12.738,19.262 13.192,19.262 13.441,18.955C14.567,17.555 17.318,13.88 17.318,11.215C17.318,8.741 15.37,6.741 12.962,6.741ZM12.962,12.813C12.103,12.813 11.406,12.097 11.406,11.215C11.406,10.333 12.103,9.617 12.962,9.617C13.821,9.617 14.518,10.333 14.518,11.215C14.518,12.097 13.821,12.813 12.962,12.813Z"
|
|
||||||
android:fillColor="#ffffff"/>
|
|
||||||
</group>
|
|
||||||
</vector>
|
|
||||||
|
|
@ -23,7 +23,7 @@ class LocationConstraintsCheckTest {
|
||||||
|
|
||||||
val result = checkLocationConstraints(permissionsState, locationActions)
|
val result = checkLocationConstraints(permissionsState, locationActions)
|
||||||
|
|
||||||
assertThat(result).isEqualTo(LocationConstraintsCheckResult.Success)
|
assertThat(result).isEqualTo(LocationConstraintsCheck.Success)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -35,7 +35,7 @@ class LocationConstraintsCheckTest {
|
||||||
|
|
||||||
val result = checkLocationConstraints(permissionsState, locationActions)
|
val result = checkLocationConstraints(permissionsState, locationActions)
|
||||||
|
|
||||||
assertThat(result).isEqualTo(LocationConstraintsCheckResult.Success)
|
assertThat(result).isEqualTo(LocationConstraintsCheck.Success)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -47,7 +47,7 @@ class LocationConstraintsCheckTest {
|
||||||
|
|
||||||
val result = checkLocationConstraints(permissionsState, locationActions)
|
val result = checkLocationConstraints(permissionsState, locationActions)
|
||||||
|
|
||||||
assertThat(result).isEqualTo(LocationConstraintsCheckResult.LocationServiceDisabled)
|
assertThat(result).isEqualTo(LocationConstraintsCheck.LocationServiceDisabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -60,7 +60,7 @@ class LocationConstraintsCheckTest {
|
||||||
|
|
||||||
val result = checkLocationConstraints(permissionsState, locationActions)
|
val result = checkLocationConstraints(permissionsState, locationActions)
|
||||||
|
|
||||||
assertThat(result).isEqualTo(LocationConstraintsCheckResult.PermissionRationale)
|
assertThat(result).isEqualTo(LocationConstraintsCheck.PermissionRationale)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -73,7 +73,6 @@ class LocationConstraintsCheckTest {
|
||||||
|
|
||||||
val result = checkLocationConstraints(permissionsState, locationActions)
|
val result = checkLocationConstraints(permissionsState, locationActions)
|
||||||
|
|
||||||
assertThat(result).isEqualTo(LocationConstraintsCheckResult.PermissionDenied)
|
assertThat(result).isEqualTo(LocationConstraintsCheck.PermissionDenied)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@ import io.element.android.tests.testutils.WarmUpRule
|
||||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||||
import io.element.android.tests.testutils.lambda.value
|
import io.element.android.tests.testutils.lambda.value
|
||||||
import io.element.android.tests.testutils.test
|
import io.element.android.tests.testutils.test
|
||||||
import kotlinx.coroutines.delay
|
|
||||||
import kotlinx.coroutines.test.advanceUntilIdle
|
import kotlinx.coroutines.test.advanceUntilIdle
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2025 Element Creations Ltd.
|
* Copyright (c) 2026 Element Creations Ltd.
|
||||||
* Copyright 2024, 2025 New Vector Ltd.
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,11 @@ import com.google.common.truth.Truth.assertThat
|
||||||
import io.element.android.features.location.api.Location
|
import io.element.android.features.location.api.Location
|
||||||
import io.element.android.features.location.api.ShowLocationMode
|
import io.element.android.features.location.api.ShowLocationMode
|
||||||
import io.element.android.features.location.impl.aPermissionsState
|
import io.element.android.features.location.impl.aPermissionsState
|
||||||
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialogState
|
|
||||||
import io.element.android.features.location.impl.common.actions.FakeLocationActions
|
import io.element.android.features.location.impl.common.actions.FakeLocationActions
|
||||||
import io.element.android.features.location.impl.common.permissions.FakePermissionsPresenter
|
import io.element.android.features.location.impl.common.permissions.FakePermissionsPresenter
|
||||||
import io.element.android.features.location.impl.common.permissions.PermissionsEvents
|
import io.element.android.features.location.impl.common.permissions.PermissionsEvents
|
||||||
import io.element.android.features.location.impl.common.permissions.PermissionsState
|
import io.element.android.features.location.impl.common.permissions.PermissionsState
|
||||||
|
import io.element.android.features.location.impl.common.ui.LocationConstraintsDialogState
|
||||||
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
|
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,6 @@ import io.element.android.libraries.matrix.api.permalink.PermalinkData
|
||||||
import io.element.android.libraries.matrix.api.room.BaseRoom
|
import io.element.android.libraries.matrix.api.room.BaseRoom
|
||||||
import io.element.android.libraries.matrix.api.room.alias.matches
|
import io.element.android.libraries.matrix.api.room.alias.matches
|
||||||
import io.element.android.libraries.matrix.api.room.joinedRoomMembers
|
import io.element.android.libraries.matrix.api.room.joinedRoomMembers
|
||||||
import io.element.android.libraries.matrix.api.room.location.AssetType
|
|
||||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||||
import io.element.android.libraries.matrix.api.timeline.Timeline
|
import io.element.android.libraries.matrix.api.timeline.Timeline
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
|
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,6 @@ import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.features.location.api.StaticMapView
|
import io.element.android.features.location.api.StaticMapView
|
||||||
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContent
|
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContent
|
||||||
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContentProvider
|
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContentProvider
|
||||||
import io.element.android.libraries.designsystem.components.PinVariant
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,13 +29,9 @@ import io.element.android.features.messages.impl.utils.TextPillificationHelper
|
||||||
import io.element.android.libraries.androidutils.filesize.FileSizeFormatter
|
import io.element.android.libraries.androidutils.filesize.FileSizeFormatter
|
||||||
import io.element.android.libraries.androidutils.text.safeLinkify
|
import io.element.android.libraries.androidutils.text.safeLinkify
|
||||||
import io.element.android.libraries.core.mimetype.MimeTypes
|
import io.element.android.libraries.core.mimetype.MimeTypes
|
||||||
import io.element.android.libraries.designsystem.components.PinVariant
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.api.permalink.PermalinkParser
|
import io.element.android.libraries.matrix.api.permalink.PermalinkParser
|
||||||
import io.element.android.libraries.matrix.api.room.location.AssetType
|
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType
|
||||||
|
|
@ -49,7 +45,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.StickerMessag
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.VoiceMessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.VoiceMessageType
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.getAvatarUrl
|
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName
|
import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName
|
||||||
import io.element.android.libraries.matrix.ui.messages.toHtmlDocument
|
import io.element.android.libraries.matrix.ui.messages.toHtmlDocument
|
||||||
import io.element.android.libraries.mediaviewer.api.util.FileExtensionExtractor
|
import io.element.android.libraries.mediaviewer.api.util.FileExtensionExtractor
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@ data class TimelineItemLocationContent(
|
||||||
val assetType: AssetType? = null,
|
val assetType: AssetType? = null,
|
||||||
val mode: Mode,
|
val mode: Mode,
|
||||||
) : TimelineItemEventContent {
|
) : TimelineItemEventContent {
|
||||||
|
|
||||||
val pinVariant = when (mode) {
|
val pinVariant = when (mode) {
|
||||||
is Mode.Live -> {
|
is Mode.Live -> {
|
||||||
if (mode.isActive) {
|
if (mode.isActive) {
|
||||||
|
|
@ -61,4 +60,3 @@ data class TimelineItemLocationContent(
|
||||||
|
|
||||||
override val type: String = "TimelineItemLocationContent"
|
override val type: String = "TimelineItemLocationContent"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,7 @@ package io.element.android.features.messages.impl.timeline.model.event
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import io.element.android.features.location.api.Location
|
import io.element.android.features.location.api.Location
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.api.timeline.Timeline
|
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileDetails
|
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileDetails
|
||||||
import io.element.android.libraries.matrix.ui.components.aMatrixUser
|
|
||||||
import io.element.android.libraries.matrix.ui.messages.reply.aProfileDetailsReady
|
import io.element.android.libraries.matrix.ui.messages.reply.aProfileDetailsReady
|
||||||
|
|
||||||
open class TimelineItemLocationContentProvider : PreviewParameterProvider<TimelineItemLocationContent> {
|
open class TimelineItemLocationContentProvider : PreviewParameterProvider<TimelineItemLocationContent> {
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,10 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.graphics.Shape
|
import androidx.compose.ui.graphics.Shape
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import coil3.compose.AsyncImagePainter
|
import coil3.compose.AsyncImagePainter
|
||||||
import coil3.compose.SubcomposeAsyncImage
|
import coil3.compose.SubcomposeAsyncImage
|
||||||
import coil3.compose.SubcomposeAsyncImageContent
|
import coil3.compose.SubcomposeAsyncImageContent
|
||||||
import coil3.request.ImageRequest
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@
|
||||||
package io.element.android.libraries.designsystem.components.dialogs
|
package io.element.android.libraries.designsystem.components.dialogs
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical
|
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.LazyListScope
|
import androidx.compose.foundation.lazy.LazyListScope
|
||||||
|
|
|
||||||
|
|
@ -12,4 +12,3 @@ data class LiveLocationInfo(
|
||||||
val geoUri: String,
|
val geoUri: String,
|
||||||
val timestamp: Long,
|
val timestamp: Long,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ data class LiveLocationContent(
|
||||||
val timeout: Long,
|
val timeout: Long,
|
||||||
val assetType: AssetType?,
|
val assetType: AssetType?,
|
||||||
val locations: List<LiveLocationInfo>,
|
val locations: List<LiveLocationInfo>,
|
||||||
): EventContent
|
) : EventContent
|
||||||
|
|
||||||
data object LegacyCallInviteContent : EventContent
|
data object LegacyCallInviteContent : EventContent
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ fun AssetType.into(): RustAssetType = when (this) {
|
||||||
AssetType.UNKNOWN -> RustAssetType.UNKNOWN
|
AssetType.UNKNOWN -> RustAssetType.UNKNOWN
|
||||||
}
|
}
|
||||||
|
|
||||||
fun RustAssetType.into(): AssetType = when(this){
|
fun RustAssetType.into(): AssetType = when (this) {
|
||||||
RustAssetType.SENDER -> AssetType.SENDER
|
RustAssetType.SENDER -> AssetType.SENDER
|
||||||
RustAssetType.PIN -> AssetType.PIN
|
RustAssetType.PIN -> AssetType.PIN
|
||||||
RustAssetType.UNKNOWN -> AssetType.UNKNOWN
|
RustAssetType.UNKNOWN -> AssetType.UNKNOWN
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ package io.element.android.libraries.matrix.ui.components
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue