Add jump to message shortcut for media viewer.

This commit is contained in:
Nicholas 2022-11-28 11:56:59 -05:00 committed by Cody Henthorne
parent 800405fc3e
commit 21bd8a308b
4 changed files with 52 additions and 2 deletions

View file

@ -1,6 +1,8 @@
package org.thoughtcrime.securesms.mediapreview
import android.content.Context
import android.content.Intent
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Single
@ -9,9 +11,11 @@ import org.signal.core.util.logging.Log
import org.signal.core.util.requireLong
import org.thoughtcrime.securesms.attachments.AttachmentId
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
import org.thoughtcrime.securesms.conversation.ConversationIntents
import org.thoughtcrime.securesms.database.AttachmentDatabase
import org.thoughtcrime.securesms.database.MediaDatabase
import org.thoughtcrime.securesms.database.MediaDatabase.Sorting
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.media
import org.thoughtcrime.securesms.sms.MessageSender
import org.thoughtcrime.securesms.util.AttachmentUtil
@ -81,5 +85,17 @@ class MediaPreviewRepository {
}.subscribeOn(Schedulers.io())
}
fun getMessagePositionIntent(context: Context, messageId: Long): Single<Intent> {
return Single.fromCallable {
val messageRecord = SignalDatabase.mms.getMessageRecord(messageId)
val messagePosition = SignalDatabase.mmsSms.getMessagePositionInConversation(messageRecord.threadId, messageRecord.dateReceived)
ConversationIntents.createBuilder(context, messageRecord.recipient.id, messageRecord.threadId)
.withStartingPosition(messagePosition)
.build()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
data class Result(val initialPosition: Int, val records: List<MediaDatabase.MediaRecord>)
}

View file

@ -6,8 +6,11 @@ import android.content.ActivityNotFoundException
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.os.Build
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
@ -19,6 +22,7 @@ import android.view.animation.PathInterpolator
import android.widget.Toast
import androidx.appcompat.view.menu.MenuBuilder
import androidx.core.app.ShareCompat
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
@ -54,6 +58,7 @@ import org.thoughtcrime.securesms.mms.GlideApp
import org.thoughtcrime.securesms.mms.PartAuthority
import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.ContextUtil
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.Debouncer
import org.thoughtcrime.securesms.util.FullscreenHelper
@ -61,6 +66,7 @@ import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.RemoteDeleteUtil
import org.thoughtcrime.securesms.util.SaveAttachmentTask
import org.thoughtcrime.securesms.util.SpanUtil
import org.thoughtcrime.securesms.util.StorageUtil
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.visible
@ -232,6 +238,18 @@ class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), Med
private fun bindTextViews(currentItem: MediaDatabase.MediaRecord, showThread: Boolean) {
binding.toolbar.title = getTitleText(currentItem, showThread)
binding.toolbar.subtitle = getSubTitleText(currentItem)
val messageId: Long? = currentItem.attachment?.mmsId
if (messageId != null) {
binding.toolbar.setOnClickListener { v ->
viewModel.jumpToFragment(v.context, messageId).subscribeBy(
onSuccess = { startActivity(it) },
onError = {
Log.e(TAG, "Could not find message position for message ID: $messageId", it)
Toast.makeText(v.context, R.string.MediaPreviewActivity_error_finding_message, Toast.LENGTH_LONG).show()
}
)
}
}
val caption = currentItem.attachment?.caption
binding.mediaPreviewCaption.text = caption
@ -366,12 +384,21 @@ class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), Med
}
}
private fun getSubTitleText(mediaRecord: MediaDatabase.MediaRecord): String =
if (mediaRecord.date > 0) {
private fun getSubTitleText(mediaRecord: MediaDatabase.MediaRecord): CharSequence {
val text = if (mediaRecord.date > 0) {
DateUtils.getExtendedRelativeTimeSpanString(requireContext(), Locale.getDefault(), mediaRecord.date)
} else {
getString(R.string.MediaPreviewActivity_draft)
}
val builder = SpannableStringBuilder(text)
val onSurfaceColor = ContextCompat.getColor(requireContext(), R.color.signal_colorOnSurface)
val chevron = ContextUtil.requireDrawable(requireContext(), R.drawable.ic_chevron_end_24)
chevron.colorFilter = PorterDuffColorFilter(onSurfaceColor, PorterDuff.Mode.SRC_IN)
SpanUtil.appendCenteredImageSpan(builder, chevron, 10, 10)
return builder
}
private fun anchorMarginsToBottomInsets(viewToAnchor: View) {
ViewCompat.setOnApplyWindowInsetsListener(viewToAnchor) { view: View, windowInsetsCompat: WindowInsetsCompat ->

View file

@ -1,10 +1,12 @@
package org.thoughtcrime.securesms.mediapreview
import android.content.Context
import android.content.Intent
import androidx.lifecycle.ViewModel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import io.reactivex.rxjava3.schedulers.Schedulers
@ -82,6 +84,10 @@ class MediaPreviewV2ViewModel : ViewModel() {
return repository.localDelete(context, attachment).subscribeOn(Schedulers.io())
}
fun jumpToFragment(context: Context, messageId: Long): Single<Intent> {
return repository.getMessagePositionIntent(context, messageId)
}
override fun onCleared() {
disposables.dispose()
store.dispose()

View file

@ -2076,6 +2076,7 @@
<!-- All media preview title when viewing media sent by another recipient to you (allows changing of \'You\' based on context) -->
<string name="MediaPreviewActivity_s_to_you">%1$s to you</string>
<string name="MediaPreviewActivity_media_no_longer_available">Media no longer available.</string>
<string name="MediaPreviewActivity_error_finding_message">Error finding message.</string>
<string name="MediaPreviewActivity_cant_find_an_app_able_to_share_this_media">Can\'t find an app able to share this media.</string>
<string name="MediaPreviewActivity_dismiss_due_to_error">Close</string>
<string name="MediaPreviewFragment_edit_media_error">Media Error</string>