Refactor setting screens

This commit is contained in:
Sad Ellie 2023-09-28 15:10:39 +03:00
parent 165fdd38ad
commit 59c151d2a6
5 changed files with 118 additions and 41 deletions

View File

@ -82,8 +82,7 @@ private fun SettingsScreen(
) { padding -> ) { padding ->
LazyColumn(contentPadding = padding) { LazyColumn(contentPadding = padding) {
// THEME item("theme") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.Default.Palette, icon = Icons.Default.Palette,
iconDescription = stringResource(R.string.display_settings), iconDescription = stringResource(R.string.display_settings),
@ -93,8 +92,7 @@ private fun SettingsScreen(
) )
} }
// START SCREEN item("starting screen") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.Default.Home, icon = Icons.Default.Home,
iconDescription = stringResource(R.string.starting_screen_setting), iconDescription = stringResource(R.string.starting_screen_setting),
@ -104,8 +102,7 @@ private fun SettingsScreen(
) )
} }
// FORMATTING item("formatting") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.Default._123, icon = Icons.Default._123,
iconDescription = stringResource(R.string.formatting_setting), iconDescription = stringResource(R.string.formatting_setting),
@ -115,7 +112,7 @@ private fun SettingsScreen(
) )
} }
item { item("calculator") {
UnittoListItem( UnittoListItem(
icon = Icons.Default.Calculate, icon = Icons.Default.Calculate,
iconDescription = stringResource(R.string.calculator), iconDescription = stringResource(R.string.calculator),
@ -125,7 +122,7 @@ private fun SettingsScreen(
) )
} }
item { item("unit converter") {
UnittoListItem( UnittoListItem(
icon = Icons.Default.SwapHoriz, icon = Icons.Default.SwapHoriz,
iconDescription = stringResource(R.string.unit_converter), iconDescription = stringResource(R.string.unit_converter),
@ -135,11 +132,9 @@ private fun SettingsScreen(
) )
} }
// ADDITIONAL GROUP item("additional") { Header(stringResource(R.string.additional_settings_group)) }
item { Header(stringResource(R.string.additional_settings_group)) }
// VIBRATIONS item("vibrations") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.Default.Vibration, icon = Icons.Default.Vibration,
iconDescription = stringResource(R.string.enable_vibrations), iconDescription = stringResource(R.string.enable_vibrations),
@ -153,7 +148,7 @@ private fun SettingsScreen(
// RATE THIS APP // RATE THIS APP
if (BuildConfig.STORE_LINK.isNotEmpty()) { if (BuildConfig.STORE_LINK.isNotEmpty()) {
item { item("rate this app") {
UnittoListItem( UnittoListItem(
icon = Icons.Default.RateReview, icon = Icons.Default.RateReview,
iconDescription = stringResource(R.string.rate_this_app), iconDescription = stringResource(R.string.rate_this_app),
@ -163,8 +158,7 @@ private fun SettingsScreen(
} }
} }
// More settings item("about") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.Default.Info, icon = Icons.Default.Info,
iconDescription = stringResource(R.string.about_unitto), iconDescription = stringResource(R.string.about_unitto),

View File

@ -41,6 +41,7 @@ import androidx.compose.runtime.setValue
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.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.sadellie.unitto.core.base.BuildConfig import com.sadellie.unitto.core.base.BuildConfig
@ -49,15 +50,32 @@ import com.sadellie.unitto.core.ui.common.NavigateUpButton
import com.sadellie.unitto.core.ui.common.UnittoListItem import com.sadellie.unitto.core.ui.common.UnittoListItem
import com.sadellie.unitto.core.ui.common.UnittoScreenWithLargeTopBar import com.sadellie.unitto.core.ui.common.UnittoScreenWithLargeTopBar
import com.sadellie.unitto.core.ui.openLink import com.sadellie.unitto.core.ui.openLink
import com.sadellie.unitto.data.userprefs.AboutPreferences
@Composable @Composable
internal fun AboutScreen( internal fun AboutRoute(
viewModel: AboutViewModel = hiltViewModel(), viewModel: AboutViewModel = hiltViewModel(),
navigateUpAction: () -> Unit, navigateUpAction: () -> Unit,
navigateToThirdParty: () -> Unit, navigateToThirdParty: () -> Unit,
) { ) {
val mContext = LocalContext.current
val prefs = viewModel.prefs.collectAsStateWithLifecycle() val prefs = viewModel.prefs.collectAsStateWithLifecycle()
AboutScreen(
prefs = prefs.value,
navigateUpAction = navigateUpAction,
navigateToThirdParty = navigateToThirdParty,
enableToolsExperiment = viewModel::enableToolsExperiment
)
}
@Composable
private fun AboutScreen(
prefs: AboutPreferences,
navigateUpAction: () -> Unit,
navigateToThirdParty: () -> Unit,
enableToolsExperiment: () -> Unit,
) {
val mContext = LocalContext.current
var aboutItemClick: Int by rememberSaveable { mutableIntStateOf(0) } var aboutItemClick: Int by rememberSaveable { mutableIntStateOf(0) }
var showDialog: Boolean by rememberSaveable { mutableStateOf(false) } var showDialog: Boolean by rememberSaveable { mutableStateOf(false) }
@ -139,7 +157,7 @@ internal fun AboutScreen(
headlineText = stringResource(R.string.app_version_name_setting), headlineText = stringResource(R.string.app_version_name_setting),
supportingText = "${BuildConfig.APP_NAME} (${BuildConfig.APP_CODE})", supportingText = "${BuildConfig.APP_NAME} (${BuildConfig.APP_CODE})",
modifier = Modifier.combinedClickable { modifier = Modifier.combinedClickable {
if (prefs.value.enableToolsExperiment) { if (prefs.enableToolsExperiment) {
Toast.makeText(mContext, "Experiments features are already enabled!", Toast.LENGTH_LONG).show() Toast.makeText(mContext, "Experiments features are already enabled!", Toast.LENGTH_LONG).show()
return@combinedClickable return@combinedClickable
} }
@ -147,7 +165,7 @@ internal fun AboutScreen(
aboutItemClick++ aboutItemClick++
if (aboutItemClick < 7) return@combinedClickable if (aboutItemClick < 7) return@combinedClickable
viewModel.enableToolsExperiment() enableToolsExperiment()
Toast.makeText(mContext, "Experimental features enabled!", Toast.LENGTH_LONG).show() Toast.makeText(mContext, "Experimental features enabled!", Toast.LENGTH_LONG).show()
} }
) )
@ -172,3 +190,14 @@ internal fun AboutScreen(
) )
} }
} }
@Preview
@Composable
fun PreviewAboutScreen() {
AboutScreen(
prefs = AboutPreferences(),
navigateUpAction = {},
navigateToThirdParty = {},
enableToolsExperiment = {}
)
}

View File

@ -23,35 +23,60 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Timer import androidx.compose.material.icons.filled.Timer
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.base.R
import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.NavigateUpButton
import com.sadellie.unitto.core.ui.common.UnittoListItem import com.sadellie.unitto.core.ui.common.UnittoListItem
import com.sadellie.unitto.core.ui.common.UnittoScreenWithLargeTopBar import com.sadellie.unitto.core.ui.common.UnittoScreenWithLargeTopBar
import com.sadellie.unitto.data.userprefs.CalculatorPreferences
@Composable @Composable
internal fun CalculatorSettingsScreen( internal fun CalculatorSettingsRoute(
viewModel: CalculatorViewModel = hiltViewModel(), viewModel: CalculatorViewModel = hiltViewModel(),
navigateUpAction: () -> Unit, navigateUpAction: () -> Unit,
) { ) {
val prefs = viewModel.prefs.collectAsStateWithLifecycle() val prefs = viewModel.prefs.collectAsStateWithLifecycle()
CalculatorSettingsScreen(
prefs = prefs.value,
navigateUpAction = navigateUpAction,
updatePartialHistoryView = viewModel::updatePartialHistoryView
)
}
@Composable
private fun CalculatorSettingsScreen(
prefs: CalculatorPreferences,
navigateUpAction: () -> Unit,
updatePartialHistoryView: (Boolean) -> Unit,
) {
UnittoScreenWithLargeTopBar( UnittoScreenWithLargeTopBar(
title = stringResource(R.string.calculator), title = stringResource(R.string.calculator),
navigationIcon = { NavigateUpButton(navigateUpAction) } navigationIcon = { NavigateUpButton(navigateUpAction) }
) { padding -> ) { padding ->
LazyColumn(contentPadding = padding) { LazyColumn(contentPadding = padding) {
item { item("partial history") {
UnittoListItem( UnittoListItem(
headlineText = stringResource(R.string.partial_history_view_setting), headlineText = stringResource(R.string.partial_history_view_setting),
icon = Icons.Default.Timer, icon = Icons.Default.Timer,
iconDescription = stringResource(R.string.partial_history_view_setting), iconDescription = stringResource(R.string.partial_history_view_setting),
supportingText = stringResource(R.string.partial_history_view_setting_support), supportingText = stringResource(R.string.partial_history_view_setting_support),
switchState = prefs.value.partialHistoryView, switchState = prefs.partialHistoryView,
onSwitchChange = viewModel::updatePartialHistoryView onSwitchChange = updatePartialHistoryView
) )
} }
} }
} }
} }
@Preview
@Composable
private fun PreviewCalculatorSettingsScreen() {
CalculatorSettingsScreen(
prefs = CalculatorPreferences(),
navigateUpAction = {},
updatePartialHistoryView = {}
)
}

View File

@ -31,6 +31,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.base.R
@ -38,15 +39,34 @@ import com.sadellie.unitto.core.ui.common.NavigateUpButton
import com.sadellie.unitto.core.ui.common.UnittoListItem import com.sadellie.unitto.core.ui.common.UnittoListItem
import com.sadellie.unitto.core.ui.common.UnittoScreenWithLargeTopBar import com.sadellie.unitto.core.ui.common.UnittoScreenWithLargeTopBar
import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.UnitsListSorting
import com.sadellie.unitto.data.userprefs.ConverterPreferences
import com.sadellie.unitto.feature.settings.components.AlertDialogWithList import com.sadellie.unitto.feature.settings.components.AlertDialogWithList
@Composable @Composable
internal fun ConverterSettingsScreen( internal fun ConverterSettingsRoute(
viewModel: ConverterViewModel = hiltViewModel(), viewModel: ConverterViewModel = hiltViewModel(),
navigateUpAction: () -> Unit, navigateUpAction: () -> Unit,
navigateToUnitsGroup: () -> Unit, navigateToUnitsGroup: () -> Unit,
) { ) {
val prefs = viewModel.prefs.collectAsStateWithLifecycle() val prefs = viewModel.prefs.collectAsStateWithLifecycle()
ConverterSettingsScreen(
prefs = prefs.value,
navigateUpAction = navigateUpAction,
navigateToUnitsGroup = navigateToUnitsGroup,
updateUnitConverterFormatTime = viewModel::updateUnitConverterFormatTime,
updateUnitConverterSorting = viewModel::updateUnitConverterSorting
)
}
@Composable
private fun ConverterSettingsScreen(
prefs: ConverterPreferences,
navigateUpAction: () -> Unit,
navigateToUnitsGroup: () -> Unit,
updateUnitConverterFormatTime: (Boolean) -> Unit,
updateUnitConverterSorting: (UnitsListSorting) -> Unit,
) {
var showDialog: Boolean by rememberSaveable { mutableStateOf(false) } var showDialog: Boolean by rememberSaveable { mutableStateOf(false) }
UnittoScreenWithLargeTopBar( UnittoScreenWithLargeTopBar(
@ -54,8 +74,7 @@ internal fun ConverterSettingsScreen(
navigationIcon = { NavigateUpButton(navigateUpAction) } navigationIcon = { NavigateUpButton(navigateUpAction) }
) { padding -> ) { padding ->
LazyColumn(contentPadding = padding) { LazyColumn(contentPadding = padding) {
// UNIT GROUPS item("unit group") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.AutoMirrored.Filled.Rule, icon = Icons.AutoMirrored.Filled.Rule,
iconDescription = stringResource(R.string.unit_groups_setting), iconDescription = stringResource(R.string.unit_groups_setting),
@ -65,8 +84,7 @@ internal fun ConverterSettingsScreen(
) )
} }
// UNITS LIST SORTING item("units sorting") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.AutoMirrored.Filled.Sort, icon = Icons.AutoMirrored.Filled.Sort,
iconDescription = stringResource(R.string.units_sorting), iconDescription = stringResource(R.string.units_sorting),
@ -76,15 +94,14 @@ internal fun ConverterSettingsScreen(
) )
} }
// FORMAT TIME item("format time") {
item {
UnittoListItem( UnittoListItem(
icon = Icons.Default.Timer, icon = Icons.Default.Timer,
iconDescription = stringResource(R.string.format_time), iconDescription = stringResource(R.string.format_time),
headlineText = stringResource(R.string.format_time), headlineText = stringResource(R.string.format_time),
supportingText = stringResource(R.string.format_time_support), supportingText = stringResource(R.string.format_time_support),
switchState = prefs.value.unitConverterFormatTime, switchState = prefs.unitConverterFormatTime,
onSwitchChange = viewModel::updateUnitConverterFormatTime onSwitchChange = updateUnitConverterFormatTime
) )
} }
} }
@ -99,9 +116,21 @@ internal fun ConverterSettingsScreen(
UnitsListSorting.SCALE_DESC to R.string.sort_by_scale_desc, UnitsListSorting.SCALE_DESC to R.string.sort_by_scale_desc,
UnitsListSorting.SCALE_ASC to R.string.sort_by_scale_asc, UnitsListSorting.SCALE_ASC to R.string.sort_by_scale_asc,
), ),
selectedItemIndex = prefs.value.unitConverterSorting, selectedItemIndex = prefs.unitConverterSorting,
selectAction = viewModel::updateUnitConverterSorting, selectAction = updateUnitConverterSorting,
dismissAction = { showDialog = false } dismissAction = { showDialog = false }
) )
} }
} }
@Preview
@Composable
private fun PreviewConverterSettingsScreen() {
ConverterSettingsScreen(
prefs = ConverterPreferences(),
navigateUpAction = {},
navigateToUnitsGroup = {},
updateUnitConverterFormatTime = {},
updateUnitConverterSorting = {}
)
}

