Building correct item depending on the state of the live
This commit is contained in:
parent
d44a6c50f1
commit
431d86166f
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue