Commit Graph
24 Commits
Author SHA1 Message Date
XoséandClaude Opus 5.5 13f29e26c4 Plexamp Lite 1.14: Android 4.1 build with ExoPlayer, lyrics, home-screen widget
- 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>
2026-11-01 18:41:26 +01:00
XoséandClaude Opus 5.5 2e7476669e Add spec.md: goal, limits and rules for working on the project
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:05:35 +01:00
XoséandClaude Opus 5.5 30cc96cb34 Merge branch 'read-ahead-2' into main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 14:02:37 +02:00
XoséandClaude Opus 5.5 b6f696a8c8 Plexamp Lite 1.13: read ahead the next two tracks, keep loaded roots
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>
2026-10-20 14:00:46 +02:00
xocko 30d7742fb5 Merge pull request 'Plexamp Lite 1.12: read-ahead, renamed from Minamp, cassette icon' (#3) from ios-backports into main 2026-10-19 17:11:35 +00:00
XoséandClaude Opus 5.5 d47f705c7f Plexamp Lite 1.12: cassette icon
New launcher icon (ldpi to xhdpi from the pack, master and 512 px in art/). The status-bar
play icon still fits it and stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:57:01 +02:00
XoséandClaude Opus 5.5 dbe3203c84 README: former name, read-ahead, logcat, the other tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:40:21 +02:00
XoséandClaude Opus 5.5 7eebb0d881 Plexamp Lite 1.11: Minamp is now Plexamp Lite
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>
2026-10-19 16:57:47 +02:00
XoséandClaude Opus 5.5 08590f3224 Read ahead on mobile data too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:28:07 +02:00
XoséandClaude Opus 5.5 29ed836b4c Minamp 1.10: read the next track ahead; log to logcat too
On weak Wi-Fi shared with Bluetooth audio, Android 2.x's player (a few seconds
of stream buffer) ran dry and went silent for 6-7 s at a time; the speaker then
sometimes hung up. While a track plays, the next one is fetched whole (Wi-Fi
only) and played from the file. DiagLog lines also go to logcat (tag Minamp).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:25:54 +02:00
xocko 9aaeb57c87 Merge pull request 'Minamp 1.9: playback fixes for Bluetooth and USB' (#2) from ios-backports into main 2026-10-18 12:49:56 +00:00
XoséandClaude Opus 5.5 430da46544 README: internal install, quality over Bluetooth, stall recovery
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:49:45 +02:00
XoséandClaude Opus 5.5 9440536fa1 Recover from playback stalls; cap quality over Bluetooth
On the Galaxy Mini, Wi-Fi and Bluetooth audio share one radio: streams starve
and the media player then sits at the same position forever while showing
playing. After 10 s without progress, recover like a network failure (reconnect
and resume, then download first, then skip). New setting: quality over
Bluetooth (default 192 kbps) to leave the radio airtime for the speaker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:20:22 +02:00
XoséandClaude Opus 5.5 a610b090f0 Minamp 1.9: install internally, resume after Bluetooth dropouts, log why playback stops
Installed on the SD card (installLocation auto), Minamp was killed whenever USB
storage was turned on. A2DP dropouts send AUDIO_BECOMING_NOISY like an unplug:
after a Bluetooth loss, resume if the speaker is back within 20 s. Focus loss,
media buttons and stream failures now go to the connection log.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:16:56 +02:00
xocko 0f38670880 Merge pull request 'Backport from the iOS version: offline downloads, home-first reconnect, stall warning, Close' (#1) from ios-backports into main
Reviewed-on: xocko/minamp#1
2026-10-17 14:27:06 +00:00
xockoandClaude Opus 5.5 f7f49ecfbb Minamp 1.7: new launcher icon
- Launcher icon is now a supplied asset (masters in art/), with an xhdpi size
  added; make_icons.py only draws the notification icon, redrawn to match:
  an amber play triangle between orange arcs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:07:45 +02:00
xockoandClaude Opus 5.5 bbdab09f83 Minamp 1.6: adjustable UI size, larger text and controls
- 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>
2026-10-15 08:02:49 +02:00
xockoandClaude Opus 5.5 fa67e95fde Minamp 1.5: Galician interface
- 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>
2026-10-15 00:11:41 +02:00
xockoandClaude Opus 5.5 6fd17bc9c5 Minamp 1.4: faster connecting
- 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>
2026-10-14 21:16:09 +02:00
xockoandClaude Opus 5.5 58d21b6d68 Minamp 1.3
- 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>
2026-10-14 20:56:27 +02:00
xockoandClaude Opus 5.5 a4b875ef34 Minamp 1.2
- 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>
2026-10-14 20:38:17 +02:00
xockoandClaude Opus 5.5 0a2ac901bd Minamp 1.1
- 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>
2026-10-14 19:59:58 +02:00
xockoandClaude Opus 5.5 948d1198ad Sign APK in classic SignApk format so it installs on Android <= 4.2
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>
2026-10-14 19:46:20 +02:00
xockoandClaude Opus 5.5 0df8124629 Import minamp 1.0 source
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:38:37 +02:00