Skip to content

v1.4.6

Choose a tag to compare

@doesthings doesthings released this 14 Jul 01:30

FreeFCC v1.4.6 — Hardening + Bug Fixes

New Features

  • BootReceiver: if auto-FCC is enabled, the keepalive service restarts automatically after a controller reboot — no need to reopen FreeFCC manually
  • Sticky restart respects user intent: if the system kills and restarts the keepalive service, it checks the persistent flag so it won't silently re-enable after you stopped it
  • UI keepalive toggle synced: the toggle reflects the actual service state after a process restart

Security

  • APK SHA-256 verification: downloaded updates are verified against the GitHub asset digest before offering install — a tampered or corrupted download is refused
  • FileProvider scope narrowed: the cache path is now restricted to updates/ instead of the entire cache directory
  • Removed deprecated storage permissions: READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE are no-ops on API 30+ and have been removed
  • allowBackup=false: the auto-FCC flag is device-local and no longer backed up / restored across devices
  • Android 14 foreground service fix: added CHANGE_WIFI_STATE so the connectedDevice foreground service type has the required underlying permission on API 34+

Bug Fixes

  • Keepalive no longer swallows CancellationException — coroutine cancellation now takes effect promptly instead of waiting for the next blocking call
  • installUpdate now runs on a background thread — the APK copy was blocking the UI thread (ANR risk)
  • FileOutputStream leak fixed in the update downloader (now uses .use {})
  • Crash protection: enableFcc, disableFcc, setLed, and queryDeviceInfo now catch parse/load errors instead of crashing the app on a malformed profile asset
  • queryDeviceInfo empty-frames guard: no more NoSuchElementException if device_info.json is empty
  • sendAndReceive short-read guard: a truncated response no longer throws ArrayIndexOutOfBoundsException
  • Keepalive interval drift fixed: the 2s interval now starts at the beginning of each loop, so the actual interval is consistent regardless of send duration
  • Keepalive state desync fixed: the persistent flag is checked on process restart so the UI toggle matches reality
  • Duplicate install intents removed: the file manager intent that competed with the system installer has been removed
  • HardwareLock.end() is now safe to call without ownership — no more IllegalMonitorStateException from a stray release

Performance

  • Keepalive profile cached at service creation instead of re-parsing JSON and rebuilding frames with CRC every 2 seconds
  • ACK read buffer reused instead of allocating a new 2KB buffer per frame
  • Named constants for connect timeout, settle delay, and alternate ports (8901–8904)

Code Quality

  • Hardcoded version strings in the UI now use APP_VERSION (no more stale "1.4.4" after a bump)
  • Build version bumped to 1.4.6 (versionCode 14)

Compatibility

Same as before: DJI RC2, RC Pro 2, RC Plus (smart controllers with a screen). 21-frame universal FCC profile, 2 rounds, 150ms between frames.