From 6d560222a449cc61a1858d405ea76940de328b99 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 28 Jun 2024 15:31:38 +0530 Subject: [PATCH 1/2] parental: add custom e style toggle --- .../e/parentalcontrol/MainActivity.kt | 2 + .../parentalcontrol/ui/buttons/SwitchColor.kt | 26 ------ .../ui/buttons/ToggleWithText.kt | 82 ++++++++++++++++++- 3 files changed, 82 insertions(+), 28 deletions(-) delete mode 100644 app/src/main/java/foundation/e/parentalcontrol/ui/buttons/SwitchColor.kt diff --git a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt index 6df8571..37aab90 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt @@ -538,6 +538,7 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.activate_admin_summary), color = colorResource(foundation.e.elib.R.color.e_primary_text_color), + modifier = Modifier.padding(bottom = 8.dp) ) var checkedState by remember { mutableStateOf(false) } @@ -659,6 +660,7 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.activate_admin_summary), color = colorResource(foundation.e.elib.R.color.e_primary_text_color), + modifier = Modifier.padding(bottom = 8.dp) ) ToggleWithText( diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/SwitchColor.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/SwitchColor.kt deleted file mode 100644 index 757537c..0000000 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/SwitchColor.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright © MURENA SAS 2024. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/gpl.html - */ -package foundation.e.parentalcontrol.ui.buttons - -import androidx.compose.material3.SwitchColors -import androidx.compose.material3.SwitchDefaults -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.colorResource -import foundation.e.elib.R - -@Composable -fun switchColors(): SwitchColors { - return SwitchDefaults.colors( - checkedBorderColor = colorResource(R.color.e_switch_track_on), - uncheckedBorderColor = colorResource(R.color.e_switch_track_off), - checkedTrackColor = colorResource(R.color.e_switch_track_on), - uncheckedTrackColor = colorResource(R.color.e_switch_track_off), - checkedThumbColor = colorResource(R.color.e_switch_thumb_on), - uncheckedThumbColor = colorResource(R.color.e_switch_thumb_off) - ) -} diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt index 64994de..ae2fb96 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt @@ -7,17 +7,36 @@ */ package foundation.e.parentalcontrol.ui.buttons +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.animateDp +import androidx.compose.animation.core.spring +import androidx.compose.animation.core.updateTransition +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.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material3.Switch +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp +import foundation.e.elib.R +import kotlin.math.roundToInt @Composable fun ToggleWithText(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { @@ -29,6 +48,65 @@ fun ToggleWithText(text: String, isChecked: Boolean, onCheckedChange: (Boolean) ) { Text(text, modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.width(8.dp)) - Switch(checked = isChecked, onCheckedChange = onCheckedChange, colors = switchColors()) + ESwitch(checked = isChecked, onCheckedChange = onCheckedChange) + } +} + +@Composable +fun ESwitch(checked: Boolean, onCheckedChange: (Boolean) -> Unit) { + val thumbSize = 24.dp + val trackWidth = 52.dp + val trackHeight = 28.dp + val switchPadding = 2.dp + + val transition = updateTransition(targetState = checked, label = "switch") + + val thumbOffsetX by + transition.animateDp( + transitionSpec = { + spring( + dampingRatio = Spring.DampingRatioNoBouncy, + stiffness = Spring.StiffnessMediumLow + ) + }, + label = "Thumb offset" + ) { state -> + if (state) trackWidth - thumbSize - switchPadding else switchPadding + } + + Box( + modifier = + Modifier.width(trackWidth) + .height(trackHeight) + .clip(RoundedCornerShape(14.dp)) + .background( + color = + if (checked) colorResource(R.color.e_switch_track_on) + else colorResource(R.color.e_switch_track_off) + ) + .clickable( + onClick = { onCheckedChange(!checked) }, + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) + ) { + Box( + modifier = + Modifier.size(thumbSize) + .offset { + IntOffset(thumbOffsetX.roundToPx(), switchPadding.toPx().roundToInt()) + } + .clip(CircleShape) + .background( + color = + if (checked) colorResource(R.color.e_switch_thumb_on) + else colorResource(R.color.e_switch_thumb_off) + ) + .clickable( + onClick = { onCheckedChange(!checked) }, + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) + ) } } -- GitLab From b9ab991085df840f1b60f8d7d116c1bf2fff7496 Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 1 Jul 2024 21:06:55 +0530 Subject: [PATCH 2/2] parental: adjust paddings --- .../e/parentalcontrol/MainActivity.kt | 95 +++++++++++-------- .../ui/buttons/CheckboxWithText.kt | 10 +- .../ui/buttons/RadioButtonWithText.kt | 9 +- .../ui/buttons/ToggleWithText.kt | 15 ++- .../ui/text/CustomTopAppBar.kt | 12 ++- .../e/parentalcontrol/ui/theme/Type.kt | 17 ---- .../e/parentalcontrol/ui/view/AskPassword.kt | 23 ++--- .../view/AuthenticationTypeSelectionView.kt | 10 +- .../e/parentalcontrol/ui/view/SelectAge.kt | 10 +- .../e/parentalcontrol/utils/Dimens.kt | 14 +++ 10 files changed, 125 insertions(+), 90 deletions(-) create mode 100644 app/src/main/java/foundation/e/parentalcontrol/utils/Dimens.kt diff --git a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt index 37aab90..5b2649c 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt @@ -65,6 +65,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import foundation.e.parentalcontrol.data.AuthenticationType @@ -84,6 +85,7 @@ import foundation.e.parentalcontrol.ui.view.SelectAge import foundation.e.parentalcontrol.ui.view.selectedAge import foundation.e.parentalcontrol.utils.Constants import foundation.e.parentalcontrol.utils.CryptUtils +import foundation.e.parentalcontrol.utils.Dimens import foundation.e.parentalcontrol.utils.PrefsUtils import foundation.e.parentalcontrol.utils.SystemUtils import kotlinx.coroutines.delay @@ -132,7 +134,7 @@ class MainActivity : ComponentActivity() { Column( modifier = Modifier.fillMaxSize() - .padding(start = 24.dp, end = 24.dp) + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING) .verticalScroll(scrollState), horizontalAlignment = Alignment.Start, ) { @@ -176,8 +178,10 @@ class MainActivity : ComponentActivity() { CustomTopAppBar(title = titleText(), onClick = { onBackPress() }) Column( - modifier = Modifier.fillMaxWidth().padding(8.dp, bottom = 16.dp, top = 16.dp), - verticalArrangement = Arrangement.spacedBy(16.dp), + modifier = + Modifier.fillMaxWidth() + .padding(bottom = Dimens.SCREEN_PADDING, top = Dimens.SCREEN_PADDING), + verticalArrangement = Arrangement.spacedBy(Dimens.SCREEN_PADDING), horizontalAlignment = Alignment.CenterHorizontally ) { fun checkPassword() { @@ -198,11 +202,7 @@ class MainActivity : ComponentActivity() { passText = it isPasswordValid = isPinPasswordValid(it) }, - label = { - Text( - titleText(), - ) - }, + label = {}, visualTransformation = PasswordVisualTransformation(), keyboardOptions = KeyboardOptions.Default.copy( @@ -222,7 +222,7 @@ class MainActivity : ComponentActivity() { modifier = Modifier.fillMaxWidth() .focusRequester(focusRequester) - .padding(start = 24.dp, end = 32.dp), + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), singleLine = true, colors = textFieldColor(), ) @@ -232,13 +232,13 @@ class MainActivity : ComponentActivity() { if (PrefsUtils.getAuthType() == AuthenticationType.PIN) stringResource(R.string.pin_requirements) else stringResource(R.string.password_requirements), - Modifier.padding(10.dp), - fontWeight = FontWeight.ExtraLight + Modifier.padding(8.dp), + fontWeight = FontWeight.Normal ) Button( onClick = { checkPassword() }, - modifier = Modifier.padding(top = 16.dp), + modifier = Modifier.padding(top = Dimens.SCREEN_PADDING), colors = buttonColor(), enabled = isPasswordValid, ) { @@ -282,8 +282,10 @@ class MainActivity : ComponentActivity() { CustomTopAppBar(title = titleText(), onClick = { onBackPress() }) Column( - modifier = Modifier.fillMaxWidth().padding(8.dp, bottom = 16.dp, top = 16.dp), - verticalArrangement = Arrangement.spacedBy(16.dp), + modifier = + Modifier.fillMaxWidth() + .padding(bottom = Dimens.SCREEN_PADDING, top = Dimens.SCREEN_PADDING), + verticalArrangement = Arrangement.spacedBy(Dimens.SCREEN_PADDING), horizontalAlignment = Alignment.CenterHorizontally ) { fun confirmPassword() { @@ -360,7 +362,7 @@ class MainActivity : ComponentActivity() { isError = false isPasswordValid = isPinPasswordValid(it) }, - label = { Text(titleText()) }, + label = {}, visualTransformation = PasswordVisualTransformation(), keyboardOptions = KeyboardOptions.Default.copy( @@ -380,7 +382,7 @@ class MainActivity : ComponentActivity() { modifier = Modifier.fillMaxWidth() .focusRequester(focusRequester) - .padding(start = 24.dp, end = 32.dp), + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), singleLine = true, colors = if (isError) textFieldColorError() else textFieldColor() ) @@ -390,8 +392,8 @@ class MainActivity : ComponentActivity() { if (PrefsUtils.getAuthType() == AuthenticationType.PIN) stringResource(R.string.pin_confirm_text) else stringResource(R.string.password_confirm_text), - Modifier.padding(10.dp), - fontWeight = FontWeight.ExtraLight + Modifier.padding(8.dp), + fontWeight = FontWeight.Normal ) Button( @@ -418,7 +420,9 @@ class MainActivity : ComponentActivity() { CustomTopAppBar(title = stringResource(R.string.app_name), onClick = { onExitApp() }) Column( - modifier = Modifier.fillMaxSize().padding(start = 24.dp, end = 24.dp), + modifier = + Modifier.fillMaxSize() + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.Top ) { @@ -442,7 +446,7 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.parental_control_is_blocked), fontSize = 20.sp, - modifier = Modifier.padding(start = 10.dp) + modifier = Modifier.padding(start = Dimens.SCREEN_PADDING / 2) ) } }, @@ -464,7 +468,7 @@ class MainActivity : ComponentActivity() { val intent = Intent(Settings.ACTION_SECURITY_SETTINGS) startActivity(intent) } - .padding(start = 10.dp), + .padding(start = Dimens.SCREEN_PADDING / 2), color = colorResource(id = foundation.e.elib.R.color.e_accent), text = stringResource(R.string.open_settings).uppercase(), fontSize = 14.sp @@ -499,7 +503,7 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.multiple_users_found), fontSize = 20.sp, - modifier = Modifier.padding(start = 10.dp) + modifier = Modifier.padding(start = Dimens.SCREEN_PADDING) ) } }, @@ -517,7 +521,7 @@ class MainActivity : ComponentActivity() { startActivity(Intent(Settings.ACTION_USER_SETTINGS)) showDialog = false } - .padding(start = 10.dp), + .padding(start = Dimens.SCREEN_PADDING / 2), color = colorResource(id = foundation.e.elib.R.color.e_accent), text = stringResource(R.string.remove_users).uppercase(), fontSize = 14.sp @@ -538,7 +542,10 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.activate_admin_summary), color = colorResource(foundation.e.elib.R.color.e_primary_text_color), - modifier = Modifier.padding(bottom = 8.dp) + fontSize = 15.sp, + maxLines = Int.MAX_VALUE, + overflow = TextOverflow.Clip, + modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING / 2) ) var checkedState by remember { mutableStateOf(false) } @@ -548,6 +555,7 @@ class MainActivity : ComponentActivity() { ToggleWithText( text = stringResource(R.string.activate_parental_control), isChecked = checkedState, + fontWeight = FontWeight.Medium, onCheckedChange = { checkedState = it PrefsUtils.clearAll() @@ -583,7 +591,9 @@ class MainActivity : ComponentActivity() { } Column( - modifier = Modifier.fillMaxSize().padding(start = 24.dp, end = 24.dp), + modifier = + Modifier.fillMaxSize() + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.Top ) { @@ -606,7 +616,7 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.login_required), fontSize = 20.sp, - modifier = Modifier.padding(start = 10.dp) + modifier = Modifier.padding(start = Dimens.SCREEN_PADDING / 2) ) } }, @@ -614,7 +624,11 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.confirm_dialog_summar), color = - colorResource(id = foundation.e.elib.R.color.e_secondary_text_color) + colorResource( + id = foundation.e.elib.R.color.e_secondary_text_color + ), + maxLines = Int.MAX_VALUE, + overflow = TextOverflow.Clip, ) }, confirmButton = { @@ -635,7 +649,7 @@ class MainActivity : ComponentActivity() { startActivity(launchIntent) } } - .padding(start = 10.dp), + .padding(start = Dimens.SCREEN_PADDING / 2), color = colorResource(id = foundation.e.elib.R.color.e_accent), text = stringResource(R.string.launch_applounge).uppercase(), fontSize = 14.sp @@ -660,19 +674,23 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.activate_admin_summary), color = colorResource(foundation.e.elib.R.color.e_primary_text_color), - modifier = Modifier.padding(bottom = 8.dp) + fontSize = 15.sp, + maxLines = Int.MAX_VALUE, + overflow = TextOverflow.Clip, + modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING / 2) ) ToggleWithText( text = stringResource(R.string.activate_parental_control), isChecked = isAdminActive(), + fontWeight = FontWeight.Medium, onCheckedChange = { if (it) { setAdmin(true) } else { mainScreen(page = Pages.AskPasswordForAdminRemoval) } - } + }, ) SelectAge( @@ -684,12 +702,11 @@ class MainActivity : ComponentActivity() { Text( text = stringResource(R.string.change_my_security_code).uppercase(), color = colorResource(foundation.e.elib.R.color.e_accent), - fontWeight = FontWeight.Bold, modifier = Modifier.clickable( onClick = { mainScreen(page = Pages.AskPasswordForPasswordReset) } ), - style = MaterialTheme.typography.bodyLarge, + fontWeight = FontWeight.Medium, ) OnDebugBuild() @@ -709,7 +726,7 @@ class MainActivity : ComponentActivity() { private fun OnDebugBuild() { if (BuildConfig.DEBUG) { Box( - modifier = Modifier.fillMaxSize().padding(bottom = 16.dp), + modifier = Modifier.fillMaxSize().padding(bottom = Dimens.SCREEN_PADDING), contentAlignment = Alignment.BottomEnd, ) { Button( @@ -741,13 +758,15 @@ class MainActivity : ComponentActivity() { ) Column( - modifier = Modifier.fillMaxSize().padding(start = 24.dp, end = 24.dp), + modifier = + Modifier.fillMaxSize() + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.Top ) { Text( text = stringResource(R.string.age_group_summary), - modifier = Modifier.padding(bottom = 16.dp) + modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING) ) SelectAge( @@ -764,13 +783,15 @@ class MainActivity : ComponentActivity() { CustomTopAppBar(title = stringResource(R.string.app_name), onClick = { onExitApp() }) Column( - modifier = Modifier.fillMaxSize().padding(start = 24.dp, end = 24.dp), + modifier = + Modifier.fillMaxSize() + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.Top ) { Text( text = stringResource(R.string.main_user_parental_control), - modifier = Modifier.padding(bottom = 16.dp), + modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING), fontWeight = FontWeight.Bold ) } diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/CheckboxWithText.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/CheckboxWithText.kt index 2424434..7e2929a 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/CheckboxWithText.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/CheckboxWithText.kt @@ -17,7 +17,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp +import foundation.e.parentalcontrol.utils.Dimens @Composable fun CheckboxWithText(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { @@ -25,10 +25,14 @@ fun CheckboxWithText(text: String, isChecked: Boolean, onCheckedChange: (Boolean verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, // Aligns children at the start and end of the row - modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + modifier = + Modifier.padding( + horizontal = Dimens.SCREEN_PADDING, + vertical = Dimens.SCREEN_PADDING / 2 + ) ) { Text(text) - Spacer(modifier = Modifier.width(8.dp)) + Spacer(modifier = Modifier.width(Dimens.SCREEN_PADDING / 2)) Checkbox(checked = isChecked, onCheckedChange = onCheckedChange) } } diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/RadioButtonWithText.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/RadioButtonWithText.kt index 87cd5de..8b3d7da 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/RadioButtonWithText.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/RadioButtonWithText.kt @@ -23,8 +23,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.colorResource -import androidx.compose.ui.unit.dp import foundation.e.elib.R +import foundation.e.parentalcontrol.utils.Dimens @Composable fun RadioButtonWithText( @@ -79,14 +79,17 @@ fun ImageButtonWithText(text: String, selected: Boolean, onClick: () -> Unit, im Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Start, - modifier = Modifier.padding(bottom = 16.dp, top = 16.dp) + modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING, top = Dimens.SCREEN_PADDING) ) { Icon( imageVector = image, contentDescription = "RadioButtonWithImage", modifier = Modifier.clickable(onClick = onClick) - .padding(start = 8.dp, end = 8.dp) // Adjust padding as needed + .padding( + start = Dimens.SCREEN_PADDING / 2, + end = Dimens.SCREEN_PADDING / 2 + ) // Adjust padding as needed .alpha(if (selected) 1f else 0.5f), // Adjust alpha when selected tint = colorResource(R.color.e_accent), ) diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt index ae2fb96..6adc738 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/buttons/ToggleWithText.kt @@ -33,21 +33,28 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.colorResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import foundation.e.elib.R +import foundation.e.parentalcontrol.utils.Dimens import kotlin.math.roundToInt @Composable -fun ToggleWithText(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { +fun ToggleWithText( + text: String, + isChecked: Boolean, + onCheckedChange: (Boolean) -> Unit, + fontWeight: FontWeight = FontWeight.Normal +) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, // Aligns children at the start and end of the row - modifier = Modifier.padding(vertical = 16.dp) + modifier = Modifier.padding(top = Dimens.SCREEN_PADDING, bottom = Dimens.SCREEN_PADDING) ) { - Text(text, modifier = Modifier.weight(1f)) - Spacer(modifier = Modifier.width(8.dp)) + Text(text, fontWeight = fontWeight, modifier = Modifier.weight(1f)) + Spacer(modifier = Modifier.width(Dimens.SCREEN_PADDING / 2)) ESwitch(checked = isChecked, onCheckedChange = onCheckedChange) } } diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/text/CustomTopAppBar.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/text/CustomTopAppBar.kt index ded36f4..d142078 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/text/CustomTopAppBar.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/text/CustomTopAppBar.kt @@ -13,20 +13,21 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.res.colorResource -import androidx.compose.ui.unit.dp +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import foundation.e.parentalcontrol.utils.Dimens @Composable fun CustomTopAppBar(title: String, onClick: () -> Unit, hideBackButton: Boolean = false) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(top = 16.dp, bottom = 16.dp) + modifier = Modifier.padding(top = Dimens.SCREEN_PADDING, bottom = Dimens.SCREEN_PADDING) ) { // Back button IconButton( @@ -41,9 +42,10 @@ fun CustomTopAppBar(title: String, onClick: () -> Unit, hideBackButton: Boolean } Text( text = title, - style = MaterialTheme.typography.headlineSmall, + fontWeight = FontWeight.Medium, + fontSize = 24.sp, color = colorResource(foundation.e.elib.R.color.e_primary_text_color), - modifier = Modifier.padding(start = 16.dp) + modifier = Modifier.padding(start = Dimens.SCREEN_PADDING) ) } } diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/theme/Type.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/theme/Type.kt index 8be89cb..bd3587f 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/theme/Type.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/theme/Type.kt @@ -22,22 +22,5 @@ val Typography = fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 24.sp, - letterSpacing = 0.5.sp ) - /* Other default text styles to override - titleLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 22.sp, - lineHeight = 28.sp, - letterSpacing = 0.sp - ), - labelSmall = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Medium, - fontSize = 11.sp, - lineHeight = 16.sp, - letterSpacing = 0.5.sp - ) - */ ) diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/view/AskPassword.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/view/AskPassword.kt index 1b7eb64..709432e 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/view/AskPassword.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/view/AskPassword.kt @@ -48,6 +48,7 @@ import foundation.e.parentalcontrol.ui.text.CustomTopAppBar import foundation.e.parentalcontrol.ui.text.textFieldColor import foundation.e.parentalcontrol.ui.text.textFieldColorError import foundation.e.parentalcontrol.utils.CryptUtils +import foundation.e.parentalcontrol.utils.Dimens import foundation.e.parentalcontrol.utils.PrefsUtils import kotlinx.coroutines.launch @@ -110,7 +111,9 @@ fun AskPassword( // Login with PIN or password Column( - modifier = Modifier.fillMaxWidth().padding(bottom = 16.dp, top = 16.dp), + modifier = + Modifier.fillMaxWidth() + .padding(bottom = Dimens.SCREEN_PADDING, top = Dimens.SCREEN_PADDING), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { @@ -118,7 +121,7 @@ fun AskPassword( imageVector = Icons.Filled.Lock, contentDescription = "Lock", tint = colorResource(foundation.e.elib.R.color.e_accent), - modifier = Modifier.fillMaxWidth().padding(bottom = 16.dp), + modifier = Modifier.fillMaxWidth().padding(bottom = Dimens.SCREEN_PADDING), ) TextField( @@ -127,13 +130,7 @@ fun AskPassword( isError = false passText = it }, - label = { - Text( - if (PrefsUtils.getAuthType() == AuthenticationType.PIN) - stringResource(R.string.enter_your_parental_control_pin) - else stringResource(R.string.enter_your_parental_control_password) - ) - }, + label = {}, visualTransformation = PasswordVisualTransformation(), keyboardOptions = KeyboardOptions.Default.copy( @@ -153,7 +150,7 @@ fun AskPassword( modifier = Modifier.fillMaxWidth() .focusRequester(focusRequester) - .padding(start = 32.dp, end = 32.dp), + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), singleLine = true, colors = if (isError) textFieldColorError() else textFieldColor() ) @@ -163,13 +160,13 @@ fun AskPassword( if (PrefsUtils.getAuthType() == AuthenticationType.PIN) stringResource(R.string.enter_your_parental_control_pin) else stringResource(R.string.enter_your_parental_control_password), - Modifier.padding(10.dp), - fontWeight = FontWeight.ExtraLight + Modifier.padding(8.dp), + fontWeight = FontWeight.Normal ) Button( onClick = { validatePassword() }, - modifier = Modifier.padding(top = 24.dp), + modifier = Modifier.padding(top = Dimens.SCREEN_PADDING), colors = buttonColor() ) { Text(stringResource(R.string.confirm)) diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/view/AuthenticationTypeSelectionView.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/view/AuthenticationTypeSelectionView.kt index 6cb360f..73e6b8f 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/view/AuthenticationTypeSelectionView.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/view/AuthenticationTypeSelectionView.kt @@ -26,13 +26,13 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.unit.dp import foundation.e.parentalcontrol.R import foundation.e.parentalcontrol.data.AuthenticationType import foundation.e.parentalcontrol.ui.buttons.ImageButtonWithText import foundation.e.parentalcontrol.ui.buttons.buttonColor import foundation.e.parentalcontrol.ui.text.CustomTopAppBar import foundation.e.parentalcontrol.utils.Constants +import foundation.e.parentalcontrol.utils.Dimens import foundation.e.parentalcontrol.utils.PrefsUtils @Composable @@ -47,13 +47,15 @@ fun AuthenticationTypeSelectionView(onBackPressed: () -> Unit, onSelection: () - CustomTopAppBar(title = stringResource(R.string.security), onClick = { onBackPressed() }) Column( - modifier = Modifier.fillMaxSize().padding(start = 24.dp, end = 24.dp), + modifier = + Modifier.fillMaxSize() + .padding(start = Dimens.SCREEN_PADDING, end = Dimens.SCREEN_PADDING), horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.Top ) { Text( text = stringResource(R.string.auth_summary), - modifier = Modifier.padding(bottom = 16.dp) + modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING) ) // Radio buttons for selecting authentication type @@ -80,7 +82,7 @@ fun AuthenticationTypeSelectionView(onBackPressed: () -> Unit, onSelection: () - } onSelection() }, - modifier = Modifier.align(Alignment.TopCenter).padding(top = 16.dp), + modifier = Modifier.align(Alignment.TopCenter).padding(top = Dimens.SCREEN_PADDING), enabled = selectedType != AuthenticationType.NONE, // Enable only if an option is selected colors = buttonColor() diff --git a/app/src/main/java/foundation/e/parentalcontrol/ui/view/SelectAge.kt b/app/src/main/java/foundation/e/parentalcontrol/ui/view/SelectAge.kt index 6422ca2..9c25c1c 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/ui/view/SelectAge.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/ui/view/SelectAge.kt @@ -23,12 +23,12 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp import foundation.e.parentalcontrol.DeviceAdmin import foundation.e.parentalcontrol.R import foundation.e.parentalcontrol.data.Ages import foundation.e.parentalcontrol.ui.buttons.RadioButtonWithText import foundation.e.parentalcontrol.ui.buttons.buttonColor +import foundation.e.parentalcontrol.utils.Dimens import foundation.e.parentalcontrol.utils.PrefsUtils var selectedAge: Ages? by mutableStateOf(null) @@ -45,11 +45,13 @@ fun SelectAge(onRadioClick: () -> Unit, onNextClick: () -> Unit) { text = stringResource(R.string.age_group_of_the_child), color = colorResource(foundation.e.elib.R.color.e_primary_text_color), fontWeight = FontWeight.Bold, - modifier = Modifier.padding(top = 8.dp, bottom = 8.dp) + modifier = + Modifier.padding(top = Dimens.SCREEN_PADDING / 2, bottom = Dimens.SCREEN_PADDING / 2) ) Column( - modifier = Modifier.padding(start = 8.dp, end = 8.dp), + modifier = + Modifier.padding(start = Dimens.SCREEN_PADDING / 2, end = Dimens.SCREEN_PADDING / 2), ) { RadioButtonWithText( text = stringResource(R.string.three_years_old), @@ -104,7 +106,7 @@ fun SelectAge(onRadioClick: () -> Unit, onNextClick: () -> Unit) { if (!DeviceAdmin().isAdminActive(context)) { Box( - modifier = Modifier.fillMaxSize().padding(top = 16.dp), + modifier = Modifier.fillMaxSize().padding(top = Dimens.SCREEN_PADDING), contentAlignment = Alignment.TopCenter, ) { Button( diff --git a/app/src/main/java/foundation/e/parentalcontrol/utils/Dimens.kt b/app/src/main/java/foundation/e/parentalcontrol/utils/Dimens.kt new file mode 100644 index 0000000..efae9e7 --- /dev/null +++ b/app/src/main/java/foundation/e/parentalcontrol/utils/Dimens.kt @@ -0,0 +1,14 @@ +/* + * Copyright © MURENA SAS 2024. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + */ +package foundation.e.parentalcontrol.utils + +import androidx.compose.ui.unit.dp + +object Dimens { + val SCREEN_PADDING = 18.dp +} -- GitLab