From 4dc487ccf97f1abbe0c935964c2f279ee80860a6 Mon Sep 17 00:00:00 2001 From: IacobIonut01 Date: Tue, 25 Jun 2024 11:49:37 +0300 Subject: [PATCH] Vault: Set secure mode while viewing Hides the gallery screen in the recents apps or in screenrecording (and screenshots) to protect users privacy to their hidden content Signed-off-by: IacobIonut01 --- app/build.gradle.kts | 2 +- .../feature_node/presentation/vault/VaultScreen.kt | 12 ++++++++++++ .../encryptedmediaview/EncryptedMediaViewScreen.kt | 11 +++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ab2973c79..636ca384d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,7 +20,7 @@ android { applicationId = "com.dot.gallery" minSdk = 30 targetSdk = 34 - versionCode = 30005 + versionCode = 30006 versionName = "3.0.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/VaultScreen.kt b/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/VaultScreen.kt index 592013c09..fac423bf4 100644 --- a/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/VaultScreen.kt +++ b/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/VaultScreen.kt @@ -1,18 +1,22 @@ package com.dot.gallery.feature_node.presentation.vault +import android.app.Activity import android.os.Build +import android.view.WindowManager import androidx.annotation.RequiresApi import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG import androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL import androidx.biometric.BiometricPrompt.PromptInfo import androidx.compose.animation.AnimatedVisibility import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.dot.gallery.R @@ -28,6 +32,14 @@ fun VaultScreen( navigate: (route: String) -> Unit, vm: VaultViewModel ) { + val window = (LocalContext.current as Activity).window + + DisposableEffect(Unit) { + window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + onDispose { + window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } val vaults by vm.vaults.collectAsStateWithLifecycle() val currentVault by vm.currentVault.collectAsStateWithLifecycle() diff --git a/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/encryptedmediaview/EncryptedMediaViewScreen.kt b/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/encryptedmediaview/EncryptedMediaViewScreen.kt index 5efa38e0e..eb3a6bf98 100644 --- a/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/encryptedmediaview/EncryptedMediaViewScreen.kt +++ b/app/src/main/kotlin/com/dot/gallery/feature_node/presentation/vault/encryptedmediaview/EncryptedMediaViewScreen.kt @@ -5,6 +5,8 @@ package com.dot.gallery.feature_node.presentation.vault.encryptedmediaview +import android.app.Activity +import android.view.WindowManager import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.FastOutLinearInEasing @@ -23,6 +25,7 @@ import androidx.compose.foundation.pager.PagerDefaults import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf @@ -76,6 +79,14 @@ fun EncryptedMediaViewScreen( restoreMedia: (Vault, EncryptedMedia) -> Unit, deleteMedia: (Vault, EncryptedMedia) -> Unit ) { + val window = (LocalContext.current as Activity).window + + DisposableEffect(Unit) { + window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + onDispose { + window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } var runtimeMediaId by rememberSaveable(mediaId) { mutableLongStateOf(mediaId) } val state by mediaState.collectAsStateWithLifecycle() val initialPage = rememberSaveable(runtimeMediaId) {