diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt index 0136dbfff8..9e4d48ff01 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt @@ -26,6 +26,7 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.core.resources.toTimestamp import im.vector.app.core.time.Clock import im.vector.app.features.home.AvatarRenderer +import im.vector.app.features.location.live.map.bottomsheet.LiveLocationUserItem import im.vector.app.features.location.live.map.bottomsheet.liveLocationUserItem import javax.inject.Inject @@ -54,10 +55,17 @@ class LiveLocationBottomSheetController @Inject constructor( val currentUserLocations = userLocations ?: return val host = this + val userItemCallback = object : LiveLocationUserItem.Callback { + override fun onStopSharingClicked() { + host.callback?.onStopLocationClicked() + } + } + currentUserLocations.forEach { liveLocationViewState -> val remainingTime = getFormattedLocalTimeEndOfLive(liveLocationViewState.endOfLiveTimestampMillis) liveLocationUserItem { id(liveLocationViewState.matrixItem.id) + callback(userItemCallback) matrixItem(liveLocationViewState.matrixItem) stringProvider(host.stringProvider) clock(host.clock) diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapAction.kt b/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapAction.kt index 16cd3badc6..b88fffc733 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapAction.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapAction.kt @@ -21,4 +21,5 @@ import im.vector.app.core.platform.VectorViewModelAction sealed class LocationLiveMapAction : VectorViewModelAction { data class AddMapSymbol(val key: String, val value: Long) : LocationLiveMapAction() data class RemoveMapSymbol(val key: String) : LocationLiveMapAction() + object StopSharing : LocationLiveMapAction() } diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewFragment.kt b/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewFragment.kt index 95328201ac..edfb967f45 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewFragment.kt @@ -71,6 +71,16 @@ class LocationLiveMapViewFragment @Inject constructor( override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) views.bottomSheetRecyclerView.configureWith(bottomSheetController, hasFixedSize = false, disableItemAnimation = true) + + bottomSheetController.callback = object : LiveLocationBottomSheetController.Callback { + override fun onUserSelected(userId: String) { + + } + + override fun onStopLocationClicked() { + viewModel.handle(LocationLiveMapAction.StopSharing) + } + } } override fun onResume() { diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewModel.kt b/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewModel.kt index b14feea667..64802c7090 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/LocationLiveMapViewModel.kt @@ -23,13 +23,15 @@ import dagger.assisted.AssistedInject import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.location.LocationSharingServiceConnection import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach class LocationLiveMapViewModel @AssistedInject constructor( @Assisted private val initialState: LocationLiveMapViewState, - getListOfUserLiveLocationUseCase: GetListOfUserLiveLocationUseCase -) : VectorViewModel<LocationLiveMapViewState, LocationLiveMapAction, LocationLiveMapViewEvents>(initialState) { + getListOfUserLiveLocationUseCase: GetListOfUserLiveLocationUseCase, + private val locationSharingServiceConnection: LocationSharingServiceConnection, +) : VectorViewModel<LocationLiveMapViewState, LocationLiveMapAction, LocationLiveMapViewEvents>(initialState), LocationSharingServiceConnection.Callback { @AssistedFactory interface Factory : MavericksAssistedViewModelFactory<LocationLiveMapViewModel, LocationLiveMapViewState> { @@ -42,12 +44,14 @@ class LocationLiveMapViewModel @AssistedInject constructor( getListOfUserLiveLocationUseCase.execute(initialState.roomId) .onEach { setState { copy(userLocations = it) } } .launchIn(viewModelScope) + locationSharingServiceConnection.bind(this) } override fun handle(action: LocationLiveMapAction) { when (action) { is LocationLiveMapAction.AddMapSymbol -> handleAddMapSymbol(action) is LocationLiveMapAction.RemoveMapSymbol -> handleRemoveMapSymbol(action) + LocationLiveMapAction.StopSharing -> handleStopSharing() } } @@ -64,4 +68,16 @@ class LocationLiveMapViewModel @AssistedInject constructor( copy(mapSymbolIds = newMapSymbolIds) } } + + private fun handleStopSharing() { + locationSharingServiceConnection.stopLiveLocationSharing(initialState.roomId) + } + + override fun onLocationServiceRunning() { + // NOOP + } + + override fun onLocationServiceStopped() { + // NOOP + } }