Use LocalDimensions in LandingActivity

This commit is contained in:
Andrew 2024-06-11 15:07:53 +09:30
parent 9ee2b9207b
commit 50f9864a8b
4 changed files with 113 additions and 97 deletions

View File

@ -24,6 +24,7 @@ import network.loki.messenger.R
import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences
import org.thoughtcrime.securesms.ui.AppTheme import org.thoughtcrime.securesms.ui.AppTheme
import org.thoughtcrime.securesms.ui.ItemButton import org.thoughtcrime.securesms.ui.ItemButton
import org.thoughtcrime.securesms.ui.LocalDimensions
import org.thoughtcrime.securesms.ui.classicDarkColors import org.thoughtcrime.securesms.ui.classicDarkColors
import org.thoughtcrime.securesms.ui.components.AppBar import org.thoughtcrime.securesms.ui.components.AppBar
import org.thoughtcrime.securesms.ui.components.QrImage import org.thoughtcrime.securesms.ui.components.QrImage
@ -57,20 +58,20 @@ class NewConversationHomeFragment : Fragment() {
Column(modifier = Modifier.background(MaterialTheme.colors.primarySurface)) { Column(modifier = Modifier.background(MaterialTheme.colors.primarySurface)) {
AppBar(stringResource(R.string.dialog_new_conversation_title), onClose = { delegate.onDialogClosePressed() }) AppBar(stringResource(R.string.dialog_new_conversation_title), onClose = { delegate.onDialogClosePressed() })
ItemButton(textId = R.string.messageNew, icon = R.drawable.ic_message) { delegate.onNewMessageSelected() } ItemButton(textId = R.string.messageNew, icon = R.drawable.ic_message) { delegate.onNewMessageSelected() }
Divider(modifier = Modifier.padding(start = 80.dp)) Divider(startIndent = LocalDimensions.current.dividerIndent)
ItemButton(textId = R.string.activity_create_group_title, icon = R.drawable.ic_group) { delegate.onCreateGroupSelected() } ItemButton(textId = R.string.activity_create_group_title, icon = R.drawable.ic_group) { delegate.onCreateGroupSelected() }
Divider(modifier = Modifier.padding(start = 80.dp)) Divider(startIndent = LocalDimensions.current.dividerIndent)
ItemButton(textId = R.string.dialog_join_community_title, icon = R.drawable.ic_globe) { delegate.onJoinCommunitySelected() } ItemButton(textId = R.string.dialog_join_community_title, icon = R.drawable.ic_globe) { delegate.onJoinCommunitySelected() }
Divider(modifier = Modifier.padding(start = 80.dp)) Divider(startIndent = LocalDimensions.current.dividerIndent)
ItemButton(textId = R.string.activity_settings_invite_button_title, icon = R.drawable.ic_invite_friend, contentDescription = R.string.AccessibilityId_invite_friend_button) { delegate.onInviteFriend() } ItemButton(textId = R.string.activity_settings_invite_button_title, icon = R.drawable.ic_invite_friend, contentDescription = R.string.AccessibilityId_invite_friend_button) { delegate.onInviteFriend() }
Column( Column(
modifier = Modifier modifier = Modifier
.padding(horizontal = 32.dp) .padding(horizontal = LocalDimensions.current.marginMedium)
.padding(top = 20.dp)) { .padding(top = LocalDimensions.current.itemSpacingMedium)) {
Text(text = stringResource(R.string.accountIdYours), style = MaterialTheme.typography.medium) Text(text = stringResource(R.string.accountIdYours), style = MaterialTheme.typography.medium)
Spacer(modifier = Modifier.height(4.dp)) Spacer(modifier = Modifier.height(LocalDimensions.current.itemSpacingTiny))
Text(text = stringResource(R.string.qrYoursDescription), color = classicDarkColors[5], style = MaterialTheme.typography.small) Text(text = stringResource(R.string.qrYoursDescription), color = classicDarkColors[5], style = MaterialTheme.typography.small)
Spacer(modifier = Modifier.height(20.dp)) Spacer(modifier = Modifier.height(LocalDimensions.current.itemSpacingSmall))
QrImage(string = TextSecurePreferences.getLocalNumber(requireContext())!!, Modifier.contentDescription(R.string.AccessibilityId_qr_code)) QrImage(string = TextSecurePreferences.getLocalNumber(requireContext())!!, Modifier.contentDescription(R.string.AccessibilityId_qr_code))
} }
} }

View File

@ -17,11 +17,11 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Card
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -49,6 +49,8 @@ import org.thoughtcrime.securesms.onboarding.pickname.startPickDisplayNameActivi
import org.thoughtcrime.securesms.service.KeyCachingService import org.thoughtcrime.securesms.service.KeyCachingService
import org.thoughtcrime.securesms.showOpenUrlDialog import org.thoughtcrime.securesms.showOpenUrlDialog
import org.thoughtcrime.securesms.ui.AppTheme import org.thoughtcrime.securesms.ui.AppTheme
import org.thoughtcrime.securesms.ui.Cell
import org.thoughtcrime.securesms.ui.LocalDimensions
import org.thoughtcrime.securesms.ui.PreviewTheme import org.thoughtcrime.securesms.ui.PreviewTheme
import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider
import org.thoughtcrime.securesms.ui.classicDarkColors import org.thoughtcrime.securesms.ui.classicDarkColors
@ -119,63 +121,68 @@ class LandingActivity : BaseActionBarActivity() {
} }
} }
Column(modifier = Modifier.padding(horizontal = 36.dp)) { Column {
Spacer(modifier = Modifier.weight(1f)) Column(modifier = Modifier
Text( .weight(1f)
stringResource(R.string.onboardingBubblePrivacyInYourPocket), .padding(horizontal = LocalDimensions.current.marginMedium)) {
modifier = Modifier.align(Alignment.CenterHorizontally), Spacer(modifier = Modifier.weight(1f))
style = MaterialTheme.typography.h4, Text(
textAlign = TextAlign.Center stringResource(R.string.onboardingBubblePrivacyInYourPocket),
) modifier = Modifier.align(Alignment.CenterHorizontally),
Spacer(modifier = Modifier.height(24.dp)) style = MaterialTheme.typography.h4,
textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(LocalDimensions.current.itemSpacingMedium))
LazyColumn( LazyColumn(
state = listState, state = listState,
modifier = Modifier modifier = Modifier
.heightIn(min = 200.dp) .heightIn(min = 200.dp)
.fillMaxWidth() .fillMaxWidth()
.weight(2f), .weight(3f),
verticalArrangement = Arrangement.spacedBy(16.dp) verticalArrangement = Arrangement.spacedBy(LocalDimensions.current.itemSpacingSmall)
) { ) {
items( items(
MESSAGES.take(count), MESSAGES.take(count),
key = { it.stringId } key = { it.stringId }
) { item -> ) { item ->
AnimateMessageText( AnimateMessageText(
stringResource(item.stringId), stringResource(item.stringId),
item.isOutgoing item.isOutgoing
) )
}
} }
Spacer(modifier = Modifier.weight(1f))
} }
Spacer(modifier = Modifier.weight(1f)) Column(modifier = Modifier.padding(horizontal = LocalDimensions.current.marginLarge)) {
FilledButton(
OutlineButton( text = stringResource(R.string.onboardingAccountCreate),
text = stringResource(R.string.onboardingAccountCreate), modifier = Modifier
modifier = Modifier .fillMaxWidth()
.contentDescription(R.string.AccessibilityId_create_account_button) .align(Alignment.CenterHorizontally)
.width(262.dp) .contentDescription(R.string.AccessibilityId_create_account_button),
.align(Alignment.CenterHorizontally), onClick = ::startPickDisplayNameActivity
onClick = ::startPickDisplayNameActivity )
) Spacer(modifier = Modifier.height(LocalDimensions.current.itemSpacingSmall))
Spacer(modifier = Modifier.height(14.dp)) OutlineButton(
FilledButton( text = stringResource(R.string.onboardingAccountExists),
text = stringResource(R.string.onboardingAccountExists), modifier = Modifier
modifier = Modifier .fillMaxWidth()
.width(262.dp) .align(Alignment.CenterHorizontally)
.align(Alignment.CenterHorizontally) .contentDescription(R.string.AccessibilityId_restore_account_button)
.contentDescription(R.string.AccessibilityId_restore_account_button) ) { start<LinkDeviceActivity>() }
) { start<LinkDeviceActivity>() } BorderlessButton(
Spacer(modifier = Modifier.height(8.dp)) text = stringResource(R.string.onboardingTosPrivacy),
BorderlessButton( modifier = Modifier
text = stringResource(R.string.onboardingTosPrivacy), .fillMaxWidth()
modifier = Modifier .align(Alignment.CenterHorizontally)
.width(262.dp) .contentDescription(R.string.AccessibilityId_open_url),
.align(Alignment.CenterHorizontally) onClick = ::openDialog
.contentDescription(R.string.AccessibilityId_open_url), )
onClick = ::openDialog Spacer(modifier = Modifier.height(LocalDimensions.current.itemSpacingExtraSmall))
) }
Spacer(modifier = Modifier.height(8.dp))
} }
} }
@ -218,47 +225,34 @@ private fun AnimateMessageText(text: String, isOutgoing: Boolean, modifier: Modi
@Composable @Composable
private fun MessageText(text: String, isOutgoing: Boolean, modifier: Modifier) { private fun MessageText(text: String, isOutgoing: Boolean, modifier: Modifier) {
if (isOutgoing) OutgoingText(text, modifier) else IncomingText(text, modifier)
}
@Composable
private fun IncomingText(text: String, modifier: Modifier = Modifier) {
ChatText(
text,
color = classicDarkColors[2],
modifier = modifier
)
}
@Composable
private fun OutgoingText(text: String, modifier: Modifier = Modifier) {
Box(modifier = modifier then Modifier.fillMaxWidth()) { Box(modifier = modifier then Modifier.fillMaxWidth()) {
ChatText( MessageText(
text, text,
color = session_accent, color = if (isOutgoing) session_accent else classicDarkColors[2],
textColor = MaterialTheme.colors.primary, textColor = if (isOutgoing) MaterialTheme.colors.primary else Color.Unspecified,
modifier = Modifier.align(Alignment.TopEnd) modifier = Modifier.align(if (isOutgoing) Alignment.TopEnd else Alignment.TopStart)
) )
} }
} }
@Composable @Composable
private fun ChatText( private fun MessageText(
text: String, text: String,
color: Color, color: Color,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
textColor: Color = Color.Unspecified textColor: Color = Color.Unspecified
) { ) {
Text( Card(
text, modifier = modifier.fillMaxWidth(0.666f),
style = MaterialTheme.typography.large, shape = RoundedCornerShape(size = 13.dp),
color = textColor, backgroundColor = color,
modifier = modifier elevation = 0.dp
.fillMaxWidth(0.666f) ) {
.background( Text(
color = color, text,
shape = RoundedCornerShape(size = 13.dp) style = MaterialTheme.typography.large,
) color = textColor,
.padding(horizontal = 16.dp, vertical = 12.dp) modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp)
) )
}
} }

View File

@ -5,6 +5,7 @@ import androidx.annotation.AttrRes
import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.LocalTextSelectionColors import androidx.compose.foundation.text.selection.LocalTextSelectionColors
import androidx.compose.foundation.text.selection.TextSelectionColors import androidx.compose.foundation.text.selection.TextSelectionColors
import androidx.compose.material.LocalContentColor import androidx.compose.material.LocalContentColor
@ -21,7 +22,9 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.google.accompanist.themeadapter.appcompat.createAppCompatTheme import com.google.accompanist.themeadapter.appcompat.createAppCompatTheme
import com.google.android.material.color.MaterialColors import com.google.android.material.color.MaterialColors
@ -32,6 +35,20 @@ val LocalButtonColor = staticCompositionLocalOf { Color.Black }
val LocalLightCell = staticCompositionLocalOf { Color.Black } val LocalLightCell = staticCompositionLocalOf { Color.Black }
val LocalOnLightCell = staticCompositionLocalOf { Color.Black } val LocalOnLightCell = staticCompositionLocalOf { Color.Black }
val LocalDimensions = staticCompositionLocalOf { Dimensions() }
data class Dimensions(
val itemSpacingTiny: Dp = 4.dp,
val itemSpacingExtraSmall: Dp = 8.dp,
val itemSpacingSmall: Dp = 16.dp,
val itemSpacingMedium: Dp = 24.dp,
val marginTiny: Dp = 8.dp,
val marginSmall: Dp = 16.dp,
val marginMedium: Dp = 32.dp,
val marginLarge: Dp = 64.dp,
val dividerIndent: Dp = 80.dp,
)
/** /**
* Converts current Theme to Compose Theme. * Converts current Theme to Compose Theme.
*/ */
@ -85,7 +102,9 @@ fun AppCompatTheme(
surface = surface ?: colors.surface surface = surface ?: colors.surface
), ),
typography = typography, typography = typography,
shapes = shapes, shapes = shapes.copy(
small = RoundedCornerShape(50)
),
) { ) {
// We update the LocalContentColor to match our onBackground. This allows the default // We update the LocalContentColor to match our onBackground. This allows the default
// content color to be more appropriate to the theme background // content color to be more appropriate to the theme background

View File

@ -23,6 +23,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.Shape
@ -41,7 +42,6 @@ import org.thoughtcrime.securesms.ui.extraSmall
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
val LocalButtonSize = staticCompositionLocalOf { mediumButton } val LocalButtonSize = staticCompositionLocalOf { mediumButton }
val LocalButtonShape = staticCompositionLocalOf<Shape> { RoundedCornerShape(percent = 50) }
@Composable @Composable
fun Modifier.applyButtonSize() = then(LocalButtonSize.current) fun Modifier.applyButtonSize() = then(LocalButtonSize.current)
@ -56,7 +56,10 @@ fun OutlineButton(@StringRes textId: Int, modifier: Modifier = Modifier, onClick
@Composable @Composable
fun OutlineButton(text: String, modifier: Modifier = Modifier, onClick: () -> Unit) { fun OutlineButton(text: String, modifier: Modifier = Modifier, onClick: () -> Unit) {
OutlineButton(modifier.contentDescription(text), onClick = onClick) { Text(text) } OutlineButton(
modifier.contentDescription(text),
onClick = onClick
) { Text(text) }
} }
@Composable @Composable
@ -71,7 +74,6 @@ fun OutlineButton(
interactionSource = interactionSource, interactionSource = interactionSource,
onClick = onClick, onClick = onClick,
border = BorderStroke(1.dp, LocalButtonColor.current), border = BorderStroke(1.dp, LocalButtonColor.current),
shape = LocalButtonShape.current,
colors = ButtonDefaults.outlinedButtonColors( colors = ButtonDefaults.outlinedButtonColors(
contentColor = LocalButtonColor.current, contentColor = LocalButtonColor.current,
backgroundColor = Color.Unspecified backgroundColor = Color.Unspecified
@ -125,7 +127,7 @@ fun FilledButton(
onClick: () -> Unit onClick: () -> Unit
) { ) {
OutlinedButton( OutlinedButton(
modifier = modifier.size(108.dp, 34.dp), modifier = modifier,
onClick = onClick, onClick = onClick,
shape = RoundedCornerShape(50), shape = RoundedCornerShape(50),
colors = ButtonDefaults.outlinedButtonColors( colors = ButtonDefaults.outlinedButtonColors(