From 263d1348eccd1bea095fd2fe25bee6001c266eaf Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 19:29:03 +0100 Subject: [PATCH] Model overlay permissions and persistent settings for service tests --- .../router-tests/src/main/kotlin/android/os/HostOs.kt | 6 +++++- .../src/main/kotlin/android/provider/Settings.kt | 6 ++++++ .../kotlin/com/utun/chat/data/RouterHostEnvironment.kt | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt index 8a52a434..b1b85a27 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt @@ -6,8 +6,12 @@ import android.media.AudioAttributes /** Host-модель SDK/главной очереди: callbacks и их доставку тест контролирует явно, без настоящего Android Looper. */ object Build { object VERSION { var SDK_INT = 36 } - object VERSION_CODES { const val O = 26; const val P = 28; const val S = 31; const val TIRAMISU = 33; const val UPSIDE_DOWN_CAKE = 34 } + object VERSION_CODES { + const val M = 23; const val O = 26; const val P = 28; const val R = 30; const val S = 31 + const val TIRAMISU = 33; const val UPSIDE_DOWN_CAKE = 34 + } } +interface IBinder class Looper private constructor() { private data class Task(val handler: Handler, val runnable: Runnable, val deadline: Long) private val tasks = ConcurrentLinkedQueue() diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/provider/Settings.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/provider/Settings.kt index b33310d7..81058fa9 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/provider/Settings.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/provider/Settings.kt @@ -2,6 +2,12 @@ package android.provider /** Имена настоящих Android actions; host-тест проверяет target/порядок и не открывает системный UI. */ object Settings { + var overlayAllowed = true + var failOverlayQuery = false + fun canDrawOverlays(context: android.content.Context): Boolean { + check(!failOverlayQuery) { "overlay permission query unavailable" } + return overlayAllowed + } const val ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" const val ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS = "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS" } diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt index db13e46c..3dc13a13 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt @@ -161,6 +161,14 @@ object NativeLib { /** Управляемая подготовка конфига: тест удерживает реальный worker, считает перекрытия и затем дожидается его завершения. */ class HostConfigProvider { + var radioOverlay = false + var failOverlayWrite = false + fun getRadioOverlay() = radioOverlay + suspend fun setRadioOverlay(enabled: Boolean) { + check(!failOverlayWrite) { "overlay settings write unavailable" } + radioOverlay = enabled + } + fun getInt(key: String): Int { check(key == "radio.auto_enabled"); return if (radioSettings.enabled) 1 else 0 } var radioSettings = RadioAutoSettings() var failRadioSettings = false fun getRadioAutoSettings(): RadioAutoSettings {