From ac476f4382996ef9ec716c0cffdd5fad9e9d32a2 Mon Sep 17 00:00:00 2001 From: andrew Date: Thu, 29 Jun 2023 22:11:15 +0930 Subject: [PATCH] Add icons and respect nullability --- app/build.gradle | 2 + .../conversation/v2/MessageDetailActivity.kt | 139 +++++++++++------- .../drawable/ic_message_details__refresh.xml | 9 ++ .../drawable/ic_message_details__reply.xml | 9 ++ .../drawable/ic_message_details__trash.xml | 9 ++ 5 files changed, 116 insertions(+), 52 deletions(-) create mode 100644 app/src/main/res/drawable/ic_message_details__refresh.xml create mode 100644 app/src/main/res/drawable/ic_message_details__reply.xml create mode 100644 app/src/main/res/drawable/ic_message_details__trash.xml diff --git a/app/build.gradle b/app/build.gradle index 8194ef4b7..c3ae7de49 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -164,6 +164,8 @@ dependencies { implementation 'androidx.compose.ui:ui:1.4.3' implementation 'androidx.compose.ui:ui-tooling:1.4.3' implementation "com.google.accompanist:accompanist-themeadapter-appcompat:0.30.1" + implementation "androidx.compose.runtime:runtime-livedata:1.4.3" + implementation 'androidx.compose.foundation:foundation-layout:1.5.0-alpha02' implementation 'androidx.compose.material:material:1.5.0-alpha02' diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt index 34d53acf7..7421412e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.conversation.v2 import android.os.Bundle -import android.view.View import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -11,12 +10,15 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Divider import androidx.compose.material.LocalTextStyle import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.text.TextStyle @@ -24,6 +26,9 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import dagger.hilt.android.AndroidEntryPoint import network.loki.messenger.R import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity @@ -60,71 +65,101 @@ class MessageDetailActivity: PassphraseRequiredActionBarActivity() { title = resources.getString(R.string.conversation_context__menu_message_details) - setContentView(createComposeView()) + setContentView(ComposeView(this).apply { + setContent { + MessageDetailsScreen() + } + }) } - private fun createComposeView(): ComposeView = ComposeView(this).apply { - id = View.generateViewId() - setContent { - MessageDetails() - } + class MessageDetailsViewModel: ViewModel() { + private val _details = MutableLiveData(MessageDetails()) + val details: LiveData = _details + } + + @Composable + private fun MessageDetailsScreen(viewModel: MessageDetailsViewModel = MessageDetailsViewModel()) { + val details by viewModel.details.observeAsState(MessageDetails()) + MessageDetails(details) } data class TitledText(val title: String, val value: String) - @OptIn(ExperimentalLayoutApi::class) + data class MessageDetails( + val fileDetails: List? = null, + val sent: TitledText? = null, + val received: TitledText? = null, + val user: TitledText? = null, + ) + @Preview @Composable - fun MessageDetails() { - val fileDetails = listOf( - TitledText("File Id:", "1237896548514214124235985214"), - TitledText("File Type:", ".PNG"), - TitledText("File Size:", "6mb"), - TitledText("Resolution:", "550x550"), - TitledText("Duration:", "N/A"), + fun PreviewMessageDetails() { + MessageDetails( + fileDetails = listOf( + TitledText("File Id:", "1237896548514214124235985214"), + TitledText("File Type:", ".PNG"), + TitledText("File Size:", "6mb"), + TitledText("Resolution:", "550x550"), + TitledText("Duration:", "N/A"), + ), + sent = TitledText("Sent:", "6:12 AM Tue, 09/08/2022"), + received = TitledText("Received:", "6:12 AM Tue, 09/08/2022"), + user = TitledText("Connor", "d4f1g54sdf5g1d5f4g65ds4564df65f4g65d54gdfsg") ) + } - val sent = TitledText("Sent:", "6:12 AM Tue, 09/08/2022") - val received = TitledText("Received:", "6:12 AM Tue, 09/08/2022") - val user = TitledText("Connor", "d4f1g54sdf5g1d5f4g65ds4564df65f4g65d54gdfsg") - - AppTheme { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()), - verticalArrangement = Arrangement.spacedBy(16.dp)) { - CellWithPadding { - FlowRow( - verticalArrangement = Arrangement.spacedBy(16.dp), - maxItemsInEachRow = 2 - ) { - fileDetails.forEach { - titledText(it, Modifier.weight(1f)) - } - } - } - CellWithPadding { - Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { - titledText(sent) - titledText(received) - titledView("From:") { - Row { - Box(modifier = Modifier - .width(60.dp) - .height(60.dp)) - Column { - titledText(user, valueStyle = LocalTextStyle.current.copy(fontFamily = FontFamily.Monospace)) + @OptIn(ExperimentalLayoutApi::class) + @Composable + fun MessageDetails(messageDetails: MessageDetails) { + messageDetails.apply { + AppTheme { + Column( + modifier = Modifier.verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + fileDetails?.takeIf { it.isNotEmpty() }?.let { + CellWithPadding { + FlowRow( + verticalArrangement = Arrangement.spacedBy(16.dp), + maxItemsInEachRow = 2 + ) { + it.forEach { + titledText(it, Modifier.weight(1f)) } } } } - } - Cell { - Column { - ItemButton("Reply", R.drawable.ic_reply) - Divider() - ItemButton("Resend", R.drawable.ic_reply) - Divider() - ItemButton("Delete", R.drawable.ic_delete_24 , colors = destructiveButtonColors()) + if (sent != null || received != null || user != null) CellWithPadding { + Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { + sent?.let { titledText(it) } + received?.let { titledText(it) } + user?.let { + titledView("From:") { + Row { + Box(modifier = Modifier + .width(60.dp) + .height(60.dp)) + Column { + titledText(it, valueStyle = LocalTextStyle.current.copy(fontFamily = FontFamily.Monospace)) + } + } + } + } + } + } + Cell { + Column { + ItemButton("Reply", R.drawable.ic_message_details__reply) + Divider() + ItemButton("Resend", R.drawable.ic_message_details__refresh) + Divider() + ItemButton( + "Delete", + R.drawable.ic_message_details__trash, + colors = destructiveButtonColors() + ) + } } } } diff --git a/app/src/main/res/drawable/ic_message_details__refresh.xml b/app/src/main/res/drawable/ic_message_details__refresh.xml new file mode 100644 index 000000000..2aabe6fbe --- /dev/null +++ b/app/src/main/res/drawable/ic_message_details__refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_message_details__reply.xml b/app/src/main/res/drawable/ic_message_details__reply.xml new file mode 100644 index 000000000..c9e1591a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_message_details__reply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_message_details__trash.xml b/app/src/main/res/drawable/ic_message_details__trash.xml new file mode 100644 index 000000000..85d421695 --- /dev/null +++ b/app/src/main/res/drawable/ic_message_details__trash.xml @@ -0,0 +1,9 @@ + + +