Updated on 2026-08-14

This commit is contained in:
Tangem 2025-09-22 14:24:06 +05:00
parent 3306749ae5
commit b98b66ff9f
6 changed files with 84 additions and 46 deletions

View file

@ -1,11 +1,53 @@
package com.tangem.core.ui.security
import android.app.Activity
import android.view.WindowManager
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.platform.LocalContext
import com.tangem.core.ui.utils.findActivity
import timber.log.Timber
private val LocalSecureFlagController = staticCompositionLocalOf<SecureFlagController> {
error("No SecureFlagController provided")
}
private class SecureFlagController(private val activity: Activity) {
private var count by mutableIntStateOf(0)
fun enable() {
if (count == 0) {
activity.window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE,
)
}
count++
}
fun disable() {
count--
if (count == 0) {
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
}
}
@Composable
fun ProvideSecureFlagController(content: @Composable () -> Unit) {
val activity = LocalContext.current.findActivity()
val controller = remember(activity) { SecureFlagController(activity) }
CompositionLocalProvider(
LocalSecureFlagController provides controller,
content = content,
)
}
/**
* Disables screenshots for the current composition.
@ -14,18 +56,10 @@ import timber.log.Timber
*/
@Composable
fun DisableScreenshotsDisposableEffect() {
val activity = LocalContext.current.findActivity()
val secureFlagController = LocalSecureFlagController.current
DisposableEffect(activity) {
Timber.d("Security mode: enabled")
activity.window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE,
)
onDispose {
Timber.d("Security mode: disabled")
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
DisposableEffect(secureFlagController) {
secureFlagController.enable()
onDispose { secureFlagController.disable() }
}
}