diff --git a/app/src/main/java/com/example/sw0b_001/ui/modals/AddGatewayClientModal.kt b/app/src/main/java/com/example/sw0b_001/ui/modals/AddGatewayClientModal.kt index 61e5c331..0e4ea79a 100644 --- a/app/src/main/java/com/example/sw0b_001/ui/modals/AddGatewayClientModal.kt +++ b/app/src/main/java/com/example/sw0b_001/ui/modals/AddGatewayClientModal.kt @@ -139,7 +139,7 @@ fun AddGatewayClientModal( horizontalAlignment = Alignment.CenterHorizontally ) { Text( - text = if (gatewayClients == null) stringResource(R.string.add_gateway_client) else stringResource( + text = if (gatewayClients == null) stringResource(R.string.add_routing_numbers) else stringResource( R.string.edit_gateway_client ), style = MaterialTheme.typography.headlineSmall, diff --git a/app/src/main/java/com/example/sw0b_001/ui/views/settings/SettingsView.kt b/app/src/main/java/com/example/sw0b_001/ui/views/settings/SettingsView.kt index 163f5167..9c148649 100644 --- a/app/src/main/java/com/example/sw0b_001/ui/views/settings/SettingsView.kt +++ b/app/src/main/java/com/example/sw0b_001/ui/views/settings/SettingsView.kt @@ -1,76 +1,81 @@ package com.example.sw0b_001.ui.views.settings - -import android.content.Context -import android.content.ContextWrapper import android.content.res.Configuration import android.widget.Toast -import androidx.activity.ComponentActivity -import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll -import androidx.compose.material.LinearProgressIndicator import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material3.DropdownMenu -import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight +import androidx.compose.material.icons.filled.DeleteOutline +import androidx.compose.material.icons.filled.Description +import androidx.compose.material.icons.filled.Language +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material.icons.filled.Nightlight +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController -import com.afkanerd.smswithoutborders_libsmsmms.extensions.context.getActivity import com.afkanerd.smswithoutborders_libsmsmms.extensions.context.getCurrentLocale import com.afkanerd.smswithoutborders_libsmsmms.extensions.context.setLocale -import com.afkanerd.smswithoutborders_libsmsmms.ui.SettingsItem import com.example.sw0b_001.BuildConfig import com.example.sw0b_001.MainActivity import com.example.sw0b_001.R import com.example.sw0b_001.data.CrashHandler import com.example.sw0b_001.extensions.context.getAppCompatActivity import com.example.sw0b_001.extensions.context.promptBiometrics -import com.example.sw0b_001.extensions.context.settingsGetIsEmailLogin import com.example.sw0b_001.extensions.context.settingsGetLockDownApp -import com.example.sw0b_001.extensions.context.settingsGetStoreTokensOnDevice -import com.example.sw0b_001.extensions.context.settingsGetUseDeviceId import com.example.sw0b_001.extensions.context.settingsSetIsLoggedIn import com.example.sw0b_001.extensions.context.settingsSetLockDownApp -import com.example.sw0b_001.extensions.context.settingsSetUseDeviceId -import com.example.sw0b_001.ui.theme.AppTheme import com.example.sw0b_001.ui.viewModels.TokensViewModel import io.grpc.StatusRuntimeException -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch + @OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsView( @@ -81,237 +86,571 @@ fun SettingsView( val context = LocalContext.current val inPreviewMode = LocalInspectionMode.current val scrollState = rememberScrollState() - - val isEmailLogin = context.settingsGetIsEmailLogin + val scope = rememberCoroutineScope() var localeExpanded by remember { mutableStateOf(false) } - var setLockDownApp by remember { mutableStateOf( context.settingsGetLockDownApp) } - var useDeviceId by remember { mutableStateOf( - if(isEmailLogin) true else context.settingsGetUseDeviceId ) + var themeExpanded by remember { mutableStateOf(false) } + + var setLockDownApp by remember { + mutableStateOf(context.settingsGetLockDownApp) } - var storeTokensOnDevice by remember { - mutableStateOf( context.settingsGetStoreTokensOnDevice) } - val currentNightMode = LocalConfiguration.current.uiMode and Configuration.UI_MODE_NIGHT_MASK - var themeExpanded by remember { mutableStateOf(false) } + var isLoading by remember { + mutableStateOf(false) + } - var isLoading by remember { mutableStateOf(false) } + val currentNightMode = + LocalConfiguration.current.uiMode and Configuration.UI_MODE_NIGHT_MASK + val localeArraysValues = + stringArrayResource(R.array.language_values) - val localeArraysValues = stringArrayResource(R.array.language_values) - val localeArraysOptions= stringArrayResource(R.array.language_options) + val localeArraysOptions = + stringArrayResource(R.array.language_options) - val scope = rememberCoroutineScope() + val backgroundColor = MaterialTheme.colorScheme.background + val cardColor = MaterialTheme.colorScheme.surface + val dividerColor = MaterialTheme.colorScheme.outline.copy(alpha = 0.25f) + + val primaryColor = MaterialTheme.colorScheme.primary + val textColor = MaterialTheme.colorScheme.onSurface + val secondaryTextColor = MaterialTheme.colorScheme.onSurfaceVariant Scaffold( + containerColor = backgroundColor, topBar = { TopAppBar( + title = { + Text( + text = stringResource(R.string.general_settings), + fontSize = 22.sp, + color = textColor + ) + }, navigationIcon = { - IconButton(onClick = { navController.popBackStack() }) { + IconButton( + onClick = { + navController.popBackStack() + } + ) { Icon( - Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = stringResource(R.string.go_back) + imageVector = Icons.AutoMirrored.Filled.ArrowBack, + contentDescription = stringResource(R.string.go_back), + tint = textColor ) } }, - title = { - Text(stringResource(R.string.general_settings)) - }, - colors = TopAppBarDefaults.topAppBarColors() + colors = TopAppBarDefaults.topAppBarColors( + containerColor = backgroundColor + ) ) } ) { innerPadding -> - Column( modifier = Modifier - .verticalScroll(scrollState) - .padding(innerPadding), + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(scrollState) + .padding(innerPadding) + .padding(horizontal = 12.dp) ) { - if(isLoading || inPreviewMode) - LinearProgressIndicator(Modifier.fillMaxWidth()) + if (isLoading || inPreviewMode) { + LinearProgressIndicator( + modifier = Modifier.fillMaxWidth() + ) + } - Spacer(modifier = Modifier.height(4.dp)) - Text( - stringResource(R.string.system), - fontSize = 13.sp, - modifier = Modifier.padding(start = 10.dp), - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.secondary, + Spacer(modifier = Modifier.height(12.dp)) + + SectionTitle( + text = stringResource(R.string.system) ) - SettingsItem( - itemTitle = stringResource(R.string.language), - itemDescription = context.getCurrentLocale()?.displayName ?: - stringResource(R.string.english1), - checked = null, - enabled = !isLoading, + + Spacer(modifier = Modifier.height(8.dp)) + + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + colors = CardDefaults.cardColors( + containerColor = cardColor + ), + border = BorderStroke( + 1.dp, + dividerColor + ), + elevation = CardDefaults.cardElevation( + defaultElevation = 0.dp + ) ) { - localeExpanded = true + + Column { + SettingsRow( + icon = { + Icon( + imageVector = Icons.Default.Language, + contentDescription = null, + tint = primaryColor, + modifier = Modifier.size(24.dp) + ) + }, + title = stringResource(R.string.language), + description = + context.getCurrentLocale()?.displayName + ?: stringResource(R.string.english1), + showArrow = true, + onClick = { + localeExpanded = true + } + ) + SettingsDivider() + SettingsRow( + icon = { + Icon( + imageVector = Icons.Default.Nightlight, + contentDescription = null, + tint = primaryColor, + modifier = Modifier.size(24.dp) + ) + }, + title = stringResource( + com.afkanerd.lib_smsmms_android.R.string.theme + ), + description = when (currentNightMode) { + Configuration.UI_MODE_NIGHT_YES -> + stringResource( + com.afkanerd.lib_smsmms_android.R.string.dark + ) + Configuration.UI_MODE_NIGHT_NO -> + stringResource( + com.afkanerd.lib_smsmms_android.R.string.light + ) + else -> + stringResource( + com.afkanerd.lib_smsmms_android.R.string.system_default + ) + }, + showArrow = true, + onClick = { + themeExpanded = true + } + ) + } } - Column( - modifier = Modifier - .fillMaxWidth() - .padding(start = 8.dp) - ) { - DropdownMenu( - expanded = localeExpanded, - onDismissRequest = { localeExpanded = false } + if (localeExpanded) { + Spacer(modifier = Modifier.height(8.dp)) + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + colors = CardDefaults.cardColors( + containerColor = cardColor + ), + border = BorderStroke( + 1.dp, + dividerColor + ) ) { - localeArraysOptions.forEachIndexed { i, item -> - DropdownMenuItem( - text = { Text(item) }, + Column { + localeArraysOptions.forEachIndexed { index, language -> + DropdownOption( + text = language, + onClick = { + context.setLocale( + localeArraysValues[index] + ) + localeExpanded = false + } + ) + } + } + } + } + + if (themeExpanded) { + Spacer(modifier = Modifier.height(8.dp)) + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + colors = CardDefaults.cardColors( + containerColor = cardColor + ), + border = BorderStroke( + 1.dp, + dividerColor + ) + ) { + + Column { + DropdownOption( + text = stringResource( + com.afkanerd.lib_smsmms_android.R.string.light + ), + onClick = { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_NO + ) + themeExpanded = false + } + ) + + DropdownOption( + text = stringResource( + com.afkanerd.lib_smsmms_android.R.string.dark + ), onClick = { - context.setLocale(localeArraysValues[i]) - localeExpanded = false + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_YES + ) + themeExpanded = false + } + ) + + DropdownOption( + text = stringResource( + com.afkanerd.lib_smsmms_android.R.string.system_default + ), + onClick = { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + ) + themeExpanded = false } ) } } } - SettingsItem( - itemTitle = stringResource(com.afkanerd.lib_smsmms_android.R.string.theme), - itemDescription = when(currentNightMode) { - Configuration.UI_MODE_NIGHT_YES -> stringResource(com.afkanerd.lib_smsmms_android.R.string.dark) - Configuration.UI_MODE_NIGHT_NO -> stringResource(com.afkanerd.lib_smsmms_android.R.string.light) - else -> stringResource(com.afkanerd.lib_smsmms_android.R.string.system_default) - }, - checked = null, - enabled = !isLoading, + Spacer(modifier = Modifier.height(28.dp)) + + SectionTitle( + text = stringResource(R.string.security) + ) + Spacer(modifier = Modifier.height(8.dp)) + + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + colors = CardDefaults.cardColors( + containerColor = cardColor + ), + border = BorderStroke( + 1.dp, + dividerColor + ), + elevation = CardDefaults.cardElevation( + defaultElevation = 0.dp + ) ) { - themeExpanded = true + Row( + modifier = Modifier + .fillMaxWidth() + .padding( + horizontal = 16.dp, + vertical = 18.dp + ), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Default.Lock, + contentDescription = null, + tint = primaryColor, + modifier = Modifier.size(25.dp) + ) + + Spacer(modifier = Modifier.width(16.dp)) + + Column( + modifier = Modifier.weight(1f) + ) { + Text( + text = stringResource(R.string.lock_app), + color = textColor, + fontSize = 16.sp + ) + Spacer(modifier = Modifier.height(4.dp)) + + Text( + text = stringResource( + R.string.this_will_lock_the_app_using_your_phone_s_biometric_security_configurations_you_will_need_to_globally_set_for_the_device + ), + color = secondaryTextColor, + fontSize = 14.sp + ) + } + + Spacer(modifier = Modifier.width(8.dp)) + + Switch( + checked = setLockDownApp, + onCheckedChange = { checked -> + context.promptBiometrics( + context.getAppCompatActivity()!! + ) { + if (it) { + context.settingsSetLockDownApp( + checked + ) + setLockDownApp = checked + } else { + scope.launch( + Dispatchers.Main + ) { + Toast.makeText( + context, + context.getString( + R.string.failed_to_set_biometric_authentication + ), + Toast.LENGTH_LONG + ).show() + } + } + } + }, + colors = SwitchDefaults.colors( + checkedThumbColor = Color.White, + checkedTrackColor = primaryColor + ) + ) + } } - Column( + Spacer(modifier = Modifier.height(20.dp)) + + Card( modifier = Modifier .fillMaxWidth() - .padding(start = 8.dp) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.error, + shape = RoundedCornerShape(12.dp) + ) + .clip(RoundedCornerShape(12.dp)) + .clickable( + enabled = !isLoading + ) { + isLoading = true + scope.launch(Dispatchers.Default) { + context.settingsSetIsLoggedIn(false) + try { + tokensViewModel.reset { + navController.popBackStack() + } + } catch (e: StatusRuntimeException) { + e.printStackTrace() + scope.launch(Dispatchers.Main) { + Toast.makeText( + context, + e.status.description, + Toast.LENGTH_SHORT + ).show() + } + } catch (e: Exception) { + e.printStackTrace() + scope.launch(Dispatchers.Main) { + Toast.makeText( + context, + e.message, + Toast.LENGTH_SHORT + ).show() + } + } finally { + isLoading = false + } + } + }, + + shape = RoundedCornerShape(12.dp), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.errorContainer + ), + elevation = CardDefaults.cardElevation( + defaultElevation = 0.dp + ) ) { - DropdownMenu( - expanded = themeExpanded, - onDismissRequest = { themeExpanded = false } + Row( + modifier = Modifier + .fillMaxWidth() + .padding( + horizontal = 16.dp, + vertical = 18.dp + ), + verticalAlignment = Alignment.CenterVertically ) { - DropdownMenuItem( - text = { Text(stringResource(com.afkanerd.lib_smsmms_android.R.string.light)) }, - onClick = { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - themeExpanded = false - } + Icon( + imageVector = Icons.Default.DeleteOutline, + contentDescription = null, + tint = MaterialTheme.colorScheme.error, + modifier = Modifier.size(25.dp) ) + Spacer(modifier = Modifier.width(16.dp)) - DropdownMenuItem( - text = { Text(stringResource(com.afkanerd.lib_smsmms_android.R.string.dark)) }, - onClick = { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - themeExpanded = false - } - ) + Column( + modifier = Modifier.weight(1f) + ) { + Text( + text = stringResource( + R.string.delete_account + ), + color = MaterialTheme.colorScheme.error, + fontSize = 16.sp + ) + Spacer(modifier = Modifier.height(4.dp)) - DropdownMenuItem( - text = { Text(stringResource(com.afkanerd.lib_smsmms_android.R.string.system_default)) }, - onClick = { - AppCompatDelegate - .setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - themeExpanded = false - } + Text( + text = stringResource( + R.string.this_would_revoke_all_your_stored_tokens_security_keys_and_every_data_you_have_stored_on_device_and_vault_you_can_still_use_bridges_whenever_you_prefer + ), + color = MaterialTheme.colorScheme.error, + fontSize = 14.sp + ) + } + + Spacer(modifier = Modifier.width(8.dp)) + + Icon( + imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, + contentDescription = null, + tint = MaterialTheme.colorScheme.error, + modifier = Modifier.size(24.dp) ) } } -// HorizontalDivider(Modifier.padding(8.dp)) + if (BuildConfig.DEBUG) { + Spacer(modifier = Modifier.height(20.dp)) + SettingsDivider() + Spacer(modifier = Modifier.height(4.dp)) + SettingsRow( + icon = { + Icon( + imageVector = Icons.Default.Description, + contentDescription = null, + tint = secondaryTextColor, + modifier = Modifier.size(24.dp) + ) + }, + title = "Export logs", + description = "Export crash logs for debugging purposes", + showArrow = true, + onClick = { + CrashHandler.offerCrashLogOptions( + activity, + context + ) + } + ) + } - Spacer(Modifier.padding(8.dp)) - Text( - stringResource(R.string.publishing), - fontSize = 13.sp, - modifier = Modifier.padding(start = 12.dp), - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.secondary, - ) + Spacer(modifier = Modifier.height(24.dp)) + } + } +} - SettingsItem( - itemTitle = stringResource(R.string.send_messages_with_device_id), - itemDescription = stringResource(R.string.device_id_lets_you_send_messages_without_using_your_actual_phone_number_for_authentication_this_works_well_for_dual_sim_phones), - checked = useDeviceId, - enabled = !isEmailLogin && !isLoading, - ) { - context.settingsSetUseDeviceId(it ?: true) - useDeviceId = it ?: true - } +@Composable +private fun SectionTitle( + text: String +) { + Text( + text = text, + modifier = Modifier.padding( + start = 8.dp, + bottom = 2.dp + ), + fontSize = 13.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.labelSmall + ) +} - Spacer(Modifier.padding(8.dp)) +@Composable +private fun SettingsRow( + icon: @Composable () -> Unit, + title: String, + description: String, + showArrow: Boolean, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable( + onClick = onClick + ) + .padding( + horizontal = 16.dp, + vertical = 16.dp + ), + verticalAlignment = Alignment.CenterVertically + ) { + icon() + Spacer(modifier = Modifier.width(16.dp)) + + Column( + modifier = Modifier.weight(1f) + ) { Text( - stringResource(R.string.security), - fontSize = 13.sp, - modifier = Modifier.padding(start = 12.dp), - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.secondary, + text = title, + fontSize = 16.sp, + color = MaterialTheme.colorScheme.onSurface ) - SettingsItem( - itemTitle = stringResource(R.string.lock_app), - itemDescription = stringResource(R.string.this_will_lock_the_app_using_your_phone_s_biometric_security_configurations_you_will_need_to_globally_set_for_the_device), - checked = setLockDownApp, - enabled = !isLoading, - horizontalDivide = false - ) { checked -> - context.promptBiometrics(context.getAppCompatActivity()!!) { - if(it) { - context.settingsSetLockDownApp(checked!!) - setLockDownApp = checked - } - else { - scope.launch(Dispatchers.Default) { - Toast.makeText(context, - context.getString(R.string.failed_to_set_biometric_authentication), - Toast.LENGTH_LONG).show() - } - } - } - } + Spacer(modifier = Modifier.height(3.dp)) - SettingsItem( - itemTitle = stringResource(R.string.delete_account), - itemDescription = stringResource(R.string.this_would_revoke_all_your_stored_tokens_security_keys_and_every_data_you_have_stored_on_device_and_vault_you_can_still_use_bridges_whenever_you_prefer), - isWarning = true, - enabled = !isLoading, - ) { - isLoading = true - scope.launch(Dispatchers.Default) { - context.settingsSetIsLoggedIn(false) - try { - TODO("Remove from cloud") - tokensViewModel.reset { - navController.popBackStack() - } - } catch(e: StatusRuntimeException) { - e.printStackTrace() - scope.launch(Dispatchers.Main){ - Toast.makeText(context, e.status.description, - Toast.LENGTH_SHORT) - .show() - } - } catch(e: Exception) { - e.printStackTrace() - scope.launch(Dispatchers.Main){ - Toast.makeText(context, e.message, - Toast.LENGTH_SHORT).show() - } - } finally { - isLoading = false - } - } - } + Text( + text = description, + fontSize = 14.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } - if(BuildConfig.DEBUG) { - HorizontalDivider(Modifier.padding(top = 20.dp)) - SettingsItem( - itemTitle = "Export logs", - itemDescription = "Export crash logs for debugging purposes", - enabled = true, - ) { - CrashHandler.offerCrashLogOptions(activity, context) - } - } + if (showArrow) { + Icon( + imageVector = + Icons.AutoMirrored.Filled.KeyboardArrowRight, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.size(24.dp) + ) } } } + + +@Composable +private fun SettingsDivider() { + Box( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background( + MaterialTheme.colorScheme.outline.copy( + alpha = 0.20f + ) + ) + ) +} + +@Composable +private fun DropdownOption( + text: String, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable( + onClick = onClick + ) + .padding( + horizontal = 20.dp, + vertical = 16.dp + ), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = text, + color = MaterialTheme.colorScheme.onSurface, + fontSize = 15.sp + ) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index acc6d9e0..4b92b053 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -136,7 +136,7 @@ Countries Settings Permission Denied! - Add Gateway Client + Add Routing Numbers Edit Gateway Client e.g +237123456 or select contact Alias (optional)