diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt index 10d1398aa2..5d47884b9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt @@ -11,4 +11,5 @@ sealed interface LabsSettingsEvents { data class ToggleIncognito(val enabled: Boolean) : LabsSettingsEvents data class ToggleBetterSearch(val enabled: Boolean) : LabsSettingsEvents data class ToggleStarredMessages(val enabled: Boolean) : LabsSettingsEvents + data class ToggleStickerReplies(val enabled: Boolean) : LabsSettingsEvents } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt index 3731a6d68a..fe36ff5666 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt @@ -133,6 +133,15 @@ private fun LabsSettingsContent( onCheckChanged = { onEvent(LabsSettingsEvents.ToggleStarredMessages(it)) } ) } + + item { + Rows.ToggleRow( + checked = state.stickerReplies, + text = "Sticker Replies", + label = "Keep a pending quote when sending a sticker so the sticker is sent as a reply. Normally the quote is dropped when you send a sticker.", + onCheckChanged = { onEvent(LabsSettingsEvents.ToggleStickerReplies(it)) } + ) + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt index 977530347f..7fd1613810 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt @@ -13,5 +13,6 @@ data class LabsSettingsState( val storyArchive: Boolean = false, val incognito: Boolean = false, val betterSearch: Boolean = false, - val starredMessages: Boolean = false + val starredMessages: Boolean = false, + val stickerReplies: Boolean = false ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt index 9cb6c7db43..1353037cb5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt @@ -37,6 +37,10 @@ class LabsSettingsViewModel : ViewModel() { SignalStore.labs.starredMessages = event.enabled _state.value = _state.value.copy(starredMessages = event.enabled) } + is LabsSettingsEvents.ToggleStickerReplies -> { + SignalStore.labs.stickerReplies = event.enabled + _state.value = _state.value.copy(stickerReplies = event.enabled) + } } } @@ -46,7 +50,8 @@ class LabsSettingsViewModel : ViewModel() { storyArchive = SignalStore.labs.storyArchive, incognito = SignalStore.labs.incognito, betterSearch = SignalStore.labs.betterSearch, - starredMessages = SignalStore.labs.starredMessages + starredMessages = SignalStore.labs.starredMessages, + stickerReplies = SignalStore.labs.stickerReplies ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 6ce0d7a533..b38be6cf2c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -2489,7 +2489,17 @@ class ConversationFragment : ?: MediaUtil.IMAGE_WEBP ) - sendMessageWithoutComposeInput(slide = slide, clearCompose = clearCompose) + val quote = if (SignalStore.labs.stickerReplies) { + inputPanel.quote.orNull() + } else { + null + } + + sendMessageWithoutComposeInput(slide = slide, quote = quote, clearCompose = clearCompose) + + if (quote != null) { + inputPanel.clearQuote() + } viewModel.updateStickerLastUsedTime(stickerRecord, System.currentTimeMillis().milliseconds) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt index d12dc0a97e..2f31cbcafe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt @@ -9,6 +9,7 @@ class LabsValues internal constructor(store: KeyValueStore) : SignalStoreValues( const val INCOGNITO: String = "labs.incognito" const val BETTER_SEARCH: String = "labs.better_search" const val STARRED_MESSAGES: String = "labs.starred_messages" + const val STICKER_REPLIES: String = "labs.sticker_replies" } public override fun onFirstEverAppLaunch() = Unit @@ -25,6 +26,8 @@ class LabsValues internal constructor(store: KeyValueStore) : SignalStoreValues( var starredMessages by booleanValue(STARRED_MESSAGES, true).falseForExternalUsers() + var stickerReplies by booleanValue(STICKER_REPLIES, false).falseForExternalUsers() + private fun SignalStoreValueDelegate.falseForExternalUsers(): SignalStoreValueDelegate { return this.map { actualValue -> RemoteConfig.internalUser && actualValue } }