diff options
author | Iván Ávalos <avalos@disroot.org> | 2023-07-31 21:27:45 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2023-11-11 13:20:09 -0600 |
commit | f66a4b0dc576e4a6102d1a4612784b4ff0212d86 (patch) | |
tree | d796343c68e4258be7ffdfc8dc177681e5c65d48 /anastasis | |
parent | e7dd19128279f55b0fc0d4466a714dd8d89da021 (diff) | |
download | taler-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')
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 |