From 17cba1a43223bebeaae7595509cc958aa5c23f5a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 25 Sep 2019 14:39:33 +0200 Subject: [PATCH] Display progress in the timeline when uploading file --- .../im/vector/riotx/core/utils/FileUtils.kt | 2 ++ .../timeline/factory/MessageItemFactory.kt | 5 +++++ .../helper/ContentUploadStateTrackerBinder.kt | 9 ++++----- .../detail/timeline/item/MessageFileItem.kt | 18 ++++++++++++++++++ .../timeline/item/MessageImageVideoItem.kt | 7 +++++-- .../features/media/ImageContentRenderer.kt | 6 ++---- .../layout/item_timeline_event_file_stub.xml | 2 +- 7 files changed, 37 insertions(+), 12 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/core/utils/FileUtils.kt b/vector/src/main/java/im/vector/riotx/core/utils/FileUtils.kt index 4b2d0682d2..5812c395e5 100644 --- a/vector/src/main/java/im/vector/riotx/core/utils/FileUtils.kt +++ b/vector/src/main/java/im/vector/riotx/core/utils/FileUtils.kt @@ -24,6 +24,8 @@ import java.io.File // Implementation should return true in case of success typealias ActionOnFile = (file: File) -> Boolean +internal fun String?.isLocalFile() = this != null && File(this).exists() + /* ========================================================================================== * Delete * ========================================================================================== */ diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt index 4819db4075..0dfa44563c 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -42,6 +42,7 @@ import im.vector.riotx.core.resources.StringProvider import im.vector.riotx.core.utils.DebouncedClickListener import im.vector.riotx.core.utils.DimensionConverter import im.vector.riotx.core.utils.containsOnlyEmojis +import im.vector.riotx.core.utils.isLocalFile import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.home.room.detail.timeline.helper.ContentUploadStateTrackerBinder @@ -117,6 +118,8 @@ class MessageItemFactory @Inject constructor( .avatarRenderer(avatarRenderer) .colorProvider(colorProvider) .dimensionConverter(dimensionConverter) + .izLocalFile(messageContent.getFileUrl().isLocalFile()) + .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) @@ -147,6 +150,8 @@ class MessageItemFactory @Inject constructor( .avatarRenderer(avatarRenderer) .colorProvider(colorProvider) .dimensionConverter(dimensionConverter) + .izLocalFile(messageContent.getFileUrl().isLocalFile()) + .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt index ca79666747..a7db7c826e 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt @@ -27,7 +27,6 @@ import im.vector.matrix.android.api.session.room.send.SendState import im.vector.riotx.R import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.core.resources.ColorProvider -import im.vector.riotx.features.media.ImageContentRenderer import im.vector.riotx.features.ui.getMessageTextColor import javax.inject.Inject @@ -37,12 +36,12 @@ class ContentUploadStateTrackerBinder @Inject constructor(private val activeSess private val updateListeners = mutableMapOf() fun bind(eventId: String, - mediaData: ImageContentRenderer.Data, + isLocalFile: Boolean, progressLayout: ViewGroup) { activeSessionHolder.getActiveSession().also { session -> val uploadStateTracker = session.contentUploadProgressTracker() - val updateListener = ContentMediaProgressUpdater(progressLayout, mediaData, colorProvider) + val updateListener = ContentMediaProgressUpdater(progressLayout, isLocalFile, colorProvider) updateListeners[eventId] = updateListener uploadStateTracker.track(eventId, updateListener) } @@ -60,7 +59,7 @@ class ContentUploadStateTrackerBinder @Inject constructor(private val activeSess } private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup, - private val mediaData: ImageContentRenderer.Data, + private val isLocalFile: Boolean, private val colorProvider: ColorProvider) : ContentUploadStateTracker.UpdateListener { override fun onUpdate(state: ContentUploadStateTracker.State) { @@ -76,7 +75,7 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup, } private fun handleIdle(state: ContentUploadStateTracker.State.Idle) { - if (mediaData.isLocalFile()) { + if (isLocalFile) { progressLayout.isVisible = true val progressBar = progressLayout.findViewById(R.id.mediaProgressBar) val progressTextView = progressLayout.findViewById(R.id.mediaProgressTextView) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt index 45e57b59db..56d6a33bc7 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt @@ -22,9 +22,11 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.annotation.DrawableRes +import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.riotx.R +import im.vector.riotx.features.home.room.detail.timeline.helper.ContentUploadStateTrackerBinder @EpoxyModelClass(layout = R.layout.item_timeline_event_base) abstract class MessageFileItem : AbsMessageItem() { @@ -36,19 +38,35 @@ abstract class MessageFileItem : AbsMessageItem() { var iconRes: Int = 0 @EpoxyAttribute var clickListener: View.OnClickListener? = null + @EpoxyAttribute + var izLocalFile = false + @EpoxyAttribute + lateinit var contentUploadStateTrackerBinder: ContentUploadStateTrackerBinder override fun bind(holder: Holder) { super.bind(holder) renderSendState(holder.fileLayout, holder.filenameView) + if (!informationData.sendState.hasFailed()) { + contentUploadStateTrackerBinder.bind(informationData.eventId, izLocalFile, holder.progressLayout) + } else { + holder.progressLayout.isVisible = false + } holder.filenameView.text = filename holder.fileImageView.setImageResource(iconRes) holder.filenameView.setOnClickListener(clickListener) holder.filenameView.paintFlags = (holder.filenameView.paintFlags or Paint.UNDERLINE_TEXT_FLAG) } + override fun unbind(holder: Holder) { + super.unbind(holder) + + contentUploadStateTrackerBinder.unbind(informationData.eventId) + } + override fun getViewType() = STUB_ID class Holder : AbsMessageItem.Holder(STUB_ID) { + val progressLayout by bind(R.id.messageFileUploadProgressLayout) val fileLayout by bind(R.id.messageFileLayout) val fileImageView by bind(R.id.messageFileImageView) val filenameView by bind(R.id.messageFilenameView) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt index 6f713b17fe..50e263267a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt @@ -20,6 +20,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import androidx.core.view.ViewCompat +import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.riotx.R @@ -44,11 +45,13 @@ abstract class MessageImageVideoItem : AbsMessageItem