mirror of
https://github.com/element-hq/element-android
synced 2024-10-23 19:26:42 +03:00
Deactivate all previous active beacons when receiving one from user
This commit is contained in:
parent
40d8d5c605
commit
79212321a2
3 changed files with 33 additions and 5 deletions
|
@ -24,7 +24,7 @@ import dagger.assisted.AssistedInject
|
||||||
import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationShareAggregatedSummary
|
import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationShareAggregatedSummary
|
||||||
import org.matrix.android.sdk.internal.database.mapper.LiveLocationShareAggregatedSummaryMapper
|
import org.matrix.android.sdk.internal.database.mapper.LiveLocationShareAggregatedSummaryMapper
|
||||||
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntity
|
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntity
|
||||||
import org.matrix.android.sdk.internal.database.query.findRunningLiveLocationShareInRoom
|
import org.matrix.android.sdk.internal.database.query.findRunningLiveInRoom
|
||||||
import org.matrix.android.sdk.internal.di.SessionDatabase
|
import org.matrix.android.sdk.internal.di.SessionDatabase
|
||||||
|
|
||||||
// TODO add unit tests
|
// TODO add unit tests
|
||||||
|
@ -41,7 +41,7 @@ internal class DefaultLocationSharingService @AssistedInject constructor(
|
||||||
|
|
||||||
override fun getRunningLiveLocationShareSummaries(): LiveData<List<LiveLocationShareAggregatedSummary>> {
|
override fun getRunningLiveLocationShareSummaries(): LiveData<List<LiveLocationShareAggregatedSummary>> {
|
||||||
return monarchy.findAllMappedWithChanges(
|
return monarchy.findAllMappedWithChanges(
|
||||||
{ LiveLocationShareAggregatedSummaryEntity.findRunningLiveLocationShareInRoom(it, roomId = roomId) },
|
{ LiveLocationShareAggregatedSummaryEntity.findRunningLiveInRoom(it, roomId = roomId) },
|
||||||
{ liveLocationShareAggregatedSummaryMapper.map(it) }
|
{ liveLocationShareAggregatedSummaryMapper.map(it) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ import io.realm.Realm
|
||||||
import io.realm.RealmQuery
|
import io.realm.RealmQuery
|
||||||
import io.realm.kotlin.where
|
import io.realm.kotlin.where
|
||||||
import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity
|
import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity
|
||||||
import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
|
|
||||||
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntity
|
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntity
|
||||||
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntityFields
|
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntityFields
|
||||||
|
|
||||||
|
@ -37,7 +36,7 @@ internal fun LiveLocationShareAggregatedSummaryEntity.Companion.where(
|
||||||
internal fun LiveLocationShareAggregatedSummaryEntity.Companion.whereRoomId(realm: Realm,
|
internal fun LiveLocationShareAggregatedSummaryEntity.Companion.whereRoomId(realm: Realm,
|
||||||
roomId: String): RealmQuery<LiveLocationShareAggregatedSummaryEntity> {
|
roomId: String): RealmQuery<LiveLocationShareAggregatedSummaryEntity> {
|
||||||
return realm.where<LiveLocationShareAggregatedSummaryEntity>()
|
return realm.where<LiveLocationShareAggregatedSummaryEntity>()
|
||||||
.equalTo(TimelineEventEntityFields.ROOM_ID, roomId)
|
.equalTo(LiveLocationShareAggregatedSummaryEntityFields.ROOM_ID, roomId)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun LiveLocationShareAggregatedSummaryEntity.Companion.create(
|
internal fun LiveLocationShareAggregatedSummaryEntity.Companion.create(
|
||||||
|
@ -71,7 +70,22 @@ internal fun LiveLocationShareAggregatedSummaryEntity.Companion.get(
|
||||||
return LiveLocationShareAggregatedSummaryEntity.where(realm, roomId, eventId).findFirst()
|
return LiveLocationShareAggregatedSummaryEntity.where(realm, roomId, eventId).findFirst()
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun LiveLocationShareAggregatedSummaryEntity.Companion.findRunningLiveLocationShareInRoom(
|
internal fun LiveLocationShareAggregatedSummaryEntity.Companion.findActiveLiveInRoomForUser(
|
||||||
|
realm: Realm,
|
||||||
|
roomId: String,
|
||||||
|
userId: String,
|
||||||
|
): List<LiveLocationShareAggregatedSummaryEntity> {
|
||||||
|
return LiveLocationShareAggregatedSummaryEntity
|
||||||
|
.whereRoomId(realm, roomId = roomId)
|
||||||
|
.equalTo(LiveLocationShareAggregatedSummaryEntityFields.USER_ID, userId)
|
||||||
|
.equalTo(LiveLocationShareAggregatedSummaryEntityFields.IS_ACTIVE, true)
|
||||||
|
.findAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A live is considered as running when active and with at least a last known location.
|
||||||
|
*/
|
||||||
|
internal fun LiveLocationShareAggregatedSummaryEntity.Companion.findRunningLiveInRoom(
|
||||||
realm: Realm,
|
realm: Realm,
|
||||||
roomId: String,
|
roomId: String,
|
||||||
): RealmQuery<LiveLocationShareAggregatedSummaryEntity> {
|
): RealmQuery<LiveLocationShareAggregatedSummaryEntity> {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconInfoCo
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconLocationDataContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconLocationDataContent
|
||||||
import org.matrix.android.sdk.internal.database.mapper.ContentMapper
|
import org.matrix.android.sdk.internal.database.mapper.ContentMapper
|
||||||
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntity
|
import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationShareAggregatedSummaryEntity
|
||||||
|
import org.matrix.android.sdk.internal.database.query.findActiveLiveInRoomForUser
|
||||||
import org.matrix.android.sdk.internal.database.query.getOrCreate
|
import org.matrix.android.sdk.internal.database.query.getOrCreate
|
||||||
import org.matrix.android.sdk.internal.di.SessionId
|
import org.matrix.android.sdk.internal.di.SessionId
|
||||||
import org.matrix.android.sdk.internal.di.WorkManagerProvider
|
import org.matrix.android.sdk.internal.di.WorkManagerProvider
|
||||||
|
@ -72,6 +73,8 @@ internal class LiveLocationAggregationProcessor @Inject constructor(
|
||||||
aggregatedSummary.isActive = isLive
|
aggregatedSummary.isActive = isLive
|
||||||
aggregatedSummary.userId = event.senderId
|
aggregatedSummary.userId = event.senderId
|
||||||
|
|
||||||
|
deactivateAllPreviousBeacons(realm, roomId, event.senderId, targetEventId)
|
||||||
|
|
||||||
if (isLive) {
|
if (isLive) {
|
||||||
scheduleDeactivationAfterTimeout(targetEventId, roomId, endOfLiveTimestampMillis)
|
scheduleDeactivationAfterTimeout(targetEventId, roomId, endOfLiveTimestampMillis)
|
||||||
} else {
|
} else {
|
||||||
|
@ -138,5 +141,16 @@ internal class LiveLocationAggregationProcessor @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun deactivateAllPreviousBeacons(realm: Realm, roomId: String, userId: String, currentEventId: String) {
|
||||||
|
LiveLocationShareAggregatedSummaryEntity
|
||||||
|
.findActiveLiveInRoomForUser(
|
||||||
|
realm = realm,
|
||||||
|
roomId = roomId,
|
||||||
|
userId = userId
|
||||||
|
)
|
||||||
|
.filterNot { it.eventId == currentEventId }
|
||||||
|
.forEach { it.isActive = false }
|
||||||
|
}
|
||||||
|
|
||||||
private fun Long.isMoreRecentThan(timestamp: Long) = this > timestamp
|
private fun Long.isMoreRecentThan(timestamp: Long) = this > timestamp
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue