🚀 Update UI of About Screen

* Material3 Style
This commit is contained in:
Acclorite 2025-02-05 12:20:07 +02:00
parent 85e4159249
commit 6e497a7d67
5 changed files with 166 additions and 170 deletions

View file

@ -6,38 +6,47 @@
package ua.acclorite.book_story.presentation.about package ua.acclorite.book_story.presentation.about
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.domain.about.Badge import ua.acclorite.book_story.domain.about.Badge
import ua.acclorite.book_story.presentation.core.components.common.IconButton
@Composable @Composable
fun AboutBadgeItem( fun AboutBadgeItem(
badge: Badge, badge: Badge,
onClick: () -> Unit onClick: () -> Unit
) { ) {
if (badge.imageVector == null && badge.drawable != null) { Box(
IconButton( modifier = Modifier
modifier = Modifier.size(22.dp), .clip(MaterialTheme.shapes.large)
icon = badge.drawable, .background(MaterialTheme.colorScheme.surfaceContainer)
contentDescription = badge.contentDescription, .clickable { onClick() }
disableOnClick = false, .padding(14.dp)
color = MaterialTheme.colorScheme.primary ) {
) { if (badge.imageVector == null && badge.drawable != null) {
onClick() Icon(
} modifier = Modifier.size(22.dp),
} else if (badge.imageVector != null && badge.drawable == null) { painter = painterResource(id = badge.drawable),
IconButton( contentDescription = stringResource(id = badge.contentDescription),
modifier = Modifier.size(22.dp), tint = MaterialTheme.colorScheme.primary
icon = badge.imageVector, )
contentDescription = badge.contentDescription, } else if (badge.imageVector != null && badge.drawable == null) {
disableOnClick = false, Icon(
color = MaterialTheme.colorScheme.primary modifier = Modifier.size(22.dp),
) { imageVector = badge.imageVector,
onClick() contentDescription = stringResource(id = badge.contentDescription),
tint = MaterialTheme.colorScheme.primary
)
} }
} }
} }

View file

