Add jump to message shortcut for media viewer.
This commit is contained in:
parent
800405fc3e
commit
21bd8a308b
4 changed files with 52 additions and 2 deletions
|
@ -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>)
|
||||
}
|
||||
|
|
|
@ -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 ->
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue