aboutsummaryrefslogtreecommitdiff
path: root/anastasis
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2023-07-31 21:27:45 -0600
committerIván Ávalos <avalos@disroot.org>2023-11-11 13:20:09 -0600
commitf66a4b0dc576e4a6102d1a4612784b4ff0212d86 (patch)
treed796343c68e4258be7ffdfc8dc177681e5c65d48 /anastasis
parente7dd19128279f55b0fc0d4466a714dd8d89da021 (diff)
downloadtaler-android-f66a4b0dc576e4a6102d1a4612784b4ff0212d86.tar.gz
taler-android-f66a4b0dc576e4a6102d1a4612784b4ff0212d86.tar.bz2
taler-android-f66a4b0dc576e4a6102d1a4612784b4ff0212d86.zip
Slightly improve recomposition performance
Signed-off-by: Iván Ávalos <avalos@disroot.org>
Diffstat (limited to 'anastasis')
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/backup/ReviewPoliciesScreen.kt14
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/backup/SelectAuthMethodsScreen.kt15
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/common/SelectUserAttributesScreen.kt32
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/forms/EditEmailForm.kt4
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/forms/EditPolicyForm.kt11
-rw-r--r--anastasis/src/main/java/net/taler/anastasis/ui/forms/EditSmsForm.kt4
6 files changed, 50 insertions, 30 deletions
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 04c44d8..c42e7bc 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
@@ -71,12 +71,15 @@ fun ReviewPoliciesScreen(
?: error("invalid reducer type")
val policies = reducerState.policies ?: emptyList()
- // Get only providers with "ok" status
- val providers = reducerState.authenticationProviders?.filter {
- it.value is AuthenticationProviderStatus.Ok
- }?.mapValues { it.value as AuthenticationProviderStatus.Ok } ?: emptyMap()
val methods = reducerState.authenticationMethods ?: emptyList()
+ // Get only providers with "ok" status
+ val providers = remember(reducerState.authenticationProviders) {
+ reducerState.authenticationProviders?.filter {
+ it.value is AuthenticationProviderStatus.Ok
+ }?.mapValues { it.value as AuthenticationProviderStatus.Ok } ?: emptyMap()
+ }
+
var showEditDialog by remember { mutableStateOf(false) }
var editingPolicy by remember { mutableStateOf<Policy?>(null) }
var editingPolicyIndex by remember { mutableStateOf<Int?>(null) }
@@ -129,14 +132,13 @@ fun ReviewPoliciesScreen(
.fillMaxWidth()
) {
items(count = policies.size) { index ->
- val policy = policies[index]
PolicyCard(
modifier = Modifier.padding(
start = LocalSpacing.current.small,
end = LocalSpacing.current.small,
bottom = LocalSpacing.current.small,
),
- policy = policy,
+ policy = policies[index],
methods = methods,
providers = providers,
index = index,
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 9234f99..1ffd9ac 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
@@ -71,17 +71,18 @@ fun SelectAuthMethodsScreen(
val selectedMethods = reducerState.authenticationMethods ?: emptyList()
// Get only known methods of providers with "ok" status
- val availableMethods = authProviders.flatMap { entry ->
- if (entry.value is AuthenticationProviderStatus.Ok) {
- (entry.value as AuthenticationProviderStatus.Ok).methods.map { it.type }
- .filter { it != AuthMethod.Type.Unknown }
- } else emptyList()
- }.distinct()
+ val availableMethods = remember(authProviders) {
+ authProviders.flatMap { entry ->
+ if (entry.value is AuthenticationProviderStatus.Ok) {
+ (entry.value as AuthenticationProviderStatus.Ok).methods.map { it.type }
+ .filter { it != AuthMethod.Type.Unknown }
+ } else emptyList()
+ }.distinct()
+ }
var showEditDialog by remember { mutableStateOf(false) }
var methodType by remember { mutableStateOf<AuthMethod.Type?>(null) }
var method by remember { mutableStateOf<AuthMethod?>(null) }
-
val reset = {
showEditDialog = false
methodType = null
diff --git a/anastasis/src/main/java/net/taler/anastasis/ui/common/SelectUserAttributesScreen.kt b/anastasis/src/main/java/net/taler/anastasis/ui/common/SelectUserAttributesScreen.kt
index b7e1a4e..9374798 100644
--- a/anastasis/src/main/java/net/taler/anastasis/ui/common/SelectUserAttributesScreen.kt
+++ b/anastasis/src/main/java/net/taler/anastasis/ui/common/SelectUserAttributesScreen.kt
@@ -69,6 +69,12 @@ fun SelectUserAttributesScreen(
*identityAttributes.toList().toTypedArray()
) }
+ val enableNext = remember(userAttributes, values) {
+ userAttributes.fold(true) { a, b ->
+ a && (fieldStatus(b, values[b.name]) == FieldStatus.Valid)
+ }
+ }
+
WizardPage(
title = stringResource(R.string.select_user_attributes_title),
onBackClicked = { viewModel.goHome() },
@@ -76,9 +82,7 @@ fun SelectUserAttributesScreen(
onNextClicked = {
viewModel.reducerManager.enterUserAttributes(values)
},
- enableNext = userAttributes.fold(true) { a, b ->
- a && (fieldStatus(b, values[b.name]) == FieldStatus.Valid)
- }
+ enableNext = enableNext,
) { scrollConnection ->
LazyColumn(
modifier = Modifier
@@ -87,13 +91,13 @@ fun SelectUserAttributesScreen(
verticalArrangement = Arrangement.Top,
) {
items(items = userAttributes) { attr ->
- val status = fieldStatus(attr, values[attr.name])
- val supportingText: @Composable () -> Unit = @Composable {
- status.msgRes?.let {
- Text(stringResource(it))
- } ?: if (attr.optional == true) {
- Text(stringResource(R.string.field_optional))
- } else {}
+ val status = remember(attr, values) {
+ fieldStatus(attr, values[attr.name])
+ }
+ val supportingRes = remember(attr, status) {
+ status.msgRes ?: if (attr.optional == true) {
+ R.string.field_optional
+ } else null
}
when (attr.type) {
"string" -> OutlinedTextField(
@@ -106,7 +110,9 @@ fun SelectUserAttributesScreen(
value = values[attr.name] ?: "",
onValueChange = { values[attr.name] = it },
isError = status.error,
- supportingText = supportingText,
+ supportingText = {
+ supportingRes?.let { Text(stringResource(it)) }
+ },
label = { Text(attr.label) },
)
"date" -> DatePickerField(
@@ -118,7 +124,9 @@ fun SelectUserAttributesScreen(
.fillMaxWidth(),
label = attr.label,
isError = status.error,
- supportingText = supportingText,
+ supportingText = {
+ supportingRes?.let { Text(stringResource(it)) }
+ },
date = values[attr.name]?.toLocalDate(),
onDateSelected = { date ->
values[attr.name] = Utils.formatDate(date)
diff --git a/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditEmailForm.kt b/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditEmailForm.kt
index 0e1a840..e874f23 100644
--- a/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditEmailForm.kt
+++ b/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditEmailForm.kt
@@ -54,7 +54,9 @@ fun EditEmailForm(
val context = LocalContext.current
val focusRequester1 = remember { FocusRequester() }
val focusManager = LocalFocusManager.current
- val status = fieldStatus(localMethod.challenge)
+ val status = remember(localMethod.challenge) {
+ fieldStatus(localMethod.challenge)
+ }
OutlinedTextField(
modifier = Modifier
diff --git a/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditPolicyForm.kt b/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditPolicyForm.kt
index 89309f8..6bed512 100644
--- a/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditPolicyForm.kt
+++ b/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditPolicyForm.kt
@@ -24,6 +24,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.material3.Checkbox
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
@@ -43,7 +44,9 @@ fun EditPolicyForm(
onPolicyEdited: (policy: Policy) -> Unit,
) {
val localPolicy = policy ?: Policy(methods = listOf())
- val localMethods = localPolicy.methods.associateBy { it.authenticationMethod }
+ val localMethods = remember(localPolicy.methods) {
+ localPolicy.methods.associateBy { it.authenticationMethod }
+ }
val submitLocalMethods = { it: MutableMap<Int, Policy.PolicyMethod>.() -> Unit ->
onPolicyEdited(
localPolicy.copy(
@@ -59,8 +62,10 @@ fun EditPolicyForm(
) {
methods.forEachIndexed { index, method ->
// Get only the providers that support this method type
- val methodProviders = providers.filterValues { provider ->
- method.type in provider.methods.map { it.type }
+ val methodProviders = remember(providers) {
+ providers.filterValues { provider ->
+ method.type in provider.methods.map { it.type }
+ }
}
val providerUrls = methodProviders.keys.toList()
val selectedProvider = localMethods[index]?.provider
diff --git a/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditSmsForm.kt b/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditSmsForm.kt
index fe573d2..aa27919 100644
--- a/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditSmsForm.kt
+++ b/anastasis/src/main/java/net/taler/anastasis/ui/forms/EditSmsForm.kt
@@ -55,7 +55,9 @@ fun EditSmsForm(
val context = LocalContext.current
val focusRequester1 = remember { FocusRequester() }
val focusManager = LocalFocusManager.current
- val status = fieldStatus(localMethod.challenge)
+ val status = remember(localMethod.challenge) {
+ fieldStatus(localMethod.challenge)
+ }
OutlinedTextField(
modifier = Modifier