From f60390c99c0d6fa6aee7e080e0d2d291c7404dad Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 10:07:46 +0100 Subject: [PATCH] Model native file failures and wake lock ownership on host --- .../src/main/kotlin/android/os/HostPower.kt | 8 ++++++-- .../src/main/kotlin/com/utun/chat/RouterHostApp.kt | 2 ++ .../com/utun/chat/data/RouterHostEnvironment.kt | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostPower.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostPower.kt index 2482007a..ec6ecf04 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostPower.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostPower.kt @@ -2,18 +2,22 @@ package android.os /** Host wake lock: тест различает отказ до acquire, после побочного эффекта и освобождение по timeout. */ class PowerManager { - companion object { const val SCREEN_BRIGHT_WAKE_LOCK = 10; const val ACQUIRE_CAUSES_WAKEUP = 0x10000000; const val ON_AFTER_RELEASE = 0x20000000 } + companion object { + const val PARTIAL_WAKE_LOCK = 1; const val SCREEN_BRIGHT_WAKE_LOCK = 10 + const val ACQUIRE_CAUSES_WAKEUP = 0x10000000; const val ON_AFTER_RELEASE = 0x20000000 + } var failures = emptySet() val locks = mutableListOf() fun newWakeLock(flags: Int, tag: String): WakeLock { check("create" !in failures) { "wake lock creation unavailable" } return WakeLock(flags, tag, failures).also { locks.add(it) } } - class WakeLock(val flags: Int, val tag: String, private val failures: Set) { + class WakeLock(val flags: Int, val tag: String, var failures: Set) { var timeout = 0L var releaseCalls = 0 var held = false val isHeld: Boolean get() { check("query" !in failures) { "wake lock query unavailable" }; return held } + fun acquire() = acquire(0) fun acquire(timeout: Long) { this.timeout = timeout held = true diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/RouterHostApp.kt b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/RouterHostApp.kt index 8011137c..79eddaa6 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/RouterHostApp.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/RouterHostApp.kt @@ -16,5 +16,7 @@ object R { const val incoming_calls = 101; const val incoming_call_notification = 102; const val radio_call_incoming = 103 const val incoming_call = 104; const val decline = 105; const val hang_up = 106; const val accept = 107 const val media_audio_fallback = 108; const val media_audio_failed = 109 + const val files_preparing = 201; const val files_transferring = 202; const val files_completed = 203 + const val files_cancelled = 204; const val files_failed = 205; const val files_replace_title = 206; const val files_saving = 207 } } 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 2aff133a..f5420468 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 @@ -34,6 +34,20 @@ object LogManager { /** Только host-тест: считает уведомления standby, не загружает JNI и не запускает ядро. */ object NativeLib { + data class FileTransfer(val id: Long, val group: Long, val server: Long, val owner: Long, + val remote: String, val local: String, val upload: Boolean, val version: ByteArray) + var fileRequest: (Long, Long, ByteArray) -> Boolean = { _, _, _ -> true } + var acceptFileTransfer = true + val fileTransfers = mutableListOf() + val fileCancels = mutableListOf() + fun getMyNodeId() = 1L + fun fileRequest(group: Long, server: Long, wire: ByteArray) = fileRequest.invoke(group, server, wire) + fun fileTransfer(id: Long, group: Long, server: Long, owner: Long, remote: String, local: String, + upload: Boolean, version: ByteArray): Boolean { + fileTransfers.add(FileTransfer(id, group, server, owner, remote, local, upload, version.copyOf())) + return acceptFileTransfer + } + fun fileCancel(id: Long): Boolean { fileCancels.add(id); return true } val networkNotifications = AtomicInteger() var ready = true var acceptSocketUpdate = true