F7SecureScreen: не ставить FLAG_SECURE в debug-сборке (FLAG_DEBUGGABLE-гейт)

Релиз остаётся защищённым (скриншоты/запись/превью блокируются), но debug-APK
теперь снимается на эмуляторе — нужно для автономного визуал-теста (screencap
на secure-окне возвращает пустой кадр). Проверка через ApplicationInfo.FLAG_DEBUGGABLE,
без BuildConfig (работает в library-модуле).
This commit is contained in:
b-dev-mobile
2026-07-13 11:57:33 +00:00
parent 93086d3f43
commit 195235495e
@@ -1,6 +1,7 @@
package ru.forbion.f7cloud.core.designsystem
import android.app.Activity
import android.content.pm.ApplicationInfo
import android.view.WindowManager
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
@@ -10,15 +11,23 @@ import androidx.compose.ui.platform.LocalContext
* Пока этот экран на виду — окно помечено FLAG_SECURE: содержимое не попадает
* в скриншоты, превью в «недавних» и запись экрана. Вешать на чувствительные
* экраны (ввод пароля/PIN). Флаг снимается при уходе с экрана.
*
* В debug-сборке (FLAG_DEBUGGABLE) флаг НЕ ставится — иначе невозможен автономный
* визуал-тест на эмуляторе (screencap возвращает пустой кадр). Релиз — всегда защищён.
*/
@Composable
fun F7SecureScreen() {
val context = LocalContext.current
DisposableEffect(Unit) {
val debuggable = (context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
val window = (context as? Activity)?.window
window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
if (!debuggable) {
window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
onDispose {
window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
if (!debuggable) {
window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
}
}
}