From 8bc0afa75e5cd601650b8ac60bafc608a5de421f Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 24 Sep 2020 11:29:07 +0200 Subject: [PATCH] Timeline: add glide preloading --- vector/build.gradle | 1 + .../home/room/detail/RoomDetailFragment.kt | 17 ++++++++++++++++- .../app/features/media/ImageContentRenderer.kt | 18 +++++++++--------- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/vector/build.gradle b/vector/build.gradle index 0c7985b45d..30ca90e1d8 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -326,6 +326,7 @@ dependencies { implementation 'com.jakewharton.rxbinding3:rxbinding-material:3.0.0' implementation("com.airbnb.android:epoxy:$epoxy_version") + implementation "com.airbnb.android:epoxy-glide-preloading:$epoxy_version" kapt "com.airbnb.android:epoxy-processor:$epoxy_version" implementation "com.airbnb.android:epoxy-paging:$epoxy_version" implementation 'com.airbnb.android:mvrx:1.3.0' 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 7c3ac6011e..d03e6bad1e 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 @@ -53,6 +53,8 @@ import androidx.recyclerview.widget.RecyclerView import butterknife.BindView import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.OnModelBuildFinishedListener +import com.airbnb.epoxy.addGlidePreloader +import com.airbnb.epoxy.glidePreloader import com.airbnb.mvrx.Async import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Loading @@ -75,9 +77,11 @@ import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.extensions.showKeyboard import im.vector.app.core.extensions.trackItemsVisibilityChange import im.vector.app.core.glide.GlideApp +import im.vector.app.core.glide.GlideRequests import im.vector.app.core.intent.getMimeTypeFromUri import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider +import im.vector.app.core.ui.model.Size import im.vector.app.core.ui.views.ActiveCallView import im.vector.app.core.ui.views.ActiveCallViewHolder import im.vector.app.core.ui.views.ActiveConferenceView @@ -218,7 +222,8 @@ class RoomDetailFragment @Inject constructor( private val colorProvider: ColorProvider, private val notificationUtils: NotificationUtils, private val webRtcPeerConnectionManager: WebRtcPeerConnectionManager, - private val matrixItemColorProvider: MatrixItemColorProvider + private val matrixItemColorProvider: MatrixItemColorProvider, + private val imageContentRenderer: ImageContentRenderer ) : VectorBaseFragment(), TimelineEventController.Callback, @@ -921,6 +926,16 @@ class RoomDetailFragment @Inject constructor( val touchHelper = ItemTouchHelper(swipeCallback) touchHelper.attachToRecyclerView(recyclerView) } + recyclerView.addGlidePreloader( + epoxyController = timelineEventController, + requestManager = GlideApp.with(this), + preloader = glidePreloader { requestManager, epoxyModel: MessageImageVideoItem, _ -> + imageContentRenderer.createGlideRequest( + epoxyModel.mediaData, + ImageContentRenderer.Mode.THUMBNAIL, + requestManager as GlideRequests + ) + }) } private fun updateJumpToReadMarkerViewVisibility() { diff --git a/vector/src/main/java/im/vector/app/features/media/ImageContentRenderer.kt b/vector/src/main/java/im/vector/app/features/media/ImageContentRenderer.kt index 0336e2d03c..d6ab24bfbd 100644 --- a/vector/src/main/java/im/vector/app/features/media/ImageContentRenderer.kt +++ b/vector/src/main/java/im/vector/app/features/media/ImageContentRenderer.kt @@ -33,6 +33,7 @@ import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.glide.GlideApp import im.vector.app.core.glide.GlideRequest +import im.vector.app.core.glide.GlideRequests import im.vector.app.core.ui.model.Size import im.vector.app.core.utils.DimensionConverter import im.vector.app.core.utils.isLocalFile @@ -206,12 +207,14 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder: .into(imageView) } - private fun createGlideRequest(data: Data, mode: Mode, imageView: ImageView, size: Size): GlideRequest { + fun createGlideRequest(data: Data, mode: Mode, imageView: ImageView, size: Size): GlideRequest { + return createGlideRequest(data, mode, GlideApp.with(imageView), size) + } + + fun createGlideRequest(data: Data, mode: Mode, glideRequests: GlideRequests, size: Size = processSize(data, mode)): GlideRequest { return if (data.elementToDecrypt != null) { // Encrypted image - GlideApp - .with(imageView) - .load(data) + glideRequests.load(data) } else { // Clear image val contentUrlResolver = activeSessionHolder.getActiveSession().contentUrlResolver() @@ -223,15 +226,12 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder: // Fallback to base url ?: data.url.takeIf { it?.startsWith("content://") == true } - GlideApp - .with(imageView) + glideRequests .load(resolvedUrl) .apply { if (mode == Mode.THUMBNAIL) { error( - GlideApp - .with(imageView) - .load(resolveUrl(data)) + glideRequests.load(resolveUrl(data)) ) } }