kopia lustrzana https://github.com/ryukoposting/Signal-Android
Add jump to message shortcut for media viewer.
rodzic
800405fc3e
commit
21bd8a308b
|
@ -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>)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ->
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Ładowanie…
Reference in New Issue