From bcd384c31c5cb6250ed13c0ff281a2c741203629 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 14:46:19 +0100 Subject: [PATCH 01/10] Small cleanup --- .../vector/app/features/media/BaseAttachmentProvider.kt | 5 ++++- .../app/features/media/DataAttachmentRoomProvider.kt | 1 - .../app/features/media/RoomEventsAttachmentProvider.kt | 9 ++++----- .../app/features/media/VectorAttachmentViewerActivity.kt | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt index 3846e56ecf..f99ed2e324 100644 --- a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt @@ -30,7 +30,10 @@ import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.file.FileService import java.io.File -abstract class BaseAttachmentProvider(val imageContentRenderer: ImageContentRenderer, val fileService: FileService) : AttachmentSourceProvider { +abstract class BaseAttachmentProvider( + private val imageContentRenderer: ImageContentRenderer, + protected val fileService: FileService +) : AttachmentSourceProvider { interface InteractionListener { fun onDismissTapped() diff --git a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt index 085153a721..70305f2fd8 100644 --- a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt @@ -31,7 +31,6 @@ import java.io.File class DataAttachmentRoomProvider( private val attachments: List, private val room: Room?, - private val initialIndex: Int, imageContentRenderer: ImageContentRenderer, private val dateFormatter: VectorDateFormatter, fileService: FileService) : BaseAttachmentProvider(imageContentRenderer, fileService) { diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index 5c0c33d078..574751ec36 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -40,7 +40,6 @@ import javax.inject.Inject class RoomEventsAttachmentProvider( private val attachments: List, - private val initialIndex: Int, imageContentRenderer: ImageContentRenderer, private val dateFormatter: VectorDateFormatter, fileService: FileService @@ -167,11 +166,11 @@ class AttachmentProviderFactory @Inject constructor( private val session: Session ) { - fun createProvider(attachments: List, initialIndex: Int): RoomEventsAttachmentProvider { - return RoomEventsAttachmentProvider(attachments, initialIndex, imageContentRenderer, vectorDateFormatter, session.fileService()) + fun createProvider(attachments: List): RoomEventsAttachmentProvider { + return RoomEventsAttachmentProvider(attachments, imageContentRenderer, vectorDateFormatter, session.fileService()) } - fun createProvider(attachments: List, room: Room?, initialIndex: Int): DataAttachmentRoomProvider { - return DataAttachmentRoomProvider(attachments, room, initialIndex, imageContentRenderer, vectorDateFormatter, session.fileService()) + fun createProvider(attachments: List, room: Room?): DataAttachmentRoomProvider { + return DataAttachmentRoomProvider(attachments, room, imageContentRenderer, vectorDateFormatter, session.fileService()) } } diff --git a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt index 9302be502d..92b0e0c14c 100644 --- a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt @@ -118,7 +118,7 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen val inMemoryData = intent.getParcelableArrayListExtra(EXTRA_IN_MEMORY_DATA) if (inMemoryData != null) { - val sourceProvider = dataSourceFactory.createProvider(inMemoryData, room, initialIndex) + val sourceProvider = dataSourceFactory.createProvider(inMemoryData, room) val index = inMemoryData.indexOfFirst { it.eventId == args.eventId } initialIndex = index sourceProvider.interactionListener = this @@ -137,7 +137,7 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen val index = events.indexOfFirst { it.eventId == args.eventId } initialIndex = index - val sourceProvider = dataSourceFactory.createProvider(events, index) + val sourceProvider = dataSourceFactory.createProvider(events) sourceProvider.interactionListener = this setSourceProvider(sourceProvider) this.currentSourceProvider = sourceProvider From 345e8a067987a89629510918a44cc4fda5abbd0e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:06:51 +0100 Subject: [PATCH 02/10] i18n --- .../features/media/BaseAttachmentProvider.kt | 4 ++- .../media/DataAttachmentRoomProvider.kt | 11 +++++-- .../media/RoomEventsAttachmentProvider.kt | 30 +++++++++++++++---- vector/src/main/res/values/strings.xml | 2 ++ 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt index f99ed2e324..f8ffe99b77 100644 --- a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt @@ -22,6 +22,7 @@ import android.view.View import android.widget.ImageView import com.bumptech.glide.request.target.CustomViewTarget import com.bumptech.glide.request.transition.Transition +import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo import im.vector.lib.attachmentviewer.AttachmentSourceProvider import im.vector.lib.attachmentviewer.ImageLoaderTarget @@ -32,7 +33,8 @@ import java.io.File abstract class BaseAttachmentProvider( private val imageContentRenderer: ImageContentRenderer, - protected val fileService: FileService + protected val fileService: FileService, + protected val stringProvider: StringProvider ) : AttachmentSourceProvider { interface InteractionListener { diff --git a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt index 70305f2fd8..289e9912dc 100644 --- a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt @@ -19,8 +19,10 @@ package im.vector.app.features.media import android.content.Context import android.view.View import androidx.core.view.isVisible +import im.vector.app.R import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter +import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.events.model.isVideoMessage @@ -33,7 +35,9 @@ class DataAttachmentRoomProvider( private val room: Room?, imageContentRenderer: ImageContentRenderer, private val dateFormatter: VectorDateFormatter, - fileService: FileService) : BaseAttachmentProvider(imageContentRenderer, fileService) { + fileService: FileService, + stringProvider: StringProvider +) : BaseAttachmentProvider(imageContentRenderer, fileService, stringProvider) { override fun getItemCount(): Int = attachments.size @@ -78,7 +82,10 @@ class DataAttachmentRoomProvider( val timeLineEvent = room?.getTimeLineEvent(item.eventId) if (timeLineEvent != null) { val dateString = dateFormatter.format(timeLineEvent.root.originServerTs, DateFormatKind.DEFAULT_DATE_AND_TIME) - overlayView?.updateWith("${position + 1} of ${attachments.size}", "${timeLineEvent.senderInfo.displayName} $dateString") + overlayView?.updateWith( + counter = stringProvider.getString(R.string.attachment_viewer_item_x_of_y, position + 1, attachments.size), + senderInfo = "${timeLineEvent.senderInfo.displayName} $dateString" + ) overlayView?.videoControlsGroup?.isVisible = timeLineEvent.root.isVideoMessage() } else { overlayView?.updateWith("", "") diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index 574751ec36..caaaabb4b3 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -19,8 +19,10 @@ package im.vector.app.features.media import android.content.Context import android.view.View import androidx.core.view.isVisible +import im.vector.app.R import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter +import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.Session @@ -42,8 +44,9 @@ class RoomEventsAttachmentProvider( private val attachments: List, imageContentRenderer: ImageContentRenderer, private val dateFormatter: VectorDateFormatter, - fileService: FileService -) : BaseAttachmentProvider(imageContentRenderer, fileService) { + fileService: FileService, + stringProvider: StringProvider +) : BaseAttachmentProvider(imageContentRenderer, fileService, stringProvider) { override fun getItemCount(): Int { return attachments.size @@ -128,7 +131,10 @@ class RoomEventsAttachmentProvider( super.overlayViewAtPosition(context, position) val item = attachments[position] val dateString = dateFormatter.format(item.root.originServerTs, DateFormatKind.DEFAULT_DATE_AND_TIME) - overlayView?.updateWith("${position + 1} of ${attachments.size}", "${item.senderInfo.displayName} $dateString") + overlayView?.updateWith( + counter = stringProvider.getString(R.string.attachment_viewer_item_x_of_y, position + 1, attachments.size), + senderInfo = "${item.senderInfo.displayName} $dateString" + ) overlayView?.videoControlsGroup?.isVisible = item.root.isVideoMessage() return overlayView } @@ -163,14 +169,28 @@ class RoomEventsAttachmentProvider( class AttachmentProviderFactory @Inject constructor( private val imageContentRenderer: ImageContentRenderer, private val vectorDateFormatter: VectorDateFormatter, + private val stringProvider: StringProvider, private val session: Session ) { fun createProvider(attachments: List): RoomEventsAttachmentProvider { - return RoomEventsAttachmentProvider(attachments, imageContentRenderer, vectorDateFormatter, session.fileService()) + return RoomEventsAttachmentProvider( + attachments, + imageContentRenderer, + vectorDateFormatter, + session.fileService(), + stringProvider + ) } fun createProvider(attachments: List, room: Room?): DataAttachmentRoomProvider { - return DataAttachmentRoomProvider(attachments, room, imageContentRenderer, vectorDateFormatter, session.fileService()) + return DataAttachmentRoomProvider( + attachments, + room, + imageContentRenderer, + vectorDateFormatter, + session.fileService(), + stringProvider + ) } } diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 45d9d40ba6..8ac2b6410d 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1852,6 +1852,8 @@ Rotate and crop Couldn\'t handle share data + %1$d of %2$d + MEDIA There are no media in this room FILES From 816301bf8dad7b9acb163cb27d5e56225625be66 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:09:49 +0100 Subject: [PATCH 03/10] More cleanup --- .../media/VectorAttachmentViewerActivity.kt | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt index 92b0e0c14c..30af1fdd09 100644 --- a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt @@ -119,33 +119,29 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen val inMemoryData = intent.getParcelableArrayListExtra(EXTRA_IN_MEMORY_DATA) if (inMemoryData != null) { val sourceProvider = dataSourceFactory.createProvider(inMemoryData, room) - val index = inMemoryData.indexOfFirst { it.eventId == args.eventId } - initialIndex = index + initialIndex = inMemoryData.indexOfFirst { it.eventId == args.eventId } sourceProvider.interactionListener = this setSourceProvider(sourceProvider) this.currentSourceProvider = sourceProvider if (savedInstanceState == null) { - pager2.setCurrentItem(index, false) + pager2.setCurrentItem(initialIndex, false) // The page change listener is not notified of the change... pager2.post { - onSelectedPositionChanged(index) + onSelectedPositionChanged(initialIndex) } } } else { - val events = room?.getAttachmentMessages() - ?: emptyList() - val index = events.indexOfFirst { it.eventId == args.eventId } - initialIndex = index - + val events = room?.getAttachmentMessages().orEmpty() + initialIndex = events.indexOfFirst { it.eventId == args.eventId } val sourceProvider = dataSourceFactory.createProvider(events) sourceProvider.interactionListener = this setSourceProvider(sourceProvider) this.currentSourceProvider = sourceProvider if (savedInstanceState == null) { - pager2.setCurrentItem(index, false) + pager2.setCurrentItem(initialIndex, false) // The page change listener is not notified of the change... pager2.post { - onSelectedPositionChanged(index) + onSelectedPositionChanged(initialIndex) } } } From 83467b8597adf75e8ff05925d5af2dce67b8ff68 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:12:21 +0100 Subject: [PATCH 04/10] Fix crash on AttachmentViewer (#2365) Not sure how to reproduce it, but if the value is -1, it will crash for sure --- CHANGES.md | 1 + .../app/features/media/VectorAttachmentViewerActivity.kt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 26418c75f1..44f5eee57d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ Improvements 🙌: - Open an existing DM instead of creating a new one (#2319) Bugfix 🐛: + - Fix crash on AttachmentViewer (#2365) - Fix issue when updating the avatar of a room (new avatar vanishing) - Discard change dialog displayed by mistake when avatar has been updated diff --git a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt index 30af1fdd09..778df64ed5 100644 --- a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt @@ -119,7 +119,7 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen val inMemoryData = intent.getParcelableArrayListExtra(EXTRA_IN_MEMORY_DATA) if (inMemoryData != null) { val sourceProvider = dataSourceFactory.createProvider(inMemoryData, room) - initialIndex = inMemoryData.indexOfFirst { it.eventId == args.eventId } + initialIndex = inMemoryData.indexOfFirst { it.eventId == args.eventId }.coerceAtLeast(0) sourceProvider.interactionListener = this setSourceProvider(sourceProvider) this.currentSourceProvider = sourceProvider @@ -132,7 +132,7 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen } } else { val events = room?.getAttachmentMessages().orEmpty() - initialIndex = events.indexOfFirst { it.eventId == args.eventId } + initialIndex = events.indexOfFirst { it.eventId == args.eventId }.coerceAtLeast(0) val sourceProvider = dataSourceFactory.createProvider(events) sourceProvider.interactionListener = this setSourceProvider(sourceProvider) From ca70ddb810c7dd19435259160539a2aa013c5328 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:15:42 +0100 Subject: [PATCH 05/10] DRY --- .../media/VectorAttachmentViewerActivity.kt | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt index 778df64ed5..4105a1c55f 100644 --- a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt @@ -70,7 +70,7 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen private var initialIndex = 0 private var isAnimatingOut = false - var currentSourceProvider: BaseAttachmentProvider? = null + private var currentSourceProvider: BaseAttachmentProvider? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -117,32 +117,22 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen val room = args.roomId?.let { session.getRoom(it) } val inMemoryData = intent.getParcelableArrayListExtra(EXTRA_IN_MEMORY_DATA) - if (inMemoryData != null) { - val sourceProvider = dataSourceFactory.createProvider(inMemoryData, room) + val sourceProvider = if (inMemoryData != null) { initialIndex = inMemoryData.indexOfFirst { it.eventId == args.eventId }.coerceAtLeast(0) - sourceProvider.interactionListener = this - setSourceProvider(sourceProvider) - this.currentSourceProvider = sourceProvider - if (savedInstanceState == null) { - pager2.setCurrentItem(initialIndex, false) - // The page change listener is not notified of the change... - pager2.post { - onSelectedPositionChanged(initialIndex) - } - } + dataSourceFactory.createProvider(inMemoryData, room) } else { val events = room?.getAttachmentMessages().orEmpty() initialIndex = events.indexOfFirst { it.eventId == args.eventId }.coerceAtLeast(0) - val sourceProvider = dataSourceFactory.createProvider(events) - sourceProvider.interactionListener = this - setSourceProvider(sourceProvider) - this.currentSourceProvider = sourceProvider - if (savedInstanceState == null) { - pager2.setCurrentItem(initialIndex, false) - // The page change listener is not notified of the change... - pager2.post { - onSelectedPositionChanged(initialIndex) - } + dataSourceFactory.createProvider(events) + } + sourceProvider.interactionListener = this + setSourceProvider(sourceProvider) + currentSourceProvider = sourceProvider + if (savedInstanceState == null) { + pager2.setCurrentItem(initialIndex, false) + // The page change listener is not notified of the change... + pager2.post { + onSelectedPositionChanged(initialIndex) } } @@ -274,7 +264,7 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen } override fun onShareTapped() { - this.currentSourceProvider?.getFileForSharing(currentPosition) { data -> + currentSourceProvider?.getFileForSharing(currentPosition) { data -> if (data != null && lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { shareMedia(this@VectorAttachmentViewerActivity, data, getMimeTypeFromUri(this@VectorAttachmentViewerActivity, data.toUri())) } From 510f8ae0f54df7c49baa08917bb645cbd5d4c841 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:23:22 +0100 Subject: [PATCH 06/10] DRY --- .../features/media/BaseAttachmentProvider.kt | 26 ++++++++++++++++-- .../media/DataAttachmentRoomProvider.kt | 27 ++++--------------- .../media/RoomEventsAttachmentProvider.kt | 22 +++------------ 3 files changed, 33 insertions(+), 42 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt index f8ffe99b77..d77f8ad0e2 100644 --- a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt @@ -20,21 +20,28 @@ import android.content.Context import android.graphics.drawable.Drawable import android.view.View import android.widget.ImageView +import androidx.core.view.isVisible import com.bumptech.glide.request.target.CustomViewTarget import com.bumptech.glide.request.transition.Transition +import im.vector.app.R +import im.vector.app.core.date.DateFormatKind +import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo import im.vector.lib.attachmentviewer.AttachmentSourceProvider import im.vector.lib.attachmentviewer.ImageLoaderTarget import im.vector.lib.attachmentviewer.VideoLoaderTarget import org.matrix.android.sdk.api.MatrixCallback +import org.matrix.android.sdk.api.session.events.model.isVideoMessage import org.matrix.android.sdk.api.session.file.FileService +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import java.io.File abstract class BaseAttachmentProvider( private val imageContentRenderer: ImageContentRenderer, protected val fileService: FileService, - protected val stringProvider: StringProvider + private val dateFormatter: VectorDateFormatter, + private val stringProvider: StringProvider ) : AttachmentSourceProvider { interface InteractionListener { @@ -48,7 +55,7 @@ abstract class BaseAttachmentProvider( protected var overlayView: AttachmentOverlayView? = null - override fun overlayViewAtPosition(context: Context, position: Int): View? { + final override fun overlayViewAtPosition(context: Context, position: Int): View? { if (position == -1) return null if (overlayView == null) { overlayView = AttachmentOverlayView(context) @@ -65,9 +72,24 @@ abstract class BaseAttachmentProvider( interactionListener?.videoSeekTo(percent) } } + + val timelineEvent = getTimelineEventAtPosition(position) + if (timelineEvent != null) { + val dateString = dateFormatter.format(timelineEvent.root.originServerTs, DateFormatKind.DEFAULT_DATE_AND_TIME) + overlayView?.updateWith( + counter = stringProvider.getString(R.string.attachment_viewer_item_x_of_y, position + 1, getItemCount()), + senderInfo = "${timelineEvent.senderInfo.displayName} $dateString" + ) + overlayView?.videoControlsGroup?.isVisible = timelineEvent.root.isVideoMessage() + } else { + overlayView?.updateWith("", "") + } + return overlayView } + abstract fun getTimelineEventAtPosition(position: Int): TimelineEvent? + override fun loadImage(target: ImageLoaderTarget, info: AttachmentInfo.Image) { (info.data as? ImageContentRenderer.Data)?.let { imageContentRenderer.render(it, target.contextView(), object : CustomViewTarget(target.contextView()) { diff --git a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt index 289e9912dc..57587b8db2 100644 --- a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt @@ -16,28 +16,23 @@ package im.vector.app.features.media -import android.content.Context -import android.view.View -import androidx.core.view.isVisible -import im.vector.app.R -import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.session.events.model.isVideoMessage import org.matrix.android.sdk.api.session.file.FileService import org.matrix.android.sdk.api.session.room.Room +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import java.io.File class DataAttachmentRoomProvider( private val attachments: List, private val room: Room?, imageContentRenderer: ImageContentRenderer, - private val dateFormatter: VectorDateFormatter, + dateFormatter: VectorDateFormatter, fileService: FileService, stringProvider: StringProvider -) : BaseAttachmentProvider(imageContentRenderer, fileService, stringProvider) { +) : BaseAttachmentProvider(imageContentRenderer, fileService, dateFormatter, stringProvider) { override fun getItemCount(): Int = attachments.size @@ -76,21 +71,9 @@ class DataAttachmentRoomProvider( } } - override fun overlayViewAtPosition(context: Context, position: Int): View? { - super.overlayViewAtPosition(context, position) + override fun getTimelineEventAtPosition(position: Int): TimelineEvent? { val item = attachments[position] - val timeLineEvent = room?.getTimeLineEvent(item.eventId) - if (timeLineEvent != null) { - val dateString = dateFormatter.format(timeLineEvent.root.originServerTs, DateFormatKind.DEFAULT_DATE_AND_TIME) - overlayView?.updateWith( - counter = stringProvider.getString(R.string.attachment_viewer_item_x_of_y, position + 1, attachments.size), - senderInfo = "${timeLineEvent.senderInfo.displayName} $dateString" - ) - overlayView?.videoControlsGroup?.isVisible = timeLineEvent.root.isVideoMessage() - } else { - overlayView?.updateWith("", "") - } - return overlayView + return room?.getTimeLineEvent(item.eventId) } override fun getFileForSharing(position: Int, callback: (File?) -> Unit) { diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index caaaabb4b3..13224c5626 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -16,17 +16,11 @@ package im.vector.app.features.media -import android.content.Context -import android.view.View -import androidx.core.view.isVisible -import im.vector.app.R -import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.events.model.isVideoMessage import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.file.FileService import org.matrix.android.sdk.api.session.room.Room @@ -43,10 +37,10 @@ import javax.inject.Inject class RoomEventsAttachmentProvider( private val attachments: List, imageContentRenderer: ImageContentRenderer, - private val dateFormatter: VectorDateFormatter, + dateFormatter: VectorDateFormatter, fileService: FileService, stringProvider: StringProvider -) : BaseAttachmentProvider(imageContentRenderer, fileService, stringProvider) { +) : BaseAttachmentProvider(imageContentRenderer, fileService, dateFormatter, stringProvider) { override fun getItemCount(): Int { return attachments.size @@ -127,16 +121,8 @@ class RoomEventsAttachmentProvider( } } - override fun overlayViewAtPosition(context: Context, position: Int): View? { - super.overlayViewAtPosition(context, position) - val item = attachments[position] - val dateString = dateFormatter.format(item.root.originServerTs, DateFormatKind.DEFAULT_DATE_AND_TIME) - overlayView?.updateWith( - counter = stringProvider.getString(R.string.attachment_viewer_item_x_of_y, position + 1, attachments.size), - senderInfo = "${item.senderInfo.displayName} $dateString" - ) - overlayView?.videoControlsGroup?.isVisible = item.root.isVideoMessage() - return overlayView + override fun getTimelineEventAtPosition(position: Int): TimelineEvent? { + return attachments[position] } override fun getFileForSharing(position: Int, callback: (File?) -> Unit) { From bfcd4b82504b6c4c1fc1d10095553242ad2a4bbd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:26:59 +0100 Subject: [PATCH 07/10] Extract AttachmentProviderFactory to its own file --- .../media/AttachmentProviderFactory.kt | 53 +++++++++++++++++++ .../media/RoomEventsAttachmentProvider.kt | 31 ----------- 2 files changed, 53 insertions(+), 31 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt diff --git a/vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt b/vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt new file mode 100644 index 0000000000..b549e01551 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/media/AttachmentProviderFactory.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.media + +import im.vector.app.core.date.VectorDateFormatter +import im.vector.app.core.resources.StringProvider +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.room.Room +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent +import javax.inject.Inject + +class AttachmentProviderFactory @Inject constructor( + private val imageContentRenderer: ImageContentRenderer, + private val vectorDateFormatter: VectorDateFormatter, + private val stringProvider: StringProvider, + private val session: Session +) { + + fun createProvider(attachments: List): RoomEventsAttachmentProvider { + return RoomEventsAttachmentProvider( + attachments, + imageContentRenderer, + vectorDateFormatter, + session.fileService(), + stringProvider + ) + } + + fun createProvider(attachments: List, room: Room?): DataAttachmentRoomProvider { + return DataAttachmentRoomProvider( + attachments, + room, + imageContentRenderer, + vectorDateFormatter, + session.fileService(), + stringProvider + ) + } +} diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index 13224c5626..4ffd416011 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -20,10 +20,8 @@ import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.StringProvider import im.vector.lib.attachmentviewer.AttachmentInfo import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.file.FileService -import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.model.message.MessageImageContent import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent @@ -32,7 +30,6 @@ import org.matrix.android.sdk.api.session.room.model.message.getFileUrl import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.internal.crypto.attachments.toElementToDecrypt import java.io.File -import javax.inject.Inject class RoomEventsAttachmentProvider( private val attachments: List, @@ -152,31 +149,3 @@ class RoomEventsAttachmentProvider( } } -class AttachmentProviderFactory @Inject constructor( - private val imageContentRenderer: ImageContentRenderer, - private val vectorDateFormatter: VectorDateFormatter, - private val stringProvider: StringProvider, - private val session: Session -) { - - fun createProvider(attachments: List): RoomEventsAttachmentProvider { - return RoomEventsAttachmentProvider( - attachments, - imageContentRenderer, - vectorDateFormatter, - session.fileService(), - stringProvider - ) - } - - fun createProvider(attachments: List, room: Room?): DataAttachmentRoomProvider { - return DataAttachmentRoomProvider( - attachments, - room, - imageContentRenderer, - vectorDateFormatter, - session.fileService(), - stringProvider - ) - } -} From 45e534bbf50a1884a0a0cee1f8f7a15934967181 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:33:24 +0100 Subject: [PATCH 08/10] DRY again --- .../vector/app/features/media/BaseAttachmentProvider.kt | 7 +++++-- .../app/features/media/DataAttachmentRoomProvider.kt | 6 ++---- .../app/features/media/RoomEventsAttachmentProvider.kt | 8 ++------ 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt index d77f8ad0e2..208d5e28f8 100644 --- a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt @@ -37,7 +37,8 @@ import org.matrix.android.sdk.api.session.file.FileService import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import java.io.File -abstract class BaseAttachmentProvider( +abstract class BaseAttachmentProvider( + protected val attachments: List, private val imageContentRenderer: ImageContentRenderer, protected val fileService: FileService, private val dateFormatter: VectorDateFormatter, @@ -53,7 +54,9 @@ abstract class BaseAttachmentProvider( var interactionListener: InteractionListener? = null - protected var overlayView: AttachmentOverlayView? = null + private var overlayView: AttachmentOverlayView? = null + + final override fun getItemCount() = attachments.size final override fun overlayViewAtPosition(context: Context, position: Int): View? { if (position == -1) return null diff --git a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt index 57587b8db2..02b9c034e9 100644 --- a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt @@ -26,15 +26,13 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import java.io.File class DataAttachmentRoomProvider( - private val attachments: List, + attachments: List, private val room: Room?, imageContentRenderer: ImageContentRenderer, dateFormatter: VectorDateFormatter, fileService: FileService, stringProvider: StringProvider -) : BaseAttachmentProvider(imageContentRenderer, fileService, dateFormatter, stringProvider) { - - override fun getItemCount(): Int = attachments.size +) : BaseAttachmentProvider(attachments, imageContentRenderer, fileService, dateFormatter, stringProvider) { override fun getAttachmentInfoAt(position: Int): AttachmentInfo { return attachments[position].let { diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index 4ffd416011..da6cc5d570 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -32,16 +32,12 @@ import org.matrix.android.sdk.internal.crypto.attachments.toElementToDecrypt import java.io.File class RoomEventsAttachmentProvider( - private val attachments: List, + attachments: List, imageContentRenderer: ImageContentRenderer, dateFormatter: VectorDateFormatter, fileService: FileService, stringProvider: StringProvider -) : BaseAttachmentProvider(imageContentRenderer, fileService, dateFormatter, stringProvider) { - - override fun getItemCount(): Int { - return attachments.size - } +) : BaseAttachmentProvider(attachments, imageContentRenderer, fileService, dateFormatter, stringProvider) { override fun getAttachmentInfoAt(position: Int): AttachmentInfo { return attachments[position].let { From f57fc827feeaa37753221f0d1167f9dd954f8ff2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 15:36:22 +0100 Subject: [PATCH 09/10] Last cleanup --- .../im/vector/app/features/media/BaseAttachmentProvider.kt | 4 +++- .../app/features/media/DataAttachmentRoomProvider.kt | 6 +++--- .../app/features/media/RoomEventsAttachmentProvider.kt | 7 +++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt index 208d5e28f8..e23b905919 100644 --- a/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/BaseAttachmentProvider.kt @@ -38,7 +38,7 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import java.io.File abstract class BaseAttachmentProvider( - protected val attachments: List, + private val attachments: List, private val imageContentRenderer: ImageContentRenderer, protected val fileService: FileService, private val dateFormatter: VectorDateFormatter, @@ -58,6 +58,8 @@ abstract class BaseAttachmentProvider( final override fun getItemCount() = attachments.size + protected fun getItem(position: Int) = attachments[position] + final override fun overlayViewAtPosition(context: Context, position: Int): View? { if (position == -1) return null if (overlayView == null) { diff --git a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt index 02b9c034e9..18312b4aa0 100644 --- a/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/DataAttachmentRoomProvider.kt @@ -35,7 +35,7 @@ class DataAttachmentRoomProvider( ) : BaseAttachmentProvider(attachments, imageContentRenderer, fileService, dateFormatter, stringProvider) { override fun getAttachmentInfoAt(position: Int): AttachmentInfo { - return attachments[position].let { + return getItem(position).let { when (it) { is ImageContentRenderer.Data -> { if (it.mimeType == "image/gif") { @@ -70,12 +70,12 @@ class DataAttachmentRoomProvider( } override fun getTimelineEventAtPosition(position: Int): TimelineEvent? { - val item = attachments[position] + val item = getItem(position) return room?.getTimeLineEvent(item.eventId) } override fun getFileForSharing(position: Int, callback: (File?) -> Unit) { - val item = attachments[position] + val item = getItem(position) fileService.downloadFile( downloadMode = FileService.DownloadMode.FOR_EXTERNAL_SHARE, id = item.eventId, diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index da6cc5d570..1e2761dde0 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -40,7 +40,7 @@ class RoomEventsAttachmentProvider( ) : BaseAttachmentProvider(attachments, imageContentRenderer, fileService, dateFormatter, stringProvider) { override fun getAttachmentInfoAt(position: Int): AttachmentInfo { - return attachments[position].let { + return getItem(position).let { val content = it.root.getClearContent().toModel() as? MessageWithAttachmentContent if (content is MessageImageContent) { val data = ImageContentRenderer.Data( @@ -115,11 +115,11 @@ class RoomEventsAttachmentProvider( } override fun getTimelineEventAtPosition(position: Int): TimelineEvent? { - return attachments[position] + return getItem(position) } override fun getFileForSharing(position: Int, callback: (File?) -> Unit) { - attachments[position].let { timelineEvent -> + getItem(position).let { timelineEvent -> val messageContent = timelineEvent.root.getClearContent().toModel() as? MessageWithAttachmentContent @@ -144,4 +144,3 @@ class RoomEventsAttachmentProvider( } } } - From d1848fd5f7d69ef24fcb9f0e20e2c899d7a5813d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Nov 2020 16:01:19 +0100 Subject: [PATCH 10/10] Fix compilation issue :) --- .../vector/app/features/media/VectorAttachmentViewerActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt index 4105a1c55f..e7f4806e31 100644 --- a/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/media/VectorAttachmentViewerActivity.kt @@ -70,7 +70,7 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), BaseAttachmen private var initialIndex = 0 private var isAnimatingOut = false - private var currentSourceProvider: BaseAttachmentProvider? = null + private var currentSourceProvider: BaseAttachmentProvider<*>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)