@@ -22,6 +22,8 @@ import androidx.compose.foundation.layout.Column
2222import androidx.compose.foundation.layout.fillMaxSize
2323import androidx.compose.foundation.layout.padding
2424import androidx.compose.foundation.layout.wrapContentWidth
25+ import androidx.compose.foundation.rememberScrollState
26+ import androidx.compose.foundation.verticalScroll
2527import androidx.compose.material.Text
2628import androidx.compose.material3.MaterialTheme
2729import androidx.compose.runtime.Composable
@@ -30,15 +32,21 @@ import androidx.compose.runtime.getValue
3032import androidx.compose.ui.Modifier
3133import androidx.compose.ui.platform.LocalClipboardManager
3234import androidx.compose.ui.platform.LocalContext
35+ import androidx.compose.ui.res.stringResource
3336import androidx.compose.ui.text.AnnotatedString
3437import androidx.hilt.navigation.compose.hiltViewModel
38+ import com.wire.android.BuildConfig
3539import com.wire.android.R
3640import com.wire.android.model.Clickable
3741import com.wire.android.navigation.Navigator
3842import com.wire.android.navigation.annotation.app.WireDestination
3943import com.wire.android.ui.common.HandleActions
44+ import com.wire.android.ui.common.WireDialog
45+ import com.wire.android.ui.common.WireDialogButtonProperties
46+ import com.wire.android.ui.common.WireDialogButtonType
4047import com.wire.android.ui.common.rowitem.RowItemTemplate
4148import com.wire.android.ui.common.button.WirePrimaryButton
49+ import com.wire.android.ui.common.button.WireSwitch
4250import com.wire.android.ui.common.dimensions
4351import com.wire.android.ui.common.scaffold.WireScaffold
4452import com.wire.android.ui.common.topappbar.NavigationIconType
@@ -62,6 +70,7 @@ fun DebugConversationScreen(
6270) {
6371
6472 val context = LocalContext .current
73+ val scrollState = rememberScrollState()
6574
6675 WireScaffold (
6776 topBar = {
@@ -86,6 +95,7 @@ fun DebugConversationScreen(
8695 Column (
8796 modifier = modifier
8897 .fillMaxSize()
98+ .verticalScroll(scrollState)
8999 .padding(paddingValues),
90100 ) {
91101 SectionHeader (" Conversation details" )
@@ -102,6 +112,18 @@ fun DebugConversationScreen(
102112 onUpdate = { viewModel.updateConversation() },
103113 onReset = { viewModel.resetMLSConversation() },
104114 )
115+ if (BuildConfig .CONVERSATION_FEEDER_ENABLED ) {
116+ SectionHeader (" Feeders / performance config" )
117+ ConversationFeedConfigView (
118+ config = state.feedConfig,
119+ onMessagesToggle = { enabled -> viewModel.onMessagesFeederToggle(enabled) },
120+ onReactionsToggle = { enabled -> viewModel.onReactionsFeederToggle(enabled) },
121+ onUnreadEventsToggle = { enabled -> viewModel.onUnreadEventsFeederToggle(enabled) },
122+ onMentionsToggle = { enabled -> viewModel.onMentionsFeederToggle(enabled) },
123+ onShowDialog = { show -> viewModel.showFeedersDialog(show) },
124+ onRunFeeders = { viewModel.runFeedersForConversation() }
125+ )
126+ }
105127 }
106128 }
107129 )
@@ -232,6 +254,132 @@ private fun MlsDetailsView(mlsProtocolInfo: Conversation.ProtocolInfo.MLS) {
232254 )
233255}
234256
257+ @Composable
258+ private fun ConversationFeedConfigView (
259+ config : DebugFeedConfigUiState ,
260+ onMessagesToggle : (Boolean ) -> Unit ,
261+ onReactionsToggle : (Boolean ) -> Unit ,
262+ onUnreadEventsToggle : (Boolean ) -> Unit ,
263+ onMentionsToggle : (Boolean ) -> Unit ,
264+ onShowDialog : (Boolean ) -> Unit ,
265+ onRunFeeders : () -> Unit ,
266+ ) {
267+ if (config.showDialog) {
268+ WireDialog (
269+ title = " Warning: Irreversible Debug Operation" ,
270+ text = " Using feeders will permanently modify this conversation’s data.\n " +
271+ " Synthetic messages, mentions, reactions or unread events cannot be undone.\n " +
272+ " \n " +
273+ " This action is for internal testing only. Do NOT use on real conversations." ,
274+ onDismiss = {
275+ onShowDialog(false )
276+ },
277+ optionButton1Properties = WireDialogButtonProperties (
278+ onClick = {
279+ onShowDialog(false )
280+ },
281+ text = stringResource(R .string.label_cancel),
282+ type = WireDialogButtonType .Secondary ,
283+ ),
284+ optionButton2Properties = WireDialogButtonProperties (
285+ onClick = {
286+ onRunFeeders()
287+ },
288+ text = " Run feeders" ,
289+ loading = config.isProcessing,
290+ type = WireDialogButtonType .Primary ,
291+ )
292+ )
293+ }
294+
295+ RowItemTemplate (
296+ title = {
297+ Text (
298+ text = " Feed messages" ,
299+ style = MaterialTheme .wireTypography.body01,
300+ color = MaterialTheme .wireColorScheme.onBackground,
301+ modifier = Modifier .padding(start = dimensions().spacing8x)
302+ )
303+ },
304+ actions = {
305+ WireSwitch (
306+ checked = config.messagesEnabled,
307+ onCheckedChange = onMessagesToggle
308+ )
309+ }
310+ )
311+
312+ RowItemTemplate (
313+ title = {
314+ Text (
315+ text = " Feed reactions" ,
316+ style = MaterialTheme .wireTypography.body01,
317+ color = MaterialTheme .wireColorScheme.onBackground,
318+ modifier = Modifier .padding(start = dimensions().spacing8x)
319+ )
320+ },
321+ actions = {
322+ WireSwitch (
323+ checked = config.reactionsEnabled,
324+ onCheckedChange = onReactionsToggle
325+ )
326+ }
327+ )
328+
329+ RowItemTemplate (
330+ title = {
331+ Text (
332+ text = " Feed unread events" ,
333+ style = MaterialTheme .wireTypography.body01,
334+ color = MaterialTheme .wireColorScheme.onBackground,
335+ modifier = Modifier .padding(start = dimensions().spacing8x)
336+ )
337+ },
338+ actions = {
339+ WireSwitch (
340+ checked = config.unreadEventsEnabled,
341+ onCheckedChange = onUnreadEventsToggle
342+ )
343+ }
344+ )
345+
346+ RowItemTemplate (
347+ title = {
348+ Text (
349+ text = " Feed mentions" ,
350+ style = MaterialTheme .wireTypography.body01,
351+ color = MaterialTheme .wireColorScheme.onBackground,
352+ modifier = Modifier .padding(start = dimensions().spacing8x)
353+ )
354+ },
355+ actions = {
356+ WireSwitch (
357+ checked = config.mentionsEnabled,
358+ onCheckedChange = onMentionsToggle
359+ )
360+ }
361+ )
362+
363+ RowItemTemplate (
364+ title = {
365+ Text (
366+ text = " Run selected feeders" ,
367+ style = MaterialTheme .wireTypography.body01,
368+ color = MaterialTheme .wireColorScheme.onBackground,
369+ modifier = Modifier .padding(start = dimensions().spacing8x)
370+ )
371+ },
372+ actions = {
373+ WirePrimaryButton (
374+ loading = config.isProcessing,
375+ onClick = { onShowDialog(true ) },
376+ text = " Run feeders" ,
377+ fillMaxWidth = false
378+ )
379+ }
380+ )
381+ }
382+
235383data class DebugConversationScreenNavArgs (
236384 val conversationId : ConversationId ,
237385)
0 commit comments