From 19315fc65e5142660d4ccb011db2284916824365 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Dec 2020 11:08:06 +0100 Subject: [PATCH] PreviewUrl: handle click --- .../home/room/detail/RoomDetailFragment.kt | 8 ++++++++ .../detail/timeline/TimelineEventController.kt | 13 ++++++++++++- .../timeline/factory/MessageItemFactory.kt | 2 ++ .../room/detail/timeline/item/MessageTextItem.kt | 6 ++++++ .../detail/timeline/url/PreviewUrlRetriever.kt | 2 +- .../detail/timeline/url/PreviewUrlUiState.kt | 2 +- .../room/detail/timeline/url/PreviewUrlView.kt | 16 +++------------- 7 files changed, 33 insertions(+), 16 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index 3f5e476a5e..5e8d41c545 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -1652,6 +1652,14 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.EnterTrackingUnreadMessagesState) } + override fun onPreviewUrlClicked(url: String) { + onUrlClicked(url, url) + } + + override fun onPreviewUrlCloseClicked(url: String) { + TODO("Not yet implemented") + } + private fun onShareActionClicked(action: EventSharedAction.Share) { if (action.messageContent is MessageTextContent) { shareText(requireContext(), action.messageContent.body) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt index bddc7fa126..31c4ceaff5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt @@ -76,7 +76,13 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec private val backgroundHandler: Handler ) : EpoxyController(backgroundHandler, backgroundHandler), Timeline.Listener, EpoxyController.Interceptor { - interface Callback : BaseCallback, ReactionPillCallback, AvatarCallback, UrlClickCallback, ReadReceiptsCallback { + interface Callback : + BaseCallback, + ReactionPillCallback, + AvatarCallback, + UrlClickCallback, + ReadReceiptsCallback, + PreviewUrlCallback { fun onLoadMore(direction: Timeline.Direction) fun onEventInvisible(event: TimelineEvent) fun onEventVisible(event: TimelineEvent) @@ -118,6 +124,11 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec fun onUrlLongClicked(url: String): Boolean } + interface PreviewUrlCallback { + fun onPreviewUrlClicked(url: String) + fun onPreviewUrlCloseClicked(url: String) + } + // Map eventId to adapter position private val adapterPositionMapping = HashMap() private val modelCache = arrayListOf() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index f3be4337ef..96fa055d1f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -428,6 +428,7 @@ class MessageItemFactory @Inject constructor( .searchForPills(isFormatted) .previewUrlRetriever(previewUrlRetriever) .imageContentRenderer(imageContentRenderer) + .previewUrlCallback(callback) .leftGuideline(avatarSizeProvider.leftGuideline) .attributes(attributes) .highlighted(highlight) @@ -535,6 +536,7 @@ class MessageItemFactory @Inject constructor( .leftGuideline(avatarSizeProvider.leftGuideline) .previewUrlRetriever(previewUrlRetriever) .imageContentRenderer(imageContentRenderer) + .previewUrlCallback(callback) .attributes(attributes) .highlighted(highlight) .movementMethod(createLinkMovementMethod(callback)) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt index 8bb5a84695..5bb7aff194 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageTextItem.kt @@ -23,6 +23,7 @@ import androidx.core.widget.TextViewCompat import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.home.room.detail.timeline.tools.findPillsAndProcess import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlUiState @@ -44,6 +45,9 @@ abstract class MessageTextItem : AbsMessageItem() { @EpoxyAttribute var previewUrlRetriever: PreviewUrlRetriever? = null + @EpoxyAttribute + var previewUrlCallback: TimelineEventController.PreviewUrlCallback? = null + @EpoxyAttribute var imageContentRenderer: ImageContentRenderer? = null @@ -53,9 +57,11 @@ abstract class MessageTextItem : AbsMessageItem() { private val previewUrlViewUpdater = PreviewUrlViewUpdater() override fun bind(holder: Holder) { + // Preview URL previewUrlViewUpdater.previewUrlView = holder.previewUrlView previewUrlViewUpdater.imageContentRenderer = imageContentRenderer previewUrlRetriever?.addListener(attributes.informationData.eventId, previewUrlViewUpdater) + holder.previewUrlView.delegate = previewUrlCallback if (useBigFont) { holder.messageView.textSize = 44F diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt index a36b2367f6..0153a38719 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt @@ -60,7 +60,7 @@ class PreviewUrlRetriever @Inject constructor( }.fold( { synchronized(data) { - updateState(eventId, PreviewUrlUiState.Data(it)) + updateState(eventId, PreviewUrlUiState.Data(urlToRetrieve, it)) } }, { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlUiState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlUiState.kt index e411ba3031..d86633b1e4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlUiState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlUiState.kt @@ -35,5 +35,5 @@ sealed class PreviewUrlUiState { data class Error(val throwable: Throwable) : PreviewUrlUiState() // PreviewUrl data - data class Data(val previewUrlData: PreviewUrlData) : PreviewUrlUiState() + data class Data(val url: String, val previewUrlData: PreviewUrlData) : PreviewUrlUiState() } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlView.kt index c29d57539d..58c36a95c9 100755 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlView.kt @@ -27,6 +27,7 @@ import butterknife.BindView import butterknife.ButterKnife import im.vector.app.R import im.vector.app.core.extensions.setTextOrHide +import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.media.ImageContentRenderer import org.matrix.android.sdk.api.session.media.PreviewUrlData @@ -51,7 +52,7 @@ class PreviewUrlView @JvmOverloads constructor( @BindView(R.id.url_preview_site) lateinit var siteView: TextView - var delegate: Delegate? = null + var delegate: TimelineEventController.PreviewUrlCallback? = null init { setupView() @@ -85,7 +86,7 @@ class PreviewUrlView @JvmOverloads constructor( override fun onClick(v: View?) { when (val finalState = state) { - is PreviewUrlUiState.Data -> delegate?.onUrlClicked(finalState.previewUrlData.url) + is PreviewUrlUiState.Data -> delegate?.onPreviewUrlClicked(finalState.url) else -> Unit } } @@ -129,15 +130,4 @@ class PreviewUrlView @JvmOverloads constructor( descriptionView.isVisible = false siteView.isVisible = false } - - /** - * An interface to delegate some actions to another object - */ - interface Delegate { - // TODO - fun onUrlClicked(url: String) - - // TODO - // fun close() - } }