diff options
| author | Kalle Lindström <karl.lindstrom@mullvad.net> | 2025-03-21 13:48:53 +0100 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2025-03-24 14:15:55 +0100 |
| commit | 8322c4f9b6f5c34246bc37a0135511eb08ee8d4f (patch) | |
| tree | e4ff8981745d38cae4496088b4af797fea95e5fb /android/app/src | |
| parent | 8c3c33d32512387f96197bf58537869f34ee597f (diff) | |
| download | mullvadvpn-8322c4f9b6f5c34246bc37a0135511eb08ee8d4f.tar.xz mullvadvpn-8322c4f9b6f5c34246bc37a0135511eb08ee8d4f.zip | |
Hide clipboard data when copying account number
Diffstat (limited to 'android/app/src')
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) } } |
