Document overlay service handshake, window cleanup and gesture error ownership

This commit is contained in:
evgeny committed 2026-10-29 13:34:23 +01:00
1 parent 1559e0681b
commit 4de7d7ec9d
1 file changed
+39
+39
View File
@@ -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`;