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:
XoséandClaude Opus 5.5 committed 2026-11-01 18:41:26 +01:00
1 parent 2e7476669e
commit 13f29e26c4
39 files changed
+1685 -119

No files matched your search

+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- the widget's and the Android 4.1 notification's card -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F01D1D22" />
<corners android:radius="6dp" />
</shape>
+6
View File
@@ -23,6 +23,7 @@
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/text" android:textSize="@dimen/text_sub" />
</LinearLayout>
<ImageButton android:id="@+id/np_lyrics_btn" style="@style/IconButton" android:contentDescription="@string/lyrics" />
<ImageButton android:id="@+id/np_queue" style="@style/IconButton" />
</LinearLayout>
@@ -41,6 +42,11 @@
android:layout_height="match_parent"
android:layout_gravity="center"
android:scaleType="centerCrop" />
<com.minamp.LyricsView
android:id="@+id/np_lyrics"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
</FrameLayout>
<LinearLayout
+39
View File
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Home-screen widget (4x1) and the Android 4.1 notification. Only views RemoteViews allows; PlayerViews fills it. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rv_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:background="@drawable/widget_bg"
android:padding="4dp">
<ImageView android:id="@+id/rv_art"
android:layout_width="56dp" android:layout_height="56dp"
android:scaleType="centerCrop" android:src="@drawable/art_placeholder" />
<LinearLayout android:id="@+id/rv_text"
android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"
android:orientation="vertical" android:gravity="center_vertical"
android:paddingLeft="8dp" android:paddingRight="2dp">
<TextView android:id="@+id/rv_title"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:textColor="@color/text" android:textSize="@dimen/text_mini_title" android:textStyle="bold"
android:singleLine="true" android:ellipsize="end" />
<TextView android:id="@+id/rv_sub"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:textColor="@color/text2" android:textSize="@dimen/text_mini_sub"
android:singleLine="true" android:ellipsize="end" />
</LinearLayout>
<ImageButton android:id="@+id/rv_prev" android:layout_width="38dp" android:layout_height="48dp"
android:background="@drawable/bg_pressable_round" android:scaleType="center" android:contentDescription="@string/previous" />
<ImageButton android:id="@+id/rv_toggle" android:layout_width="44dp" android:layout_height="48dp"
android:background="@drawable/bg_pressable_round" android:scaleType="center" android:contentDescription="@string/play_pause" />
<ImageButton android:id="@+id/rv_next" android:layout_width="38dp" android:layout_height="48dp"
android:background="@drawable/bg_pressable_round" android:scaleType="center" android:contentDescription="@string/next" />
<ImageButton android:id="@+id/rv_close" android:layout_width="34dp" android:layout_height="48dp"
android:background="@drawable/bg_pressable_round" android:scaleType="center" android:contentDescription="@string/close"
android:visibility="gone" />
</LinearLayout>
+53
View File
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- The larger widget (Android 4.1+, when it's made two rows tall or more) and the expanded Android 4.1 notification. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rv_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="@drawable/widget_bg"
android:padding="6dp">
<ImageView android:id="@+id/rv_art"
android:layout_width="112dp" android:layout_height="112dp"
android:layout_gravity="center_vertical"
android:scaleType="centerCrop" android:src="@drawable/art_placeholder" />
<LinearLayout
android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"
android:orientation="vertical" android:paddingLeft="10dp">
<LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"
android:orientation="horizontal">
<LinearLayout android:id="@+id/rv_text"
android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"
android:orientation="vertical" android:gravity="center_vertical">
<TextView android:id="@+id/rv_title"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:textColor="@color/text" android:textSize="@dimen/text_body" android:textStyle="bold"
android:maxLines="2" android:ellipsize="end" />
<TextView android:id="@+id/rv_sub"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:textColor="@color/text2" android:textSize="@dimen/text_sub"
android:singleLine="true" android:ellipsize="end" />
<TextView android:id="@+id/rv_album"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:textColor="@color/text2" android:textSize="@dimen/text_mini_sub"
android:singleLine="true" android:ellipsize="end" />
</LinearLayout>
<ImageButton android:id="@+id/rv_close" android:layout_width="34dp" android:layout_height="34dp"
android:background="@drawable/bg_pressable_round" android:scaleType="center"
android:contentDescription="@string/close" android:visibility="gone" />
</LinearLayout>
<LinearLayout android:layout_width="match_parent" android:layout_height="48dp"
android:orientation="horizontal" android:gravity="center">
<ImageButton android:id="@+id/rv_prev" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1"
android:background="@drawable/bg_pressable_round" android:scaleType="center" android:contentDescription="@string/previous" />
<ImageButton android:id="@+id/rv_toggle" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1"
android:background="@drawable/bg_pressable_round" android:scaleType="center" android:contentDescription="@string/play_pause" />
<ImageButton android:id="@+id/rv_next" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1"
android:background="@drawable/bg_pressable_round" android:scaleType="center" android:contentDescription="@string/next" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
+8
View File
@@ -72,21 +72,26 @@
<string name="loading_albums">Loading albums…</string>
<string name="loading_artists">Loading artists…</string>
<string name="loading_libraries">Loading libraries…</string>
<string name="loading_lyrics">Loading lyrics…</string>
<string name="loading_playlists">Loading playlists…</string>
<string name="log_empty">Nothing logged yet.</string>
<string name="love">Add to favourites</string>
<string name="loved">Added to favourites</string>
<string name="loved_radio">Favourites radio</string>
<string name="loved_radio_sub">Your top rated</string>
<string name="lyrics">Lyrics</string>
<string name="lyrics_failed">Couldn\'t load the lyrics</string>
<string name="min">%1$d min</string>
<string name="music">Music</string>
<string name="n_albums">%1$d albums</string>
<string name="n_albums_one">%1$d album</string>
<string name="n_tracks">%1$d tracks</string>
<string name="n_tracks_one">%1$d track</string>
<string name="next">Next</string>
<string name="no_albums">No albums</string>
<string name="no_albums_library">No albums in this library</string>
<string name="no_artists_library">No artists in this library</string>
<string name="no_lyrics">No lyrics for this track</string>
<string name="no_music_libraries">%1$s has no music libraries</string>
<string name="no_playlists">No music playlists yet</string>
<string name="no_sd">No SD card available</string>
@@ -117,12 +122,14 @@
<string name="play">Play</string>
<string name="play_all">Play all</string>
<string name="play_next">Play next</string>
<string name="play_pause">Play or pause</string>
<string name="playback_error">Playback error (%1$d/%2$d)</string>
<string name="playing_from">PLAYING FROM</string>
<string name="playing_next">Playing next</string>
<string name="playing_x">Playing %1$s</string>
<string name="playlist">Playlist</string>
<string name="plex_server">Plex server</string>
<string name="previous">Previous</string>
<string name="quality_away_title">Quality away / mobile</string>
<string name="quality_bt_title">Quality over Bluetooth</string>
<string name="quality_home_title">Quality at home</string>
@@ -237,5 +244,6 @@
<string name="unlove">Remove from favourites</string>
<string name="unloved">Removed from favourites</string>
<string name="up_next">Queue</string>
<string name="widget_name">Plexamp Lite player</string>
<string name="you">you</string>
</resources>
+2
View File
@@ -19,6 +19,8 @@
<dimen name="text_mini_sub">13sp</dimen>
<dimen name="text_card_title">13sp</dimen>
<dimen name="text_log">11sp</dimen>
<dimen name="text_lyrics">19sp</dimen> <!-- timed lyrics in Now Playing -->
<dimen name="text_lyrics_plain">16sp</dimen> <!-- plain-text lyrics -->
<!-- touch targets and bars -->
<dimen name="touch">48dp</dimen>
+8
View File
@@ -72,21 +72,26 @@
<string name="loading_albums">Cargando álbums…</string>
<string name="loading_artists">Cargando artistas…</string>
<string name="loading_libraries">Cargando bibliotecas…</string>
<string name="loading_lyrics">Cargando a letra…</string>
<string name="loading_playlists">Cargando listas…</string>
<string name="log_empty">Aínda non hai nada no rexistro.</string>
<string name="love">Engadir a favoritas</string>
<string name="loved">Engadida a favoritas</string>
<string name="loved_radio">Radio de favoritas</string>
<string name="loved_radio_sub">As mellor valoradas</string>
<string name="lyrics">Letra</string>
<string name="lyrics_failed">Non se puido cargar a letra</string>
<string name="min">%1$d min</string>
<string name="music">Música</string>
<string name="n_albums">%1$d álbums</string>
<string name="n_albums_one">%1$d álbum</string>
<string name="n_tracks">%1$d pistas</string>
<string name="n_tracks_one">%1$d pista</string>
<string name="next">Seguinte</string>
<string name="no_albums">Non hai álbums</string>
<string name="no_albums_library">Esta biblioteca non ten álbums</string>
<string name="no_artists_library">Esta biblioteca non ten artistas</string>
<string name="no_lyrics">Esta pista non ten letra</string>
<string name="no_music_libraries">%1$s non ten bibliotecas de música</string>
<string name="no_playlists">Aínda non hai listas de música</string>
<string name="no_sd">Non hai tarxeta SD dispoñible</string>
@@ -117,12 +122,14 @@
<string name="play">Reproducir</string>
<string name="play_all">Reproducir</string>
<string name="play_next">Reproducir a continuación</string>
<string name="play_pause">Reproducir ou pausar</string>
<string name="playback_error">Erro de reprodución (%1$d/%2$d)</string>
<string name="playing_from">REPRODUCINDO DESDE</string>
<string name="playing_next">Soará a continuación</string>
<string name="playing_x">Reproducindo %1$s</string>
<string name="playlist">Lista de reprodución</string>
<string name="plex_server">Servidor Plex</string>
<string name="previous">Anterior</string>
<string name="quality_away_title">Calidade fóra / datos móbiles</string>
<string name="quality_bt_title">Calidade por Bluetooth</string>
<string name="quality_home_title">Calidade na casa</string>
@@ -237,5 +244,6 @@
<string name="unlove">Quitar de favoritas</string>
<string name="unloved">Quitada de favoritas</string>
<string name="up_next">Cola</string>
<string name="widget_name">Reprodutor de Plexamp Lite</string>
<string name="you">ti</string>
</resources>
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<style name="AppTheme" parent="@style/BaseTheme">
<item name="android:windowBackground">@color/bg</item>
<item name="android:textColor">@color/text</item>
<item name="android:textColorPrimary">@color/text</item>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- The Android look the app's theme (styles.xml) builds on. The Android 4.1 build replaces this file
(platform/api16/res/values) with Holo, for Android 4's dialogs, spinners and text fields. -->
<resources>
<style name="BaseTheme" parent="@android:style/Theme.NoTitleBar" />
</resources>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 4x1 on both Android 2.x (74n-2 dp cells) and 4.x (70n-30 dp). The Android 4.1 build replaces this file
(platform/api16/res/xml) to make the widget resizable. -->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="40dp"
android:updatePeriodMillis="0"
android:initialLayout="@layout/widget_player" />