diff --git a/tools/chatgui-android/router-tests/build.gradle.kts b/tools/chatgui-android/router-tests/build.gradle.kts index f45b51b5..fcf25bbf 100644 --- a/tools/chatgui-android/router-tests/build.gradle.kts +++ b/tools/chatgui-android/router-tests/build.gradle.kts @@ -7,9 +7,9 @@ kotlin { sourceSets.named("main") { // Компилируем настоящие компоненты приложения; Android fixtures существуют только в этом JVM-модуле. kotlin.srcDir(providers.gradleProperty("routerSourceDir").getOrElse("../app/src/main/java")) - kotlin.include("android/**", "com/utun/chat/RouterHostApp.kt", "com/utun/chat/data/RouterHostEnvironment.kt", + kotlin.include("android/**", "androidx/**", "com/utun/chat/RouterHostApp.kt", "com/utun/chat/data/RouterHostEnvironment.kt", "com/utun/chat/data/CallAudioRouter.kt", "com/utun/chat/data/CoreActivity.kt", - "com/utun/chat/data/ProximityManager.kt", + "com/utun/chat/data/ProximityManager.kt", "com/utun/chat/data/PhoneStateMonitor.kt", "com/utun/chat/data/NetworkActivityMonitor.kt", "com/utun/chat/data/NetworkChangeMonitor.kt") } } @@ -20,6 +20,7 @@ providers.gradleProperty("routerTestsBuildDir").orNull?.let { layout.buildDirect dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") testImplementation("junit:junit:4.13.2") + testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3") } tasks.test { diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt index 442b192f..393449fb 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt @@ -3,6 +3,8 @@ package android.content import android.media.AudioManager import android.net.ConnectivityManager import android.hardware.SensorManager +import android.telephony.SubscriptionManager +import android.telephony.TelephonyManager import com.utun.chat.data.HostConfigProvider /** Только host-тест: управляемые Android managers, без устройств/разрешений ОС. */ @@ -11,6 +13,8 @@ class Context { var permissionGranted = true var connectivityManager: ConnectivityManager? = ConnectivityManager() var sensorManager: SensorManager? = SensorManager() + var subscriptionManager: SubscriptionManager? = SubscriptionManager() + var telephonyManager: TelephonyManager? = TelephonyManager() val configProvider = HostConfigProvider() val applicationContext: Context get() = this fun getSystemService(name: String): Any? = when (name) { @@ -22,6 +26,8 @@ class Context { return type.cast(when (type) { ConnectivityManager::class.java -> connectivityManager SensorManager::class.java -> sensorManager + SubscriptionManager::class.java -> subscriptionManager + TelephonyManager::class.java -> telephonyManager else -> error("Unknown service: $type") }) } 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 a22b5a1c..77fcb4e5 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 @@ -4,6 +4,7 @@ import java.util.Collections import java.util.concurrent.atomic.AtomicInteger import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred +import kotlinx.coroutines.flow.MutableStateFlow /** Минимальная поверхность Telecom; Bluetooth lifecycle не создаёт настоящую Connection. */ class UtunConnection { @@ -35,8 +36,14 @@ object NativeLib { var activityAttempts = 0 var failActivityRequest = false var acceptActivityRequest = true + val phoneRequests = mutableListOf>() + var acceptPhoneRequest = true fun notifyNetworkActive() { networkNotifications.incrementAndGet() } fun isReady(): Boolean = ready + fun setPhoneState(state: Int, policy: Int): Boolean { + phoneRequests.add(state to policy) + return acceptPhoneRequest + } fun updateSockets(config: String): Boolean { socketUpdates.add(config); return acceptSocketUpdate } fun setActive(active: Boolean): Boolean { activityAttempts++ @@ -49,6 +56,7 @@ object NativeLib { /** Управляемая подготовка конфига: тест удерживает реальный worker, считает перекрытия и затем дожидается его завершения. */ class HostConfigProvider { + val incomingCallOptions = MutableStateFlow(List(5) { false }) val builds = AtomicInteger() val inBuild = AtomicInteger() val maximumConcurrentBuilds = AtomicInteger()