summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/button/AnimatedIconButton.kt86
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/CopyableObfuscationView.kt10
2 files changed, 57 insertions, 39 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/button/AnimatedIconButton.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/button/AnimatedIconButton.kt
index 2fa25253eb..0054b560e8 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/button/AnimatedIconButton.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/button/AnimatedIconButton.kt
@@ -1,9 +1,10 @@
package net.mullvad.mullvadvpn.compose.button
import androidx.compose.animation.AnimatedContent
-import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -13,13 +14,11 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.res.stringResource
import kotlinx.coroutines.delay
-import net.mullvad.mullvadvpn.R
+import net.mullvad.mullvadvpn.compose.theme.Dimens
internal const val PRESS_EFFECT_TIME_SPAN: Long = 1000
-@OptIn(ExperimentalAnimationApi::class)
@Composable
fun AnimatedIconButton(
defaultIcon: Painter,
@@ -28,48 +27,63 @@ fun AnimatedIconButton(
pressEffectDuration: Long = PRESS_EFFECT_TIME_SPAN,
defaultIconColorFilter: ColorFilter? = null,
secondaryIconColorFilter: ColorFilter? = null,
+ contentDescription: String,
isToggleButton: Boolean = false,
onClick: () -> Unit
) {
var state by remember { mutableStateOf(ButtonState.IDLE) }
- AnimatedContent(targetState = state) { targetState ->
- when (targetState) {
- ButtonState.IDLE -> {
- Image(
- painter = defaultIcon,
- colorFilter = defaultIconColorFilter,
- contentDescription = "",
- modifier =
- modifier.clickable {
- onClick()
+ if (state == ButtonState.PRESSED) {
+ LaunchedEffect(Unit) {
+ delay(pressEffectDuration)
+ state = ButtonState.IDLE
+ }
+ }
+ Box(
+ modifier =
+ modifier
+ .clickable {
+ when (state) {
+ ButtonState.IDLE -> {
state = if (isToggleButton) ButtonState.TOGGLED else ButtonState.PRESSED
- }
- )
- }
- ButtonState.TOGGLED -> {
- Image(
- painter = secondaryIcon,
- colorFilter = secondaryIconColorFilter,
- contentDescription = stringResource(id = R.string.copy_account_number),
- modifier =
- modifier.clickable {
onClick()
+ }
+ ButtonState.TOGGLED -> {
state = ButtonState.IDLE
+ onClick()
}
- )
- }
- ButtonState.PRESSED -> {
- LaunchedEffect(Unit) {
- delay(pressEffectDuration)
- state = ButtonState.IDLE
+ ButtonState.PRESSED -> {}
+ }
+ }
+ .padding(all = Dimens.smallPadding)
+ ) {
+ AnimatedContent(targetState = state, label = contentDescription) { targetState ->
+ val iconPainter: Painter
+ val colorFilter: ColorFilter?
+ val imageModifier: Modifier
+ when (targetState) {
+ ButtonState.IDLE -> {
+ iconPainter = defaultIcon
+ colorFilter = defaultIconColorFilter
+ imageModifier = modifier
+ }
+ ButtonState.TOGGLED -> {
+ iconPainter = secondaryIcon
+ colorFilter = secondaryIconColorFilter
+ imageModifier = modifier
+ }
+ ButtonState.PRESSED -> {
+ iconPainter = secondaryIcon
+ colorFilter = secondaryIconColorFilter
+ imageModifier = modifier
}
- Image(
- painter = secondaryIcon,
- colorFilter = secondaryIconColorFilter,
- contentDescription = stringResource(id = R.string.copy_account_number),
- modifier = modifier
- )
}
+
+ Image(
+ painter = iconPainter,
+ colorFilter = colorFilter,
+ contentDescription = contentDescription,
+ modifier = imageModifier
+ )
}
}
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/CopyableObfuscationView.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/CopyableObfuscationView.kt
index 571985c0be..9efdcc96d8 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/CopyableObfuscationView.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/CopyableObfuscationView.kt
@@ -11,6 +11,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.compose.button.AnimatedIconButton
@@ -29,7 +30,10 @@ fun CopyableObfuscationView(content: String) {
val context = LocalContext.current
val shouldObfuscated = remember { mutableStateOf(true) }
- Row(verticalAlignment = CenterVertically) {
+ Row(
+ verticalAlignment = CenterVertically,
+ modifier = Modifier.padding(end = Dimens.sideMargin)
+ ) {
AccountNumberView(
accountNumber = content,
doObfuscateWithPasswordDots = shouldObfuscated.value,
@@ -39,7 +43,7 @@ fun CopyableObfuscationView(content: String) {
defaultIcon = painterResource(id = R.drawable.icon_hide),
secondaryIcon = painterResource(id = R.drawable.icon_show),
isToggleButton = true,
- modifier = Modifier.padding(start = Dimens.smallPadding, end = Dimens.sideMargin),
+ contentDescription = stringResource(id = R.string.hide_account_number),
onClick = { shouldObfuscated.value = shouldObfuscated.value.not() }
)
AnimatedIconButton(
@@ -48,7 +52,7 @@ fun CopyableObfuscationView(content: String) {
secondaryIconColorFilter =
ColorFilter.tint(color = MaterialTheme.colorScheme.inversePrimary),
isToggleButton = false,
- modifier = Modifier.padding(end = Dimens.sideMargin),
+ contentDescription = stringResource(id = R.string.copy_account_number),
onClick = {
context.copyToClipboard(
content = content,