@ -7,16 +7,13 @@
package ua.acclorite.book_story.presentation.about package ua.acclorite.book_story.presentation.about
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.constants.Constants
import ua.acclorite.book_story.presentation.core.constants.provideAboutBadges import ua.acclorite.book_story.presentation.core.constants.provideAboutBadges
@ -29,36 +26,30 @@ fun AboutBadges(
) { ) {
val context = LocalContext.current val context = LocalContext.current
Box( LazyRow(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) { ) {
LazyRow( items(
Modifier Constants.provideAboutBadges(),
.padding(18.dp), key = { it.id }
verticalAlignment = Alignment.CenterVertically, ) { badge ->
horizontalArrangement = Arrangement.spacedBy(13.dp) AboutBadgeItem(badge = badge) {
) { when (badge.id) {
items( "tryzub" -> {
Constants.provideAboutBadges(), context.getString(R.string.slava_ukraini)
key = { it.id } .showToast(context = context, longToast = false)
) { badge -> }
AboutBadgeItem(badge = badge) {
when (badge.id) {
"tryzub" -> {
context.getString(R.string.slava_ukraini)
.showToast(context = context, longToast = false)
}
else -> { else -> {
badge.url?.let { badge.url?.let {
navigateToBrowserPage( navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage( AboutEvent.OnNavigateToBrowserPage(
page = it, page = it,
context = context context = context
)
) )
} )
} }
} }
} }

View file

@ -8,6 +8,7 @@ package ua.acclorite.book_story.presentation.about
import androidx.compose.animation.core.EaseInOut import androidx.compose.animation.core.EaseInOut
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@ -21,9 +22,9 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator
@ -34,7 +35,6 @@ fun AboutItem(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
title: String, title: String,
description: AnnotatedString?, description: AnnotatedString?,
verticalPadding: Dp = 12.dp,
showLoading: Boolean = false, showLoading: Boolean = false,
isOnClickEnabled: Boolean = true, isOnClickEnabled: Boolean = true,
onClick: () -> Unit = {} onClick: () -> Unit = {}
@ -42,10 +42,12 @@ fun AboutItem(
Row( Row(
modifier modifier
.fillMaxWidth() .fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.background(MaterialTheme.colorScheme.surfaceContainer)
.clickable(enabled = isOnClickEnabled) { .clickable(enabled = isOnClickEnabled) {
onClick() onClick()
} }
.padding(horizontal = 18.dp, vertical = verticalPadding), .padding(horizontal = 18.dp, vertical = 18.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
Column(Modifier.weight(1f)) { Column(Modifier.weight(1f)) {

View file

@ -6,21 +6,25 @@
package ua.acclorite.book_story.presentation.about package ua.acclorite.book_story.presentation.about
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material3.HorizontalDivider import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@ -35,6 +39,7 @@ import ua.acclorite.book_story.presentation.core.constants.provideReleasesPage
import ua.acclorite.book_story.presentation.core.constants.provideTranslationPage import ua.acclorite.book_story.presentation.core.constants.provideTranslationPage
import ua.acclorite.book_story.ui.about.AboutEvent import ua.acclorite.book_story.ui.about.AboutEvent
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun AboutLayout( fun AboutLayout(
updateLoading: Boolean, updateLoading: Boolean,
@ -46,16 +51,13 @@ fun AboutLayout(
navigateToCredits: () -> Unit navigateToCredits: () -> Unit
) { ) {
val context = LocalContext.current val context = LocalContext.current
LazyColumnWithScrollbar( LazyColumnWithScrollbar(
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.padding(top = paddingValues.calculateTopPadding()), .padding(top = paddingValues.calculateTopPadding()),
state = listState state = listState
) { ) {
item {
Spacer(modifier = Modifier.height(16.dp))
}
item { item {
Box( Box(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
@ -65,123 +67,119 @@ fun AboutLayout(
painterResource(id = R.drawable.app_icon), painterResource(id = R.drawable.app_icon),
contentDescription = stringResource(id = R.string.app_icon_content_desc), contentDescription = stringResource(id = R.string.app_icon_content_desc),
modifier = Modifier modifier = Modifier
.padding(14.dp) .padding(horizontal = 14.dp)
.size(120.dp), .padding(
tint = MaterialTheme.colorScheme.onSurfaceVariant top = 40.dp,
bottom = 50.dp
)
.size(180.dp),
tint = MaterialTheme.colorScheme.primary
) )
} }
} }
item { item {
Spacer(modifier = Modifier.height(36.dp)) Column(
HorizontalDivider( modifier = Modifier
modifier = Modifier.fillMaxWidth(), .fillMaxWidth()
color = MaterialTheme.colorScheme.outlineVariant .clip(
) MaterialTheme.shapes.extraLarge.copy(
} bottomStart = CornerSize(0),
bottomEnd = CornerSize(0)
item {
AboutItem(
title = stringResource(id = R.string.app_version_option),
description = buildAnnotatedString {
append(
stringResource(
id = R.string.app_version_option_desc_1,
context.getString(R.string.app_version)
) )
) )
append("\n") .background(MaterialTheme.colorScheme.surfaceContainerLow)
append(stringResource(id = R.string.app_version_option_desc_2)) .padding(24.dp)
}, .navigationBarsPadding(),
showLoading = updateLoading verticalArrangement = Arrangement.spacedBy(12.dp)
) { ) {
checkForUpdate( AboutItem(
AboutEvent.OnCheckForUpdate( title = stringResource(id = R.string.app_version_option),
context = context description = buildAnnotatedString {
append(
stringResource(
id = R.string.app_version_option_desc_1,
context.getString(R.string.app_version)
)
)
append("\n")
append(stringResource(id = R.string.app_version_option_desc_2))
},
showLoading = updateLoading
) {
checkForUpdate(
AboutEvent.OnCheckForUpdate(
context = context
)
) )
}
AboutItem(
title = stringResource(id = R.string.report_bug_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideIssuesPage(),
context = context
)
)
}
AboutItem(
title = stringResource(id = R.string.contributors_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideContributorsPage(),
context = context
)
)
}
AboutItem(
title = stringResource(id = R.string.whats_new_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideReleasesPage(),
context = context
)
)
}
AboutItem(
title = stringResource(id = R.string.licenses_option),
description = null
) {
navigateToLicenses()
}
AboutItem(
title = stringResource(id = R.string.credits_option),
description = null
) {
navigateToCredits()
}
AboutItem(
title = stringResource(id = R.string.help_translate_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideTranslationPage(),
context = context
)
)
}
AboutBadges(
navigateToBrowserPage = navigateToBrowserPage
) )
} }
} }
item {
AboutItem(
title = stringResource(id = R.string.report_bug_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideIssuesPage(),
context = context
)
)
}
}
item {
AboutItem(
title = stringResource(id = R.string.contributors_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideContributorsPage(),
context = context
)
)
}
}
item {
AboutItem(
title = stringResource(id = R.string.whats_new_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideReleasesPage(),
context = context
)
)
}
}
item {
AboutItem(
title = stringResource(id = R.string.licenses_option),
description = null
) {
navigateToLicenses()
}
}
item {
AboutItem(
title = stringResource(id = R.string.credits_option),
description = null
) {
navigateToCredits()
}
}
item {
AboutItem(
title = stringResource(id = R.string.help_translate_option),
description = null
) {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideTranslationPage(),
context = context
)
)
}
}
item {
AboutBadges(
navigateToBrowserPage = navigateToBrowserPage
)
}
} }
} }

View file

@ -6,10 +6,7 @@
package ua.acclorite.book_story.presentation.about package ua.acclorite.book_story.presentation.about
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -35,8 +32,7 @@ fun AboutScaffold(
Scaffold( Scaffold(
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection) .nestedScroll(scrollBehavior.nestedScrollConnection),
.windowInsetsPadding(WindowInsets.navigationBars),
containerColor = MaterialTheme.colorScheme.surface, containerColor = MaterialTheme.colorScheme.surface,
topBar = { topBar = {
AboutTopBar( AboutTopBar(