Let the Presenter use real classes.

This commit is contained in:
Benoit Marty 2024-12-10 15:56:54 +01:00
parent 7a3bd38c96
commit 57fc19d545
11 changed files with 45 additions and 145 deletions

View file

@ -7,10 +7,8 @@
package io.element.android.libraries.mediaviewer.impl.gallery
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.androidutils.filesize.FileSizeFormatter
import io.element.android.libraries.dateformatter.api.toHumanReadableDuration
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent
@ -45,18 +43,13 @@ import java.text.DateFormat
import java.util.Date
import javax.inject.Inject
interface EventItemFactory {
fun create(currentTimelineItem: MatrixTimelineItem.Event): MediaItem.Event?
}
@ContributesBinding(RoomScope::class)
class DefaultEventItemFactory @Inject constructor(
class EventItemFactory @Inject constructor(
private val fileSizeFormatter: FileSizeFormatter,
private val fileExtensionExtractor: FileExtensionExtractor,
) : EventItemFactory {
) {
private val timeFormatter = DateFormat.getDateInstance()
override fun create(
fun create(
currentTimelineItem: MatrixTimelineItem.Event,
): MediaItem.Event? {
val event = currentTimelineItem.event

View file

@ -7,23 +7,14 @@
package io.element.android.libraries.mediaviewer.impl.gallery
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.di.RoomScope
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import javax.inject.Inject
interface MediaItemsPostProcessor {
class MediaItemsPostProcessor @Inject constructor() {
fun process(
mediaItems: AsyncData<ImmutableList<MediaItem>>,
): AsyncData<GroupedMediaItems>
}
@ContributesBinding(RoomScope::class)
class DefaultMediaItemsPostProcessor @Inject constructor() : MediaItemsPostProcessor {
override fun process(
mediaItems: AsyncData<ImmutableList<MediaItem>>,
): AsyncData<GroupedMediaItems> {
return when (mediaItems) {
is AsyncData.Uninitialized -> AsyncData.Uninitialized

View file

@ -7,12 +7,10 @@
package io.element.android.libraries.mediaviewer.impl.gallery
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.androidutils.diff.DefaultDiffCacheInvalidator
import io.element.android.libraries.androidutils.diff.DiffCacheUpdater
import io.element.android.libraries.androidutils.diff.MutableListDiffCache
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
@ -24,17 +22,11 @@ import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import javax.inject.Inject
interface TimelineMediaItemsFactory {
val timelineItems: Flow<ImmutableList<MediaItem>>
suspend fun replaceWith(timelineItems: List<MatrixTimelineItem>)
}
@ContributesBinding(RoomScope::class)
class DefaultTimelineMediaItemsFactory @Inject constructor(
class TimelineMediaItemsFactory @Inject constructor(
private val dispatchers: CoroutineDispatchers,
private val virtualItemFactory: VirtualItemFactory,
private val eventItemFactory: EventItemFactory,
) : TimelineMediaItemsFactory {
) {
private val _timelineItems = MutableSharedFlow<ImmutableList<MediaItem>>(replay = 1)
private val lock = Mutex()
private val diffCache = MutableListDiffCache<MediaItem>()
@ -50,9 +42,9 @@ class DefaultTimelineMediaItemsFactory @Inject constructor(
}
}
override val timelineItems: Flow<ImmutableList<MediaItem>> = _timelineItems.distinctUntilChanged()
val timelineItems: Flow<ImmutableList<MediaItem>> = _timelineItems.distinctUntilChanged()
override suspend fun replaceWith(
suspend fun replaceWith(
timelineItems: List<MatrixTimelineItem>,
) = withContext(dispatchers.computation) {
lock.withLock {

View file

@ -7,22 +7,15 @@
package io.element.android.libraries.mediaviewer.impl.gallery
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.dateformatter.api.DaySeparatorFormatter
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem
import javax.inject.Inject
interface VirtualItemFactory {
fun create(timelineItem: MatrixTimelineItem.Virtual): MediaItem?
}
@ContributesBinding(RoomScope::class)
class DefaultVirtualItemFactory @Inject constructor(
class VirtualItemFactory @Inject constructor(
private val daySeparatorFormatter: DaySeparatorFormatter,
) : VirtualItemFactory {
override fun create(timelineItem: MatrixTimelineItem.Virtual): MediaItem? {
) {
fun create(timelineItem: MatrixTimelineItem.Virtual): MediaItem? {
return when (val virtual = timelineItem.virtual) {
is VirtualTimelineItem.DayDivider -> MediaItem.DateSeparator(
id = timelineItem.uniqueId,