From 6d0d17a401b945cfc9a8de76f32454f9e9d3e80c Mon Sep 17 00:00:00 2001 From: Infi Date: Sat, 2 Nov 2024 21:36:26 +0100 Subject: [PATCH] chore: remove mlkit smart reply for now Signed-off-by: Infi --- app/build.gradle | 3 - app/src/main/AndroidManifest.xml | 4 - .../chat/revolt/api/settings/Experiments.kt | 4 - .../settings/experiments/SmartReplyImpl.kt | 66 ---------------- .../chat/views/channel/ChannelScreen.kt | 16 ---- .../settings/ExperimentsSettingsScreen.kt | 26 ------ .../MessageContentMLKitReplySelectSheet.kt | 62 --------------- .../chat/revolt/sheets/MessageContextSheet.kt | 79 +------------------ 8 files changed, 1 insertion(+), 259 deletions(-) delete mode 100644 app/src/main/java/chat/revolt/api/settings/experiments/SmartReplyImpl.kt delete mode 100644 app/src/main/java/chat/revolt/sheets/MessageContentMLKitReplySelectSheet.kt diff --git a/app/build.gradle b/app/build.gradle index 073487b4..83af3d0a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -292,9 +292,6 @@ dependencies { // Shimmer - loading animations implementation "com.valentinilk.shimmer:compose-shimmer:1.3.1" - - // MLKit - Machine Learning - implementation 'com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1' } sqldelight { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe086dcf..5e28981b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,10 +50,6 @@ android:name="io.sentry.auto-init" android:value="false" /> - - diff --git a/app/src/main/java/chat/revolt/api/settings/Experiments.kt b/app/src/main/java/chat/revolt/api/settings/Experiments.kt index 74700624..d750049d 100644 --- a/app/src/main/java/chat/revolt/api/settings/Experiments.kt +++ b/app/src/main/java/chat/revolt/api/settings/Experiments.kt @@ -27,7 +27,6 @@ class ExperimentInstance(default: Boolean) { */ object Experiments { val useKotlinBasedMarkdownRenderer = ExperimentInstance(false) - val useMlKitSmartReplyInApp = ExperimentInstance(false) suspend fun hydrateWithKv() { val kvStorage = KVStorage(RevoltApplication.instance) @@ -41,8 +40,5 @@ object Experiments { useKotlinBasedMarkdownRenderer.setEnabled( kvStorage.getBoolean("exp/useKotlinBasedMarkdownRenderer") ?: false ) - useMlKitSmartReplyInApp.setEnabled( - kvStorage.getBoolean("exp/useMlKitSmartReplyInApp") ?: false - ) } } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/api/settings/experiments/SmartReplyImpl.kt b/app/src/main/java/chat/revolt/api/settings/experiments/SmartReplyImpl.kt deleted file mode 100644 index 778f80ad..00000000 --- a/app/src/main/java/chat/revolt/api/settings/experiments/SmartReplyImpl.kt +++ /dev/null @@ -1,66 +0,0 @@ -package chat.revolt.api.settings.experiments - -import android.util.Log -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.ULID -import chat.revolt.api.schemas.Message -import chat.revolt.api.schemas.RsResult -import com.google.mlkit.nl.smartreply.SmartReply -import com.google.mlkit.nl.smartreply.TextMessage - -object SmartReplyImpl { - val client = SmartReply.getClient() - - fun forMessages( - messages: List, - onResult: (RsResult, Exception>) -> Unit - ) { - if (messages.size > 10) { - onResult(RsResult.err(IllegalArgumentException("Too many messages"))) - return - } - - Log.d("SmartReplyImpl", "Creating conversation for ${messages.size} messages") - - val conversation = messages.map { - if (it.author == RevoltAPI.selfId) { - if (it.id == null) { - Log.w("SmartReplyImpl", "Message ID is null in local user message, skipping") - return@map null - } - if (it.content?.isEmpty() == true || it.content == null) { - Log.w( - "SmartReplyImpl", - "Message content is null or empty in local user message, skipping" - ) - return@map null - } - TextMessage.createForLocalUser(it.content, ULID.asTimestamp(it.id)) - } else { - if (it.id == null || it.author == null) { - Log.w( - "SmartReplyImpl", - "Message ID or author is null in remote user message, skipping" - ) - return@map null - } - if (it.content?.isEmpty() == true || it.content == null) { - Log.w( - "SmartReplyImpl", - "Message content is null or empty in remote user message, skipping" - ) - return@map null - } - TextMessage.createForRemoteUser(it.content, ULID.asTimestamp(it.id), it.author) - } - }.filterNotNull().reversed() - - Log.d("SmartReplyImpl", "Suggesting replies for ${conversation.size} messages") - - client.suggestReplies(conversation).addOnSuccessListener { - onResult(RsResult.ok(it.suggestions.map { s -> s.text })) - }.addOnFailureListener { - onResult(RsResult.err(it)) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt index 966be4fe..8b236826 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt @@ -373,22 +373,6 @@ fun ChannelScreen( scope.launch { ActionChannel.send(Action.ReportMessage(messageContextSheetTarget)) } - }, - lastTenMessages = { - // First we find the message in viewModel.items - val index = viewModel.items.filterIsInstance() - .indexOfFirst { it.message.id == messageContextSheetTarget } - - Log.d("ChannelScreen", "We have index $index") - Log.d("ChannelScreen", "Items.len ${viewModel.items.size}") - - // Then we take the last 10 messages before it. We take care to not go out of bounds. - val messages = - viewModel.items.filterIsInstance() - .subList(index, min(index + 5, (viewModel.items.size - 1))) - .map { it.message } - - messages } ) } diff --git a/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt b/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt index 5a89b26a..29a79173 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt +++ b/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt @@ -30,7 +30,6 @@ class ExperimentsSettingsScreenViewModel : ViewModel() { fun init() { viewModelScope.launch { useKotlinMdRendererChecked.value = Experiments.useKotlinBasedMarkdownRenderer.isEnabled - useMlKitSmartReplyInAppChecked.value = Experiments.useMlKitSmartReplyInApp.isEnabled } } @@ -43,7 +42,6 @@ class ExperimentsSettingsScreenViewModel : ViewModel() { } val useKotlinMdRendererChecked = mutableStateOf(false) - val useMlKitSmartReplyInAppChecked = mutableStateOf(false) fun setUseKotlinMdRendererChecked(value: Boolean) { viewModelScope.launch { @@ -52,14 +50,6 @@ class ExperimentsSettingsScreenViewModel : ViewModel() { useKotlinMdRendererChecked.value = value } } - - fun setUseMlKitSmartReplyInAppChecked(value: Boolean) { - viewModelScope.launch { - kv.set("exp/useMlKitSmartReplyInApp", value) - Experiments.useMlKitSmartReplyInApp.setEnabled(value) - useMlKitSmartReplyInAppChecked.value = value - } - } } @Composable @@ -93,22 +83,6 @@ fun ExperimentsSettingsScreen( modifier = Modifier.clickable { viewModel.setUseKotlinMdRendererChecked(!viewModel.useKotlinMdRendererChecked.value) } ) - ListItem( - headlineContent = { - Text("Smart Reply Suggestions (In-App)") - }, - supportingContent = { - Text("Use a machine learning model to suggest replies to messages from the message sheet.") - }, - trailingContent = { - Switch( - checked = viewModel.useMlKitSmartReplyInAppChecked.value, - onCheckedChange = viewModel::setUseMlKitSmartReplyInAppChecked - ) - }, - modifier = Modifier.clickable { viewModel.setUseMlKitSmartReplyInAppChecked(!viewModel.useMlKitSmartReplyInAppChecked.value) } - ) - Subcategory( title = { Text("Disable experiments") diff --git a/app/src/main/java/chat/revolt/sheets/MessageContentMLKitReplySelectSheet.kt b/app/src/main/java/chat/revolt/sheets/MessageContentMLKitReplySelectSheet.kt deleted file mode 100644 index 88a3d396..00000000 --- a/app/src/main/java/chat/revolt/sheets/MessageContentMLKitReplySelectSheet.kt +++ /dev/null @@ -1,62 +0,0 @@ -package chat.revolt.sheets - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.components.generic.SheetButton - -@Composable -fun MessageContentMLKitReplySelectSheet( - options: List, - onOptionSelected: (String) -> Unit -) { - Column( - modifier = Modifier - .verticalScroll(rememberScrollState()) - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp), - modifier = Modifier.fillMaxWidth() - ) { - Icon( - painter = painterResource(R.drawable.ic_creation_24dp), - contentDescription = null, - tint = Color(0xFF977EFF) - ) - Text( - "Select a reply", - style = MaterialTheme.typography.headlineLarge, - textAlign = TextAlign.Center - ) - } - Spacer(modifier = Modifier.height(16.dp)) - options.forEach { option -> - SheetButton( - headlineContent = { Text(option) }, - leadingContent = { - Icon( - painter = painterResource(R.drawable.ic_reply_24dp), - contentDescription = null - ) - }, - onClick = { onOptionSelected(option) } - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt index 2b9d627c..1eed0801 100644 --- a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt @@ -18,14 +18,11 @@ import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.LocalContentColor import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -33,7 +30,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource @@ -48,16 +44,10 @@ import chat.revolt.api.internals.Roles import chat.revolt.api.internals.has import chat.revolt.api.routes.channel.deleteMessage import chat.revolt.api.routes.channel.react -import chat.revolt.api.schemas.Message -import chat.revolt.api.settings.Experiments -import chat.revolt.api.settings.experiments.SmartReplyImpl import chat.revolt.callbacks.UiCallbacks import chat.revolt.components.chat.Message import chat.revolt.components.generic.SheetButton import chat.revolt.internals.Platform -import com.valentinilk.shimmer.ShimmerBounds -import com.valentinilk.shimmer.rememberShimmer -import com.valentinilk.shimmer.shimmer import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @@ -65,8 +55,7 @@ import kotlinx.coroutines.launch fun MessageContextSheet( messageId: String, onHideSheet: suspend () -> Unit, - onReportMessage: () -> Unit, - lastTenMessages: (() -> List)? = null + onReportMessage: () -> Unit ) { val message = RevoltAPI.messageCache[messageId] if (message == null) { @@ -84,48 +73,6 @@ fun MessageContextSheet( val clipboardManager = LocalClipboardManager.current val coroutineScope = rememberCoroutineScope() - var mlKitSmartReplies by remember { mutableStateOf?>(null) } - var mlKitSmartRepliesLoading by remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - if (Experiments.useMlKitSmartReplyInApp.isEnabled) { - mlKitSmartReplies = null - mlKitSmartRepliesLoading = true - lastTenMessages?.let { fn -> - SmartReplyImpl.forMessages( - fn.invoke() - ) { - mlKitSmartReplies = if (it.ok) { - it.unwrap() - } else { - null - } - mlKitSmartRepliesLoading = false - } - } - } - } - var showMlKitSmartReplySheet by remember { mutableStateOf(false) } - if (showMlKitSmartReplySheet) { - val mlKitSmartReplySheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) - - ModalBottomSheet( - sheetState = mlKitSmartReplySheetState, - onDismissRequest = { - showMlKitSmartReplySheet = false - } - ) { - MessageContentMLKitReplySelectSheet( - options = mlKitSmartReplies ?: emptyList(), - onOptionSelected = { - coroutineScope.launch { - UiCallbacks.replyToMessageWithContent(messageId, it) - onHideSheet() - } - }, - ) - } - } - var showShareSheet by remember { mutableStateOf(false) } var showReactSheet by remember { mutableStateOf(false) } var showDeleteMessageConfirmation by remember { mutableStateOf(false) } @@ -388,30 +335,6 @@ fun MessageContextSheet( text = stringResource(id = R.string.message_context_sheet_actions_reply), ) }, - trailingContent = { - if (Experiments.useMlKitSmartReplyInApp.isEnabled && (mlKitSmartRepliesLoading || (mlKitSmartReplies?.isNotEmpty() == true))) { - IconButton(onClick = { - coroutineScope.launch { - showMlKitSmartReplySheet = true - } - }) { - Icon( - painter = painterResource(id = R.drawable.ic_creation_24dp), - contentDescription = null, - tint = if (!mlKitSmartRepliesLoading && mlKitSmartReplies != null) { - Color(0xFF977EFF) - } else { - LocalContentColor.current - }, - modifier = if (mlKitSmartRepliesLoading) { - Modifier.shimmer(rememberShimmer(ShimmerBounds.View)) - } else { - Modifier - } - ) - } - } - }, onClick = { coroutineScope.launch { UiCallbacks.replyToMessage(messageId)