Stop live location share API
This commit is contained in:
parent
29f48249e2
commit
632064ffde
@ -30,6 +30,11 @@ interface LocationSharingService {
|
|||||||
*/
|
*/
|
||||||
suspend fun startLiveLocationShare(timeoutMillis: Long): String
|
suspend fun startLiveLocationShare(timeoutMillis: Long): String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops sharing live location in the room.
|
||||||
|
*/
|
||||||
|
suspend fun stopLiveLocationShare()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a LiveData on the list of current running live location shares.
|
* Returns a LiveData on the list of current running live location shares.
|
||||||
*/
|
*/
|
||||||
|
@ -66,21 +66,6 @@ interface StateService {
|
|||||||
*/
|
*/
|
||||||
suspend fun deleteAvatar()
|
suspend fun deleteAvatar()
|
||||||
|
|
||||||
// TODO delete
|
|
||||||
/**
|
|
||||||
* Stops sharing live location in the room.
|
|
||||||
* @param userId user id
|
|
||||||
*/
|
|
||||||
suspend fun stopLiveLocation(userId: String)
|
|
||||||
|
|
||||||
// TODO delete
|
|
||||||
/**
|
|
||||||
* Returns beacon info state event of a user.
|
|
||||||
* @param userId user id who is sharing location
|
|
||||||
* @param filterOnlyLive filters only ongoing live location sharing beacons if true else ended event is included
|
|
||||||
*/
|
|
||||||
suspend fun getLiveLocationBeaconInfo(userId: String, filterOnlyLive: Boolean): Event?
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a state event to the room.
|
* Send a state event to the room.
|
||||||
* @param eventType The type of event to send.
|
* @param eventType The type of event to send.
|
||||||
|
@ -52,7 +52,9 @@ import org.matrix.android.sdk.internal.session.room.directory.GetPublicRoomTask
|
|||||||
import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask
|
import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask
|
||||||
import org.matrix.android.sdk.internal.session.room.directory.SetRoomDirectoryVisibilityTask
|
import org.matrix.android.sdk.internal.session.room.directory.SetRoomDirectoryVisibilityTask
|
||||||
import org.matrix.android.sdk.internal.session.room.location.DefaultStartLiveLocationShareTask
|
import org.matrix.android.sdk.internal.session.room.location.DefaultStartLiveLocationShareTask
|
||||||
|
import org.matrix.android.sdk.internal.session.room.location.DefaultStopLiveLocationShareTask
|
||||||
import org.matrix.android.sdk.internal.session.room.location.StartLiveLocationShareTask
|
import org.matrix.android.sdk.internal.session.room.location.StartLiveLocationShareTask
|
||||||
|
import org.matrix.android.sdk.internal.session.room.location.StopLiveLocationShareTask
|
||||||
import org.matrix.android.sdk.internal.session.room.membership.DefaultLoadRoomMembersTask
|
import org.matrix.android.sdk.internal.session.room.membership.DefaultLoadRoomMembersTask
|
||||||
import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask
|
import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask
|
||||||
import org.matrix.android.sdk.internal.session.room.membership.admin.DefaultMembershipAdminTask
|
import org.matrix.android.sdk.internal.session.room.membership.admin.DefaultMembershipAdminTask
|
||||||
@ -304,4 +306,7 @@ internal abstract class RoomModule {
|
|||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindStartLiveLocationShareTask(task: DefaultStartLiveLocationShareTask): StartLiveLocationShareTask
|
abstract fun bindStartLiveLocationShareTask(task: DefaultStartLiveLocationShareTask): StartLiveLocationShareTask
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
abstract fun bindStopLiveLocationShareTask(task: DefaultStopLiveLocationShareTask): StopLiveLocationShareTask
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ internal class DefaultLocationSharingService @AssistedInject constructor(
|
|||||||
@Assisted private val roomId: String,
|
@Assisted private val roomId: String,
|
||||||
@SessionDatabase private val monarchy: Monarchy,
|
@SessionDatabase private val monarchy: Monarchy,
|
||||||
private val startLiveLocationShareTask: StartLiveLocationShareTask,
|
private val startLiveLocationShareTask: StartLiveLocationShareTask,
|
||||||
|
private val stopLiveLocationShareTask: StopLiveLocationShareTask,
|
||||||
private val liveLocationShareAggregatedSummaryMapper: LiveLocationShareAggregatedSummaryMapper,
|
private val liveLocationShareAggregatedSummaryMapper: LiveLocationShareAggregatedSummaryMapper,
|
||||||
) : LocationSharingService {
|
) : LocationSharingService {
|
||||||
|
|
||||||
@ -49,6 +50,13 @@ internal class DefaultLocationSharingService @AssistedInject constructor(
|
|||||||
return startLiveLocationShareTask.execute(params)
|
return startLiveLocationShareTask.execute(params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun stopLiveLocationShare() {
|
||||||
|
val params = StopLiveLocationShareTask.Params(
|
||||||
|
roomId = roomId,
|
||||||
|
)
|
||||||
|
return stopLiveLocationShareTask.execute(params)
|
||||||
|
}
|
||||||
|
|
||||||
override fun getRunningLiveLocationShareSummaries(): LiveData<List<LiveLocationShareAggregatedSummary>> {
|
override fun getRunningLiveLocationShareSummaries(): LiveData<List<LiveLocationShareAggregatedSummary>> {
|
||||||
return monarchy.findAllMappedWithChanges(
|
return monarchy.findAllMappedWithChanges(
|
||||||
{ LiveLocationShareAggregatedSummaryEntity.findRunningLiveInRoom(it, roomId = roomId) },
|
{ LiveLocationShareAggregatedSummaryEntity.findRunningLiveInRoom(it, roomId = roomId) },
|
||||||
|
@ -36,7 +36,7 @@ internal interface StartLiveLocationShareTask : Task<StartLiveLocationShareTask.
|
|||||||
internal class DefaultStartLiveLocationShareTask @Inject constructor(
|
internal class DefaultStartLiveLocationShareTask @Inject constructor(
|
||||||
@UserId private val userId: String,
|
@UserId private val userId: String,
|
||||||
private val clock: Clock,
|
private val clock: Clock,
|
||||||
private val sendStateTask: SendStateTask
|
private val sendStateTask: SendStateTask,
|
||||||
) : StartLiveLocationShareTask {
|
) : StartLiveLocationShareTask {
|
||||||
|
|
||||||
override suspend fun execute(params: StartLiveLocationShareTask.Params): String {
|
override suspend fun execute(params: StartLiveLocationShareTask.Params): String {
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 The Matrix.org Foundation C.I.C.
|
||||||
|
*
|
||||||
|
* 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 org.matrix.android.sdk.internal.session.room.location
|
||||||
|
|
||||||
|
import org.matrix.android.sdk.api.extensions.orFalse
|
||||||
|
import org.matrix.android.sdk.api.query.QueryStringValue
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.toContent
|
||||||
|
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconInfoContent
|
||||||
|
import org.matrix.android.sdk.internal.di.UserId
|
||||||
|
import org.matrix.android.sdk.internal.session.room.state.SendStateTask
|
||||||
|
import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource
|
||||||
|
import org.matrix.android.sdk.internal.task.Task
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
internal interface StopLiveLocationShareTask : Task<StopLiveLocationShareTask.Params, Unit> {
|
||||||
|
data class Params(
|
||||||
|
val roomId: String,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO add unit tests
|
||||||
|
internal class DefaultStopLiveLocationShareTask @Inject constructor(
|
||||||
|
@UserId private val userId: String,
|
||||||
|
private val sendStateTask: SendStateTask,
|
||||||
|
private val stateEventDataSource: StateEventDataSource,
|
||||||
|
) : StopLiveLocationShareTask {
|
||||||
|
|
||||||
|
override suspend fun execute(params: StopLiveLocationShareTask.Params) {
|
||||||
|
val beaconInfoStateEvent = getLiveLocationBeaconInfoForUser(userId, params.roomId) ?: return
|
||||||
|
val stateKey = beaconInfoStateEvent.stateKey ?: return
|
||||||
|
val content = beaconInfoStateEvent.getClearContent()?.toModel<MessageBeaconInfoContent>() ?: return
|
||||||
|
val updatedContent = content.copy(isLive = false).toContent()
|
||||||
|
val sendStateTaskParams = SendStateTask.Params(
|
||||||
|
roomId = params.roomId,
|
||||||
|
stateKey = stateKey,
|
||||||
|
eventType = EventType.STATE_ROOM_BEACON_INFO.first(),
|
||||||
|
body = updatedContent
|
||||||
|
)
|
||||||
|
sendStateTask.executeRetry(sendStateTaskParams, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getLiveLocationBeaconInfoForUser(userId: String, roomId: String): Event? {
|
||||||
|
return EventType.STATE_ROOM_BEACON_INFO
|
||||||
|
.mapNotNull {
|
||||||
|
stateEventDataSource.getStateEvent(
|
||||||
|
roomId = roomId,
|
||||||
|
eventType = it,
|
||||||
|
stateKey = QueryStringValue.Equals(userId)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.firstOrNull { beaconInfoEvent ->
|
||||||
|
beaconInfoEvent.getClearContent()?.toModel<MessageBeaconInfoContent>()?.isLive.orFalse()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -21,33 +21,27 @@ import androidx.lifecycle.LiveData
|
|||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import org.matrix.android.sdk.api.extensions.orFalse
|
|
||||||
import org.matrix.android.sdk.api.query.QueryStateEventValue
|
import org.matrix.android.sdk.api.query.QueryStateEventValue
|
||||||
import org.matrix.android.sdk.api.query.QueryStringValue
|
|
||||||
import org.matrix.android.sdk.api.session.events.model.Event
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||||
import org.matrix.android.sdk.api.session.events.model.toContent
|
import org.matrix.android.sdk.api.session.events.model.toContent
|
||||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomCanonicalAliasContent
|
import org.matrix.android.sdk.api.session.room.model.RoomCanonicalAliasContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry
|
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
|
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconInfoContent
|
|
||||||
import org.matrix.android.sdk.api.session.room.state.StateService
|
import org.matrix.android.sdk.api.session.room.state.StateService
|
||||||
import org.matrix.android.sdk.api.util.JsonDict
|
import org.matrix.android.sdk.api.util.JsonDict
|
||||||
import org.matrix.android.sdk.api.util.MimeTypes
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.api.util.Optional
|
import org.matrix.android.sdk.api.util.Optional
|
||||||
import org.matrix.android.sdk.internal.session.content.FileUploader
|
import org.matrix.android.sdk.internal.session.content.FileUploader
|
||||||
import org.matrix.android.sdk.internal.session.permalinks.ViaParameterFinder
|
|
||||||
|
|
||||||
internal class DefaultStateService @AssistedInject constructor(
|
internal class DefaultStateService @AssistedInject constructor(
|
||||||
@Assisted private val roomId: String,
|
@Assisted private val roomId: String,
|
||||||
private val stateEventDataSource: StateEventDataSource,
|
private val stateEventDataSource: StateEventDataSource,
|
||||||
private val sendStateTask: SendStateTask,
|
private val sendStateTask: SendStateTask,
|
||||||
private val fileUploader: FileUploader,
|
private val fileUploader: FileUploader,
|
||||||
private val viaParameterFinder: ViaParameterFinder
|
|
||||||
) : StateService {
|
) : StateService {
|
||||||
|
|
||||||
@AssistedFactory
|
@AssistedFactory
|
||||||
@ -191,35 +185,4 @@ internal class DefaultStateService @AssistedInject constructor(
|
|||||||
}
|
}
|
||||||
updateJoinRule(RoomJoinRules.RESTRICTED, null, allowEntries)
|
updateJoinRule(RoomJoinRules.RESTRICTED, null, allowEntries)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun stopLiveLocation(userId: String) {
|
|
||||||
getLiveLocationBeaconInfo(userId, true)?.let { beaconInfoStateEvent ->
|
|
||||||
beaconInfoStateEvent.getClearContent()?.toModel<MessageBeaconInfoContent>()?.let { content ->
|
|
||||||
val updatedContent = content.copy(isLive = false).toContent()
|
|
||||||
|
|
||||||
beaconInfoStateEvent.stateKey?.let {
|
|
||||||
sendStateEvent(
|
|
||||||
eventType = EventType.STATE_ROOM_BEACON_INFO.first(),
|
|
||||||
body = updatedContent,
|
|
||||||
stateKey = it
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun getLiveLocationBeaconInfo(userId: String, filterOnlyLive: Boolean): Event? {
|
|
||||||
return EventType.STATE_ROOM_BEACON_INFO
|
|
||||||
.mapNotNull {
|
|
||||||
stateEventDataSource.getStateEvent(
|
|
||||||
roomId = roomId,
|
|
||||||
eventType = it,
|
|
||||||
stateKey = QueryStringValue.Equals(userId)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.firstOrNull { beaconInfoEvent ->
|
|
||||||
!filterOnlyLive ||
|
|
||||||
beaconInfoEvent.getClearContent()?.toModel<MessageBeaconInfoContent>()?.isLive.orFalse()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,9 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
|
|||||||
.getSafeActiveSession()
|
.getSafeActiveSession()
|
||||||
?.let { session ->
|
?.let { session ->
|
||||||
session.coroutineScope.launch(session.coroutineDispatchers.io) {
|
session.coroutineScope.launch(session.coroutineDispatchers.io) {
|
||||||
session.getRoom(roomId)?.stateService()?.stopLiveLocation(session.myUserId)
|
session.getRoom(roomId)
|
||||||
|
?.locationSharingService()
|
||||||
|
?.stopLiveLocationShare()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user