F7SecureScreen: не ставить FLAG_SECURE в debug-сборке (FLAG_DEBUGGABLE-гейт)
Релиз остаётся защищённым (скриншоты/запись/превью блокируются), но debug-APK теперь снимается на эмуляторе — нужно для автономного визуал-теста (screencap на secure-окне возвращает пустой кадр). Проверка через ApplicationInfo.FLAG_DEBUGGABLE, без BuildConfig (работает в library-модуле).
This commit is contained in:
@@ -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
|
||||
if (!debuggable) {
|
||||
window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
|
||||
}
|
||||
onDispose {
|
||||
if (!debuggable) {
|
||||
window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user