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 a92c31424e..fcb693e79d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java @@ -27,6 +27,7 @@ import androidx.annotation.Nullable; import androidx.annotation.Px; import androidx.annotation.UiThread; import androidx.appcompat.widget.AppCompatImageView; +import com.google.android.material.color.MaterialColors; import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.RequestManager; @@ -347,6 +348,7 @@ public class ThumbnailView extends FrameLayout { transferControlViewStub.setVisibility(View.GONE); playOverlay.setVisibility(View.GONE); + setBackgroundColor(Color.TRANSPARENT); requestManager.clear(blurHash); blurHash.setImageDrawable(null); @@ -488,6 +490,12 @@ public class ThumbnailView extends FrameLayout { image.setImageDrawable(null); } + if (slide.getTransferState() == AttachmentTable.TRANSFER_RESTORE_OFFLOADED && slide.getDisplayUri() == null) { + setBackgroundColor(MaterialColors.getColor(this, com.google.android.material.R.attr.colorSurfaceVariant, Color.GRAY)); + } else { + setBackgroundColor(Color.TRANSPARENT); + } + if (!resultHandled) { result.set(false); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 736478041a..8426a0b02d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -718,7 +718,9 @@ class ConversationSettingsFragment : mediaRecords = state.sharedMedia, mediaIds = state.sharedMediaIds, onMediaRecordClick = { view, mediaRecord, isLtr -> - if (mediaRecord.attachment?.transferState != AttachmentTable.TRANSFER_PROGRESS_DONE) { + if (mediaRecord.attachment?.transferState != AttachmentTable.TRANSFER_PROGRESS_DONE && + mediaRecord.attachment?.transferState != AttachmentTable.TRANSFER_RESTORE_OFFLOADED + ) { Toast.makeText(context, R.string.ConversationSettingsFragment__this_media_is_not_sent_yet, Toast.LENGTH_LONG).show() return@Model } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt index 6439350075..d9b2d4816b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt @@ -109,8 +109,8 @@ class MediaTable internal constructor(context: Context?, databaseHelper: SignalD private val GALLERY_MEDIA_QUERY_INCLUDING_TEMP_VIDEOS = String.format( BASE_MEDIA_QUERY, """ - (${AttachmentTable.DATA_FILE} IS NOT NULL OR (${AttachmentTable.CONTENT_TYPE} LIKE 'video/%' AND ${AttachmentTable.REMOTE_INCREMENTAL_DIGEST} IS NOT NULL) OR (${AttachmentTable.THUMBNAIL_FILE} IS NOT NULL)) AND - ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'image/svg%' AND + (${AttachmentTable.DATA_FILE} IS NOT NULL OR (${AttachmentTable.CONTENT_TYPE} LIKE 'video/%' AND ${AttachmentTable.REMOTE_INCREMENTAL_DIGEST} IS NOT NULL) OR ${AttachmentTable.THUMBNAIL_FILE} IS NOT NULL OR ${AttachmentTable.TRANSFER_STATE} = ${AttachmentTable.TRANSFER_RESTORE_OFFLOADED}) AND + ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'image/svg%' AND (${AttachmentTable.CONTENT_TYPE} LIKE 'image/%' OR ${AttachmentTable.CONTENT_TYPE} LIKE 'video/%') AND ${MessageTable.LINK_PREVIEWS} IS NULL AND ${MessageTable.SCHEDULED_DATE} < 0 @@ -120,7 +120,7 @@ class MediaTable internal constructor(context: Context?, databaseHelper: SignalD private val AUDIO_MEDIA_QUERY = String.format( BASE_MEDIA_QUERY, """ - ${AttachmentTable.DATA_FILE} IS NOT NULL AND + (${AttachmentTable.DATA_FILE} IS NOT NULL OR ${AttachmentTable.TRANSFER_STATE} = ${AttachmentTable.TRANSFER_RESTORE_OFFLOADED}) AND ${AttachmentTable.CONTENT_TYPE} LIKE 'audio/%' AND ${MessageTable.SCHEDULED_DATE} < 0 """ @@ -129,7 +129,7 @@ class MediaTable internal constructor(context: Context?, databaseHelper: SignalD private val ALL_MEDIA_QUERY = String.format( BASE_MEDIA_QUERY, """ - ${AttachmentTable.DATA_FILE} IS NOT NULL AND + (${AttachmentTable.DATA_FILE} IS NOT NULL OR ${AttachmentTable.TRANSFER_STATE} = ${AttachmentTable.TRANSFER_RESTORE_OFFLOADED}) AND ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'text/x-signal-plain' AND ${MessageTable.LINK_PREVIEWS} IS NULL AND ${MessageTable.SCHEDULED_DATE} < 0 @@ -203,13 +203,13 @@ class MediaTable internal constructor(context: Context?, databaseHelper: SignalD private val DOCUMENT_MEDIA_QUERY = String.format( BASE_MEDIA_QUERY, """ - ${AttachmentTable.DATA_FILE} IS NOT NULL AND + (${AttachmentTable.DATA_FILE} IS NOT NULL OR ${AttachmentTable.TRANSFER_STATE} = ${AttachmentTable.TRANSFER_RESTORE_OFFLOADED}) AND ( - ${AttachmentTable.CONTENT_TYPE} LIKE 'image/svg%' OR + ${AttachmentTable.CONTENT_TYPE} LIKE 'image/svg%' OR ( - ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'image/%' AND - ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'video/%' AND - ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'audio/%' AND + ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'image/%' AND + ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'video/%' AND + ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'audio/%' AND ${AttachmentTable.CONTENT_TYPE} NOT LIKE 'text/x-signal-plain' AND ${MessageTable.SCHEDULED_DATE} < 0 ) @@ -232,9 +232,6 @@ class MediaTable internal constructor(context: Context?, databaseHelper: SignalD } private fun applyIndexHint(query: String, threadId: Long, sorting: Sorting): String { - if (threadId == ALL_THREADS.toLong() && sorting == Sorting.Largest) { - return query.replace("__INDEX_HINT__", "INDEXED BY attachment_media_overview_size") - } return query.replace("__INDEX_HINT__", "") } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java index ef0ec32ed0..3547307463 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java @@ -58,6 +58,7 @@ import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob; import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.MediaUtil; import org.signal.core.util.Util; @@ -584,6 +585,11 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { audioItemListener.unregisterPlaybackStateObserver(audioView.getPlaybackStateObserver()); audioView.setAudio((AudioSlide) slide, new AudioViewCallbacksAdapter(audioItemListener, mmsId), true, true); + audioView.setDownloadClickListener((v, s) -> { + if (s.asAttachment() instanceof DatabaseAttachment) { + AttachmentDownloadJob.downloadAttachmentIfNeeded((DatabaseAttachment) s.asAttachment()); + } + }); audioItemListener.registerPlaybackStateObserver(audioView.getPlaybackStateObserver()); audioView.setOnClickListener(view -> itemClickListener.onMediaClicked(audioView, mediaRecord));