diff options
author | Iván Ávalos <avalos@disroot.org> | 2023-09-02 01:31:12 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2023-11-11 13:20:09 -0600 |
commit | 8ecdda6b849931c78d96f4a665d48f60efb82878 (patch) | |
tree | afee1c0b490f55d9ce4992a653e6a3caa7c0eeb7 /anastasis | |
parent | bba3c0c3e2c89f2a9b37a2d8851b8e0741f25b0e (diff) | |
download | taler-android-8ecdda6b849931c78d96f4a665d48f60efb82878.tar.gz taler-android-8ecdda6b849931c78d96f4a665d48f60efb82878.tar.bz2 taler-android-8ecdda6b849931c78d96f4a665d48f60efb82878.zip |
Render Taler fees + preview improvements
Signed-off-by: Iván Ávalos <avalos@disroot.org>
Diffstat (limited to 'anastasis')
6 files changed, 95 insertions, 32 deletions
diff --git a/anastasis/src/main/java/net/taler/anastasis/models/ReducerState.kt b/anastasis/src/main/java/net/taler/anastasis/models/ReducerState.kt index 72c1f48..1acb905 100644 --- a/anastasis/src/main/java/net/taler/anastasis/models/ReducerState.kt +++ b/anastasis/src/main/java/net/taler/anastasis/models/ReducerState.kt @@ -331,7 +331,7 @@ enum class RecoveryStates { data class MethodSpec( val type: AuthMethod.Type, @SerialName("usage_fee") - val usageFee: String, + val usageFee: Amount, ) @OptIn(ExperimentalSerializationApi::class) @@ -346,20 +346,20 @@ sealed class AuthenticationProviderStatus { @SerialName("ok") data class Ok( @SerialName("annual_fee") - val annualFee: String, + val annualFee: Amount, @SerialName("business_name") val businessName: String, val currency: String? = null, @SerialName("http_status") val httpStatus: Int, @SerialName("liability_limit") - val liabilityLimit: String, + val liabilityLimit: Amount, @SerialName("provider_salt") val providerSalt: String, @SerialName("storage_limit_in_megabytes") val storageLimitInMegabytes: Int, @SerialName("truth_upload_fee") - val truthUploadFee: String, + val truthUploadFee: Amount, val methods: List<MethodSpec>, ): AuthenticationProviderStatus() diff --git a/anastasis/src/main/java/net/taler/anastasis/ui/backup/ReviewPoliciesScreen.kt b/anastasis/src/main/java/net/taler/anastasis/ui/backup/ReviewPoliciesScreen.kt index 0055589..e570014 100644 --- a/anastasis/src/main/java/net/taler/anastasis/ui/backup/ReviewPoliciesScreen.kt +++ b/anastasis/src/main/java/net/taler/anastasis/ui/backup/ReviewPoliciesScreen.kt @@ -31,6 +31,7 @@ import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.EditOff +import androidx.compose.material3.Badge import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FloatingActionButton @@ -226,12 +227,17 @@ fun PolicyCard( } } +@OptIn(ExperimentalMaterial3Api::class) @Composable fun PolicyMethodCard( modifier: Modifier = Modifier, method: AuthMethod, provider: AuthenticationProviderStatus.Ok, ) { + val usageFee = remember(provider) { + provider.methods.find { it.type == method.type }?.usageFee + } + OutlinedCard( modifier = modifier, ) { @@ -253,6 +259,12 @@ fun PolicyMethodCard( style = MaterialTheme.typography.labelMedium, fontWeight = FontWeight.Bold, ) + if (usageFee != null && !usageFee.isZero()) { + Spacer(Modifier.height(LocalSpacing.current.small)) + Badge { + Text(usageFee.toString()) + } + } } } } diff --git a/anastasis/src/main/java/net/taler/anastasis/ui/backup/SelectAuthMethodsScreen.kt b/anastasis/src/main/java/net/taler/anastasis/ui/backup/SelectAuthMethodsScreen.kt index 584d853..19f6e6b 100644 --- a/anastasis/src/main/java/net/taler/anastasis/ui/backup/SelectAuthMethodsScreen.kt +++ b/anastasis/src/main/java/net/taler/anastasis/ui/backup/SelectAuthMethodsScreen.kt @@ -67,7 +67,6 @@ import net.taler.common.CryptoUtils @Composable fun SelectAuthMethodsScreen( viewModel: ReducerViewModelI = hiltViewModel<ReducerViewModel>(), - showManageProviders: Boolean = false, ) { val state by viewModel.reducerState.collectAsState() val reducerState = state as? ReducerState.Backup @@ -89,11 +88,11 @@ fun SelectAuthMethodsScreen( }.distinct() } - var manageProviders by remember { mutableStateOf(showManageProviders) } + var manageProviders by remember { mutableStateOf(false) } WizardPage( title = if (manageProviders) - stringResource(R.string.backup_providers) + stringResource(R.string.manage_backup_providers) else stringResource(R.string.select_auth_methods_title), onBackClicked = { viewModel.goHome() }, onPrevClicked = { viewModel.goBack() }, @@ -282,15 +281,4 @@ fun SelectAuthMethodsScreenPreview() { backupState = BackupStates.AuthenticationsEditing, ), ) -} - -@Preview -@Composable -fun ManageBackupProvidersPreview() { - SelectAuthMethodsScreen( - viewModel = FakeBackupViewModel( - backupState = BackupStates.AuthenticationsEditing, - ), - showManageProviders = true, - ) }
\ No newline at end of file diff --git a/anastasis/src/main/java/net/taler/anastasis/ui/common/ManageProvidersScreen.kt b/anastasis/src/main/java/net/taler/anastasis/ui/common/ManageProvidersScreen.kt index e0d4b7e..2f3dd40 100644 --- a/anastasis/src/main/java/net/taler/anastasis/ui/common/ManageProvidersScreen.kt +++ b/anastasis/src/main/java/net/taler/anastasis/ui/common/ManageProvidersScreen.kt @@ -22,6 +22,7 @@ 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.width import androidx.compose.foundation.lazy.LazyColumn @@ -39,9 +40,11 @@ import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Scaffold import androidx.compose.material3.Text 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 @@ -51,11 +54,16 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.taler.anastasis.R import net.taler.anastasis.models.AuthenticationProviderStatus +import net.taler.anastasis.models.BackupStates +import net.taler.anastasis.models.ReducerState import net.taler.anastasis.ui.dialogs.EditProviderDialog +import net.taler.anastasis.ui.reusable.pages.WizardPage import net.taler.anastasis.ui.theme.LocalSpacing +import net.taler.anastasis.viewmodels.FakeBackupViewModel @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -150,13 +158,44 @@ fun ProviderCard( tint = MaterialTheme.colorScheme.primary, ) } - Spacer(Modifier.width(12.dp)) Column( - modifier = Modifier.weight(1f), + modifier = Modifier + .padding(horizontal = LocalSpacing.current.medium) + .weight(1f), ) { Text(url, style = MaterialTheme.typography.labelLarge) if (status is AuthenticationProviderStatus.Ok) { - Text(status.businessName, style = MaterialTheme.typography.labelMedium) + Spacer(Modifier.height(LocalSpacing.current.small)) + Text(status.businessName, style = MaterialTheme.typography.labelLarge) + ProvideTextStyle(MaterialTheme.typography.labelMedium) { + if (!status.annualFee.isZero()) { + Spacer(Modifier.height(LocalSpacing.current.small)) + Text( + stringResource( + R.string.provider_annual_fee, + status.annualFee.toString() + ) + ) + } + if (!status.truthUploadFee.isZero()) { + Spacer(Modifier.height(LocalSpacing.current.small)) + Text( + stringResource( + R.string.provider_truth_upload_fee, + status.truthUploadFee.toString() + ) + ) + } + if (!status.liabilityLimit.isZero()) { + Spacer(Modifier.height(LocalSpacing.current.small)) + Text( + stringResource( + R.string.provider_liability_limit, + status.liabilityLimit.toString() + ) + ) + } + } } } Spacer(Modifier.width(12.dp)) @@ -168,4 +207,26 @@ fun ProviderCard( } } } +} + +@Preview +@Composable +fun ManageProvidersScreenPreview() { + val viewModel by remember { + mutableStateOf( + FakeBackupViewModel( + backupState = BackupStates.AuthenticationsEditing, + ), + ) + } + val reducerState by viewModel.reducerState.collectAsState() + val authProviders = (reducerState as ReducerState.Backup).authenticationProviders + WizardPage(title = stringResource(R.string.manage_backup_providers)) { + ManageProvidersScreen( + nestedScrollConnection = it, + authProviders = authProviders!!, + onAddProvider = {}, + onDeleteProvider = {}, + ) + } }
\ No newline at end of file diff --git a/anastasis/src/main/java/net/taler/anastasis/viewmodels/FakeReducerViewModel.kt b/anastasis/src/main/java/net/taler/anastasis/viewmodels/FakeReducerViewModel.kt index 3f482e4..9941d5d 100644 --- a/anastasis/src/main/java/net/taler/anastasis/viewmodels/FakeReducerViewModel.kt +++ b/anastasis/src/main/java/net/taler/anastasis/viewmodels/FakeReducerViewModel.kt @@ -92,12 +92,12 @@ internal val authenticationProviders = mapOf( "http://localhost:8088/" to AuthenticationProviderStatus.Ok( httpStatus = 200, methods = listOf( - MethodSpec(type = AuthMethod.Type.Question, usageFee = "EUR:0.001"), - MethodSpec(type = AuthMethod.Type.Sms, usageFee = "EUR:0.55"), + MethodSpec(type = AuthMethod.Type.Question, usageFee = Amount.fromJSONString("EUR:0.001")), + MethodSpec(type = AuthMethod.Type.Sms, usageFee = Amount.fromJSONString("EUR:0.55")), ), - annualFee = "EUR:0.99", - truthUploadFee = "EUR:3.99", - liabilityLimit = "EUR:1", + annualFee = Amount.fromJSONString("EUR:0.99"), + truthUploadFee = Amount.fromJSONString("EUR:3.99"), + liabilityLimit = Amount.fromJSONString("EUR:1"), currency = "EUR", storageLimitInMegabytes = 1, businessName = "Anastasis 4", @@ -106,12 +106,12 @@ internal val authenticationProviders = mapOf( "http://localhost:8089/" to AuthenticationProviderStatus.Ok( httpStatus = 200, methods = listOf( - MethodSpec(type = AuthMethod.Type.Question, usageFee = "EUR:0.001"), - MethodSpec(type = AuthMethod.Type.Sms, usageFee = "EUR:0.55"), + MethodSpec(type = AuthMethod.Type.Question, usageFee = Amount.fromJSONString("EUR:0.001")), + MethodSpec(type = AuthMethod.Type.Sms, usageFee = Amount.fromJSONString("EUR:0.55")), ), - annualFee = "EUR:0.99", - truthUploadFee = "EUR:3.99", - liabilityLimit = "EUR:1", + annualFee = Amount.fromJSONString("EUR:0.99"), + truthUploadFee = Amount.fromJSONString("EUR:3.99"), + liabilityLimit = Amount.fromJSONString("EUR:1"), currency = "EUR", storageLimitInMegabytes = 1, businessName = "Anastasis 2", diff --git a/anastasis/src/main/res/values/strings.xml b/anastasis/src/main/res/values/strings.xml index d53db88..0bbf397 100644 --- a/anastasis/src/main/res/values/strings.xml +++ b/anastasis/src/main/res/values/strings.xml @@ -59,7 +59,6 @@ <string name="auth_method_totp">TOTP</string> <string name="auth_instruction_email">Email to %1$s</string> <string name="auth_instruction_sms">Sms to %1$s</string> - <string name="backup_providers">Manage backup providers</string> <string name="add_challenge">Add challenge</string> <string name="manage_backup_providers">Manage backup providers</string> <string name="add_provider">Add provider</string> @@ -67,6 +66,9 @@ <string name="provider_status_disabled">Disabled</string> <string name="provider_status_error">Error</string> <string name="provider_status_not_contacted">Not contacted</string> + <string name="provider_liability_limit">Liability limit is %1$s</string> + <string name="provider_truth_upload_fee">Truth upload fee is %1$s</string> + <string name="provider_annual_fee">Annual fee is %1$s</string> <string name="add_policy">Add policy</string> <string name="edit_policy">Edit policy</string> <string name="secret_name">Secret name</string> |