From 9432cca14a5dc3d7af866c440e87d32af4f89ca0 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 26 Feb 2025 12:44:01 -0500 Subject: [PATCH] Fix some media not appearing in the gallery picker. Works around the glide issue by using the straight URI when possible, which allows glide to not have to keep a buffer. However, as soon as you select it, it'll be an encrypted file, and we'll run into this same issue where glide needs to keep a buffer for the input stream. Related to #11014 --- .../securesms/components/ThumbnailView.java | 8 +++++++- .../v2/gallery/MediaGallerySelectableItem.kt | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java index bb1fd6ee37..9e7f9fc6f7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java @@ -47,6 +47,7 @@ import org.thoughtcrime.securesms.components.transfercontrols.TransferControlVie import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; import org.thoughtcrime.securesms.mms.ImageSlide; +import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideClickListener; import org.thoughtcrime.securesms.mms.SlidesClickedListener; @@ -488,7 +489,12 @@ public class ThumbnailView extends FrameLayout { transferControlViewStub.setVisibility(View.GONE); - RequestBuilder request = requestManager.load(new DecryptableUri(uri)) + Object glideModel = uri; + if (PartAuthority.isLocalUri(uri)) { + glideModel = new DecryptableUri(uri); + } + + RequestBuilder request = requestManager.load(glideModel) .diskCacheStrategy(DiskCacheStrategy.NONE) .downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE) .listener(listener); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt index 46b717207d..14567500cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt @@ -2,12 +2,14 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery import android.animation.ValueAnimator import android.graphics.drawable.Drawable +import android.net.Uri import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.core.view.setPadding import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target @@ -18,6 +20,7 @@ import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaFolder import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader +import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter @@ -66,6 +69,14 @@ object MediaGallerySelectableItem { } } + private fun Uri.toGlideModel(): Any { + return if (PartAuthority.isLocalUri(this)) { + DecryptableStreamUriLoader.DecryptableUri(this) + } else { + this + } + } + abstract class BaseViewHolder>(itemView: View) : MappingViewHolder(itemView) { protected val imageView: ShapeableImageView = itemView.findViewById(R.id.media_gallery_image) protected val playOverlay: ImageView? = itemView.findViewById(R.id.media_gallery_play_overlay) @@ -76,7 +87,7 @@ object MediaGallerySelectableItem { class FolderViewHolder(itemView: View, private val onMediaFolderClicked: OnMediaFolderClicked) : BaseViewHolder(itemView) { override fun bind(model: FolderModel) { Glide.with(imageView) - .load(DecryptableStreamUriLoader.DecryptableUri(model.mediaFolder.thumbnailUri)) + .load(model.mediaFolder.thumbnailUri.toGlideModel()) .into(imageView) playOverlay?.visible = false @@ -131,7 +142,8 @@ object MediaGallerySelectableItem { } Glide.with(imageView) - .load(DecryptableStreamUriLoader.DecryptableUri(model.media.uri)) + .load(model.media.uri.toGlideModel()) + .diskCacheStrategy(DiskCacheStrategy.ALL) .addListener(ErrorLoggingRequestListener(FILE_VIEW_HOLDER_TAG)) .into(imageView) }