Private
Public Access
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>
This commit is contained in:
1 parent
2e7476669e
commit
13f29e26c4
39 files changed
+1685
-119
No files matched your search
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
# Fetches what the Android 4.1 build needs beyond tools/setup_toolchain.sh: ExoPlayer 2.18.7 (Google's Maven) and
|
||||
# Guava (Maven Central), checked against these SHA-256s, into $TOOLS/exoplayer-2.18.7 (TOOLS default ~/android-toolchain).
|
||||
# 2.18.7 because it's the newest that needs only Guava (2.19 adds AndroidX Core); every 2.x runs on Android 4.1.
|
||||
set -euo pipefail
|
||||
T=${TOOLS:-$HOME/android-toolchain}
|
||||
D=$T/exoplayer-2.18.7
|
||||
G=https://dl.google.com/dl/android/maven2/com/google/android/exoplayer
|
||||
M=https://repo1.maven.org/maven2/com/google/guava
|
||||
mkdir -p "$D"
|
||||
tmp=$(mktemp -d)
|
||||
trap 'rm -rf "$tmp"' EXIT
|
||||
get() { # url sha256 file
|
||||
if [ -f "$D/$3" ] && [ "$(shasum -a 256 "$D/$3" | cut -d' ' -f1)" = "$2" ]; then return; fi
|
||||
curl -fsSL -o "$tmp/$3" "$1"
|
||||
[ "$(shasum -a 256 "$tmp/$3" | cut -d' ' -f1)" = "$2" ] || { echo "$3: checksum mismatch"; exit 1; }
|
||||
mv "$tmp/$3" "$D/$3"
|
||||
}
|
||||
for m in core:2b51c5f07aa25f89e4adb7a833073e1a4adc5b87a388bd0045ebc3429b1bf42f \
|
||||
common:adfef7d3cbd69dd8fcc4ce05642a886c9fbc2764826bc39a6075ba6a0c62d003 \
|
||||
datasource:cbe67ad9eaf94be7b35d1a625252a79ed5c18601d19f7b4d787acfbcea009208 \
|
||||
decoder:598c0b444db71770f9b89b4e444e34cb03d5ed2eb5c12fb062afb2f9b05b9a1e \
|
||||
extractor:c3e34c7b07ecd3c78a75bb7185671030bea4371ac88d854000a856fc05f7eeff \
|
||||
database:31f0929246fb81296345be8414e7fa080a82deb8d382eb5d875974649030619d; do
|
||||
a=${m%%:*}; sum=${m#*:}
|
||||
get "$G/exoplayer-$a/2.18.7/exoplayer-$a-2.18.7.aar" "$sum" "exoplayer-$a.aar"
|
||||
# an AAR is a zip: the code is classes.jar, the keep rules for apps that shrink it are proguard.txt
|
||||
unzip -o -q -d "$tmp/$a" "$D/exoplayer-$a.aar"
|
||||
cp "$tmp/$a/classes.jar" "$D/exoplayer-$a.jar"
|
||||
if [ -f "$tmp/$a/proguard.txt" ]; then cp "$tmp/$a/proguard.txt" "$D/exoplayer-$a.pro"; fi
|
||||
rm "$D/exoplayer-$a.aar"
|
||||
done
|
||||
get "$M/guava/31.0.1-android/guava-31.0.1-android.jar" 9425a423a4cb9d9db0356300722d9bd8e634cf539f29d97bb84f457cccd16eb8 guava.jar
|
||||
get "$M/failureaccess/1.0.1/failureaccess-1.0.1.jar" a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26 failureaccess.jar
|
||||
ls "$D"
|
||||
@@ -0,0 +1,17 @@
|
||||
# R8 for the Android 4.1 build (build.sh): shrinks ExoPlayer and Guava to what the app uses and turns their Java 8
|
||||
# code into what Android 4.1 runs. The app (and its Bouncy Castle copy) stays whole and readable in crash reports.
|
||||
-keep class com.minamp.** { *; }
|
||||
-dontobfuscate
|
||||
# referenced only by annotations, or by code for newer Androids that ExoPlayer guards by version
|
||||
# (build.sh gives R8 the Android 4.1 API, so anything newer is "missing")
|
||||
-dontwarn android.**
|
||||
-dontwarn androidx.annotation.**
|
||||
-dontwarn org.checkerframework.**
|
||||
-dontwarn com.google.errorprone.annotations.**
|
||||
-dontwarn com.google.j2objc.annotations.**
|
||||
-dontwarn javax.annotation.**
|
||||
-dontwarn kotlin.**
|
||||
-dontwarn org.codehaus.mojo.animal_sniffer.**
|
||||
-dontwarn sun.misc.Unsafe
|
||||
-dontwarn java.lang.ClassValue
|
||||
-dontwarn javax.lang.model.element.Modifier
|
||||
@@ -256,6 +256,18 @@ S = {
|
||||
"set_delete_downloads": ("Delete all downloads (%1$s)", "Borrar todas as descargas (%1$s)"),
|
||||
"downloaded": ("Downloaded", "Descargada"),
|
||||
"quit_app": ("Close Plexamp Lite", "Pechar Plexamp Lite"),
|
||||
|
||||
# lyrics (as in the Mac app)
|
||||
"lyrics": ("Lyrics", "Letra"),
|
||||
"loading_lyrics": ("Loading lyrics…", "Cargando a letra…"),
|
||||
"no_lyrics": ("No lyrics for this track", "Esta pista non ten letra"),
|
||||
"lyrics_failed": ("Couldn't load the lyrics", "Non se puido cargar a letra"),
|
||||
|
||||
# home-screen widget, notification and lock-screen buttons
|
||||
"widget_name": ("Plexamp Lite player", "Reprodutor de Plexamp Lite"),
|
||||
"previous": ("Previous", "Anterior"),
|
||||
"next": ("Next", "Seguinte"),
|
||||
"play_pause": ("Play or pause", "Reproducir ou pausar"),
|
||||
"stalled": ("Playback got stuck: the network isn't keeping up.", "A reprodución quedou parada: a rede non dá abasto."),
|
||||
"quality_bt_title": ("Quality over Bluetooth", "Calidade por Bluetooth"),
|
||||
"set_quality_bt": ("Quality over Bluetooth: %1$s", "Calidade por Bluetooth: %1$s"),
|
||||
|
||||
Reference in new issue
Block a user