From b78967f8be8e5ba5dc31eabf826b1448b5eb774c Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 19 Jun 2023 21:58:12 -0400 Subject: [PATCH] Screen diet --- .../amethyst/ui/actions/NewPostView.kt | 3 +- .../amethyst/ui/navigation/AppBottomBar.kt | 2 +- .../amethyst/ui/navigation/AppTopBar.kt | 8 +- .../ui/screen/loggedIn/ChannelScreen.kt | 99 ++++++++++++++++++- 4 files changed, 105 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 2a6f43872..c40e42a44 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -723,7 +723,8 @@ fun PostButton(onPost: () -> Unit = {}, isActive: Boolean, modifier: Modifier = colors = ButtonDefaults .buttonColors( backgroundColor = if (isActive) MaterialTheme.colors.primary else Color.Gray - ) + ), + contentPadding = PaddingValues(0.dp) ) { Text(text = stringResource(R.string.post), color = Color.White) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt index 798336471..19b8e36f6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt @@ -101,7 +101,7 @@ private fun RenderBottomMenu( navEntryState: State, nav: (Route, Boolean) -> Unit ) { - Column() { + Column(modifier = Modifier.height(50.dp)) { Divider( thickness = 0.25.dp ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt index 25331d726..b98896764 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt @@ -115,6 +115,8 @@ private fun RenderTopRouteBar( accountViewModel: AccountViewModel ) { when (currentRoute) { + Route.Channel.base -> NoTopBar() + Route.Room.base -> NoTopBar() // Route.Profile.route -> TopBarWithBackButton(nav) Route.Home.base -> HomeTopBar(followLists, scaffoldState, accountViewModel) Route.Video.base -> StoriesTopBar(followLists, scaffoldState, accountViewModel) @@ -123,6 +125,10 @@ private fun RenderTopRouteBar( } } +@Composable +fun NoTopBar() { +} + @Composable fun StoriesTopBar(followLists: FollowListViewModel, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { GenericTopBar(scaffoldState, accountViewModel) { accountViewModel -> @@ -206,7 +212,7 @@ fun GenericTopBar(scaffoldState: ScaffoldState, accountViewModel: AccountViewMod NewRelayListView({ wantsToEditRelays = false }, accountViewModel) } - Column() { + Column(modifier = Modifier.height(50.dp)) { TopAppBar( elevation = 0.dp, backgroundColor = MaterialTheme.colors.surface, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt index 8a63c60ba..9b58aca75 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt @@ -2,12 +2,15 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.widget.Toast import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -16,19 +19,23 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.material.Divider import androidx.compose.material.DropdownMenu import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.LocalTextStyle import androidx.compose.material.MaterialTheme import androidx.compose.material.Text -import androidx.compose.material.TextField +import androidx.compose.material.TextFieldColors import androidx.compose.material.TextFieldDefaults +import androidx.compose.material.TextFieldDefaults.indicatorLine import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Cancel import androidx.compose.material.icons.filled.EditNote @@ -47,14 +54,19 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.takeOrElse import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextDirection import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @@ -322,7 +334,7 @@ fun EditFieldRow( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - TextField( + MyTextField( value = channelScreenModel.message, onValueChange = { channelScreenModel.updateMessage(it) @@ -345,14 +357,14 @@ fun EditFieldRow( onSendNewMessage() }, isActive = channelScreenModel.message.text.isNotBlank() && !channelScreenModel.isUploadingImage, - modifier = Modifier.padding(end = 10.dp) + modifier = Modifier.height(32.dp).padding(end = 10.dp) ) }, leadingIcon = { UploadFromGallery( isUploading = channelScreenModel.isUploadingImage, tint = MaterialTheme.colors.placeholderText, - modifier = Modifier.padding(start = 5.dp) + modifier = Modifier.height(32.dp).padding(start = 2.dp) ) { val fileServer = if (isPrivate) { // TODO: Make private servers @@ -380,6 +392,85 @@ fun EditFieldRow( } } +@Composable +fun MyTextField( + value: TextFieldValue, + onValueChange: (TextFieldValue) -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + readOnly: Boolean = false, + textStyle: TextStyle = LocalTextStyle.current, + label: @Composable (() -> Unit)? = null, + placeholder: @Composable (() -> Unit)? = null, + leadingIcon: @Composable (() -> Unit)? = null, + trailingIcon: @Composable (() -> Unit)? = null, + isError: Boolean = false, + visualTransformation: VisualTransformation = VisualTransformation.None, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions(), + singleLine: Boolean = false, + maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, + minLines: Int = 1, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + shape: Shape = TextFieldDefaults.TextFieldShape, + colors: TextFieldColors = TextFieldDefaults.textFieldColors() +) { + // If color is not provided via the text style, use content color as a default + val textColor = textStyle.color.takeOrElse { + colors.textColor(enabled).value + } + val mergedTextStyle = textStyle.merge(TextStyle(color = textColor)) + + @OptIn(ExperimentalMaterialApi::class) + ( + BasicTextField( + value = value, + modifier = modifier + .background(colors.backgroundColor(enabled).value, shape) + .indicatorLine(enabled, isError, interactionSource, colors) + .defaultMinSize( + minWidth = TextFieldDefaults.MinWidth, + minHeight = 36.dp + ), + onValueChange = onValueChange, + enabled = enabled, + readOnly = readOnly, + textStyle = mergedTextStyle, + cursorBrush = SolidColor(colors.cursorColor(isError).value), + visualTransformation = visualTransformation, + keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, + interactionSource = interactionSource, + singleLine = singleLine, + maxLines = maxLines, + minLines = minLines, + decorationBox = @Composable { innerTextField -> + // places leading icon, text field with label and placeholder, trailing icon + TextFieldDefaults.TextFieldDecorationBox( + value = value.text, + visualTransformation = visualTransformation, + innerTextField = innerTextField, + placeholder = placeholder, + label = label, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + singleLine = singleLine, + enabled = enabled, + isError = isError, + interactionSource = interactionSource, + colors = colors, + contentPadding = TextFieldDefaults.textFieldWithoutLabelPadding( + top = 12.dp, + bottom = 12.dp, + start = 10.dp, + end = 10.dp + ) + ) + } + ) + ) +} + @Composable fun ChannelHeader(channelHex: String, accountViewModel: AccountViewModel, nav: (String) -> Unit) { var baseChannel by remember { mutableStateOf(null) }