- One build per Android level, as in Tenda: build/PlexampLite.apk (Android 2.2+, versionCode 1508) and
build/PlexampLite-api16.apk (Android 4.1+, 1516), from shared src/ plus platform/api8 or platform/api16.
- Android 4.1 build: ExoPlayer 2.18.7 behind a small Engine interface (gapless hand-over to read-ahead and
downloaded files, a longer buffer, MediaPlayer fallback for tracks it can't decode), a notification and
lock screen with art and buttons, a resizable widget, Holo, a menu button without a Menu key, metered networks.
R8 shrinks ExoPlayer and Guava (tools/fetch_exoplayer.sh, tools/r8-rules.pro).
- Both builds: lyrics in Now Playing as in the Mac app (timed lyrics follow and seek), a home-screen widget,
media play/pause keys, the moon icon drawn without clipPath.
- PlexampLite-noreport on the SD card stops play reports, for tests against a real server.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Interface in Galician by default regardless of the phone's language, with
English selectable under Axustes -> Idioma; switching rebuilds the screens
- All text in tools/strings.py (key -> English, Galician), generating
res/values/strings.xml (gl) and res/values-en/strings.xml; layouts now use
string resources
- util/Tr.java: translations for the network and Plex layers, which can't
read Android resources (falls back to English in desktop tests)
- net/RefusedException: distinguish "server answered but refused" from
connection failures
- The connection log stays in English for troubleshooting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fix NoSuchMethodError on Android 2.x: Dalvik before 4.0 can't link Object
methods (toString/equals/...) called through an interface. Patch the bundled
Bouncy Castle (tools/patch_bc_dalvik.py) and our own CertVerifier, and make
build.sh fail if tools/scan_dalvik.py finds any such call
- Treat a manually entered private address (10.x, 172.16-31.x, 192.168.x,
.local) as home, so LAN servers that allow access without sign-in work
- Send Plex client headers on media requests (files and transcodes)
- Explain a 503 on a file as the server being unable to open it (drive or
folder not available)
- Connection log: home/away, token presence, Plex's file check and a direct
file request in the streaming test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Transcoding: send client identities Plex has a profile for (unknown ones get
400 "unable to find a matching profile"), with a fresh session id per variant
- Stream proxy: fetch transcodes once into a temp file and serve every player
request from it, so reconnects no longer restart the transcode (503s, tracks
cut short); original files still pass Range requests through
- Sign-in: remember the pending link code so it survives Minamp being closed
while the code is entered elsewhere; add "I've entered it - check now"
- Diagnostics: in-app connection log (DiagLog) with a streaming test and save
to SD card; tokens are never logged
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Run network/TLS work on 256 KB-stack threads (net/Threads.java): Android 2.x's
~16 KB default stack overflowed during the bundled TLS handshake
- Close pooled TLS connections off the caller thread
- Try several Plex music-transcoder URL variants until the server accepts one,
and remember the one that worked
- Accept pasted server URLs with paths; default to 443 for https
- Catch fatal errors and save a crash report (shown on next launch and written
to Minamp-error.txt on the SD card)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>