The cut is per account, not per device: a file request from any device signed in to the same account (another
phone, an iPod, the Mac) cut this phone's stream. The player's own stream now also asks for the file as a
download (?download=1), which Plex leaves out of that rule; the plain address follows for servers that refuse
downloads. Transcodes aren't affected.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two causes, both fixed:
- Plex keeps one file stream per device and cuts the one in progress when another starts, so the read-ahead
and the player cut each other off. Whole-file fetches (read-ahead, downloads, download-first) now ask for
the file as a download (?download=1), which Plex leaves out of that rule; the plain address follows for
servers that refuse downloads.
- Http.abort closed the socket of a response already read to the end, whose connection was back in the pool
and could be carrying the read-ahead. abort now leaves finished responses alone (test/PoolAbortTest.java).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
Read-ahead keeps the next two tracks on the SD card (one without it) and drops files
that are no longer coming up. Trusted roots are cached once read, and a failed read
is retried instead of leaving every server untrusted until a restart.
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>
- 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>
- Remember the connection that worked and try it alone first next start
- Prefer plain HTTP on the home network (each TLS handshake costs seconds on a
600 MHz phone); new setting "Encrypt at home too" to keep HTTPS
- Try secure addresses one at a time instead of in parallel, so they don't
all time out together
- TLS 1.2 with session resumption: reconnects skip the full handshake
- Cache certificate chains already verified; changing the trusted roots
clears that cache and all TLS sessions
- README: updated connection order; test: session resumption check and
HandshakeProfile
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>