1.23.1 — MDC1200 Last Heard display Show decoded MDC1200 text prominently on its own green line in ANALOG FM Last Heard. Include hexadecimal unit ID, PTT ID start/end and decoded opcode/argument. The string remains in saved history and call details. 1.23.0 — MDC1200 Add MDC1200 SETTINGS with independent receive/transmit switches, default unit ID 0001, and beginning/end/both PTT ID positions. Transmit is hardware FM voice only; end ID adds a bounded approximately 260 ms carrier tail on normal PTT release. Cancellation and timeout still release immediately. Decode received IDs into analog Last Heard; IDs are not sent to RadioID. Both switches default off. Native modem source, GPL-2.0 license and build script included. Synthetic modem and pacing checks pass; over-air interoperability needs user testing. 1.22.9 — Roll back F11 Remove F11 squelch override and latch handling, restoring pre-F11 radio behavior. F2 Zone Scan and button diagnostics remain. 1.22.8 — F11 squelch On ANALOG FM, F11 opens squelch while held. Hold 600 ms to latch SQL 0; press again to restore the saved level. This is a transient hardware override and does not change memories. Leaving the page/app, changing SQL or starting Zone Scan restores the level. Scanning/busy hardware blocks opening. 1.22.7 — F2 zone scan F2 toggles Zone Scan on the ANALOG FM page using the same action and idle-radio safeguards as the scan button. Key release and held-key repeats do not toggle again. 1.22.6 — Button diagnostics Add Last button press with timestamp, key name, press/release state, Android key code and scan code for keys delivered to the Diagnostics page. Physical PTT broadcasts also update the field. Existing button behavior is preserved. 1.22.5 — Device diagnostics Add Android release/API level, system build, total/available RAM and total/available internal data storage to Diagnostics. Values come from Android and remain visible when the radio is disconnected. 1.22.4 — Radio model diagnostics Show the device-reported radio model on Diagnostics, including when disconnected. 1.22.3 — Analog FM shortcuts Remove the Memories shortcut and its row from ANALOG FM, giving Last Heard the remaining space. Memories remains accessible in the main menu. 1.22.2 — Analog FM shortcuts Remove the Repeaters shortcut from the ANALOG FM page. 1.22.1 — Credits Add CREDITS above EXIT at the bottom of the main menu. Show supplied artwork across the full screen for five seconds, then return to the previous page. 1.22.0 — EchoLink first client Add encrypted account settings, sign-in, searchable online station directory, outgoing direct/manual-proxy connections and GSM voice with physical PTT, busy lockout, volume and Last Heard. Leaving EchoLink signs out. Includes libgsm copyright notice. Protocol, transport and local codec checks pass; live account login and end-to-end voice await user testing. Incoming connection acceptance and chat are not included. 1.21.5 — ECHOLINK menu entry Add ECHOLINK to the alphabetized globe menu with the shared RoIP page layout and volume control. Explicitly marked not implemented; Connect is disabled. EchoLink login, directory and voice implementation remains future work. 1.21.4 — Consistent RoIP page layouts Use BrandMeister-style ordering, typography and spacing for D-STAR, YSF, P25 and M17: volume, status, server, destination and Connect, with compact scrolling Last Heard filling the remaining screen. Mode settings and connection behavior retained. 1.21.3 — RoIP volume dropdowns Add the same numbers-only 0–15 volume dropdown to BrandMeister, D-STAR, YSF, P25 and M17. All use current media volume and apply immediately. 1.21.2 — Numbers-only volume dropdown Remove check marks from the 0–15 volume dropdown. 1.21.1 — Quick volume dropdown Tap Volume on ANALOG FM or DMR to choose 0–15. Applies media volume immediately and marks the current level. 1.21.0 — M17 RoIP voice Add M17 reflector linking, Codec2 3200-bps microphone/speaker and 1600-bps receive compatibility, physical PTT with busy lockout and chirp, knob media volume and separate Last Heard. Settings → M17 SETTINGS defaults to M17-M17 module C, m17.openquad.net:17000. Disconnects on navigation. SWLA-LINK M17 334 S endpoint remains unknown. No M17 RF or packet/SMS support. 1.20.0 — P25 RoIP voice Add P25 Phase 1 IMBE internet reflector link, microphone/speaker, physical PTT with busy lockout and chirp, master-volume knob, cached caller lookup and Last Heard. Settings → P25 SETTINGS defaults to SWLA-LINK, bridge.kc5jmj.com:41000, TG 31337; source ID initially follows saved hardware ID. Disconnects on navigation. P25 RF, trunking, Phase 2 and encrypted voice are outside this feature. 1.19.1 — Switch YSF test reflector to US-SWLA337 Set YSF 54634 at ysf.swlalink.com:42000 once, retaining callsign and other mode settings. 1.19.0 — YSF / System Fusion DN voice Add UDP reflector linking, reconnect, DN microphone/speaker audio, physical PTT with busy lockout and chirp, knob volume and YSF Last Heard. Prefill reflector 31337 at xlx.afu-kiel.de:42000. Configure under Settings → YSF SETTINGS. Disconnect on navigation; RF voice modes remain separate. VW/FCS/Wires-X commands are not implemented. 1.18.59 — Simplify Memories actions Remove Export this zone and Restore previous import from the Memories page. 1.18.58 — PACKET RADIO SETTINGS page Move local callsign, BBS/node callsign and digipeater path into Settings → PACKET RADIO SETTINGS. Retain saved values and use them when connecting. 1.18.57 — Capitalize battery settings label Display BACKGROUND BATTERY SETTINGS on the Settings page. 1.18.56 — Capitalize Settings entries Display BRANDMEISTER and DMR SETTINGS on the Settings page. 1.18.55 — Move WINLINK SETTINGS Move Account / RMS from WINLINK to the Settings page and rename it WINLINK SETTINGS. Existing account and gateway settings remain saved. 1.18.54 — Left-align Winlink dropdowns Left-align transport and mailbox selector text and options. 1.18.53 — TELENET transport label Display TELENET in the Winlink transport selector as requested. 1.18.52 — PACKET transport label Simplify the Winlink packet transport selector label to PACKET. 1.18.51 — Winlink ready status line break Show Local mail engine verified below Ready. 1.18.50 — Center Winlink page Center heading, labels, status, session log, mailbox rows, selectors and form text. 1.18.49 — Packet callsign prefill Prefill Packet Radio callsign / SSID with KE5EUA-7 once; subsequent edits remain saved. 1.18.48 — Center Packet Radio labels Center label text on the Packet Radio page. 1.18.47 — Simplify packet frequency label Show only the frequency and MHz unit. 1.18.46 — Packet frequency follows ANALOG FM Replace the editable packet frequency with a read-only label from the selected analog channel. Packet connections use that frequency and require an FM channel selection. 1.18.45 — Winlink controls on separate rows Place Account / RMS below Send / Receive. 1.18.44 — Replace analog Monitor with SQL Move the analog SQL dropdown into the status row in place of Monitor. DMR Monitor remains available. 1.18.43 — Quick FM squelch dropdown Tap SQL on ANALOG FM to select a supported CJ1 squelch level 0–9. Applies to the current tuning; use Save channel to retain in memory. Blocked during PTT or scanning. 1.18.42 — High power label Display 5W instead of High power on radio and analog APRS pages. 1.18.41 — ANTENNA CALCULATOR Add main-menu antenna calculator with wavelength, half-wave dipole and quarter-wave vertical starting dimensions in meters and feet. 1.18.40 — Matrix-inspired visual theme Black and deep-green surfaces, luminous green accents, pale green text and monospace typography. Dark system dialogs and controls; RX/TX status colors retained. 1.18.39 — Uppercase main menu All main menu navigation labels, including EXIT, now display in uppercase. 1.18.38 — Uppercase Digital dropdown All DMR dropdown labels now display in uppercase. 1.18.37 — Alphabetize globe dropdown Order: BRANDMEISTER, D-STAR, M17, P25, YSF / SYSTEM FUSION. 1.18.36 — Capitalize internet mode labels Display BRANDMEISTER and YSF / SYSTEM FUSION in the dropdown and page headings. 1.18.35 — Alphabetize analog menu Order: ANALOG FM, APRS, PACKET RADIO, SSTV, WINLINK. 1.18.34 — ANALOG FM label Rename the FM entry in the analog dropdown to ANALOG FM. 1.18.33 — WINLINK label Capitalize the analog menu entry and page heading as WINLINK. 1.18.32 — PACKET RADIO label Rename the analog packet menu entry and page heading to PACKET RADIO. 1.18.31 — Move APRS to the analog dropdown Removed APRS from the main menu and placed it in the analog dropdown. 1.18.30 — Move Winlink to the analog dropdown Removed the main-menu Winlink entry and added it alongside FM, SSTV, and Packet Terminal. 1.18.29 — Menu cleanup Remove Radio from the main menu; move DMR contacts to the alphabetized DMR dropdown. 1.18.28 — Change Android package to com.ke5eua.cj1radioham New application identity; installed separately from the previous package. 1.18.27 — Rename app to CJ1 Radio Command Updated launcher label, menu title, foreground notification, and default APRS/D-STAR text. Existing account and radio settings are retained. 1.18.26 — Header dividers - Added white vertical dividers between the analog radio and DMR dropdowns, and between DMR and the globe. 1.18.25 — White internet globe - Replaced the colored globe emoji with a white vector globe in the top bar. 1.18.24 — Header appearance - Removed the gold selected-mode background. Header dropdown icons and arrows stay white on black in every mode. 1.18.23 — Direct analog menu - Removed the sine-wave submenu. FM, SSTV and Packet Terminal are directly under the transceiver icon. 1.18.22 — Top-level DMR menu - Moved the DMR logo dropdown from inside Hardware RF into the top bar between the transceiver and globe. DMR, DMR APRS, DMR Call Alert and DMR SMS are directly inside it. - Adjusted icon widths to fit the phone and retained selected-state highlighting. 1.18.21 — Stylized analog wave - Reworked the Analog sine-wave logo with a bold silhouette, tighter curves and sharp angled terminals. Menu sizing is retained. 1.18.20 — Replacement DMR logo - Replaced the DMR menu artwork with the supplied black DMR/wedge logo, with a transparent background and compact menu sizing. 1.18.19 — Supplied DMR logo - Replaced the DMR menu badge with the supplied DMR logo, with its white background removed. Displayed at 64 × 32 dp with original colors. 1.18.18 — DMR menu badge - Replaced the digital radio menu icon with a DMR badge. 1.18.17 — Sine wave fit - Reduced the sine-wave artwork height slightly to prevent clipping in the Analog menu row. 1.18.16 — Analog and digital menu icons - Replaced the small sine character with a larger, thicker vector sine wave. - Replaced the square-wave text with a vector digital handheld radio icon showing binary digits and radio waves. Accessible Analog/Digital descriptions are retained. 1.18.15 — Digital menu symbol - Replaced the Digital submenu text with a square-wave symbol, retaining its accessible Digital radio description. 1.18.14 — Analog menu symbol - Replaced the Analog submenu text with a sine-wave symbol, retaining its accessible Analog description. 1.18.13 — Hardware RF icon - Replaced Hardware RF text with an original vector transceiver/microphone icon and dropdown arrow. Retained the accessible Hardware RF menu label. 1.18.12 — RoIP globe - Replaced the RoIP header text with an internet globe, retaining the dropdown and accessible RoIP menu label. 1.18.11 — Zone scan dwell - Reduced zone scan on-channel dwell from 1 second to 750 ms. Carrier hold and clear-channel resume remain unchanged. 1.18.10 — Scan button divider - Added a centered vertical divider between CTCSS SCAN and ZONE SCAN. 1.18.9 — Scan button labels - Renamed FM scan buttons to CTCSS SCAN and ZONE SCAN; active zone scan shows STOP SCAN. 1.18.8 — FM zone scan - Added Scan/Stop scan beside CTCSS scan on the FM page. Scans saved FM channels in the current zone; digital memories are skipped. - One-second dwell starts after each channel tune. Hardware receive events and calibrated RSSI carrier detection hold the active channel; scanning resumes after the carrier clears. - Runs in the foreground radio service, including while the screen is off. PTT, knob changes, leaving the FM page, CTCSS scan or radio failure cancel scanning. Stopping keeps the current channel. - Smart APRS beacons defer during scanning. Saved channel tones/settings are not modified. 1.18.7 — FM channel label - Replaced the FM repeater/simplex text below the frequency with the current channel name. 1.18.6 — FM zone label - FM radio page now shows only the zone name in the zone selector, matching DMR. 1.18.5 — DMR zone label - DMR radio page now shows only the zone name in the zone selector, without appending the channel name. FM layout is unchanged. 1.18.4 — DMR settings - Added Settings → DMR Settings with editable hardware DMR ID (1–16776415). The saved ID applies across RF DMR voice, SMS and call alerts and survives channel changes. - Connected digital channels are reapplied with the new ID when idle, preserving monitor state. Busy sessions reject changes. BrandMeister account ID remains independently configured. 1.18.3 — D-STAR settings location - Moved the D-STAR configuration form into Settings → D-STAR, directly below BrandMeister. Removed the settings button from the RoIP D-STAR page. Existing profile values are preserved. 1.18.2 — Main menu order - Placed Diagnostics and Settings after the alphabetized feature entries, immediately above Exit: Diagnostics, Settings, Exit. 1.18.1 — D-STAR DPlus / REF - Added DPlus reflector connection, callsign registration lookup, RW/receive-only login modes, keepalive/reconnect, unlink, CRC-protected DSVT headers, voice, slow data and end-of-call frames. Receive-only login blocks PTT. - Shared D-STAR V0 audio/PTT/volume/lockout/Last Heard with DCS. - Configured the requested first test target: REF048 B at ref048.dstargateway.org, UDP 20001. No automatic voice transmission. - Local simulator tests cover RW/RO/refused login, stream validation, header CRC, sequence gaps and call end. DCS regression also passed. 1.18.0 — D-STAR DCS voice - Added DCS settings and manual connect/disconnect under RoIP → D-STAR: callsign, reflector, hostname, UDP port (30051), module, and 20-character short text. DPlus/REF remains a later step. - DCS link/ACK/NAK, keepalives, reconnect, unlink, validated voice frames and slow data; bounded 60 ms receive jitter buffer; V0 software codec using the existing recovered Radio APK codec. - Physical PTT, media-volume knob, talk-permit chirp, busy lockout/tone, RX/TX status-bar colors, and separate persisted callsign Last Heard. No automatic voice transmission or RF keying; leaving the page disconnects. - Local UDP simulator covers link, receive, transmit, unlink, refusal, packet validation, short text and reordering. Packaged V0 codec passed a 50-frame local test on the phone. Live reflector/audio interoperability still needs testing. 1.17.21 — Busy tone playback fix - Fixed the static AudioTrack state check: STATE_NO_STATIC_DATA is valid before loading the PCM buffer. Previously it rejected the player before writing any audio. - Validate the initialized state after loading and log successful playback for diagnosis. 1.17.20 — Busy-channel PTT tone - RF DMR and BrandMeister play a locally synthesized 300 Hz Motorola-style talk-prohibit bonk when a PTT press is rejected because a call is being received. - Tone uses media audio and stops when PTT is released or the radio/session closes. Duplicate key-down events do not restart it. No RF/network transmission is started by the tone. 1.17.19 — DMR busy-channel lockout - RF DMR blocks voice PTT while the module reports reception, with a second check immediately before transmit preparation. Analog voice behavior is unchanged. - BrandMeister blocks PTT during matching incoming calls, including headers, packet gaps and queued playback; automatic talkgroup activation waits for idle reception. - Busy PTT presses require release and a new press; no automatic key-up after the channel clears. Session status reports the busy condition. 1.17.18 — BrandMeister knob volume - The hardware knob adjusts Android media volume while the BrandMeister page is selected or its session is active, including in the background. RF channel selection remains unchanged outside BrandMeister. - Added current volume to the BrandMeister page. Each knob event raises or lowers one system volume step and shows the system volume indicator. 1.17.17 — RoIP placeholders - Added D-STAR, YSF / System Fusion, P25, and M17 placeholder pages to RoIP alongside BrandMeister. - Placeholder navigation keeps RoIP selected without changing the saved RF channel. Leaving BrandMeister still disconnects its session. 1.17.16 — SSTV frequency display - SSTV now displays the selected FM channel frequency, with separate RX/TX frequencies for split channels and a disconnected/non-FM indication. The label refreshes with channel changes. 1.17.15 — Digital menu order - Alphabetized Hardware RF → Digital: DMR, DMR APRS, DMR Call Alert, DMR SMS. 1.17.14 — Packet Terminal navigation - Moved Packet Terminal from the main menu back to Hardware RF → Analog. 1.17.13 — DMR Call Alert navigation - Moved Call Alert from the main menu to Hardware RF → Digital, labeled DMR Call Alert. Updated the page heading to match. 1.17.12 — Main menu cleanup - Removed Close menu, Last heard, Select zone, and Radio channel from the main menu. Remaining entries stay alphabetized with Exit last. 1.17.11 — Main menu organization - Moved analog APRS and Packet Terminal from Hardware RF → Analog into the main menu. - Alphabetized all main menu entries and shortcuts, keeping Exit last. 1.17.10 — Winlink navigation - Moved Winlink from Hardware RF → Analog to the main menu. 1.17.9 — Winlink CMS-Z TCP - At user request, connect to cms-z.winlink.org on plain TCP port 8772. Android DNS and B2F account challenge-response login are retained. - Connection selector and session stages identify TCP, with no TLS handshake attempted. 1.17.8 — Winlink Telnet endpoint - Telnet now resolves and connects to cms-z.winlink.org on TLS port 8773. TLS hostname verification uses cms-z.winlink.org; Android DNS is retained. 1.17.7 — Android DNS for Winlink - Resolve cms.winlink.org with Android InetAddress instead of the standalone Go resolver, which attempted unavailable localhost DNS on the phone. - Pass validated numeric addresses privately to the native helper; try multiple results within a bounded connection timeout. TLS still verifies cms.winlink.org on port 8773. - Session log reports the Android DNS stage and lookup errors. 1.17.6 — Secure Winlink Telnet - Internet sessions now connect with TLS to cms.winlink.org:8773, verifying system-trusted certificates and the server hostname (TLS 1.2 minimum). Android Conscrypt root updates are included. - CMS access login uses CMSTelnet; personal account authentication remains the B2F challenge-response exchange. Prompt handling accepts CR or LF. - Session log distinguishes connection, TLS verification, CMS login, and B2F negotiation. Packet RF settings are retained. - Local tests cover TLS bidirectional B2F mail/attachments, trusted certificate acceptance, wrong-host/untrusted certificate rejection, and CR/LF login handling. 1.17.5 — Winlink Telnet endpoint - Telnet server changed to cms.winlink.org on port 8772. 1.17.4 — Winlink Telnet endpoint - Telnet server changed to server.winlink.org on port 8772. 1.17.3 — Winlink Telnet endpoint - Telnet server changed to cms-z.winlink.org on port 8772. 1.17.2 — Winlink Telnet endpoint - Restored Telnet server to cms.winlink.org on port 8772. 1.17.1 — Winlink Telnet endpoint - Telnet now connects to cms-z.winlink.org on port 8772. 1.17.0 — Winlink Telnet - Winlink connection selector offers Packet hardware RF or Telnet Internet. Both use the same account, encrypted saved password, mailbox, attachments and queued mail. - Telnet connects to cms-z.winlink.org:8772, performs CMS login and B2F secure account authentication without requiring the hardware radio. Exchanges start only when Send / Receive is pressed. - Stop terminates the connection. Connection/login timeouts and network failures are reported in the newest-first session log; unaccepted messages stay queued. - Local tests cover packet and Telnet bidirectional B2F mail/attachments, buffered login data and oversized prompt rejection. Live CMS exchange remains untested. 1.16.12 — Winlink label - Renamed Winlink Packet to Winlink in the Analog menu. 1.16.11 — Packet receive polling - Packet audio thread checks for transmit completion every 1 ms instead of 2 ms. 1.16.10 — Newest session events first - Winlink session log displays newest entries at the top and discards the oldest entries when trimming history. 1.16.9 — Silent unsquelched packet reception - Packet Terminal and Winlink Packet receive at squelch 0 with their local AudioTrack speaker output muted. Raw UART PCM still reaches the packet decoder; system/media volume is not changed. - Speaker audio returns when the packet session ends and the saved radio channel is restored. - Temporary squelch 1/carrier check remains before transmit; squelch 0 is restored during the 250 ms key-up interval, before sending audio, for immediate post-TX reception. - Retains fast TX-to-RX handoff and burst buffering. Green in packet mode indicates decoded packets rather than open-squelch noise. 1.16.8 — Packet TX key-up delay - Packet Terminal and Winlink Packet wait until 250 ms after the PTT GPIO is asserted before sending modem audio. The acknowledgment wait counts toward that interval; cancellation remains responsive. Existing AX.25 preamble and fast TX-to-RX handoff remain intact. Other transmit modes are unchanged. 1.16.7 — Packet squelch - Packet Terminal and Winlink Packet receive squelch reduced to 1. APRS remains at 3 and saved voice-channel squelch is unchanged. Fast packet turnaround and carrier sensing retained. 1.16.6 — Closed-squelch packet receive with fast handoff - Removed open-squelch packet RX and all transmit-path squelch reopening commands. Packet/Winlink stays at squelch 3, RX/TX tones off, monitor off. - Keeps receive enabled at PTT GPIO release before the module stop acknowledgment, the 2 ms packet audio poll, no post-TX UART flush, and the bounded 10 ms final-frame drain. - Keeps the burst-buffer fix that enabled the verified gateway reply. Restores ordinary carrier-based transmit eligibility and green receive indication with squelch closed. - Actual RF/squelch-opening turnaround remains determined by module firmware/hardware and the received signal. 1.16.5 — Mail validation after verified packet reception - Live v1.16.4 test decoded UA (control 0x73) from KE5EUA-10 to KE5EUA and entered B2F negotiation. This confirms hardware audio reception, AX.25 decoding and connection establishment after the burst-buffer fix. - The subsequent exchange failure was "invalid queued message: Empty body", rather than lack of reception. - Composer now requires a nonempty subject/body before queuing, with the protocol's 128-character subject limit. Draft autosave remains permissive for unfinished work. - Defensive engine validation skips malformed queued mail instead of aborting the entire exchange. Such messages are preserved in Drafts with an editable error reason, allowing valid mail and inbox checks to continue. - Race-checked bidirectional B2F test now includes an invalid queued message alongside valid mail and verifies that incoming/outgoing valid mail still completes. Live authenticated mail exchange still awaits confirmation. 1.16.4 — Fix receive-burst decoder overflow - Confirmed the last exchange ended with "Packet audio gap · reconnect required" immediately after TX, despite receiving 5,600 PCM samples. The old queue admitted only 64 individual 10 ms audio jobs. - Replaced per-record task submission with a bounded eight-second PCM FIFO and one decoder drain task. Batches preserve sample order, absorb UART catch-up bursts, and avoid a spurious session abort when RX resumes. - Ignore decoded local-source TX echoes. Winlink now surfaces the actual packet-session failure instead of only a generic disconnected message. - Verified seven-second burst buffering, source-buffer isolation, FIFO/bounds/reuse, and the complete UART -> burst FIFO -> modem -> AX.25 reply pipeline. Live gateway test remains to be repeated. 1.16.3 — Faster packet TX-to-RX handoff - Opens packet RX squelch during transmit setup, so no squelch-setting round trip is needed after release. - Enables UART receive immediately after PTT GPIO release, before waiting for the module's PTT-stop acknowledgment. Packet-mode audio thread polls at 2 ms while TX is active; ordinary voice timing stays unchanged. - Preserves the last PCM frame with a bounded final drain (up to 10 ms), keeps the no-flush packet receive path, and removes redundant successful-path squelch reopening. - Clear-channel sensing before transmit remains enabled. Actual RF turnaround still depends on module hardware; live reply capture remains to be verified. 1.16.2 — Packet reply receive recovery - Packet/Winlink RX is unsquelched between transmissions, with RX/TX tones still off. Before sending, squelch 3 and a bounded clear-channel check remain in effect. - Packet PCM transmit enables receive before timeout-cleanup commands, reopens squelch, and preserves input UART bytes instead of flushing away a fast reply. Ordinary voice/SSTV/APRS transmit paths retain their existing default behavior. - Incoming packet audio is no longer discarded merely because the packet send task is doing clear-channel checks or cleanup; the hardware TX flag still excludes actual local transmit audio. - Open-squelch noise does not trigger the green status bar; CRC-valid packets do. UART byte/discard counters are available in service diagnostics for the next RF test. - UART-framing through raw PCM, Bell 202 demodulation and AX.25 reply decode passed a new pipeline test. Live receive recovery remains to be confirmed against KE5EUA-10. 1.16.1 — Packet receive indication - Holds green status indication for 500 ms after a receive-start event, making brief bursts visible between the 100 ms UI updates. - CRC-valid decoded AX.25 frames also trigger receive indication, covering a missed module carrier-start notification. Transmit still takes priority over green; silent listening is black. - Device trace during the reported exchange showed Connecting, zero packet audio samples and zero decoded packets; a gateway reply has not yet been confirmed. Indicator updates do not imply a successful link or fabricate receive traffic. 1.16.0 — Winlink Packet client (development) - Hardware RF > Analog > Winlink Packet: Inbox, Drafts with autosave, Outbox, Sent and Trash; compose, reply, forward, queue, attachments, message export, and restore from Trash. - RMS defaults: KE5EUA-10 / 145.0100 MHz, no digipeater path. Account and encrypted Winlink password are entered on the phone. Native helper receives the password only through a private pipe, never argv, logs or source exports. - Integrated the MIT-licensed wl2k-go B2F/LZHUF engine (commit efde6fbcb7bc8d6519fd8018ec544c793d4ef48d); handles secure login challenge response, proposals, binary compression/transfer and recipient addressing. Third-party license notices are included in the APK/source. - Added binary-safe AX.25 delivery, acknowledgment-based helper backpressure and link-reset cancellation; the existing packet session owns RF/background operation. Smart Beaconing waits while a mail exchange uses the RF module. - Received mail is saved atomically before B2F acknowledges it. Outbox messages move to Sent only after gateway acceptance/already-received confirmation. Deferred or interrupted messages remain queued; each retains its MID for duplicate protection. - Outgoing attachments: up to four files, 128 KB each. Incoming proposals over 2 MB are deferred. Native helper supports Android arm64 and is reproducible with winlink-engine/build.py (Go compiler required for native rebuild). - Validation: upstream B2F/secure-login/LZHUF tests; race-checked bidirectional local exchange with Unicode and binary attachments; Java regression/binary-packet tests; native helper self-test in the installed app sandbox. No live gateway session or email was initiated for this feature. Live RMS/RF interoperability remains unverified following the earlier Packet Terminal no-reply test. - This adds Winlink mail over 1200-baud AX.25 Packet, not VARA/ARDOP/PACTOR, an RMS server, or Winlink Express forms/catalog parity. 1.15.0 — Connected Packet Terminal (development) - Hardware RF > Analog > Packet Terminal: frequency, local callsign/SSID, BBS/node callsign/SSID, optional digipeater path, Connect/Disconnect, scrolling terminal and line/command entry. - AX.25 v2 modulo-8 connected links over 1200-baud Bell 202. Implements SABM/UA, numbered I frames with PID F0, RR/RNR/REJ, duplicate suppression, sequence wraparound, bounded T1 retries, idle polls, and DISC/UA/DM. Uses a conservative one-frame outbound window and 128-byte segments; Enter sends CR-terminated lines. - Packet sessions are owned by the foreground service and remain active across page navigation/backgrounding. Session frequency stays reserved until disconnect; smart beaconing waits and resumes afterward. Physical PTT and competing modes are blocked while a packet session is active. - Restores the saved radio channel after disconnect/error. No automatic connection or transmission when opening the page. - Generic AX.25 framing added beneath the shared APRS decoder; APRS still accepts only valid APRS UI frames. - Protocol reference: https://files.tapr.org/tech_docs/AX25/AX25.2.2.pdf - Simulated connected-link/modem and regression tests passed. Live RF interoperability with a real BBS/node remains unverified. Modulo-128/SABME, NET/ROM routing and binary/file transfer are not implemented. 1.14.2 — Radio activity status bar - Android time/battery status bar turns green for receive, red for transmit, and black while idle/disconnected. White system icons remain legible. - Hardware RF and decoded BrandMeister voice activity are included; transmit takes priority. Checks every 100 ms while the app is visible, stopping UI polling in the background. - APRS preparation/clear-channel waits do not appear as transmit just because the radio is reserved. 1.14.1 — Background Smart Beaconing alongside voice - Starting Smart Beaconing releases the APRS page's receive hold and restores the selected voice channel. GPS and the frozen APRS frequency/profile continue in the foreground service across navigation and screen-off use. - Beacons wait for voice receive/transmit, SMS/call alerts, scans, SSTV, channel changes and RoIP activity to finish, then allow a 1.5-second quiet period before visiting the APRS frequency. - Uses high power, tests carrier on its own frequency, and returns to the current saved FM/DMR channel with monitor settings restored. Busy-channel checks are bounded to 3 seconds away from the voice channel, then retried later. - Physical PTT cancels an APRS visit and resumes voice once restored if the button is still held; releasing before restoration cancels that pending voice request. - APRS transmission eligibility is independent of the voice channel's RX-only flag. Voice RX-only settings remain enforced when restored. - Single RF module: reception on the voice channel pauses during the APRS frequency check/packet. Traffic starting while off-channel cannot be detected until restoration. - Stop Smart Beaconing, Disconnect and Exit retain their existing stop behavior. Beaconing starts stopped after app/service restart. - Host timing/priority and existing tests passed; live FM/DMR/background coexistence test pending. 1.14.0 — APRS receive and Last Heard - Replaced explanatory APRS text with scrolling, persistent 100-packet Last Heard: timestamp, source callsign/SSID, receive frequency, coordinates, and comment. - Streaming 8 kHz Bell 202 / AX.25 receiver with HDLC bit unstuffing and CRC validation. Independent symbol-phase and clock-rate candidates; duplicate decoder results suppressed. - Supports uncompressed and timestamped positions, compressed base-91, Mic-E, objects/items and third-party encapsulation. Non-position and unsupported position packets remain visible with position unavailable; no invented coordinates. - APRS dropdown now selects the receive frequency while the page is in use, including screen-off background reception. Returning to other pages restores the saved radio channel. Beacon transmit restores APRS receive afterward. - Receive-only APRS listening uses squelch 3 and does not enable microphone PTT; Smart Beaconing retains its separate Start/Stop control and high-power packet transmission. - Protocol reference: https://www.aprs.org/doc/APRS101.PDF - Software audio/packet tests passed; live over-the-air APRS decoding remains to be confirmed. 1.13.5 — APRS controls - Removed Send GPS position and Stop transmit buttons. Start / Stop Smart Beaconing remains the APRS transmit control. 1.13.4 — Analog APRS Smart Beaconing - Start / Stop Smart Beaconing on Hardware RF > Analog > APRS. - Foreground-service GPS every 5 seconds, including while the screen is off. - 30-minute stationary rate below 5 mph; proportional moving rate down to 2 minutes at 70 mph. Turn beacons use 30 degrees + 255/speed(mph), minimum 30 seconds apart. - Waits for a fresh accurate GPS fix and idle radio; busy/failed packets retry after at least 60 seconds. Successful packets alone update timing. - High power on both APRS frequencies; restores the previous channel after each beacon. - Stop button and notification Stop beaconing action; disconnect/exit stop beaconing. Starts stopped after restart. - Validation: full host test suite passed, including 13 Smart Beaconing policy checks; installed and verified stopped on device. Moving RF test pending. CJ1 Field Radio 1.13.0 — Analog APRS position beacon - Hardware RF → Analog → APRS: GPS position, callsign, SSID, comment, editable path and exact frequency choices 144.3900 / 145.8250 MHz. - Manual one-shot Send GPS position, no automatic RF beacons or internet position uploads. Fresh GPS required (at most 2 minutes old, accuracy 100 m or better). - AX.25 UI frame, CRC-X25 FCS, HDLC bit stuffing, NRZI and phase-continuous Bell 202 1200-baud AFSK at 8 kHz. Generic APRS destination and portable-person symbol. Defaults: WIDE1-1,WIDE2-1 on 144.3900 and ARISS on 145.8250; paths editable and saved independently. - Temporarily retune hardware for the beacon with tones/monitor off, check channel signal strength before keying, restore previous channel and monitor afterward. Original channel RX-only, busy and connection guards apply. Stop transmit / physical PTT cancel an active packet. - This iteration implements sending GPS position beacons, not a received-packet decoder or APRS messaging. Radio transmission and end-to-end network reception remain unverified. - Software tests: CRC published vector, frame structure, coordinates/rounding, invalid inputs, requested frequency limits and independent Bell 202 audio → NRZI → HDLC recovery of the exact packet. CJ1 Field Radio 1.12.0 — SSTV development - Automatic SSTV reception on connected FM channels, including background operation, using raw 8 kHz mono radio audio before speaker filtering. Bounded decoder queue resets after an audio gap. - Robot36 decoder from the user's previous source; upstream xdsopl/robot36 copyright retained, 0BSD license included in source and app raw resources. - Latest received image preview, private persistence for the last completed image, and Save received image through Android's document picker as PNG. - Choose image through Android document picker. Transmit modes: Robot36, Martin M1, Scottie S1. Image resampling to mode dimensions and waveform encoding run off the UI thread. - Dedicated PCM transmitter (no microphone/chirp mixed into SSTV). Mode-sized temporary TOT, original timeout restoration, Stop transmit, PTT cancellation, RX-only/DMR/busy guards and GPIO release through the existing TX lifecycle. - Software encoder/decoder round trips verified for all three modes: full-height color-bar images decoded correctly. Raw audio hook tests verify preservation of silence timing and pre-filter PCM. Device page, connected automatic reception state and image picker launch checked. Actual RF interoperability and saving a live received image remain to be tested with another SSTV station. - Stable 1.10.15 archive remains untouched. CJ1 Field Radio 1.11.1 — Propagation GPS - Propagation always uses GPS instead of manual coordinates. Old manual location settings are cleared on upgrade. - Request precise location permission if needed; acquire GPS only while the page is visible and stop updates when leaving. Do not request weather with missing/stale (>2 minutes), invalid or imprecise (>1 km) fixes. - GPS coordinates go to Open-Meteo for local weather; global HamQSL and NOAA data do not depend on location. Cached weather stays labelled with its last GPS location and timestamps. CJ1 Field Radio 1.11.0 — Propagation development - Added Propagation in the main menu, following the Radio APK section layout: solar cards, saved bands, HF day/night table, regional VHF conditions, D-RAP map, and optional local weather. - Recovered Radio /api/v1/propagation requires an account token (unauthenticated request returned HTTP 401). This implementation uses public HamQSL/N0NBH XML, NOAA SWPC D-RAP imagery and optional Open-Meteo weather instead; it does not reuse Radio credentials. - Refresh on demand and every five minutes while visible; retain cached data with timestamps after failures. Network response limits and timeouts apply. - Local weather uses manually entered coordinates with provider disclosure. No automatic GPS access or location transmission. Model weather is labelled with model time. Ducting forecasts and the Radio account-backed alert service are not reproduced. - Live feed parsing and device display verified; 1,299 host checks passed. Existing stable 1.10.15 archive remains unchanged. CJ1 Field Radio 1.10.15 — Stable baseline Released October 20, 2026 · versionCode 104 Package: com.ke5eua.cj1fieldradio - App name and Android package identifier updated. The new package uses its own app data and permissions; the user has completed setup after uninstalling the former package. - Memory limits match the standalone JSON editor: 32 channels per zone, up to 512 zones, 512 channels total. Import, validation, editing and oversized-zone splitting use these limits. - Analog CTCSS scanning: 1-second wait per tone and 600 ms confirmation hold. User verified tone detection and automatic pause on carrier loss/resume at the same tone. Carrier detection uses raw RSSI hysteresis (48 to resume, 40 to remain active); weak-signal behavior has not been characterized. - Found CTCSS tones may be applied to receive, transmit, or both; saving to memory remains explicit. - Exit at the bottom of the menu disconnects the hardware and network, closes the service, removes the task, and ends the process after cleanup. Device checks verified service/process/task shutdown. - Opening the app after Exit restores the radio connection. Normal manual Disconnect remains disconnected. Background connection and physical PTT with the screen off were reverified by the user before the package change. - Earlier verified RF FM/DMR voice, private calling, Motorola SMS, Call Alert, BrandMeister voice, and Last Heard remain part of the baseline. - Hardware DMR APRS remains experimental: private SMS destination 310999, with end-to-end APRS delivery unverified. This checkpoint does not claim that function is production-ready. Archive contents: signed APK, matching source/build scripts, automated test results, build metadata and SHA256 checksums. Earlier stable releases remain untouched. CJ1 Radio Face 1.10.2 - Settings: saved Keep screen on toggle, off by default. Applies FLAG_KEEP_SCREEN_ON to app window; background apps and manual screen locking retain normal behavior. CJ1 Radio Face 1.10.1 - Set hardware DMR APRS private destination to 310999 per user request, including existing saved destination via one-time migration. - Transport remains Motorola SMS; APRS network delivery to this destination is unverified. CJ1 Radio Face 1.10.0 — Hardware DMR APRS development versionCode 89 - Phone GPS fixes and manual Send position through Motorola private RF DMR SMS. - BrandMeister APRS LAT LONG command to 262993 (configurable service ID), per BM262 service documentation; no dedicated GPS command in CJ1 API. - Get precise-location permission on demand; GPS runs only on visible APRS page. Reject stale (>120 seconds), invalid or inaccurate (>100 m) fixes. - Test DMR SMS sends echo without location. No automatic beacons or transmissions. - Existing SMS busy/RX-only safeguards, timeout and original channel restoration apply. Module acknowledgement does not prove APRS-IS delivery. - Position formatting checks passed; live GPS/network tests pending. CJ1 Radio Face 1.9.23 - Remove Return to radio buttons from all pages; use Hardware RF / RoIP navigation. CJ1 Radio Face 1.9.10 - Navigating away from RoIP BrandMeister disconnects the network session and stops network audio/microphone. Returning requires explicit Connect. Opening a dropdown alone or backgrounding the app does not navigate away. CJ1 Radio Face 1.9.7 — Activate BrandMeister talkgroups versionCode 72 - Send a brief encoded-silence group join after connecting or changing public destination; refresh every five minutes. Private calls never auto-dial. - Join work uses IP only and does not open the microphone or key RF. - On-phone test: TG 91 join logged, master connected, 20 incoming DMR packets / 50 decoded RX voice frames observed immediately afterward. User confirmed audible TG 91 traffic and Last Heard callers. CJ1 Radio Face 1.9.6 — BrandMeister Last Heard versionCode 71 - Match DMR compact scrolling history, timestamps, saved contacts and RadioID callsign/name/location lookup. - Persist last 200 network calls separately from RF history, one row per stream; end on terminator or idle timeout. - Tap LAST HEARD for full network history and call details; show BrandMeister rather than a fictitious RF frequency. - Build passed, layout inspected on phone, and user confirmed the 9990 echo call appears once with timestamp and caller identity. CJ1 Radio Face 1.9.4 — BrandMeister voice development versionCode 69 - Recovered software DMR codec and packet helpers from user-supplied Radio_26.10.107.apk, isolated DexClassLoader; original optimized metadata object has no constructor and uses zero-initialized allocation. - On-phone codec encode/decode, LC header/terminator, embedded LC and six voice-burst layouts checked before enabling voice. - BrandMeister receive audio to media speaker, private calls addressed to local ID and selected public TG. - Physical PTT on RoIP captures microphone and sends DMR voice over IP, with local chirp, 60-second timeout and immediate release. RF PTT retained on FM/DMR. - User verified clear BrandMeister private 9990 echo playback after physical PTT transmit and release. Background IP PTT and public talkgroups remain unverified. CJ1 Radio Face 1.8.3 — BrandMeister destination versionCode 64 - Tap destination beneath master to choose Public talkgroup or Private call and numeric ID, or choose a saved group/private contact. - Persist destination separately from RF channel and master settings; keep login session when changing it. - Selection prepares IP destination only; does not activate network talkgroups before IP voice/PTT is implemented. CJ1 Radio Face 1.8.2 — BrandMeister live connection versionCode 63 - Live master accepted authentication and station registration; keepalive reply received. - Direct-mode Homebrew classification MMDVM_DMO and numeric software date resolve station-registration rejection. Description identifies CJ1 RoIP client. Nominal station metadata 438.800 MHz does not retune or transmit RF. - Network login/keepalive implemented; voice codec and IP PTT remain unavailable. CJ1 Radio Face 1.8.0 — BrandMeister connection versionCode 61 - RoIP > BrandMeister Connect/Disconnect uses saved US master, callsign, DMR ID, ESSID and encrypted hotspot password. - Homebrew UDP login: RPTL, salted SHA-256 RPTK, station RPTC; Connected only after configuration acknowledgement. - 5-second keepalives, 30-second health deadline, bounded login retries and reconnect backoff. Authentication rejection stops retries. - Session belongs to foreground radio service; disconnecting that service also closes BrandMeister. Settings changes apply on next connection. - Connection/packet diagnostics only; AMBE encoding/decoding and network PTT are not yet implemented. CJ1 Radio Face 1.7.4 - IP tab opens a service dropdown with BrandMeister; selecting it opens the existing IP view. - BrandMeister configuration remains under Settings. CJ1 Radio Face 1.7.3 - Fix IP tab selection background: selected IP stays visible with gold highlight; FM/DMR are unselected while IP is active. CJ1 Radio Face 1.7.2 - BrandMeister configuration is a dedicated subpage under Settings, with Back to Settings navigation. IP shortcut opens that subpage. CJ1 Radio Face 1.7.1 — BrandMeister settings location versionCode 54 - Move BrandMeister configuration form to Settings. IP tab shows disconnected network status and a link to Settings. - Existing saved profile and encrypted password retained. CJ1 Radio Face 1.7.0 — BrandMeister IP setup versionCode 53 - IP tab opens BrandMeister setup with US master dropdown: 3102 Dallas, 3103 San Jose, 3104 Chicago (BrandMeister USA documentation). - Separate callsign, DMR ID, ESSID and hotspot password settings; password encrypted with Android Keystore AES-GCM and excluded from memory export. - Physical RF PTT blocked while IP is selected; select FM/DMR to resume RF PTT. - Setup only: network login and AMBE voice path remain under development. No network transmission implemented in this build. CJ1 Radio Face 1.6.2 — Physical PTT chirp versionCode 52 - Generated Motorola-style three-note local talk-permit cue after successful PTT key command, foreground and background. - Mute outgoing microphone PCM during the 210ms cue plus 60ms tail to avoid transmitting the local chirp; TX release remains immediate. - No cue for blocked PTT, SMS or Call Alert. Sound follows media volume. - User confirmed PTT chirp and normal voice transmit/release work in the requested foreground/background test. CJ1 Radio Face 1.6.1 — Restore verified Call Alert baseline versionCode 51 - Restore 1.5.4 source and behavior; remove Radio Check menu, contact actions and protocol handling. - Retain verified two-way Call Alert, popup and two-beep sound. - Higher version code permits installation over 1.6.0 without deleting app data. CJ1 Radio Face 1.5.4 — Call Alert resource playback fix versionCode 49 - Restore normal alert popup; remove grouping introduced in 1.5.3. - User verified incoming popup and two beeps together on 1.5.4; outgoing Call Alert previously verified with AnyTone 878. - Read bundled WAV through app resources and pass a file descriptor to MediaPlayer, avoiding failing URI playback. - Test alert sound button checks the same audio path without RF transmission; user confirmed audible playback on 1.5.4. CJ1 Radio Face 1.5.3 — Call Alert audio routing test versionCode 48 - Play selected Call Alert sound through radio media output; visual notification avoids duplicate system playback. - Respect notification permission, channel sound/importance, silent mode and DND. Stop on PTT/disconnect. - Audible result remains pending device test. CJ1 Radio Face 1.5.2 — Call Alert notification sound versionCode 47 - Incoming and outgoing Call Alert confirmed; user reported incoming notification silent. - Dedicated two-beep WAV on the call-alert notification channel, respecting system sound/DND and explicit original channel choices. - Audible result awaits device test. Stable 1.4.3 remains unchanged. CJ1 Radio Face 1.5.1 — Call Alert diagnostics versionCode 46 - 1.5.0 test: no UART reply to vendor/API-matching 0x28 within 2 seconds; destination was 3133624. - Extend Call Alert reply wait to 8 seconds; an unanswered optional command no longer marks the entire UART connection dead. Cleanup still cancels RF and restores the channel; failures of ordinary commands still trigger watchdog recovery. - User confirmed outgoing Call Alert works on 1.5.1 to AnyTone 878. Incoming Call Alert remains unverified. CJ1 Radio Face 1.5.0 — Call Alert development versionCode 45 - Call Alert menu page and private-contact actions use dedicated 0x28/function 2. - Incoming call alerts display sender ID and post a background notification. - Temporary private RF contact restored after TX end; bounded cancellation on no TX-end event. - Module acceptance does not confirm recipient alert. RF interoperability awaits user test. - Stable 1.4.3 preserved unchanged. CJ1 Radio Face 1.4.3 — Stable release versionCode 44 Stable baseline: private voice calling and complete Motorola/M-SMS private text delivery verified by user on CJ1 / AnyTone 878. Hytera, DMR Standard and group SMS remain experimental and unverified. - User received 1234567890YZ from AB1234567890YZ on 1.4.2. - Add UTF-16LE CR/LF before private Motorola text only; retain matched RF contact. - Other formats and group packets unchanged. User confirmed AB1234567890YZ arrives complete on AnyTone 878 in Motorola/M-SMS mode. CJ1 Radio Face 1.4.2 — Vendor-layout private SMS versionCode 43 - Private SMS returns to vendor/API layout: type + one LE destination + UTF-16LE text. - Group SMS retains its separate additional group field. - Keep temporary private RF contact alignment/restoration from1.3.7. - Full private voice calls confirmed by user; SMS end-to-end still under test. CJ1 Radio Face 1.4.1 — Private contacts in simplex selector versionCode 42 - Selector beneath frequency includes saved private and group contacts, labelled by type. - Add numeric IDs as Talkgroup or Private; choosing a saved contact sets its type. - Apply updates RF destination and call type; memory update remains explicit. - 369 host checks pass, including private payload/call-type checks. CJ1 Radio Face 1.4.0 — Quick simplex talkgroup selection versionCode 41 - Tap the talkgroup label beneath the frequency on DMR simplex channels. - Select a saved group contact or enter a numeric talkgroup ID. - Apply updates live group ID and group-call type; original memory stays unchanged. - Frequency, color code, separate slots, RX groups, power and other flags retained. - Block while PTT/SMS busy; save via Update current if desired. - 365 host checks pass, including8 new simplex override checks. CJ1 Radio Face 1.3.9 — Menu cleanup versionCode 40 - Removed Radio APK layout reference from the drawer footer. CJ1 Radio Face 1.3.8 — Private DMR contacts versionCode 39 - DMR contacts page has separate private contacts and talkgroups. - Add/edit/delete private names and IDs; private IDs excluded from monitor groups. - Contacts shortcut on SMS page; private contacts available in SMS recipient picker. - Existing group/all-call contacts, memories and channel assignments preserved. - 357 host checks passed, including15 new private-contact checks. CJ1 Radio Face 1.3.7 — SMS RF contact alignment test versionCode 38 - Temporarily program the SMS destination/contact type before sending. - Restore the captured channel/monitor payload after success, failure or timeout. - Saved memories are not changed. DMR Standard and message bytes unchanged. - Full-text reception on AnyTone remains unverified. CJ1 Radio Face 1.3.6 — DMR Standard SMS test versionCode 37 - Add DMR Standard alongside Motorola and Hytera in the composer. - DMR Standard selects module0x3A mode1 (Defined short message). - Selected by default for this test; outgoing history labels the chosen format. - Message layout unchanged; full-text interoperability still requires RF verification. CJ1 Radio Face 1.3.5 — Hytera SMS test profile versionCode 36 - Composer now offers Motorola and Hytera, with Hytera selected for the new test. - Hytera requests CJ1 0x3A mode2 (Compressed TCP/IP); brand mapping unverified. - Selection persists with drafts; outgoing history records the chosen profile. - Message byte layout is unchanged from1.3.4, isolating the module format setting. CJ1 Radio Face 1.3.4 — Restore SMS diagnostic baseline versionCode 35 - Restore1.3.1 packet layout that reached AnyTone with a corrupted first character. - Both CR/LF experiments failed; full outgoing SMS remains unverified. - Incoming SMS works; module success remains display-unverified. CJ1 Radio Face 1.3.3 — SMS addressing and text prefix test versionCode 34 - Retain both private ID fields; place Motorola CR/LF prefix after them. - Previous1.3.2 text-prefix replacement did not display at the AnyTone. - Outgoing full-text interoperability remains experimental pending device test. CJ1 Radio Face 1.3.2 — Motorola SMS text-prefix correction versionCode 33 - Replace private destination-as-prefix with UTF-16LE CR/LF before message text. - Keep documented group destination field separate from the Motorola text prefix. - Verify complete text at receiving radio; module acknowledgement is not an inbox receipt. CJ1 Radio Face 1.3.1 — Private SMS packet correction versionCode 32 - Confirmed private TX now includes the second destination ID before UTF-16LE text. - Module success is labelled radio acknowledged / display unverified, including old history. - Removed unconfirmed-private choice: API type2 conflicts with vendor all-call semantics. - Motorola/IP remains selected; AnyTone reply interoperability retest pending. CJ1 Radio Face 1.3.0 — DMR SMS development versionCode 31 - Added private/group SMS composer, drafts, conversations and incoming notification. - Motorola (M-SMS) uses the module IP transport; interoperability validation pending. - Saved local message history and explicit confirmed/failed/unknown outcomes. - SMS reserves RF during sending and redacts message payloads from hardware logs. CJ1 Radio Face 1.2.0 — SMS landing page versionCode 30 - Added SMS to the drawer menu. - Added current-channel context and an empty conversations page matching the radio theme. - SMS transport is not enabled in this version. CJ1 Radio Face 1.1.1 — Transparent launcher icon versionCode 29 - Removed the solid background from the launcher/round icon vector. CJ1 Radio Face 1.1.0 — Background connection watchdog versionCode 28 | 1.0.0 stable baseline retained unchanged - Sticky microphone/media foreground service plus partial wake lock. - Five-second RF/audio health watchdog and acknowledged control probes. - Automatic clean reconnect with 3–60-second capped retry backoff, restoring current channel and matching monitor state. Explicit Disconnect stops retries. - Physical PTT broadcasts remain service-owned while the UI is backgrounded. Backgrounded editor dialogs do not block PTT. Recovery cancels held PTT and requires release before a new press; no watchdog operation starts TX. - Pending connection/probe work is coalesced. Startup/tuning/probe stall limits and dead control/audio worker detection are included. - Settings offers background battery settings. Connected test phone is battery optimization exempt for screen-off RF/voice service. 293 automated checks pass. Device verification includes simulated radio module power loss with background reconnection/monitor restore, and Android sticky service recreation after termination of an idle diagnostic-build process (new PID, background=true, connected=true, microphone foreground capability retained). Intentional Disconnect stayed stopped across watchdog intervals and UI reopen. Final build is non-debuggable and retains the existing signing identity/data. Additional screen-off/physical-PTT results are recorded in background validation. Android user Force stop/Active apps Stop is respected: reopen the app afterward. After reboot, open the app to reconnect; this build does not attempt a boot-time microphone service. Android/vendor restrictions and microphone permission remain applicable; this watchdog is not a promise against power loss or kernel hangs. Previous release notes follow: CJ1 Radio Face 1.0.1 — RadioID location versionCode 27 | based on the preserved 1.0.0 stable baseline Adds city, state and country from targeted RadioID subscriber lookups to the compact history, full Last Heard list and call details. Cache schema 2 retains these fields offline. Existing name-only positive cache records refresh in the background without waiting 30 days; existing names remain available meanwhile. Missing fields are omitted without blank separators or fabricated location. 249 automated checks passed; live lookup integration also passed. Phone display confirmed city/state/country on existing history after the cache migration. No radio behavior, channel settings or saved history format changed. Previous baseline notes follow: CJ1 Radio Face 1.0.0 — Stable baseline 2026-10-19 | package com.ke5eua.radioface | versionCode 26 Frozen scope - Radio-inspired FM/DMR UI, Field Radio launcher/system/top-bar assets, black banner, no branded splash, connection menu under the radio icon. - Confirmed FM and DMR physical-PTT voice transmit/receive; immediate release and timeout protection; RX-only blocks transmit; no automatic TX during tests. - Current-zone knob selection; named memories, zones and Field Radio JSON I/O. - FM monitor toggle; DMR known-group monitor, selected-group filtering when off, saved group editor, received talkgroup ID reporting. - Scrolling/persisted Last Heard history with local timestamps and saved group names; RadioID callsign/name lookup and private offline cache. Stabilization Pending tuning work now uses an atomic counter, preventing overlapping main/ worker updates from prematurely permitting PTT. New tuning/monitor work is ignored during service shutdown. Version metadata comes from the manifest. Stable APK is non-debuggable and keeps the existing signing certificate so it updates the installed app without replacing its memories/history. Validation Automated codec/framing, memory/schema, knob selection, PTT/TX lifecycle, DMR monitor/filter/group edits, Last Heard/dedup/persistence and RadioID parser checks; compatibility with the user's 74-channel Field Radio codeplug. Phone validation includes install/update, cold launch, reconnect, retained memories/history/names, menu controls and hardware initialization. FM/DMR voice, knob and RadioID/history on-air behavior were confirmed by the user during the preceding development builds; no new RF transmit is initiated for this release. Exact final results and artifact checksums accompany the release. Known limits - Device/firmware validation is limited to CJ_1UV Android 14, arm64-v8a, DMR003N.UV4P.V012. No claim of universal Android/radio compatibility. - DMR monitor is a receive list of up to 32 known groups, not promiscuous mode. CC and receive slot still apply; module private/all-call rules still apply. - A firmware reply without received destination displays TG unknown. - RadioID requires connectivity for new names and is subject to API availability; cached names and numeric IDs remain usable offline. - IP/Repeaters pages are placeholders; advanced channel fields are retained through JSON but do not all have in-app editors. - The supplied signing tool uses the established development certificate. Preserve that signing identity for future updates; public-store distribution and migration to a private production key are outside this baseline. Future development Start from this source archive. Use versionCode >26, preserve the stable release folder, and write new changes in the active radio-layout project. Android blocks ordinary downgrade of versionCode; the archived APK/source are retained for recovery without recommending an uninstall that would erase private data.