Allow sending sticker replies behind a Labs flag.

This commit is contained in:
Greyson Parrelli
2026-06-25 10:20:33 -04:00
committed by Michelle Tang
parent 56378c7166
commit 7d6a31b254
6 changed files with 32 additions and 3 deletions
@@ -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
}
@@ -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)) }
)
}
}
}
}
@@ -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
)
@@ -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
)
}
}
@@ -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)
}
@@ -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<Boolean>.falseForExternalUsers(): SignalStoreValueDelegate<Boolean> {
return this.map { actualValue -> RemoteConfig.internalUser && actualValue }
}