Repository navigation
v0.2 - companion mode, beat-reactive wave, background countdown alarm
Pre-releasev0.2 turns the app into a companion for whatever you already listen to. It shows what any music app is playing (title, artist, artwork, progress) in a One UI-style player with a wave that reacts to the music in real time, lets your gestures control that app, and finishes countdowns with an alarm even when the screen is off. Local files and playlists still work as before.
This is a sideloadable APK (enable "install from unknown sources"). It is signed with the standard debug key, so it installs as an upgrade over v0.1 / v0.1.1 without losing your playlists or timer. Unlike earlier releases it is not debuggable, which switches off the developer test hooks. Verified on one phone only (Xiaomi, HyperOS 3.0, Android 16) with Mi Music; see "Not verified" below.
New: companion mode (now playing from other apps)
- Shows the song, artist, album, artwork and a progress line for whatever another app is playing (tested with Mi Music). It picks the session that is actually playing, and ignores stopped leftovers and this app's own player.
- Your gestures control the source app: double-tap left/right to seek 10 s, drag to scrub, two-finger tap for play/pause, two-finger swipe for previous/next. The music plays in the source app, so it keeps playing with the screen off.
- Needs notification access, granted once from a card the app shows. It only reads media playback information (never your notifications), and nothing leaves your phone. If Android says "Restricted setting", open this app's App info, tap the three-dot menu and choose "Allow restricted settings".
- Companion mode is now the default. Top-right menu gets Now playing (other apps); choosing a file or playlist switches to local playback (and choosing Now playing pauses local playback).
- The app has no internet permission and never fetches anything.
New: One UI-style player
- Large rounded artwork card with the title and artist overlaid on a soft scrim, a waveform progress bar with a ring thumb and elapsed/total time, and your timer underneath.
- The background is a dark gradient tinted from the artwork; the wave uses colours derived from it (greys stay neutral, so grey artwork does not get an arbitrary tint).
- No on-screen buttons: the app stays gesture-driven.
New: beat-reactive wave
- The wave follows the low, mid and high sounds of the music live: three translucent hills (bass tallest) scrolling from the thumb, tapering into the line, flat when paused. Heights emphasise beats (kicks and hits stand out; steady loudness reads calm).
- Uses Android's audio visualizer on the phone's output, which Android gates behind the Record audio permission (plus Modify audio settings). The app never uses the microphone, records nothing, saves nothing and sends nothing; it only measures three loudness levels. A card explains this before the system dialog.
- Runs only while the app is visible and music is playing (confirmed: stops on Home, restarts on return); zero frames are drawn while paused.
- If capture is blocked or silent on another device, the wave shows a faint idle ripple rather than faking beats.
New: background countdown alarm
- A countdown now fires with the app in the background or the screen off: an exact, Doze-piercing alarm posts a high-importance alarm-sound notification ("Time's up") with vibration. Skipped when the app is on screen (haptic feedback as before).
- Rescheduled after a reboot; a countdown that finished while the app was not running is detected and reported.
- Uses
USE_EXACT_ALARM(auto-granted on Android 13+), the boot receiver permission, and asks for notification permission when you pick a countdown.
Improvements and fixes since v0.1.1
- Equalizer bars in local audio mode were invisible on same-coloured backgrounds; they are now a lightened tone of the hue. The artwork tile sizes to the image (no dead space above the title).
- Performance: replaced an expensive blur with a static glow (frame time 20 ms to 8 ms in that screen), one ~30 Hz ticker instead of five 120 Hz animations, and a separate graphics layer for the wave so it does not re-draw the whole screen. Paused screens render zero frames.
- Timer state is re-synchronised with the alarm on every change; playlist, queue and notification behaviour from v0.1.1 is unchanged.
- Release build is no longer debuggable (test hooks off); versionName 0.2, versionCode 2.
Permissions (new since v0.1.1)
Notification access (user-granted, media sessions only), Record audio + Modify audio settings (beat wave only), Use exact alarm, Receive boot completed, Post notifications (asked when you pick a countdown). No internet.
Tests
93 JVM unit tests (timer, alarm scheduling, session selection, position maths, audio-band analysis, colour derivation, playlists), lint clean, clean release build. Logs are in test-logs/.
Not verified / known limitations
- Not verified by me: the countdown-finished notification and its sound (MIUI blocks granting the notification permission from the shell; needs a tap on the permission dialog), rescheduling after a reboot, long Doze, the real Settings toggle for notification access and the restricted-settings step, and the permission explanation card for the beat wave (Record audio was already granted when it would have shown).
- Verified by the tester on a real phone: gestures in companion mode (song change, play/pause and the others act on the source app).
- Only Mi Music has been observed as a source. YouTube Music, Spotify and other apps may publish different metadata (some may give no artwork or no position), and the audio-visualizer capture is known to vary by device and ROM.
- Mi Music's own artwork has dark side bars baked into the 16:9 image; they are shown as-is.
- Debug-signed, so not for Play Store. Google Play also restricts
USE_EXACT_ALARMto genuine alarm/timer apps and would need a review of the Record audio use; F-Droid/GitHub distribution is unaffected. Alarms are cancelled by Android on force-stop. - Updates install over this build only if signed with the same debug key (builds from the same machine); otherwise uninstall first.
Full diff: v0.1.1...v0.2