- 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>
Renames the app (label, texts, log files, Plex product name, User-Agent, APK). The package
name, preferences and signing key stay, so it installs over Minamp and keeps its settings.
tools/strings.py catches up with the strings added straight to the XML in 9440536.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- New setting "Text and button size" (Normal / Large / Extra large): scales
text, icons and buttons on top of the phone's density (App.UI_SCALES)
- Larger default text, rows, tiles, touch targets and player icons; all sizes
now live in res/values/dimens.xml
- Seek bar knob drawn in code, since Android 2.x caches XML shapes at the
size they were first loaded
- Full-width buttons wrap to two lines instead of cutting words off
- Shorter labels so they fit 240x320 screens in both languages
- tools/check_fit.py checks that UI texts fit their slots at every size and
language using Droid Sans metrics; build.sh runs it and setup_toolchain.sh
fetches the font
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>
Replace jarsigner + zipalign.py with tools/signapk.py, which writes the v1
signature the way old JarUtils expects and aligns the APK.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>