Pocket25 Build 1.0.0+4 - Major Stability and Feature Updates


Overview

I'm excited to share the latest updates to Pocket25, my Android application for decoding APCO Project 25 (P25) trunked and conventional radio systems. Build 1.0.0+4 brings significant stability improvements, powerful new features, and a much smoother user experience. Over the past few days, I've been laser-focused on eliminating crashes, improving performance, and adding features that real users actually need.


🚀 Major New Features

Advanced Scan Mode

One of the biggest additions is the new Advanced Scan feature, which gives power users complete control over DSD-Neo's command-line options directly from the app. Instead of being limited to the UI's quick scan presets, you can now input full command strings like:

-i rtltcp:192.168.1.240:1234:771.18125M -fp -H key_here -4

This means you can:

  • Specify custom RTL-SDR or RTL_TCP configurations
  • Add encryption keys on the fly
  • Set custom decoder flags and modulation parameters
  • Use any DSD-Neo option without recompiling the app

The Advanced Scan screen includes helpful examples for RTL-SDR direct USB, RTL_TCP remote connections, and encryption key usage. This is a game-changer for advanced users who know exactly what parameters they need.

HackRF One Support

is currently in testing, it's not complete and I don't recommend you use it, yet.

Enhanced Radio Reference Import

The Radio Reference import feature got some major love:

  • Canada Support: Canadian users can now import systems from RadioReference.com
  • GPS-Based County Lookup: The app automatically detects your county using GPS coordinates
  • Improved Location Accuracy: Fixed the county detection algorithm to check ALL counties in your state instead of just sampling, dramatically improving accuracy
  • Auto-Scroll to Trunked Systems: When you select a county, the UI now automatically scrolls down to show available trunked systems

Scan Grid with Category Filtering

Added a new Scan Grid view that organizes talkgroups by category (Law Enforcement, Fire/EMS, Public Works, etc.) with visual filtering. The grid remembers mute states and makes it easy to see what's active at a glance.

Web Programmer Feature

Introduced a multi-page Web Programmer interface for advanced radio configuration directly from the app. This is still experimental but opens up interesting possibilities for system management.


🛠️ Critical Bug Fixes

ANR (Application Not Responding) Crash Fixes

The biggest stability work went into eliminating ANR crashes that were plaguing users:

  1. Site Switching Crash (FIXED): The app was freezing when switching between sites during GPS-based site hopping. The problem? Heavy database operations and distance calculations were running on the main UI thread, blocking user interactions.

    • Solution: Moved site loading to a background thread and distance calculations to a compute isolate with a custom haversine function
    • Result: Butter-smooth site switching even with 200+ sites loaded
  2. Talkgroup Mute Crash (FIXED): Muting talkgroups during an active transmission was causing the app to hang.

    • Solution: Optimized the native-level audio filtering to handle mute state changes asynchronously
  3. Native USB RTL-SDR Crash (FIXED): Switching control channels with a native USB RTL-SDR dongle would crash the app.

    • Solution: Proper cleanup and reinitialization of the RTL-SDR device during channel changes
  4. Advanced Scan Input Device Bug (FIXED): When using Advanced Scan with custom -i device parameters, the app would ignore the setting and default to 'pulse' audio.

    • Solution: Re-apply custom arguments in nativeStart() to prevent settings from being overwritten

UTF-8 Crash Fix

Fixed a crash caused by invalid UTF-8 characters in DSD decoder output. The native C++ code now properly handles encoding issues before passing strings to Flutter.

Talkgroup Name Lookup Fix

Corrected database field mapping for talkgroup name lookups, ensuring the right names display during monitoring.

Scan Grid State Persistence

Mute states in the scan grid now persist correctly between sessions and don't reset unexpectedly.


⚡ Performance Improvements

Stay on Control Channel for Muted Talkgroups

When a talkgroup is muted, the scanner now stays on the control channel instead of following the voice channel. This dramatically reduces unnecessary frequency hopping and improves overall performance.

DMR Audio Improvements

Enhanced DMR audio output quality through better buffer management and frame timing.

P25 Phase 2 Partial Improvement

Implemented frame-by-frame audio output for P25 Phase 2 systems. While Phase 2 audio is still choppy (upstream DSD-Neo limitation), it's noticeably better than before. Full details are documented in P25_PHASE2_AUDIO_ISSUE.md.


🎨 UI/UX Enhancements

  • Overhauled Scanner Screen: Redesigned with scaled status display and better information density
  • Network Screen: Added comprehensive display of patches, group attachments, and affiliations
  • Signal Metrics: State-based signal quality indicators and improved adjacent sites display
  • Custom App Icon: Pocket25 now has its own distinctive icon
  • Fixed Icon Cropping: Disabled adaptive icons to prevent the icon from being cut off on some launchers
  • DSD Log Screen: Removed the "jump to bottom" button (auto-scroll works better)

📦 Development Infrastructure

  • Automatic Version Management: Build numbers now auto-increment, making release tracking easier
  • Wakelock: App keeps the screen on while running to prevent interruptions during monitoring

🔜 What's Next?

I'm actively looking for sample recordings of non-P25 protocols (DMR, NXDN, D-STAR, YSF, dPMR) to improve multi-protocol UI support. If you have recordings or systems to test, please reach out!

Upcoming features on my radar:

  • Better P25 Phase 2 audio
  • Enhanced talkgroup database management
  • Export/import of system configurations

📥 Download

You can download the latest APK from SarahsForge.dev/products/Pocket25

Source code is available on GitHub under GPL v3.


🙏 Acknowledgments

Pocket25 is built on the amazing DSD-Neo decoder engine by @arancormonk. Huge thanks to the open-source digital radio community for their support and feedback!

If you're using Pocket25, I'd love to hear about your experience. Feel free to open issues on GitHub or reach out with feedback.

73,
SarahRose