Building correct item depending on the state of the live

This commit is contained in:
Maxime NATUREL 2022-05-02 09:47:48 +02:00
parent d44a6c50f1
commit 431d86166f
1 changed files with 41 additions and 15 deletions

View File

@ -17,6 +17,7 @@
package im.vector.app.features.home.room.detail.timeline.factory package im.vector.app.features.home.room.detail.timeline.factory
import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.epoxy.VectorEpoxyModel
import im.vector.app.core.resources.DateProvider
import im.vector.app.core.utils.DimensionConverter import im.vector.app.core.utils.DimensionConverter
import im.vector.app.features.home.room.detail.timeline.helper.AvatarSizeProvider import im.vector.app.features.home.room.detail.timeline.helper.AvatarSizeProvider
import im.vector.app.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider import im.vector.app.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider
@ -25,8 +26,8 @@ import im.vector.app.features.home.room.detail.timeline.item.LiveLocationShareSu
import im.vector.app.features.home.room.detail.timeline.item.MessageLiveLocationStartItem import im.vector.app.features.home.room.detail.timeline.item.MessageLiveLocationStartItem
import im.vector.app.features.home.room.detail.timeline.item.MessageLiveLocationStartItem_ import im.vector.app.features.home.room.detail.timeline.item.MessageLiveLocationStartItem_
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.room.model.message.LocationInfo import org.threeten.bp.LocalDateTime
import java.time.LocalDateTime import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class LiveLocationShareMessageItemFactory @Inject constructor( class LiveLocationShareMessageItemFactory @Inject constructor(
@ -40,21 +41,15 @@ class LiveLocationShareMessageItemFactory @Inject constructor(
highlight: Boolean, highlight: Boolean,
attributes: AbsMessageItem.Attributes, attributes: AbsMessageItem.Attributes,
): VectorEpoxyModel<*>? { ): VectorEpoxyModel<*>? {
// TODO handle location received and stopped states return when (getViewState(liveLocationShareSummaryData)) {
// TODO create a dedicated ViewState LiveLocationShareViewState.Loading -> buildLoadingItem(highlight, attributes)
return when { LiveLocationShareViewState.Inactive -> buildInactiveItem()
liveLocationShareSummaryData == null -> null is LiveLocationShareViewState.Running -> buildRunningItem()
isLiveRunning(liveLocationShareSummaryData) -> buildStartLiveItem(highlight, attributes) LiveLocationShareViewState.Unkwown -> null
else -> null
} }
} }
private fun isLiveRunning(liveLocationShareSummaryData: LiveLocationShareSummaryData): Boolean { private fun buildLoadingItem(
// TODO check if the live has timed out as well
return liveLocationShareSummaryData.isActive.orFalse()
}
private fun buildStartLiveItem(
highlight: Boolean, highlight: Boolean,
attributes: AbsMessageItem.Attributes, attributes: AbsMessageItem.Attributes,
): MessageLiveLocationStartItem { ): MessageLiveLocationStartItem {
@ -69,9 +64,40 @@ class LiveLocationShareMessageItemFactory @Inject constructor(
.leftGuideline(avatarSizeProvider.leftGuideline) .leftGuideline(avatarSizeProvider.leftGuideline)
} }
private fun buildRunningItem() = null
private fun buildInactiveItem() = null
private fun getViewState(liveLocationShareSummaryData: LiveLocationShareSummaryData?): LiveLocationShareViewState {
return when {
liveLocationShareSummaryData?.isActive == null -> LiveLocationShareViewState.Unkwown
liveLocationShareSummaryData.isActive && liveLocationShareSummaryData.lastGeoUri.isNullOrEmpty() -> LiveLocationShareViewState.Loading
liveLocationShareSummaryData.isActive.not() || isLiveTimedOut(liveLocationShareSummaryData) -> LiveLocationShareViewState.Inactive
else ->
LiveLocationShareViewState.Running(
liveLocationShareSummaryData.lastGeoUri.orEmpty(),
getEndOfLiveDateTime(liveLocationShareSummaryData)
)
}.also { viewState -> Timber.d("computed viewState: $viewState") }
}
private fun isLiveTimedOut(liveLocationShareSummaryData: LiveLocationShareSummaryData): Boolean {
return getEndOfLiveDateTime(liveLocationShareSummaryData)
?.let { endOfLive ->
// this will only cover users with different timezones but not users with manually time set
val now = LocalDateTime.now()
now.isAfter(endOfLive)
}
.orFalse()
}
private fun getEndOfLiveDateTime(liveLocationShareSummaryData: LiveLocationShareSummaryData): LocalDateTime? {
return liveLocationShareSummaryData.endOfLiveTimestampAsMilliseconds?.let { DateProvider.toLocalDateTime(timestamp = it) }
}
private sealed class LiveLocationShareViewState { private sealed class LiveLocationShareViewState {
object Loading : LiveLocationShareViewState() object Loading : LiveLocationShareViewState()
data class Running(val locationInfo: LocationInfo, val endOfLiveDateTime: LocalDateTime?) : LiveLocationShareViewState() data class Running(val lastGeoUri: String, val endOfLiveDateTime: LocalDateTime?) : LiveLocationShareViewState()
object Inactive : LiveLocationShareViewState() object Inactive : LiveLocationShareViewState()
object Unkwown : LiveLocationShareViewState() object Unkwown : LiveLocationShareViewState()
} }