summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
authorKalle Lindström <karl.lindstrom@mullvad.net>2025-03-21 13:48:53 +0100
committerDavid Göransson <david.goransson@mullvad.net>2025-03-24 14:15:55 +0100
commit8322c4f9b6f5c34246bc37a0135511eb08ee8d4f (patch)
treee4ff8981745d38cae4496088b4af797fea95e5fb /android/app/src
parent8c3c33d32512387f96197bf58537869f34ee597f (diff)
downloadmullvadvpn-8322c4f9b6f5c34246bc37a0135511eb08ee8d4f.tar.xz
mullvadvpn-8322c4f9b6f5c34246bc37a0135511eb08ee8d4f.zip
Hide clipboard data when copying account number
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Clipboard.kt21
4 files changed, 24 insertions, 6 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
index bd3d8b8bc5..b771853ad2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
@@ -88,7 +88,8 @@ fun Account(
val snackbarHostState = remember { SnackbarHostState() }
val copyTextString = stringResource(id = R.string.copied_mullvad_account_number)
val errorString = stringResource(id = R.string.error_occurred)
- val copyToClipboard = createCopyToClipboardHandle(snackbarHostState = snackbarHostState)
+ val copyToClipboard =
+ createCopyToClipboardHandle(snackbarHostState = snackbarHostState, isSensitive = true)
val openAccountPage = LocalUriHandler.current.createOpenAccountPageHook()
CollectSideEffectWithLifecycle(vm.uiSideEffect) { sideEffect ->
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt
index 621fb42885..2b06606a3d 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt
@@ -77,7 +77,8 @@ fun ViewLogs(navigator: DestinationsNavigator) {
@Composable
fun ViewLogsScreen(state: ViewLogsUiState, onBackClick: () -> Unit) {
val snackbarHostState = remember { SnackbarHostState() }
- val clipboardHandle = createCopyToClipboardHandle(snackbarHostState = snackbarHostState)
+ val clipboardHandle =
+ createCopyToClipboardHandle(snackbarHostState = snackbarHostState, isSensitive = false)
Scaffold(
snackbarHost = {
SnackbarHost(
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt
index 20396c4849..8f7286987d 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt
@@ -287,7 +287,8 @@ private fun WelcomeInfo(
@Composable
private fun AccountNumberRow(snackbarHostState: SnackbarHostState, state: WelcomeUiState) {
val copiedAccountNumberMessage = stringResource(id = R.string.copied_mullvad_account_number)
- val copyToClipboard = createCopyToClipboardHandle(snackbarHostState = snackbarHostState)
+ val copyToClipboard =
+ createCopyToClipboardHandle(snackbarHostState = snackbarHostState, isSensitive = true)
val onCopyToClipboard = {
copyToClipboard(state.accountNumber?.value ?: "", copiedAccountNumberMessage)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Clipboard.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Clipboard.kt
index d3b3f166da..55bc1855d3 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Clipboard.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Clipboard.kt
@@ -1,19 +1,26 @@
package net.mullvad.mullvadvpn.compose.util
+import android.content.ClipData
import android.os.Build
+import android.os.PersistableBundle
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.ClipboardManager
import androidx.compose.ui.platform.LocalClipboardManager
-import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.platform.toClipEntry
import kotlinx.coroutines.launch
typealias CopyToClipboardHandle = (content: String, toastMessage: String?) -> Unit
+private const val IS_SENSITIVE_FLAG = "android.content.extra.IS_SENSITIVE"
+
@Composable
-fun createCopyToClipboardHandle(snackbarHostState: SnackbarHostState): CopyToClipboardHandle {
+fun createCopyToClipboardHandle(
+ snackbarHostState: SnackbarHostState,
+ isSensitive: Boolean,
+): CopyToClipboardHandle {
val scope = rememberCoroutineScope()
val clipboardManager: ClipboardManager = LocalClipboardManager.current
@@ -27,6 +34,14 @@ fun createCopyToClipboardHandle(snackbarHostState: SnackbarHostState): CopyToCli
}
}
- clipboardManager.setText(AnnotatedString(textToCopy))
+ val clip =
+ ClipData.newPlainText("", textToCopy)
+ .apply {
+ description.extras =
+ PersistableBundle().apply { putBoolean(IS_SENSITIVE_FLAG, isSensitive) }
+ }
+ .toClipEntry()
+
+ clipboardManager.setClip(clip)
}
}