You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bidirectional RFCOMM communication with directional control commands
Data Logging
Auto-save received data to local file
Floating Window
Receive data display in draggable system overlay
Network Communication
Feature
Description
UDP Server
Start a UDP multicast server to receive data
UDP Client
Start a UDP multicast client to send data
TCP Server
Start a TCP server to receive data
KCP
KCP (Reliable UDP) protocol for low-latency transmission
Pub/Sub
Subscribe & Publish messages via floating dialog windows; async connection with real-time status feedback
File Transfer
Custom binary protocol with chunked transfer (64KB/chunk) and progress callback
HTTP Server
Embedded HTTP server (filesystem & SAF) with sortable/responsive HTML directory listing, in-page image viewer, and streaming transfers tuned for Wi-Fi LAN throughput
Message System (C++ β Java)
The app uses a thread-safe message queue (Message.h) to bridge C++ native code with Java UI. Messages are dispatched via the MASSAGER enum:
Type
Direction
Description
MESSAGE
C++ β Java
General toast notifications
TOAST
C++ β Java
Status text update (txt_status)
MSG_HINT
C++ β Java
Hint text update (txt_hint)
SUBSCRIBER
C++ β Java
Subscribe service feedback
PUBLISHER
C++ β Java
Publish service feedback
FILE_PROGRESS
C++ β Java
File transfer progress update
TEXTURE
C++ β Java
Texture rendering callback
UDP_SERVER
C++ β Java
UDP server status
UDP_CLIENT
C++ β Java
UDP client status
KCP_VIEW
C++ β Java
KCP connection status
The SelectActivity UI features a dual-status display: txt_hint (italic, light gray) for supplementary hints and txt_status (bold, dark) for primary status, separated by a divider line.
Multimedia Processing
Feature
Description
GPU Rendering
Image/video rendering via OpenGL ES 2.0 (EGL/GLESv2)
CPU Rendering
Software-based image/video decoding and display
Audio Recording
16kHz PCM recording with real-time waveform visualization
Audio Playback
Play WAV/MP4/OGG/MP3/AAC/AMR files with waveform analysis
Speech to Text
Built-in speech recognition (STT) integration
Sensor Monitor
Real-time accelerometer, gravity, and linear acceleration data display
Intelligent Features
Feature
Description
AI Chat
DeepSeek API integration with Chat / Reasoner (Deep Think) models
Sensor Alert
Automatic warning audio when acceleration exceeds 7.0 m/sΒ² threshold
System Integration
Feature
Description
Event System
Observer-pattern event broadcast for inter-component communication
Time Sync
Native timestamp acquisition and synchronization
Global Toast
Floating toast notification service (3s auto-dismiss)
One-Tap Exit
Global exit manager to terminate all activities and services
Produces debug APK for arm64-v8a, armeabi-v7a, x86_64
Screenshots
License
MIT License
Recent Changes
2026-09
Multi-Select ZIP Download (HttpBrowserService.java): Every file/folder row now has a checkbox with a select-all toggle in the column header and a "δΈθ½½" toolbar button. Selected items (folders packed recursively, hidden files skipped) are packed per-file over ?zip=<name>&zip=<name>β¦ β each selected file becomes its own independent ZIP entry streamed to the browser (HTTP/1.1 chunked, no temp file on disk), images/videos/audios and other already-compressed files skip re-deflating, and a single unreadable file is skipped instead of corrupting the whole archive.
HTTP Server Sortable File List (HttpBrowserService.java): Web directory listing gained clickable column headers (Name / Size / Modified). Click toggles ascending/descending, folders always stay on top, name column uses natural numeric ordering (IMG_2 < IMG_10), active sort shows β²/βΌ.
Responsive File List Layout: File names now claim all remaining row width (flex:1). Below 760px the size/date columns shrink; below 580px the modified-date and its clickable sortable column header both move to a second line (date stays visible and time sorting stays available on phones); full file name shows as a tooltip (title) when truncated.
Viewer Ordering Fix: The in-page image viewer now resolves image indexes from the current DOM order on every open, so prev/next navigation stays in sync after re-sorting the list.
HTTP Transfer Throughput Tuning: Client connections now run on a cached thread pool; sockets enable TCP_NODELAY and a 512KB send buffer; files > 10MB stream with a 256KB buffer instead of 64KB (fewer syscalls and ContentProvider IPC round-trips) for better Wi-Fi LAN download speed.
SAF Directory Detection Fix: Directory entries are now detected via Document.MIME_TYPE_DIR instead of the non-existent DocumentsContract.Document.FLAG_DIRECTORY constant, fixing the compile error during batch directory queries.
2026-06
MSG_HINT Message Type: Added MSG_HINT = 9 to MASSAGER enum for displaying auxiliary hint text in SelectActivity. C++ can now send hints via Message::instance().setMessage(msg, MSG_HINT).
UI Layout Improvements: sample_text moved to fixed footer (outside ScrollView). txt_hint added above txt_status with visual differentiation: italic 12sp gray hint vs. bold 14sp dark status, separated by a divider line.
Pub/Sub Async Overhaul (JniMethods.cpp): StartSubscribe now returns immediately (non-blocking), connection results sent asynchronously via Message system. Publish moved to detached thread to prevent UI thread blocking (ANR). Added real-time feedback (Toast) for both Subscribe and Publish operations.
Publish/Subscribe Topic Isolation (PubSubSetting.java): Separate topic (subscribe) and pubTopic (publish) fields to prevent cross-contamination between services.
Subscriber Use-After-Free Fix (Subscriber.cpp): Fixed random trailing characters in received messages. Root cause: body buffer was freed immediately after enqueuing callback to thread pool, but the callback's content pointer still referenced freed memory. Fixed by using shared_ptr<vector<char>> to manage buffer lifecycle, ensuring it persists until callback completion.
Port Parsing Protection (SubscribeService.java): Added try-catch around Integer.parseInt() calls for port input, falling back to default port 9999 on invalid input.