From 4de7d7ec9d0a2449e7053c7efc4521a23715fbae Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 19:42:11 +0100 Subject: [PATCH] Document overlay service handshake, window cleanup and gesture error ownership --- tools/chatgui-android/doc/ARCHITECTURE.md | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tools/chatgui-android/doc/ARCHITECTURE.md b/tools/chatgui-android/doc/ARCHITECTURE.md index ed749093..df1823ab 100644 --- a/tools/chatgui-android/doc/ARCHITECTURE.md +++ b/tools/chatgui-android/doc/ARCHITECTURE.md @@ -374,6 +374,38 @@ Demand ограничивает батч viewer; GAP/CLOSED требуют сб ## Фон и диагностика +`RadioOverlayService` на main обеспечивает foreground-режим микрофона при активной +рации и включённом оверлее либо автоматике. Сам PCM захватывает RadioAudioEngine; +разрешённый экран/фоновое окно по-прежнему проверяются движком. Старт FGS +откладывается до видимой Activity. Разрешения запрашиваются только явной командой +пользователя; отказ launcher снимает ожидание и допускает повтор. Ошибки настроек, +проверки разрешения и обновления языка логируются с причиной. + +Starting удерживается от запроса ОС до onCreate; stop в этом промежутке ставит +pendingStop. Сервис сначала завершает foreground-handshake, затем запрашивает +остановку. Новый запрос во время stop ждёт onDestroy. Отказ stopService/исключение +не фиксирует pendingStop навсегда и допускает повтор. Ошибки создания канала, +promote и получения WindowManager попадают в общий rollback запуска. Уведомление +оверлея имеет отдельный ID 1005, без замены звонкового FGS (1002) и результатов +вызовов (1003/1004). Обновление языка не публикует уведомление остановленного владельца. + +Окно и LayoutParams сохраняются до addView: исключение после эффекта API получает +remove. Успешный remove либо IllegalArgumentException подтверждает отсутствие окна; +прочие отказы сохраняют ссылку и отключают обработку касаний. IsShown означает +добавленное либо ещё не подтверждённо удалённое окно. После onDestroy такой +владелец остаётся в currentService, и sync повторяет очистку до замены новым. +Повторный/поздний onDestroy не гасит новый сервис. Touch/layout callbacks проверяют +identity окна и владельца; старый callback позиционирования не сбрасывает флаг нового. + +Обычное отпускание OVERLAY оставляет хвост 250 мс. Два коротких тапа фиксируют PTT; +следующее нажатие снимает latch. Drag начинается только в первые 300 мс удержания, +снимает PTT с обычным хвостом и сохраняет выбранную позицию до нового окна. +ACTION_CANCEL, ошибка перемещения, remove и stop отменяют OVERLAY сразу, сохраняя +BUTTON/VOLUME. Ошибка окна и отзыв разрешения также останавливают ненужный FGS, +если автоматическая передача его не удерживает. При разрешённой автоматике +сервис может продолжать работу без плавающей кнопки. Ошибка observer не уходит +в необработанное исключение: свой PTT/окно закрываются, сервис запрашивает stop. + `IncomingCallManager` на main владеет одним входящим оповещением P2P/рации. Повтор `show` с теми же ID/каналом/пиром/видом обновляет только уведомление. Замена сначала снимает прежнее оповещение. Ошибки wake lock и уведомления @@ -557,6 +589,13 @@ CoreActivity и гудки. Управляемые Android/JNI/repository-гра публикации результатов. IncomingCallLifecycleTest также использует настоящий рационный контроллер при доставке DECLINE. Радиоэфир и C-сигналинг в JVM не запускаются; native-протокол проверяется отдельным test_radio. +RadioOverlayLifecycleTest использует настоящие overlay service, RadioAudioEngine, +микрофонные подписки и MediaAudioController. Host-модели service/window IPC +проверяют частичные add/remove, повторную очистку, отказы channel/promote/stop, +старые touch/layout/destroy callbacks, PTT/latch/drag, отзыв разрешений и +изолированные ID уведомлений. Settings ACK позволяет выполнять настоящие PCM +workers через управляемую JNI-границу. WindowManager/foreground restrictions, +отрисовка и OEM-поведение на устройстве в JVM не проверяются. На Linux `:app:testDebugUnitTest` также запускает 25 fault-сценариев настоящего JNI logger через `:app:testJniLog`; окружение и границы модели: `tests/jni_log/README.md`. Проверки native bridge/standby доступны в `tests/Makefile.am`;