From 6cc65ce84ad6e6aa683189d6e7b01405d98eb35e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 13 Dec 2023 15:22:23 -0500 Subject: [PATCH] Avoid remembering Modifier --- .../amethyst/ui/layouts/ChatHeaderLayout.kt | 143 ++++++++++++++++++ .../amethyst/ui/note/ChatroomHeaderCompose.kt | 15 +- .../vitorpamplona/amethyst/ui/theme/Shape.kt | 2 + 3 files changed, 149 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/ui/layouts/ChatHeaderLayout.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/layouts/ChatHeaderLayout.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/layouts/ChatHeaderLayout.kt new file mode 100644 index 000000000..400fa8da9 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/layouts/ChatHeaderLayout.kt @@ -0,0 +1,143 @@ +package com.vitorpamplona.amethyst.ui.layouts + +import android.annotation.SuppressLint +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Divider +import androidx.compose.material3.ListItem +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextDirection +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage +import com.vitorpamplona.amethyst.ui.note.NewItemsBubble +import com.vitorpamplona.amethyst.ui.note.NonClickableUserPictures +import com.vitorpamplona.amethyst.ui.note.RoomNameDisplay +import com.vitorpamplona.amethyst.ui.note.TimeAgo +import com.vitorpamplona.amethyst.ui.note.timeAgo +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.theme.AccountPictureModifier +import com.vitorpamplona.amethyst.ui.theme.ChatHeadlineBorders +import com.vitorpamplona.amethyst.ui.theme.DividerThickness +import com.vitorpamplona.amethyst.ui.theme.DoubleHorzSpacer +import com.vitorpamplona.amethyst.ui.theme.Height4dpModifier +import com.vitorpamplona.amethyst.ui.theme.Size55Modifier +import com.vitorpamplona.amethyst.ui.theme.Size55dp +import com.vitorpamplona.amethyst.ui.theme.StdTopPadding +import com.vitorpamplona.amethyst.ui.theme.grayText +import com.vitorpamplona.quartz.events.ChatroomKey +import com.vitorpamplona.quartz.utils.TimeUtils + +@SuppressLint("UnrememberedMutableState") +@Composable +@Preview +fun ChannelNamePreview() { + Column { + ChatHeaderLayout( + channelPicture = { + Image( + painter = painterResource(R.drawable.github), + contentDescription = stringResource(id = R.string.profile_banner), + contentScale = ContentScale.FillWidth + ) + }, + firstRow = { + Row(verticalAlignment = Alignment.CenterVertically) { + Text("This is my author", Modifier.weight(1f)) + TimeAgo(TimeUtils.now()) + } + }, + secondRow = { + Row(verticalAlignment = Alignment.CenterVertically) { + Text("This is a message from this person", Modifier.weight(1f)) + NewItemsBubble() + } + }, + onClick = { + + } + ) + + Divider() + + ListItem( + headlineContent = { + Row(verticalAlignment = Alignment.CenterVertically) { + Text("This is my author", Modifier.weight(1f)) + TimeAgo(TimeUtils.now()) + } + }, + supportingContent = { + Row(verticalAlignment = Alignment.CenterVertically) { + Text("This is a message from this person", Modifier.weight(1f)) + NewItemsBubble() + } + }, + leadingContent = { + Image( + painter = painterResource(R.drawable.github), + contentDescription = stringResource(id = R.string.profile_banner), + contentScale = ContentScale.FillWidth, + modifier = Size55Modifier + ) + } + ) + } +} + +@Composable +fun ChatHeaderLayout( + channelPicture: @Composable () -> Unit, + firstRow: @Composable () -> Unit, + secondRow: @Composable () -> Unit, + onClick: () -> Unit +) { + Column(modifier = remember { Modifier.clickable(onClick = onClick) }) { + Row( + modifier = ChatHeadlineBorders, + verticalAlignment = Alignment.CenterVertically + ) { + Box(Size55Modifier) { + channelPicture() + } + + Spacer(modifier = DoubleHorzSpacer) + + Column( + modifier = Modifier.fillMaxWidth() + ) { + firstRow() + + + Spacer(modifier = Height4dpModifier) + + secondRow() + } + } + + Divider( + modifier = StdTopPadding, + thickness = DividerThickness + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomHeaderCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomHeaderCompose.kt index b13af3eef..65db557e0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomHeaderCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomHeaderCompose.kt @@ -57,9 +57,11 @@ import com.vitorpamplona.amethyst.ui.theme.DividerThickness import com.vitorpamplona.amethyst.ui.theme.DoubleHorzSpacer import com.vitorpamplona.amethyst.ui.theme.Height4dpModifier import com.vitorpamplona.amethyst.ui.theme.Size55Modifier +import com.vitorpamplona.amethyst.ui.theme.AccountPictureModifier import com.vitorpamplona.amethyst.ui.theme.Size55dp import com.vitorpamplona.amethyst.ui.theme.Size75dp import com.vitorpamplona.amethyst.ui.theme.StdTopPadding +import com.vitorpamplona.amethyst.ui.theme.emptyLineItemModifier import com.vitorpamplona.amethyst.ui.theme.grayText import com.vitorpamplona.amethyst.ui.theme.placeholderText import com.vitorpamplona.quartz.encoders.HexKey @@ -120,11 +122,7 @@ private fun ChatroomPrivateMessages( if (room != null) { UserRoomCompose(baseNote, room, accountViewModel, nav) } else { - Box( - Modifier - .height(Size75dp) - .fillMaxWidth() - ) { + Box(emptyLineItemModifier) { // Makes sure just a max amount of objects are loaded. } } @@ -454,12 +452,7 @@ fun ChannelName( robot = channelIdHex, model = channelPicture, contentDescription = stringResource(R.string.channel_image), - modifier = remember { - Modifier - .width(Size55dp) - .height(Size55dp) - .clip(shape = CircleShape) - }, + modifier = AccountPictureModifier, loadProfilePicture = loadProfilePicture ) }, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt index d719ec38d..7d56f27bd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt @@ -158,3 +158,5 @@ val IconRowTextModifier = Modifier.padding(start = 16.dp) val IconRowModifier = Modifier .fillMaxWidth() .padding(vertical = 15.dp, horizontal = 25.dp) + +val emptyLineItemModifier = Modifier.height(Size75dp).fillMaxWidth() \ No newline at end of file