diff --git a/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppLockGate.kt b/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppLockGate.kt index bf8dcaf..050023a 100644 --- a/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppLockGate.kt +++ b/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppLockGate.kt @@ -53,6 +53,7 @@ import androidx.lifecycle.ProcessLifecycleOwner import ru.forbion.f7cloud.core.auth.AppLockStore import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton +import ru.forbion.f7cloud.core.designsystem.F7SecureScreen import ru.forbion.f7cloud.core.designsystem.F7TextButton import ru.forbion.f7cloud.mobile.R @@ -145,6 +146,7 @@ fun AppLockSetupDialog( onLockConfigured: () -> Unit = {}, ) { if (!visible) return + F7SecureScreen() // создание/подтверждение PIN — не в скриншотах/recents val context = LocalContext.current val activity = context.findFragmentActivity() @@ -534,6 +536,7 @@ private fun AppLockUnlockScreen( lockSession: Int, onUnlocked: () -> Unit, ) { + F7SecureScreen() // экран разблокировки (PIN) — не в скриншотах/recents val context = LocalContext.current val activity = context.findFragmentActivity() var pin by remember { mutableStateOf("") } diff --git a/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt b/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt index 398e979..8ceec2a 100644 --- a/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt +++ b/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt @@ -81,6 +81,7 @@ import ru.forbion.f7cloud.core.push.F7PushEventHub import ru.forbion.f7cloud.core.push.F7PushRegistrar import ru.forbion.f7cloud.core.designsystem.F7OverlayNavigationProvider import ru.forbion.f7cloud.core.designsystem.F7AppMenuSheet +import ru.forbion.f7cloud.core.designsystem.F7SecureScreen import ru.forbion.f7cloud.core.designsystem.F7AppScaffold import ru.forbion.f7cloud.core.designsystem.F7AutoHideBottomBar import ru.forbion.f7cloud.core.designsystem.F7BottomBarActions @@ -689,6 +690,7 @@ fun AppScaffold( private const val PERMISSIONS_PROMPTED_KEY = "runtime_permissions_prompted_v2" @Composable private fun LoginScreen(onLogin: (AuthSession) -> Unit) { + F7SecureScreen() // ввод пароля — не в скриншотах/recents val context = LocalContext.current val scope = rememberCoroutineScope() val keyboardController = LocalSoftwareKeyboardController.current diff --git a/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7SecureScreen.kt b/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7SecureScreen.kt new file mode 100644 index 0000000..8262022 --- /dev/null +++ b/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7SecureScreen.kt @@ -0,0 +1,24 @@ +package ru.forbion.f7cloud.core.designsystem + +import android.app.Activity +import android.view.WindowManager +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.platform.LocalContext + +/** + * Пока этот экран на виду — окно помечено FLAG_SECURE: содержимое не попадает + * в скриншоты, превью в «недавних» и запись экрана. Вешать на чувствительные + * экраны (ввод пароля/PIN). Флаг снимается при уходе с экрана. + */ +@Composable +fun F7SecureScreen() { + val context = LocalContext.current + DisposableEffect(Unit) { + val window = (context as? Activity)?.window + window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + onDispose { + window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } +}