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
This commit is contained in:
Greyson Parrelli
2025-02-26 12:44:01 -05:00
committed by Alex Hart
parent 4e07ac0300
commit 9432cca14a
2 changed files with 21 additions and 3 deletions

View File

@@ -47,6 +47,7 @@ import org.thoughtcrime.securesms.components.transfercontrols.TransferControlVie
import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri;
import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.ImageSlide;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.mms.SlideClickListener; import org.thoughtcrime.securesms.mms.SlideClickListener;
import org.thoughtcrime.securesms.mms.SlidesClickedListener; import org.thoughtcrime.securesms.mms.SlidesClickedListener;
@@ -488,7 +489,12 @@ public class ThumbnailView extends FrameLayout {
transferControlViewStub.setVisibility(View.GONE); transferControlViewStub.setVisibility(View.GONE);
RequestBuilder<Drawable> request = requestManager.load(new DecryptableUri(uri)) Object glideModel = uri;
if (PartAuthority.isLocalUri(uri)) {
glideModel = new DecryptableUri(uri);
}
RequestBuilder<Drawable> request = requestManager.load(glideModel)
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE) .downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE)
.listener(listener); .listener(listener);

View File

@@ -2,12 +2,14 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.view.setPadding import androidx.core.view.setPadding
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target 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.Media
import org.thoughtcrime.securesms.mediasend.MediaFolder import org.thoughtcrime.securesms.mediasend.MediaFolder
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader
import org.thoughtcrime.securesms.mms.PartAuthority
import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter 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<T : MappingModel<T>>(itemView: View) : MappingViewHolder<T>(itemView) { abstract class BaseViewHolder<T : MappingModel<T>>(itemView: View) : MappingViewHolder<T>(itemView) {
protected val imageView: ShapeableImageView = itemView.findViewById(R.id.media_gallery_image) protected val imageView: ShapeableImageView = itemView.findViewById(R.id.media_gallery_image)
protected val playOverlay: ImageView? = itemView.findViewById(R.id.media_gallery_play_overlay) 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<FolderModel>(itemView) { class FolderViewHolder(itemView: View, private val onMediaFolderClicked: OnMediaFolderClicked) : BaseViewHolder<FolderModel>(itemView) {
override fun bind(model: FolderModel) { override fun bind(model: FolderModel) {
Glide.with(imageView) Glide.with(imageView)
.load(DecryptableStreamUriLoader.DecryptableUri(model.mediaFolder.thumbnailUri)) .load(model.mediaFolder.thumbnailUri.toGlideModel())
.into(imageView) .into(imageView)
playOverlay?.visible = false playOverlay?.visible = false
@@ -131,7 +142,8 @@ object MediaGallerySelectableItem {
} }
Glide.with(imageView) Glide.with(imageView)
.load(DecryptableStreamUriLoader.DecryptableUri(model.media.uri)) .load(model.media.uri.toGlideModel())
.diskCacheStrategy(DiskCacheStrategy.ALL)
.addListener(ErrorLoggingRequestListener(FILE_VIEW_HOLDER_TAG)) .addListener(ErrorLoggingRequestListener(FILE_VIEW_HOLDER_TAG))
.into(imageView) .into(imageView)
} }