View File

@ -26,13 +26,13 @@ import com.sadellie.unitto.core.base.TopLevelDestinations
import com.sadellie.unitto.core.ui.unittoComposable import com.sadellie.unitto.core.ui.unittoComposable
import com.sadellie.unitto.core.ui.unittoNavigation import com.sadellie.unitto.core.ui.unittoNavigation
import com.sadellie.unitto.feature.settings.SettingsRoute import com.sadellie.unitto.feature.settings.SettingsRoute
import com.sadellie.unitto.feature.settings.about.AboutScreen import com.sadellie.unitto.feature.settings.about.AboutRoute
import com.sadellie.unitto.feature.settings.calculator.CalculatorSettingsScreen import com.sadellie.unitto.feature.settings.calculator.CalculatorSettingsRoute
import com.sadellie.unitto.feature.settings.converter.ConverterSettingsScreen import com.sadellie.unitto.feature.settings.converter.ConverterSettingsRoute
import com.sadellie.unitto.feature.settings.display.DisplayRoute
import com.sadellie.unitto.feature.settings.formatting.FormattingRoute import com.sadellie.unitto.feature.settings.formatting.FormattingRoute
import com.sadellie.unitto.feature.settings.language.LanguageRoute import com.sadellie.unitto.feature.settings.language.LanguageRoute
import com.sadellie.unitto.feature.settings.startingscreen.StartingScreenRoute import com.sadellie.unitto.feature.settings.startingscreen.StartingScreenRoute
import com.sadellie.unitto.feature.settings.display.DisplayRoute
import com.sadellie.unitto.feature.settings.thirdparty.ThirdPartyLicensesScreen import com.sadellie.unitto.feature.settings.thirdparty.ThirdPartyLicensesScreen
import com.sadellie.unitto.feature.settings.unitgroups.UnitGroupsScreen import com.sadellie.unitto.feature.settings.unitgroups.UnitGroupsScreen
import io.github.sadellie.themmo.ThemmoController import io.github.sadellie.themmo.ThemmoController
@ -102,13 +102,13 @@ fun NavGraphBuilder.settingGraph(
} }
unittoComposable(calculatorSettingsRoute) { unittoComposable(calculatorSettingsRoute) {
CalculatorSettingsScreen( CalculatorSettingsRoute(
navigateUpAction = navController::navigateUp, navigateUpAction = navController::navigateUp,
) )
} }
unittoComposable(converterSettingsRoute) { unittoComposable(converterSettingsRoute) {
ConverterSettingsScreen( ConverterSettingsRoute(
navigateUpAction = navController::navigateUp, navigateUpAction = navController::navigateUp,
navigateToUnitsGroup = { navController.navigate(unitsGroupRoute) } navigateToUnitsGroup = { navController.navigate(unitsGroupRoute) }
) )
@ -121,7 +121,7 @@ fun NavGraphBuilder.settingGraph(
} }
unittoComposable(aboutRoute) { unittoComposable(aboutRoute) {
AboutScreen( AboutRoute(
navigateUpAction = navController::navigateUp, navigateUpAction = navController::navigateUp,
navigateToThirdParty = { navController.navigate(thirdPartyRoute) } navigateToThirdParty = { navController.navigate(thirdPartyRoute) }
) )