mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 21:15:48 +00:00
Polish voice notes in CFv2.
This commit is contained in:
committed by
Clark Chen
parent
23ef8c78bd
commit
584c90521a
@@ -70,12 +70,18 @@ class DraftRepository(
|
||||
val TAG = Log.tag(DraftRepository::class.java)
|
||||
}
|
||||
|
||||
fun getShareOrDraftData(): Maybe<Pair<ShareOrDraftData, Drafts?>> {
|
||||
fun getShareOrDraftData(): Maybe<Pair<ShareOrDraftData?, Drafts?>> {
|
||||
return MaybeCompat.fromCallable { getShareOrDraftDataInternal() }
|
||||
.observeOn(Schedulers.io())
|
||||
}
|
||||
|
||||
private fun getShareOrDraftDataInternal(): Pair<ShareOrDraftData, Drafts?>? {
|
||||
/**
|
||||
* Loads share data from the intent and draft data from the database and provides a one-spot initial
|
||||
* load of data.
|
||||
*
|
||||
* Note: Voice note drafts are handled differently and via the [DraftViewModel.state]
|
||||
*/
|
||||
private fun getShareOrDraftDataInternal(): Pair<ShareOrDraftData?, Drafts?>? {
|
||||
val shareText = conversationArguments?.draftText
|
||||
val shareMedia = conversationArguments?.draftMedia
|
||||
val shareContentType = conversationArguments?.draftContentType
|
||||
@@ -130,11 +136,6 @@ class DraftRepository(
|
||||
return ShareOrDraftData.SetLocation(location, draftText) to drafts
|
||||
}
|
||||
|
||||
val audio: Uri? = drafts.firstOrNull { it.type == DraftTable.Draft.AUDIO }?.let { Uri.parse(it.value) }
|
||||
if (audio != null) {
|
||||
return ShareOrDraftData.SetMedia(audio, SlideFactory.MediaType.AUDIO, null) to drafts
|
||||
}
|
||||
|
||||
val quote: ConversationMessage? = drafts.firstOrNull { it.type == DraftTable.Draft.QUOTE }?.let { loadDraftQuoteInternal(it.value) }
|
||||
if (quote != null) {
|
||||
return ShareOrDraftData.SetQuote(quote, draftText) to drafts
|
||||
@@ -148,6 +149,8 @@ class DraftRepository(
|
||||
if (draftText != null) {
|
||||
return ShareOrDraftData.SetText(draftText) to drafts
|
||||
}
|
||||
|
||||
return null to drafts
|
||||
}
|
||||
|
||||
// no share or draft
|
||||
|
||||
@@ -175,7 +175,13 @@ class DraftViewModel @JvmOverloads constructor(
|
||||
store.update { saveDrafts(it.copyAndSetDrafts(drafts = drafts)) }
|
||||
}
|
||||
}
|
||||
.map { (data, _) -> data }
|
||||
.flatMap { (data, _) ->
|
||||
if (data == null) {
|
||||
Maybe.empty()
|
||||
} else {
|
||||
Maybe.just(data)
|
||||
}
|
||||
}
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,6 +180,7 @@ import org.thoughtcrime.securesms.conversation.v2.groups.ConversationGroupCallVi
|
||||
import org.thoughtcrime.securesms.conversation.v2.groups.ConversationGroupViewModel
|
||||
import org.thoughtcrime.securesms.conversation.v2.items.InteractiveConversationElement
|
||||
import org.thoughtcrime.securesms.conversation.v2.keyboard.AttachmentKeyboardFragment
|
||||
import org.thoughtcrime.securesms.database.DraftTable
|
||||
import org.thoughtcrime.securesms.database.model.IdentityRecord
|
||||
import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord
|
||||
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord
|
||||
@@ -551,7 +552,20 @@ class ConversationFragment :
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
ApplicationDependencies.getMessageNotifier().clearVisibleThread()
|
||||
|
||||
if (!args.conversationScreenType.isInBubble) {
|
||||
ApplicationDependencies.getMessageNotifier().clearVisibleThread()
|
||||
}
|
||||
|
||||
if (activity?.isFinishing == true) {
|
||||
activity?.overridePendingTransition(R.anim.fade_scale_in, R.anim.slide_to_end)
|
||||
}
|
||||
|
||||
inputPanel.onPause()
|
||||
|
||||
// todo [cfv2] setLastSeen(System.currentTimeMillis())
|
||||
// todo [cfv2] markLastSeen()
|
||||
|
||||
motionEventRelay.setDrain(null)
|
||||
EventBus.getDefault().unregister(this)
|
||||
}
|
||||
@@ -849,6 +863,15 @@ class ConversationFragment :
|
||||
.subscribeBy { data -> handleShareOrDraftData(data) }
|
||||
.addTo(disposables)
|
||||
|
||||
disposables.add(
|
||||
draftViewModel
|
||||
.state
|
||||
.subscribe {
|
||||
inputPanel.voiceNoteDraft = it.voiceNoteDraft
|
||||
updateToggleButtonState()
|
||||
}
|
||||
)
|
||||
|
||||
initializeSearch()
|
||||
initializeLinkPreviews()
|
||||
initializeStickerSuggestions()
|
||||
@@ -1201,12 +1224,13 @@ class ConversationFragment :
|
||||
when (data) {
|
||||
is ShareOrDraftData.SendKeyboardImage -> sendMessageWithoutComposeInput(slide = data.slide, clearCompose = false)
|
||||
is ShareOrDraftData.SendSticker -> sendMessageWithoutComposeInput(slide = data.slide, clearCompose = true)
|
||||
is ShareOrDraftData.SetText -> composeText.setDraftText(data.text)
|
||||
is ShareOrDraftData.SetLocation -> attachmentManager.setLocation(data.location, MediaConstraints.getPushMediaConstraints())
|
||||
is ShareOrDraftData.SetEditMessage -> {
|
||||
composeText.setDraftText(data.draftText)
|
||||
inputPanel.enterEditMessageMode(GlideApp.with(this), data.messageEdit, true)
|
||||
}
|
||||
|
||||
is ShareOrDraftData.SetLocation -> attachmentManager.setLocation(data.location, MediaConstraints.getPushMediaConstraints())
|
||||
is ShareOrDraftData.SetMedia -> {
|
||||
composeText.setDraftText(data.text)
|
||||
setMedia(data.media, data.mediaType)
|
||||
@@ -1217,7 +1241,6 @@ class ConversationFragment :
|
||||
handleReplyToMessage(data.quote)
|
||||
}
|
||||
|
||||
is ShareOrDraftData.SetText -> composeText.setDraftText(data.text)
|
||||
is ShareOrDraftData.StartSendMedia -> {
|
||||
val recipientId = viewModel.recipientSnapshot?.id ?: return
|
||||
conversationActivityResultContracts.launchMediaEditor(data.mediaList, recipientId, data.text)
|
||||
@@ -1543,6 +1566,19 @@ class ConversationFragment :
|
||||
return
|
||||
}
|
||||
|
||||
if (inputPanel.isRecordingInLockedMode) {
|
||||
inputPanel.releaseRecordingLock()
|
||||
return
|
||||
}
|
||||
|
||||
if (slideDeck == null) {
|
||||
val voiceNote: DraftTable.Draft? = draftViewModel.voiceNoteDraft
|
||||
if (voiceNote != null) {
|
||||
sendMessageWithoutComposeInput(slide = AudioSlide.createFromVoiceNoteDraft(requireContext(), voiceNote), clearCompose = true)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
val metricId = viewModel.recipientSnapshot?.let { if (it.isGroup) SignalLocalMetrics.GroupMessageSend.start() else SignalLocalMetrics.IndividualMessageSend.start() }
|
||||
|
||||
val send: Completable = viewModel.sendMessage(
|
||||
@@ -3557,7 +3593,7 @@ class ConversationFragment :
|
||||
}
|
||||
|
||||
override fun saveEphemeralVoiceNoteDraft(draft: VoiceNoteDraft) {
|
||||
draftViewModel.cancelEphemeralVoiceNoteDraft(draft.asDraft())
|
||||
draftViewModel.saveEphemeralVoiceNoteDraft(draft.asDraft())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package org.thoughtcrime.securesms.database
|
||||
|
||||
import android.database.Cursor
|
||||
import org.signal.core.util.requireLong
|
||||
import org.signal.core.util.requireString
|
||||
import org.signal.spinner.ColumnTransformer
|
||||
import org.signal.spinner.DefaultColumnTransformer
|
||||
import org.thoughtcrime.securesms.database.MessageTypes.BAD_DECRYPT_TYPE
|
||||
import org.thoughtcrime.securesms.database.MessageTypes.BASE_DRAFT_TYPE
|
||||
import org.thoughtcrime.securesms.database.MessageTypes.BASE_INBOX_TYPE
|
||||
@@ -66,8 +67,13 @@ object MessageBitmaskColumnTransformer : ColumnTransformer {
|
||||
return columnName == "type" || columnName == "msg_box"
|
||||
}
|
||||
|
||||
@Suppress("FoldInitializerAndIfToElvis")
|
||||
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
|
||||
val type = cursor.requireLong(columnName)
|
||||
val type: Long? = cursor.requireString(columnName)?.toLongOrNull()
|
||||
|
||||
if (type == null) {
|
||||
return DefaultColumnTransformer.transform(tableName, columnName, cursor)
|
||||
}
|
||||
|
||||
val describe = """
|
||||
isOutgoingMessageType:${isOutgoingMessageType(type)}
|
||||
|
||||
Reference in New Issue
Block a user