Add jump to message shortcut for media viewer.

main
Nicholas 2022-11-28 11:56:59 -05:00 zatwierdzone przez Cody Henthorne
rodzic 800405fc3e
commit 21bd8a308b
4 zmienionych plików z 52 dodań i 2 usunięć

Wyświetl plik

@ -1,6 +1,8 @@
package org.thoughtcrime.securesms.mediapreview package org.thoughtcrime.securesms.mediapreview
import android.content.Context 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.Completable
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Single 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.signal.core.util.requireLong
import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.AttachmentId
import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.attachments.DatabaseAttachment
import org.thoughtcrime.securesms.conversation.ConversationIntents
import org.thoughtcrime.securesms.database.AttachmentDatabase import org.thoughtcrime.securesms.database.AttachmentDatabase
import org.thoughtcrime.securesms.database.MediaDatabase import org.thoughtcrime.securesms.database.MediaDatabase
import org.thoughtcrime.securesms.database.MediaDatabase.Sorting 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.database.SignalDatabase.Companion.media
import org.thoughtcrime.securesms.sms.MessageSender import org.thoughtcrime.securesms.sms.MessageSender
import org.thoughtcrime.securesms.util.AttachmentUtil import org.thoughtcrime.securesms.util.AttachmentUtil
@ -81,5 +85,17 @@ class MediaPreviewRepository {
}.subscribeOn(Schedulers.io()) }.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>) data class Result(val initialPosition: Int, val records: List<MediaDatabase.MediaRecord>)
} }

Wyświetl plik

@ -6,8 +6,11 @@ import android.content.ActivityNotFoundException
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.text.SpannableStringBuilder
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.View import android.view.View
@ -19,6 +22,7 @@ import android.view.animation.PathInterpolator
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuBuilder
import androidx.core.app.ShareCompat import androidx.core.app.ShareCompat
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible 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.mms.PartAuthority
import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.ContextUtil
import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.Debouncer import org.thoughtcrime.securesms.util.Debouncer
import org.thoughtcrime.securesms.util.FullscreenHelper 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.MediaUtil
import org.thoughtcrime.securesms.util.RemoteDeleteUtil import org.thoughtcrime.securesms.util.RemoteDeleteUtil
import org.thoughtcrime.securesms.util.SaveAttachmentTask import org.thoughtcrime.securesms.util.SaveAttachmentTask
import org.thoughtcrime.securesms.util.SpanUtil
import org.thoughtcrime.securesms.util.StorageUtil import org.thoughtcrime.securesms.util.StorageUtil
import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.visible 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) { private fun bindTextViews(currentItem: MediaDatabase.MediaRecord, showThread: Boolean) {
binding.toolbar.title = getTitleText(currentItem, showThread) binding.toolbar.title = getTitleText(currentItem, showThread)
binding.toolbar.subtitle = getSubTitleText(currentItem) 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 val caption = currentItem.attachment?.caption
binding.mediaPreviewCaption.text = 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 = private fun getSubTitleText(mediaRecord: MediaDatabase.MediaRecord): CharSequence {
if (mediaRecord.date > 0) { val text = if (mediaRecord.date > 0) {
DateUtils.getExtendedRelativeTimeSpanString(requireContext(), Locale.getDefault(), mediaRecord.date) DateUtils.getExtendedRelativeTimeSpanString(requireContext(), Locale.getDefault(), mediaRecord.date)
} else { } else {
getString(R.string.MediaPreviewActivity_draft) 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) { private fun anchorMarginsToBottomInsets(viewToAnchor: View) {
ViewCompat.setOnApplyWindowInsetsListener(viewToAnchor) { view: View, windowInsetsCompat: WindowInsetsCompat -> ViewCompat.setOnApplyWindowInsetsListener(viewToAnchor) { view: View, windowInsetsCompat: WindowInsetsCompat ->

Wyświetl plik

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

Wyświetl plik

@ -2076,6 +2076,7 @@
<!-- All media preview title when viewing media sent by another recipient to you (allows changing of \'You\' based on context) --> <!-- 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_s_to_you">%1$s to you</string>
<string name="MediaPreviewActivity_media_no_longer_available">Media no longer available.</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_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="MediaPreviewActivity_dismiss_due_to_error">Close</string>
<string name="MediaPreviewFragment_edit_media_error">Media Error</string> <string name="MediaPreviewFragment_edit_media_error">Media Error</string>