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