summaryrefslogtreecommitdiff
path: root/anastasis
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2023-09-02 01:31:12 -0600
committerIván Ávalos <avalos@disroot.org>2023-11-11 13:20:09 -0600
commit8ecdda6b849931c78d96f4a665d48f60efb82878 (patch)
treeafee1c0b490f55d9ce4992a653e6a3caa7c0eeb7 /anastasis
parentbba3c0c3e2c89f2a9b37a2d8851b8e0741f25b0e (diff)
downloadtaler-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')
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/models/ReducerState.kt8
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/backup/ReviewPoliciesScreen.kt12
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/backup/SelectAuthMethodsScreen.kt16
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/common/ManageProvidersScreen.kt67
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/viewmodels/FakeReducerViewModel.kt20
-rw-r--r--anastasis/src/main/res/values/strings.xml4
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>