[#790] Fix Settings screen layout

* [#790] Fix Settings screen layout

- SwitchWithLabel moved to ui-design-lib
- Internally switched from Row to ConstraintLayout
- Used paddings, which after creating and applying of Design system #611 will be refactored
- Moved Modifier definitions to the caller side, when possible
This commit is contained in:
Honza Rychnovsky 2023-03-14 08:00:36 +01:00 committed by GitHub
parent c18160356e
commit 78180ee4e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 88 additions and 50 deletions

View File

@ -29,6 +29,7 @@ android {
dependencies { dependencies {
implementation(libs.androidx.annotation) implementation(libs.androidx.annotation)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.core) implementation(libs.androidx.core)
implementation(libs.androidx.splash) implementation(libs.androidx.splash)
implementation(libs.bundles.androidx.compose.core) implementation(libs.bundles.androidx.compose.core)

View File

@ -0,0 +1,71 @@
package co.electriccoin.zcash.ui.design.component
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Switch
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role
import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.Dimension
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
@Composable
fun SwitchWithLabel(
label: String,
state: Boolean,
onStateChange: (Boolean) -> Unit,
modifier: Modifier = Modifier
) {
val interactionSource = remember { MutableInteractionSource() }
ConstraintLayout(
modifier = modifier
.clickable(
interactionSource = interactionSource,
indication = null, // disable ripple
role = Role.Switch,
onClick = { onStateChange(!state) }
)
.fillMaxWidth()
) {
val (text, spacer, switchButton) = createRefs()
Body(
text = label,
modifier = Modifier.constrainAs(text) {
top.linkTo(parent.top)
bottom.linkTo(parent.top)
start.linkTo(parent.start)
end.linkTo(spacer.start)
width = Dimension.fillToConstraints
}
)
Spacer(
modifier = Modifier
.width(ZcashTheme.paddings.padding)
.constrainAs(spacer) {
top.linkTo(parent.top)
bottom.linkTo(parent.top)
start.linkTo(text.end)
end.linkTo(switchButton.start)
}
)
Switch(
checked = state,
onCheckedChange = {
onStateChange(it)
},
modifier = Modifier.constrainAs(switchButton) {
top.linkTo(parent.top)
bottom.linkTo(parent.top)
start.linkTo(spacer.end)
end.linkTo(parent.end)
width = Dimension.wrapContent
}
)
}
}

View File

@ -1,12 +1,6 @@
package co.electriccoin.zcash.ui.screen.settings.view package co.electriccoin.zcash.ui.screen.settings.view
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Column 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.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.ArrowBack
@ -17,26 +11,21 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
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.semantics.Role
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import co.electriccoin.zcash.ui.R import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.design.MINIMAL_WEIGHT
import co.electriccoin.zcash.ui.design.component.Body
import co.electriccoin.zcash.ui.design.component.GradientSurface import co.electriccoin.zcash.ui.design.component.GradientSurface
import co.electriccoin.zcash.ui.design.component.SwitchWithLabel
import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.design.theme.ZcashTheme.paddings
@Preview("Settings") @Preview("Settings")
@Composable @Composable
@ -80,13 +69,16 @@ fun Settings(
) )
}) { paddingValues -> }) { paddingValues ->
SettingsMainContent( SettingsMainContent(
paddingValues,
isBackgroundSyncEnabled = isBackgroundSyncEnabled, isBackgroundSyncEnabled = isBackgroundSyncEnabled,
isKeepScreenOnDuringSyncEnabled = isKeepScreenOnDuringSyncEnabled, isKeepScreenOnDuringSyncEnabled = isKeepScreenOnDuringSyncEnabled,
isAnalyticsEnabled = isAnalyticsEnabled, isAnalyticsEnabled = isAnalyticsEnabled,
onBackgroundSyncSettingsChanged = onBackgroundSyncSettingsChanged, onBackgroundSyncSettingsChanged = onBackgroundSyncSettingsChanged,
onIsKeepScreenOnDuringSyncSettingsChanged = onIsKeepScreenOnDuringSyncSettingsChanged, onIsKeepScreenOnDuringSyncSettingsChanged = onIsKeepScreenOnDuringSyncSettingsChanged,
onAnalyticsSettingsChanged = onAnalyticsSettingsChanged onAnalyticsSettingsChanged = onAnalyticsSettingsChanged,
modifier = Modifier.padding(
top = paddingValues.calculateTopPadding() + paddings.padding,
bottom = paddings.padding
)
) )
} }
} }
@ -146,58 +138,32 @@ private fun TroubleshootingMenu(
@Composable @Composable
@Suppress("LongParameterList") @Suppress("LongParameterList")
private fun SettingsMainContent( private fun SettingsMainContent(
paddingValues: PaddingValues,
isBackgroundSyncEnabled: Boolean, isBackgroundSyncEnabled: Boolean,
isKeepScreenOnDuringSyncEnabled: Boolean, isKeepScreenOnDuringSyncEnabled: Boolean,
isAnalyticsEnabled: Boolean, isAnalyticsEnabled: Boolean,
onBackgroundSyncSettingsChanged: (Boolean) -> Unit, onBackgroundSyncSettingsChanged: (Boolean) -> Unit,
onIsKeepScreenOnDuringSyncSettingsChanged: (Boolean) -> Unit, onIsKeepScreenOnDuringSyncSettingsChanged: (Boolean) -> Unit,
onAnalyticsSettingsChanged: (Boolean) -> Unit onAnalyticsSettingsChanged: (Boolean) -> Unit,
modifier: Modifier = Modifier
) { ) {
Column( Column(modifier = modifier) {
Modifier
.padding(top = paddingValues.calculateTopPadding())
) {
SwitchWithLabel( SwitchWithLabel(
label = stringResource(id = R.string.settings_enable_background_sync), label = stringResource(id = R.string.settings_enable_background_sync),
state = isBackgroundSyncEnabled, state = isBackgroundSyncEnabled,
onStateChange = { onBackgroundSyncSettingsChanged(!isBackgroundSyncEnabled) } onStateChange = { onBackgroundSyncSettingsChanged(!isBackgroundSyncEnabled) },
modifier = Modifier.padding(paddings.padding)
) )
SwitchWithLabel( SwitchWithLabel(
label = stringResource(id = R.string.settings_enable_keep_screen_on), label = stringResource(id = R.string.settings_enable_keep_screen_on),
state = isKeepScreenOnDuringSyncEnabled, state = isKeepScreenOnDuringSyncEnabled,
onStateChange = { onIsKeepScreenOnDuringSyncSettingsChanged(!isKeepScreenOnDuringSyncEnabled) } onStateChange = { onIsKeepScreenOnDuringSyncSettingsChanged(!isKeepScreenOnDuringSyncEnabled) },
modifier = Modifier.padding(paddings.padding)
) )
SwitchWithLabel( SwitchWithLabel(
label = stringResource(id = R.string.settings_enable_analytics), label = stringResource(id = R.string.settings_enable_analytics),
state = isAnalyticsEnabled, state = isAnalyticsEnabled,
onStateChange = { onAnalyticsSettingsChanged(!isAnalyticsEnabled) } onStateChange = { onAnalyticsSettingsChanged(!isAnalyticsEnabled) },
) modifier = Modifier.padding(paddings.padding)
}
}
@Composable
private fun SwitchWithLabel(label: String, state: Boolean, onStateChange: (Boolean) -> Unit) {
val interactionSource = remember { MutableInteractionSource() }
Row(
modifier = Modifier
.clickable(
interactionSource = interactionSource,
indication = null, // disable ripple
role = Role.Switch,
onClick = { onStateChange(!state) }
)
.padding(8.dp)
.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Body(text = label)
Spacer(modifier = Modifier.fillMaxWidth(MINIMAL_WEIGHT))
Switch(
checked = state,
onCheckedChange = {
onStateChange(it)
}
) )
} }
} }