From 3babc636b49bd48ce1a502a555a0796e0d8cd93d Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 02:13:33 +0100 Subject: [PATCH] Compile real Telecom integration against explicit host boundaries --- .../chatgui-android/video-tests/build.gradle.kts | 5 +++-- .../src/main/kotlin/android/os/HostVideoOs.kt | 16 ++++++++++++++-- .../main/kotlin/com/utun/chat/data/StreamHost.kt | 5 ++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/tools/chatgui-android/video-tests/build.gradle.kts b/tools/chatgui-android/video-tests/build.gradle.kts index 067ea13c..9775e06c 100644 --- a/tools/chatgui-android/video-tests/build.gradle.kts +++ b/tools/chatgui-android/video-tests/build.gradle.kts @@ -5,7 +5,7 @@ kotlin { sourceSets.named("main") { // Настоящий RX/протокольный формат; Android codecs, probe и JNI управляются на аппаратных границах. kotlin.srcDir("../app/src/main/java") - kotlin.include("android/**", "com/utun/chat/data/VideoHost.kt", "com/utun/chat/data/CallVideoPlayer.kt", + kotlin.include("android/**", "androidx/**", "com/utun/chat/data/VideoHost.kt", "com/utun/chat/data/CallVideoPlayer.kt", "com/utun/chat/data/CallVideoFormat.kt", "com/utun/chat/data/StreamVideoCodec.kt", "com/utun/chat/data/H264AnnexB.kt", "com/utun/chat/data/StreamPreview.kt", "com/utun/chat/data/VideoCodecResources.kt", "com/utun/chat/data/StreamVideoPlayback.kt", "com/utun/chat/data/StreamDecodePump.kt") @@ -15,7 +15,8 @@ kotlin { kotlin.include("com/utun/chat/data/StreamHost.kt", "com/utun/chat/data/StreamPlayerEngine.kt", "com/utun/chat/data/StreamAudioMixer.kt", "com/utun/chat/data/StreamAudioOutput.kt", "com/utun/chat/data/StreamAudioMix.kt", "com/utun/chat/data/StreamReadQueue.kt", "com/utun/chat/data/StreamPlaybackTelemetry.kt", - "com/utun/chat/data/StreamCaptureEngine.kt", "com/utun/chat/data/StreamCaptureConfig.kt") + "com/utun/chat/data/StreamCaptureEngine.kt", "com/utun/chat/data/StreamCaptureConfig.kt", + "com/utun/chat/data/TelecomCallManager.kt", "com/utun/chat/data/UtunConnection.kt", "com/utun/chat/data/UtunConnectionService.kt") } } dependencies { diff --git a/tools/chatgui-android/video-tests/src/main/kotlin/android/os/HostVideoOs.kt b/tools/chatgui-android/video-tests/src/main/kotlin/android/os/HostVideoOs.kt index 18c01b3f..8e95f58e 100644 --- a/tools/chatgui-android/video-tests/src/main/kotlin/android/os/HostVideoOs.kt +++ b/tools/chatgui-android/video-tests/src/main/kotlin/android/os/HostVideoOs.kt @@ -62,6 +62,18 @@ object SystemClock { fun elapsedRealtime(): Long = System.nanoTime() / 1_000_000 fun elapsedRealtimeNanos(): Long = System.nanoTime() } -object Build { object VERSION { const val SDK_INT = 36 } } +object Build { object VERSION { var SDK_INT = 36 }; object VERSION_CODES { const val UPSIDE_DOWN_CAKE = 34 } } object Process { const val THREAD_PRIORITY_AUDIO = -16; fun setThreadPriority(value: Int) {} } -class Bundle { val values = mutableMapOf(); fun putInt(key: String, value: Int) { values[key] = value } } +class Bundle { + val values = mutableMapOf() + fun putInt(key: String, value: Int) { values[key] = value } + fun putLong(key: String, value: Long) { values[key] = value } + fun putString(key: String, value: String) { values[key] = value } + fun putBundle(key: String, value: Bundle) { values[key] = value } + fun putParcelable(key: String, value: Any) { values[key] = value } + fun getLong(key: String, fallback: Long): Long = values[key] as? Long ?: fallback + fun getString(key: String): String? = values[key] as? String + fun keySet() = values.keys +} +data class ParcelUuid(val uuid: java.util.UUID) +interface OutcomeReceiver { fun onResult(result: R?); fun onError(error: E) } diff --git a/tools/chatgui-android/video-tests/src/main/kotlin/com/utun/chat/data/StreamHost.kt b/tools/chatgui-android/video-tests/src/main/kotlin/com/utun/chat/data/StreamHost.kt index 1aa52b02..c086c6f2 100644 --- a/tools/chatgui-android/video-tests/src/main/kotlin/com/utun/chat/data/StreamHost.kt +++ b/tools/chatgui-android/video-tests/src/main/kotlin/com/utun/chat/data/StreamHost.kt @@ -27,7 +27,10 @@ object MicrophoneCapture { } } -object CallController { var blocked = false; fun blocksMedia() = blocked } +enum class AudioRoute { EARPIECE, SPEAKER, HEADSET } +enum class CallPhase { NONE, OUTGOING, RINGING, INCOMING, ACTIVE, ENDED, WAIT_DECISION, PENDING_INCOMING } +data class HostCallState(val callId: Long, val phase: CallPhase) { val ongoing get() = phase != CallPhase.NONE && phase != CallPhase.ENDED } +object CallController { var blocked = false; val state = MutableStateFlow(null); fun blocksMedia() = blocked } object StreamController { private val ids = AtomicLong(100); fun nextId() = ids.incrementAndGet() } object MediaAudioController { data class State(val switching: Boolean = false)