summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
authorsaber safavi <saber.safavi@codic.se>2023-07-31 13:16:21 +0200
committersaber safavi <saber.safavi@codic.se>2023-08-01 09:46:36 +0200
commit826dcf5902f782a5585c89671dbf78f6f7976d97 (patch)
tree72e26897a7df3bba4d564c464c6a13561569552f /android/app/src
parent603ec7ac8c523480c9b1c6f2edef936173c17b54 (diff)
downloadmullvadvpn-826dcf5902f782a5585c89671dbf78f6f7976d97.tar.xz
mullvadvpn-826dcf5902f782a5585c89671dbf78f6f7976d97.zip
Add copy icon feedback on click
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/button/AnimatedIconButton.kt81
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/CopyableObfuscationView.kt52
2 files changed, 106 insertions, 27 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
new file mode 100644
index 0000000000..2fa25253eb
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/button/AnimatedIconButton.kt
@@ -0,0 +1,81 @@
+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.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+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
+
+internal const val PRESS_EFFECT_TIME_SPAN: Long = 1000
+
+@OptIn(ExperimentalAnimationApi::class)
+@Composable
+fun AnimatedIconButton(
+ defaultIcon: Painter,
+ secondaryIcon: Painter,
+ modifier: Modifier = Modifier,
+ pressEffectDuration: Long = PRESS_EFFECT_TIME_SPAN,
+ defaultIconColorFilter: ColorFilter? = null,
+ secondaryIconColorFilter: ColorFilter? = null,
+ 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()
+ 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()
+ state = ButtonState.IDLE
+ }
+ )
+ }
+ ButtonState.PRESSED -> {
+ LaunchedEffect(Unit) {
+ delay(pressEffectDuration)
+ state = ButtonState.IDLE
+ }
+ Image(
+ painter = secondaryIcon,
+ colorFilter = secondaryIconColorFilter,
+ contentDescription = stringResource(id = R.string.copy_account_number),
+ modifier = modifier
+ )
+ }
+ }
+ }
+}
+
+enum class ButtonState {
+ IDLE,
+ TOGGLED,
+ PRESSED
+}
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 d20f750680..71ff694f15 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
@@ -1,20 +1,20 @@
package net.mullvad.mullvadvpn.compose.component
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
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
import net.mullvad.mullvadvpn.compose.theme.Dimens
import net.mullvad.mullvadvpn.lib.common.util.SdkUtils
import net.mullvad.mullvadvpn.ui.extension.copyToClipboard
@@ -36,31 +36,29 @@ fun CopyableObfuscationView(content: String) {
doObfuscateWithPasswordDots = shouldObfuscated.value
)
Spacer(modifier = Modifier.weight(1f))
- Image(
- painter =
- painterResource(
- id = if (shouldObfuscated.value) R.drawable.icon_hide else R.drawable.icon_show
- ),
- modifier =
- Modifier.clickable { shouldObfuscated.value = shouldObfuscated.value.not() }
- .padding(start = Dimens.sideMargin),
- contentDescription = stringResource(id = R.string.copy_account_number)
+ AnimatedIconButton(
+ defaultIcon = painterResource(id = R.drawable.icon_hide),
+ secondaryIcon = painterResource(id = R.drawable.icon_show),
+ isToggleButton = true,
+ onClick = { shouldObfuscated.value = shouldObfuscated.value.not() }
)
- Image(
- painter = painterResource(id = R.drawable.icon_copy),
- modifier =
- Modifier.clickable {
- context.copyToClipboard(
- content = content,
- clipboardLabel = context.getString(R.string.mullvad_account_number)
- )
- SdkUtils.showCopyToastIfNeeded(
- context,
- context.getString(R.string.copied_mullvad_account_number)
- )
- }
- .padding(start = Dimens.sideMargin, end = Dimens.sideMargin),
- contentDescription = stringResource(id = R.string.copy_account_number)
+ AnimatedIconButton(
+ defaultIcon = painterResource(id = R.drawable.icon_copy),
+ secondaryIcon = painterResource(id = R.drawable.icon_tick),
+ secondaryIconColorFilter =
+ ColorFilter.tint(color = MaterialTheme.colorScheme.inversePrimary),
+ isToggleButton = false,
+ modifier = Modifier.padding(start = Dimens.sideMargin, end = Dimens.sideMargin),
+ onClick = {
+ context.copyToClipboard(
+ content = content,
+ clipboardLabel = context.getString(R.string.mullvad_account_number)
+ )
+ SdkUtils.showCopyToastIfNeeded(
+ context,
+ context.getString(R.string.copied_mullvad_account_number)
+ )
+ }
)
}
}