SvxApp.onCreate вызывается один раз на процесс, поэтому при живом
фоне повторные открытия не учитывались. Теперь считаем onStart
ProcessLifecycleOwner (холодный старт и каждое открытие приложения).
- RxRecorder: MediaCodec(Opus) + MediaMuxer(OGG), пишет декодированный
RX PCM 48 кГц; pts не продвигается во время тишины, поэтому паузы
в эфире не попадают в файл.
- OpusEngine.rxTap: перехват PCM из выхода декодера.
- SvxService: startRecording()/stopRecording()/isRecording().
- MainActivity: кнопка btn_record между позывным и монитором,
индикация (иконка краснеет), тосты о старте/сохранении.
- Файлы: Android/data/ru.ua1zbe.svxremote/files/recordings/rec_*.ogg.
Пустой файл (весь сеанс — тишина) удаляется.
- Tap callsign on main screen shows dialog with connected nodes
- SvxService tracks node list: ServerInfo + NODE_JOINED/NODE_LEFT events
- Bump to 1.0.4
- Check latest release on startup, show 'update available' dialog with
Update/ Later buttons
- Download APK with progress and install via ACTION_VIEW + custom
UpdateFileProvider (no androidx)
- Request unknown-app-sources permission if needed, resume download on
return to the app
- Decode received Opus audio: handle svxlink self-delimited framing and
provide monotonic PTS (c2.opus.decoder discards output when PTS == 0)
- Keep connection and playback alive in background via SvxService
(foreground service, media playback type)
- Keep screen on while app is open
- Show last talker callsign persistently instead of clearing after 4s
- Bump versionCode to 2, disable lint on release builds