From 5da86f03fd464266af334b4376081428543e20cf Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 10 Aug 2026 14:18:49 -0300 Subject: [PATCH] Add reply treatment to media-send module. --- .../mediasend/screens/edit/AddAMessageRow.kt | 18 ++++++++++++++++-- .../mediasend/screens/edit/MediaEditScreen.kt | 1 + .../src/main/res/values/strings.xml | 2 ++ .../screens/edit/AddAMessageRowTest.kt | 19 +++++++++++++++++-- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/AddAMessageRow.kt b/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/AddAMessageRow.kt index 29f8551c43..d0cd80663e 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/AddAMessageRow.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/AddAMessageRow.kt @@ -69,6 +69,7 @@ fun AddAMessageRow( canScheduleSend: Boolean = false, viewOnceAvailable: Boolean = false, viewOnce: Boolean = false, + isReply: Boolean = false, recipientChatColor: Color? = null ) { Row( @@ -87,7 +88,7 @@ fun AddAMessageRow( // A view-once send cannot carry a body, so the row becomes a static label rather than an entry point. Modifier } else { - Modifier.clickable(enabled = enabled, onClickLabel = stringResource(R.string.AddAMessageRow__add_a_message), onClick = { onEvent(MediaEditScreenEvents.AddMessageClick()) }, role = Role.Button) + Modifier.clickable(enabled = enabled, onClickLabel = stringResource(if (isReply) R.string.AddAMessageRow__add_a_reply else R.string.AddAMessageRow__add_a_message), onClick = { onEvent(MediaEditScreenEvents.AddMessageClick()) }, role = Role.Button) } ) ) { @@ -113,7 +114,7 @@ fun AddAMessageRow( } LocalAddAMessageRowTextField.current( - message?.takeIf { it.isNotBlank() } ?: stringResource(R.string.AddAMessageRow__message), + message?.takeIf { it.isNotBlank() } ?: stringResource(if (isReply) R.string.AddAMessageRow__add_a_reply else R.string.AddAMessageRow__message), Modifier .weight(1f) .padding(end = if (viewOnceAvailable) 0.dp else 16.dp) @@ -204,6 +205,19 @@ private fun AddAMessageRowViewOncePreview() { } } +@DayNightPreviews +@Composable +private fun AddAMessageRowReplyPreview() { + Previews.Preview { + AddAMessageRow( + message = null, + onEvent = {}, + onNextClick = {}, + isReply = true + ) + } +} + @DayNightPreviews @Composable private fun AddAMessageRowKnownRecipientPreview() { diff --git a/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/MediaEditScreen.kt b/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/MediaEditScreen.kt index 45bc264ce2..28a2f7e6a0 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/MediaEditScreen.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/MediaEditScreen.kt @@ -370,6 +370,7 @@ internal fun MediaEditScreen( canScheduleSend = !state.isStory, viewOnceAvailable = state.isViewOnceAvailable, viewOnce = state.isViewOnceEnabled, + isReply = state.isReply, message = state.message, recipientChatColor = recipientChatColor, onEvent = onEvent, diff --git a/feature/media-send/src/main/res/values/strings.xml b/feature/media-send/src/main/res/values/strings.xml index 45b516d25c..fe54c023ec 100644 --- a/feature/media-send/src/main/res/values/strings.xml +++ b/feature/media-send/src/main/res/values/strings.xml @@ -22,6 +22,8 @@ Add to story Add a message + + Add a reply Open emoji keyboard diff --git a/feature/media-send/src/test/java/org/signal/mediasend/screens/edit/AddAMessageRowTest.kt b/feature/media-send/src/test/java/org/signal/mediasend/screens/edit/AddAMessageRowTest.kt index 4675466d71..9acd30f211 100644 --- a/feature/media-send/src/test/java/org/signal/mediasend/screens/edit/AddAMessageRowTest.kt +++ b/feature/media-send/src/test/java/org/signal/mediasend/screens/edit/AddAMessageRowTest.kt @@ -89,14 +89,29 @@ class AddAMessageRowTest { composeTestRule.onNodeWithText("Check this out").assertExists() } - private fun setContent(canScheduleSend: Boolean = false, message: CharSequence? = null) { + @Test + fun `Given a reply flow with no message, when the row is displayed, then the reply placeholder is shown`() { + setContent(isReply = true) + + composeTestRule.onNodeWithText("Add a reply").assertExists() + } + + @Test + fun `Given a reply flow with a message, when the row is displayed, then the message is shown`() { + setContent(message = "Check this out", isReply = true) + + composeTestRule.onNodeWithText("Check this out").assertExists() + } + + private fun setContent(canScheduleSend: Boolean = false, message: CharSequence? = null, isReply: Boolean = false) { composeTestRule.setContent { SignalTheme { AddAMessageRow( message = message, onEvent = { events += it }, onNextClick = { nextClicks++ }, - canScheduleSend = canScheduleSend + canScheduleSend = canScheduleSend, + isReply = isReply ) } }