From 4fe9eed8704b0a6bedacf7a86babe3e3eab97abd Mon Sep 17 00:00:00 2001 From: xocko Date: Wed, 14 Oct 2026 19:26:04 +0200 Subject: [PATCH] Import miniabs 1.0 source Co-Authored-By: Claude Opus 5.5 --- .gitignore | 3 + AndroidManifest.xml | 71 ++ README.md | 48 ++ build.sh | 37 + miniabs.keystore | Bin 0 -> 2068 bytes res/drawable-hdpi/ic_launcher.png | Bin 0 -> 5291 bytes res/drawable-hdpi/ic_pause.png | Bin 0 -> 499 bytes res/drawable-hdpi/ic_pause_small.png | Bin 0 -> 346 bytes res/drawable-hdpi/ic_play.png | Bin 0 -> 650 bytes res/drawable-hdpi/ic_play_small.png | Bin 0 -> 880 bytes res/drawable-hdpi/ic_refresh.png | Bin 0 -> 816 bytes res/drawable-hdpi/ic_stat.png | Bin 0 -> 690 bytes res/drawable-ldpi/ic_launcher.png | Bin 0 -> 2358 bytes res/drawable-ldpi/ic_pause.png | Bin 0 -> 381 bytes res/drawable-ldpi/ic_pause_small.png | Bin 0 -> 349 bytes res/drawable-ldpi/ic_play.png | Bin 0 -> 470 bytes res/drawable-ldpi/ic_play_small.png | Bin 0 -> 527 bytes res/drawable-ldpi/ic_refresh.png | Bin 0 -> 377 bytes res/drawable-ldpi/ic_stat.png | Bin 0 -> 326 bytes res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3391 bytes res/drawable-mdpi/ic_pause.png | Bin 0 -> 408 bytes res/drawable-mdpi/ic_pause_small.png | Bin 0 -> 413 bytes res/drawable-mdpi/ic_play.png | Bin 0 -> 513 bytes res/drawable-mdpi/ic_play_small.png | Bin 0 -> 656 bytes res/drawable-mdpi/ic_refresh.png | Bin 0 -> 463 bytes res/drawable-mdpi/ic_stat.png | Bin 0 -> 457 bytes res/drawable/btn_accent.xml | 12 + res/drawable/btn_flat.xml | 24 + res/drawable/btn_round.xml | 9 + res/drawable/row_sel.xml | 6 + res/drawable/seek_thumb.xml | 5 + res/drawable/seek_track.xml | 12 + res/drawable/tab_bg.xml | 11 + res/drawable/thin_progress.xml | 12 + res/layout/activity_home.xml | 51 ++ res/layout/activity_login.xml | 108 +++ res/layout/activity_player.xml | 162 ++++ res/layout/activity_podcast.xml | 53 ++ res/layout/list_area.xml | 27 + res/layout/mini_bar.xml | 60 ++ res/layout/row_episode.xml | 62 ++ res/layout/row_header.xml | 12 + res/layout/row_more.xml | 8 + res/layout/row_show.xml | 42 + res/values/arrays.xml | 19 + res/values/values.xml | 68 ++ res/xml/settings.xml | 53 ++ src/com/miniabs/Api.java | 542 +++++++++++++ src/com/miniabs/App.java | 134 +++ src/com/miniabs/BaseActivity.java | 237 ++++++ src/com/miniabs/Covers.java | 119 +++ src/com/miniabs/DownloadService.java | 230 ++++++ src/com/miniabs/Downloads.java | 143 ++++ src/com/miniabs/Episode.java | 95 +++ src/com/miniabs/HomeActivity.java | 506 ++++++++++++ src/com/miniabs/Job.java | 36 + src/com/miniabs/Json.java | 252 ++++++ src/com/miniabs/LoginActivity.java | 117 +++ src/com/miniabs/MediaButtonReceiver.java | 41 + src/com/miniabs/PlayerActivity.java | 301 +++++++ src/com/miniabs/PlayerService.java | 762 ++++++++++++++++++ src/com/miniabs/PodcastActivity.java | 203 +++++ src/com/miniabs/Prefs.java | 146 ++++ src/com/miniabs/Rows.java | 207 +++++ src/com/miniabs/SettingsActivity.java | 77 ++ src/com/miniabs/Util.java | 107 +++ test/com/miniabs/ApiTest.java | 215 +++++ test/mock_abs.py | 179 ++++ test/run_tests.sh | 20 + test/shim/android/content/Context.java | 15 + .../android/content/SharedPreferences.java | 21 + .../shim/android/net/ConnectivityManager.java | 5 + test/shim/android/net/NetworkInfo.java | 2 + test/shim/android/os/Build.java | 5 + .../android/preference/PreferenceManager.java | 5 + test/shim/android/text/Html.java | 2 + test/shim/android/util/Base64.java | 5 + tools/make_icons.py | 96 +++ 78 files changed, 5800 insertions(+) create mode 100644 .gitignore create mode 100644 AndroidManifest.xml create mode 100644 README.md create mode 100755 build.sh create mode 100644 miniabs.keystore create mode 100644 res/drawable-hdpi/ic_launcher.png create mode 100644 res/drawable-hdpi/ic_pause.png create mode 100644 res/drawable-hdpi/ic_pause_small.png create mode 100644 res/drawable-hdpi/ic_play.png create mode 100644 res/drawable-hdpi/ic_play_small.png create mode 100644 res/drawable-hdpi/ic_refresh.png create mode 100644 res/drawable-hdpi/ic_stat.png create mode 100644 res/drawable-ldpi/ic_launcher.png create mode 100644 res/drawable-ldpi/ic_pause.png create mode 100644 res/drawable-ldpi/ic_pause_small.png create mode 100644 res/drawable-ldpi/ic_play.png create mode 100644 res/drawable-ldpi/ic_play_small.png create mode 100644 res/drawable-ldpi/ic_refresh.png create mode 100644 res/drawable-ldpi/ic_stat.png create mode 100644 res/drawable-mdpi/ic_launcher.png create mode 100644 res/drawable-mdpi/ic_pause.png create mode 100644 res/drawable-mdpi/ic_pause_small.png create mode 100644 res/drawable-mdpi/ic_play.png create mode 100644 res/drawable-mdpi/ic_play_small.png create mode 100644 res/drawable-mdpi/ic_refresh.png create mode 100644 res/drawable-mdpi/ic_stat.png create mode 100644 res/drawable/btn_accent.xml create mode 100644 res/drawable/btn_flat.xml create mode 100644 res/drawable/btn_round.xml create mode 100644 res/drawable/row_sel.xml create mode 100644 res/drawable/seek_thumb.xml create mode 100644 res/drawable/seek_track.xml create mode 100644 res/drawable/tab_bg.xml create mode 100644 res/drawable/thin_progress.xml create mode 100644 res/layout/activity_home.xml create mode 100644 res/layout/activity_login.xml create mode 100644 res/layout/activity_player.xml create mode 100644 res/layout/activity_podcast.xml create mode 100644 res/layout/list_area.xml create mode 100644 res/layout/mini_bar.xml create mode 100644 res/layout/row_episode.xml create mode 100644 res/layout/row_header.xml create mode 100644 res/layout/row_more.xml create mode 100644 res/layout/row_show.xml create mode 100644 res/values/arrays.xml create mode 100644 res/values/values.xml create mode 100644 res/xml/settings.xml create mode 100644 src/com/miniabs/Api.java create mode 100644 src/com/miniabs/App.java create mode 100644 src/com/miniabs/BaseActivity.java create mode 100644 src/com/miniabs/Covers.java create mode 100644 src/com/miniabs/DownloadService.java create mode 100644 src/com/miniabs/Downloads.java create mode 100644 src/com/miniabs/Episode.java create mode 100644 src/com/miniabs/HomeActivity.java create mode 100644 src/com/miniabs/Job.java create mode 100644 src/com/miniabs/Json.java create mode 100644 src/com/miniabs/LoginActivity.java create mode 100644 src/com/miniabs/MediaButtonReceiver.java create mode 100644 src/com/miniabs/PlayerActivity.java create mode 100644 src/com/miniabs/PlayerService.java create mode 100644 src/com/miniabs/PodcastActivity.java create mode 100644 src/com/miniabs/Prefs.java create mode 100644 src/com/miniabs/Rows.java create mode 100644 src/com/miniabs/SettingsActivity.java create mode 100644 src/com/miniabs/Util.java create mode 100644 test/com/miniabs/ApiTest.java create mode 100644 test/mock_abs.py create mode 100755 test/run_tests.sh create mode 100644 test/shim/android/content/Context.java create mode 100644 test/shim/android/content/SharedPreferences.java create mode 100644 test/shim/android/net/ConnectivityManager.java create mode 100644 test/shim/android/net/NetworkInfo.java create mode 100644 test/shim/android/os/Build.java create mode 100644 test/shim/android/preference/PreferenceManager.java create mode 100644 test/shim/android/text/Html.java create mode 100644 test/shim/android/util/Base64.java create mode 100644 tools/make_icons.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f17c59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build/ +.DS_Store +._* diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..19a7888 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..898dab2 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# MiniABS + +A tiny Audiobookshelf **podcast** client for the Samsung Galaxy Mini (GT-S5570) and other Android 2.2+ phones. Native Java, no libraries, ~100 KB. + +## Install + +1. Copy `MiniABS.apk` to the phone (USB to the SD card, or download it in the browser). +2. On the phone: **Settings → Applications → Unknown sources** → tick it. +3. Open the APK from a file manager and install. It can be moved to the SD card (Settings → Applications → Manage applications → MiniABS → Move to SD card). + +## Connecting + +Use your server's **local http:// address**, e.g. `http://192.168.1.10:13378`. + +Android 2.x only speaks old TLS and has an outdated certificate list, so it usually can't connect to modern HTTPS servers (including Let's Encrypt behind a reverse proxy). The "Accept any HTTPS certificate" box only helps with self-signed certificates on servers that still allow older TLS. + +Sign in with your username and password, or tick "Use an API key instead". It works with both current servers (2.26+, short-lived access tokens that MiniABS refreshes automatically) and older ones (single long-lived token). + +## Using it + +- **Latest**: "Continue listening" plus the newest episodes across your podcast library. Tap the library name at the top to switch libraries. +- **Shows**: every podcast; tap one for its episodes. Menu key → sort oldest/newest, hide played. +- **Saved**: episodes downloaded to the SD card, plus download progress. +- **Tap** an episode to play. **Long-press** for Download, Delete download, Mark as played/unplayed, Go to show. +- **Player**: skip back/forward (set the amounts in Settings), seek bar, show notes. Menu key → sleep timer, mark as played, download, stop. +- **Headset buttons**: play/pause; next/previous skip forward/back. Playback pauses when headphones are unplugged and during calls. + +Colored dots: blue = new, amber = in progress (with a bar), grey = played. + +## Progress sync + +Playback opens an Audiobookshelf session and syncs every 15 seconds and on pause, so progress follows you to other apps. Saved episodes play offline; their positions are kept on the phone and sent to the server next time you're online (or tap refresh on the Saved tab). + +## Limits + +- Episodes are streamed with direct play. Formats Android 2.x can't decode (e.g. Opus) can't be played, since the transcoded HLS stream isn't supported on 2.x. +- No playback speed control: Android 2.x's media player doesn't support it. +- Downloads need an SD card. "Download on Wi-Fi only" is on by default. + +## Building + +Needs a JDK, `aapt`, `dalvik-exchange` (dx), `zipalign`, `apksigner` (Ubuntu: `apt install aapt dalvik-exchange zipalign apksigner`) and an API 8 `android.jar`: + + ANDROID_JAR=/path/to/android-8/android.jar ./build.sh + +Compiling against the API 8 jar guarantees no newer Android APIs are used. The APK is signed with `miniabs.keystore` (password `miniabs`); keep it to install updates over the top. + +`test/run_tests.sh` runs the API, JSON and progress code on the desktop against a mock Audiobookshelf server (`test/mock_abs.py`). diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..c9364e2 --- /dev/null +++ b/build.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# Builds MiniABS.apk for Android 2.2+ (API 8) using the plain SDK tools, no Gradle. +# ANDROID_JAR android.jar for API 8 (compiling against it guarantees no newer APIs sneak in) +# KEYSTORE signing keystore (created on first build if missing) +set -e +cd "$(dirname "$0")" +ANDROID_JAR=${ANDROID_JAR:-/home/claude/sable/android-platforms/android-8/android.jar} +KEYSTORE=${KEYSTORE:-miniabs.keystore} +OUT=build + +rm -rf "$OUT" +mkdir -p "$OUT/gen" "$OUT/classes" + +echo "== resources" +aapt package -f -m -J "$OUT/gen" -M AndroidManifest.xml -S res -I "$ANDROID_JAR" \ + -F "$OUT/MiniABS.unsigned.apk" + +echo "== compile (Java 8 bytecode, API 8 class library)" +javac -nowarn -Xlint:-options -encoding UTF-8 -source 8 -target 8 \ + -bootclasspath "$ANDROID_JAR" -classpath "$ANDROID_JAR" \ + -d "$OUT/classes" $(find src "$OUT/gen" -name '*.java') + +echo "== dex" +dalvik-exchange --dex --min-sdk-version=8 --output="$OUT/classes.dex" "$OUT/classes" +(cd "$OUT" && aapt add MiniABS.unsigned.apk classes.dex > /dev/null) + +echo "== align + sign (v1 JAR signature with SHA-1, which Android 2.x requires)" +if [ ! -f "$KEYSTORE" ]; then + keytool -genkeypair -keystore "$KEYSTORE" -storepass miniabs -keypass miniabs -alias miniabs \ + -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=MiniABS" > /dev/null 2>&1 +fi +zipalign -f 4 "$OUT/MiniABS.unsigned.apk" "$OUT/MiniABS.aligned.apk" +apksigner sign --ks "$KEYSTORE" --ks-pass pass:miniabs --key-pass pass:miniabs --ks-key-alias miniabs \ + --min-sdk-version 8 --v1-signing-enabled true --v2-signing-enabled false --v3-signing-enabled false \ + --out "$OUT/MiniABS.apk" "$OUT/MiniABS.aligned.apk" +apksigner verify --min-sdk-version 8 "$OUT/MiniABS.apk" +ls -l "$OUT/MiniABS.apk" diff --git a/miniabs.keystore b/miniabs.keystore new file mode 100644 index 0000000000000000000000000000000000000000..787afaac3250fcffb64232466e91b905620c86ad GIT binary patch literal 2068 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 VC564`eg#G*gQu&X%Q~loCIEM8{sI61 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_pause_small.png b/res/drawable-hdpi/ic_pause_small.png new file mode 100644 index 0000000000000000000000000000000000000000..5af5bc3439dd44b0c254e669d1ef2f29def17f87 GIT binary patch literal 346 zcmV-g0j2(lP)5|CiHQQoF=GHe5Ebxl19;At&iuFE z?0XmNKoA7~3pupWLGT^@f(v-t%*nI&Mtz9N2%9}zUY7;;?^83!b^QUc-nnYE;O^}9 z<;jOAz+W>m!ghJ2y`x+$hpFm%P+pWbJpkRP8_-p%*J`lY-!#))^s`ZP&cqgPQ?u=3 z`=Cj5o+Hy*6hVLj5RvtvzWiBqRd1j91>N6r9E50YLNqranwt>KO^D_uL~|3Oxe3wS zglKLKe=|7_EC6%=vNW(&_4^{BNv5r6?be~2iar!uPv3&BQqSs6j!bjW=jGI8N@FJW s_~SAGv`lHd+21sC^2CxX2!bQ!1NP>fYSptT#sB~S07*qoM6N<$g7kBqApigX literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_play.png b/res/drawable-hdpi/ic_play.png new file mode 100644 index 0000000000000000000000000000000000000000..d06252bff310a1dc4532487da7a9cf7990bd75c9 GIT binary patch literal 650 zcmV;50(Jd~P)%|IstaTgi)tREPxR#fJf)7pb(U% zlSm8_pTod5Dqv_+`94DLCs|5#^SGb=-NaE0L?V$$Boc{4HUqA=3xWCVHu;)}Z3qA^ zjmOz2%U@sFxpw=+nEA_dywO>H=6in$;6AG!q*?wnP17NO5`ksj;Y5@GJq9#k<~`aP zd`P#iJ^&!~7DVP5TMdL4Ps+}HP`x6FN>5O~Qvgfk$g znTH_U;3V^qgaHSchbG)$E%Q)?8#>QCbYb8hnU6-J%c#W9%q9po{F*uO1WEr>x|2UD ziei8>x@?kg0|QtA3Ig3ArMrv8VyhlIbxkLB=hi6-Kmantl&Hu%5`8>B`ucI57ugiy z5`ZCMBPxd|u{WQ6*{{b8)>y}(C#?WhL}Wl%is*|T%boe`a358^j5R;BLOsHN2&%HRlbBZ^KBypVQcxe z;ak{hzHRstc9L%!u7#cE+lEVF=lQnbLfBirZP*m{o^Knrgi8R4?|j?nT38TJzHM|S z%$$hovd@MMMBajB;yYhk{Ji8L&BmY8?fl`1u^|2gw?a`AgW>RcTHkGcx?Ko@yO6~u k|7X6DNF)-8L?Y+m2lpO$PEcU;2><{907*qoM6N<$f(MT)Z~y=R literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_play_small.png b/res/drawable-hdpi/ic_play_small.png new file mode 100644 index 0000000000000000000000000000000000000000..dd67171301ff6a6bc9d62022098088ffa0d12a89 GIT binary patch literal 880 zcmV-$1CRWPP)Z=WicS^o^jFTl z_shG8NQf@Os^+KeNJ^;cwgsMzocZFFi{bG;-ba>ix=7d4mGbA?H|L&V1wj>N zoZdUpw!%RiT)QK|XBx!?bES0J{G2xC7D))}qsJka{zne1Ztr++fOB!dE_IvbA9fmZ zFOM3BTpKk>*UMB|9g!sFTe0DtY^D6^!#F&~D9(MN5HN-??T!TR5xc~E_%IF?1lA$C zdUWqSwu1!;tAMuu{5uZ4mGV+=>C8D^So24%Kh_fvG1zRqOr_nCP;gwNvA4U8v)3Pd z{nB%);6WShM2>0%2&nc`MVy#ZAYTu*S2}D>E_3-XsA?c-XP$O0>&ZsH6Fx3hH=6)} zcMe{6Y>KKvR3S4n);fp2@5!~+w!BuTZZ@?Bb5w85T~Sr2s>)M|vBnT-s*Ozbv)RSX zyTIV^%?bkQhu6uKsECHh(H4r%W~toGG+a&I-ns<FT^2?B?-p9vcTfKuq9Hlq>$XPda;e;vUJSm|}`25PtzMRipu?`;Sim0000cj-M=ec6@E@?Wu(GgGu@L;R-@Djl;AQt_cV?e^c6Mf@E!mRJ0#ty?|8j2eS73iN zZ@w8I`tlqCRbR6_8=sE@w}6qb)(enoq8kLZ`!|?^^RW`?P6CT$GSoGo*a#Q~CV~6F z9Pq`zIoC}B!?B&Sc8#X|1P-Kti-M{6SOcbjB|6IzFzr{k2bghv9a!`E@tDc7V8$Y+ z0KeLR`5n#Q0-t;yfYg0FngZ(U1jfu7Wb{9mv|G}uqyhitCCy5D<0kth9g;LEsUZnT z`+TjDb6&j+Ge(v#`hjN&EAzm4JSfvY0o-sF)_rUw46ge)={9YN368@HxsrgH1xDk2 zWC7a`3;>s-0|TfOP`JA5DWF_rWG|yZmM1PbwKYjgl1`b~GEkGWZf5n!rXuN~q<%?f zlwDzva6Q!=T}O680=t;7bI$d(0zRt13E(#HEn=qutoS$`pV!uzj}Icc7l3VaC=o;% zIns>-7l5b9)!p^=)_I6#A{zqUN5=PJumu=0XDQ9>hk={GXW(@iKs$i15umHC@BAWK zgNw8M7;ud2RsPkNcHWJc8S(&jHq6WxBrT+S+trXYNk5|B;l)q}Od4-y)-bcWGgGW& z^b*vqz_g8%NLpZ$KBV8mZTC;^K!+lpG=0d80G z`A*;i@Ceu&*1H8&wsdUhAc0Ze8_Pe{y$qmki|dfD%_lZ5$hyk5G1!(qHntxxwXyw> z^4pJtl6Lv;u=ky$2{Zc`d={rB2b7Ox8nk$A1{jNd^(=JX!cNf)@Iqh;M?7Huuckg_>@0mI0-g8%4$U+t}5ui9Hob=mRKr;PL$vIAb z{VP(d=SZr3DmkEL`VMdmJUunw4@dz8Z~^EslG~9(?wo*S;1d(+0rkJxRwGphUK+*_ z_-xo|st}=CJLY@>dN7 z+rhB!ZTv|!J6W51%u0{xc6H`eCD`{v?6xHN^XYo%#B0;O`_|2`kn~Z~AyA~029mmx z9!ly<8rtaFy>3crz-R{^TCC?;&oCTw%*BZ{gJEFW*Uq(IJ4z{i4GAAeD(!b1rP(B@ zW-&)0kLPrZL9jI=vC4@P>xX*{)0loAY^%UUjanv2FD%C}8->{v;|`49A@2Qsu`* z^&YTP^_4`0U*gp~_CzqMbWn`5qH0I$$doF5jKm<*)%kpzL#{d>yuq=0e-SKXA^(f~ Y026)Q8e*8;?EnA(07*qoM6N<$g6lRz+5i9m literal 0 HcmV?d00001 diff --git a/res/drawable-ldpi/ic_launcher.png b/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8f6d8ee552a02e0bf4f3218e504a2449aa97d1 GIT binary patch literal 2358 zcmV-63CZ?}P)+xJDsp6dI7A5q z1rcofJ*S>le^TNi;43J##DMt}2n0}#2+iis59~jsX-^A)Dk6ebsvQYN?L$*n8G)7-}dHcY{^KUxP3Emk}0mkaO z&ovjtte$mUZ*fn%CK_r)i~)Dz^gBKt11Pljs*cJKZT@*SIjupTYFgWR(Ykf02u{lG zI`pT>(;FI0%ktX`=HaceIjL5pqYnZD)hX}tPb0>_K*3LLR2Dk>lqn4oZTn?5A+cT& zuH5~%XP;dhnyup-1AvBc!6j`UO5%y_vDVj!wD&6CKQH9V(+nMbO7JNN9T@27RnDDh zxc1_ZL*2^gtngNw%A>Eu8f1M%V8cej-UC}bLjsmOvE6DeLKL`gZpg1!rReHWmfex( z)psn_DZ%N9lUoD=f$jli#r%+azL%mZ1>5#1PrqqNr3fD08q4zeW?swh8nSbK)ZTB} zXO}6fwLLi%wNR6WTbdHMSTUkl2O>gbA-0^5w*mvj7>X9cP&m+~6k|o5x1CLcQ|Qhq z&T5V8%_IOFG_4XRL(sgkv@vAP!~g_VKN#`iE=w|i`Wm6GTIlLmOhri(@lRQdKv%zV z@+e_+R!D~M!Y<322P0Hq&cuLajUmwhq(U$v)}}?FveXIU6eNU|3jzpX$3Dk>&&Q0e z5eABI_qS6#@{=@Qm}rP>DI~^wt?W4?kc;4)Spm;AXZXXaB)I~Nt`Y8gK4!;02O+Hd zVn7f=?EKh=CsP54Tm)n54ULlxC_Mg#rLUmmig3Z)fU{3C%$;hua!G>zg7;EqpHh?d zVeafxM4(VqE}Iw9FiJRgcEI^_19C;^D=3e@VL_pBvf<>hhC(zn)I$IjVrAMmVPv&I zBjv@n9bq6uR#`qTAdwOFwmEKnEFzN>q8M&onq*URhE2^GZeE%siXoE{Zh0)?-TjU* zBP^d65LqP*gcsj-Xr$Cu3Dd_4g%~PVv?27g7Ct{QfE2X%D6NOQ7wW1FXG}66u%*>< zuv;m{aQVWJ)mJ1LGeQ_MLRfu8lFJu{6k|Bpt-RD~LEwx@hPrBl5okT6wD%~agt?~} zVyi<4cvQZG#v{&0(4SXSA)AK!tboGK1B$guB7mj^0k+@k<|DBEzAX`ewaU%|3hMi2 z)4p8v=aqcq#|VeX*6_#%Q&Q5>Q~oH|o@D4JWF7S7AqWO17zDn}mkF;6rM`N!T{8@z zAx%;$VpzX2H`E9s(Alr->r_SrnYO}($aR%$4H?M4IwTOkYruZxj1UBrjG~HRi zIlo3V-C1D64oe_#<|M;elMUiL?|SpTz)l-ysLcwlplsXcNEjJX`YQ?}q!YsKgO2td zhlav=vklfNRViWZX3IdoQa{G9YEeibhIA61+v(^pK!3r%r<0yfS1k#tKgrPFr>xy< zsY(gfD(B5MXeb=&Ro*`6NF^(|QOP0oRkOQG+4z>D>1@OKa{|VXGIZyZ*Y;Ze`a(=i zM!0ERkr5e)EYwyFx;>kMjy|6RKYb)(@;F1wyN=iQTB_5+_)*@b02|+OeAuC+W*iGp zg{*xkX8HVpQ|g85FG=v@`wP@%g&Wru4{t+KrJkTJ!s{gh zpD0ZWLaw>UcYM0V@>Gi@nK^o&H8kbzQZ8OC{i=KBW-(_t?SctgydJ+54d~qDl^j>PRnD0+P5Qo=%}E>7(c>s;m+C z^LLY+GbDc|^gfwnFs8G5cHO8j$faFb^pIMu_rD$-t~ zkyU6VCn_^Y#2X3?%s$yrKU$#ZD|T72rrMNH!|1FsA|u!i=TCxVPE~k76-HDE#z<@n zfdYh6x*82^wODz1(Two?WCC@=q>z?)k&ofh+Y8K|V2DebwDKIZq!$Lz*5TN7P{|}^ z*khCth%N5inSmiKZ#Lf0+Ouv7fv93ca2@wfon1GQtzW%0AO5?=nlU3pit*8gL_DE$ z(J%+|3Sh}VNGFFs5CjGa5mY6Kci)i>t3$m~R_y-Ev(1D<4~pxj-uqs+S=D$$Z?UgH za%7b-oVNt;tz(@&%4t7bUn7t!LeGGU)?ZtdSU%tUXY~WA1*>Q6h|Lkx`mDDzuQPIeCU;!N4Lgw4=6$K$uAp3{BCq)m9S)Hz{-UQs%v%2{&%7u zO!(ouua{|4!aXRJw-CC1>bIx~mXUMwh^Z-|ITmd`PD(K#rpjz1uMaF)w)_5#5Lbd3 zc7XCFQu)qi(`^$nGwXuX-j6;Zl#_u;WB9Psf|YF-@vKW@@gG1|O1 c)MI%2zt(;-zxDFk-~a#s07*qoM6N<$g7AQKhyVZp literal 0 HcmV?d00001 diff --git a/res/drawable-ldpi/ic_pause.png b/res/drawable-ldpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..88c8cbc0401a93d9cb1f3060dc61828d74d11455 GIT binary patch literal 381 zcmV-@0fPRCP)LX zz>h}9=W<+2Qt7qK&kxSB?C}*KO-~2W!Tb)CQc%sz0#}pC%S}=1OQNQ@Qs_Z6{IrH* zP-Vk1p(DeRY97h=nrb(KSstf=z%sEJywy#sHC2YA<>zVxQvhpYlczdwl-mOQE9$@< zxC3|K4!pIt=}v)4cUnEyRd|Z-1V8Ccl457(sGN+XL<&~Ug8_*xeE^slL29hM>16=$ zzJF^ye}OMA5W(Cc&&N4D1CZzAd@y>rjDr8Dr8vg>{(ZI9-l(l%8|#0-`W-4-<0-y* br~lPEiC}bj69=kk00000NkvXXu0mjf*`lqj literal 0 HcmV?d00001 diff --git a/res/drawable-ldpi/ic_pause_small.png b/res/drawable-ldpi/ic_pause_small.png new file mode 100644 index 0000000000000000000000000000000000000000..080dfa61035d8141d9989174ea68359eb2efd9c0 GIT binary patch literal 349 zcmV-j0iyniP)H{CdR8yN_R#BVLZimrg9d4@kH2S1x7t-^KCzkWe9nX@ia_bJNtA3zWb8w(pjkdVR$u+^#e6#ix9}xCg8NF+l$&aLu)qyC*ZdBls}gD_-UK%>|Ge1B?%rWEfG> zZzP2n?kl9v*{pZ~?9>Bv(%%Z)NCZsoD`0LRyqwO8kA3ua1+Oy!N$x3_-R`5mFBqz= zq9pI5e+anQW0U@W0$%5We!b6T#p^s@+@jk0+~#9~SvQx25zOE&q@r1COgUN{z(R;} z|0UAlNx6JZb=J17j|mpwW)=bD{wBzt9+yA9)%9=@ItDlavEK5Fq{pYn%Xf|5=`!dL z@OiCDhbLwB0>1v??7LZA)u1a_K)PJ(5~@ohwQ1A^oPddiU{`2u1#JyB$<0C(ek!G- zu3CG8W!!L2ZzHRR<lNK5)2ifXpDwQJX>7Nra?YsmO^)(i#h z!D|3$)}2$pOc?2Edt0`9QkBC=iC>Nv_BT(npMbUQ+Ch|h5-g4wqXad3>>hnYcq5+Q-z1^( ztkqX3DFo@`Kt&Y5wtdC>la=Dq!69(^!bITnYX9U@g9}=_3_H$cx8sGqyTzr0L$1ym z0wU#nV7}6CR|o(C936l6D}@iApZ+rX+?E%~_vS#+`+1z{7sv#<*VN}PegZnT$C0!- RXORE^002ovPDHLkV1mZR_9OrR literal 0 HcmV?d00001 diff --git a/res/drawable-ldpi/ic_refresh.png b/res/drawable-ldpi/ic_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..7c3724e0024553d8ca510b90947e1c8be6a86b3f GIT binary patch literal 377 zcmV-<0fzpGP)i{K^ryuS!C|A zx!G)D92kb#Ih>h0KP$~CfB_-;)&!IkDi|acW(E+W;Os? zl6E9@Jk*nPV`g7Ya3<+e(u1TtB?)fVfJerq2OI=$SUzgU>~>!3gE+=Zs{bB9Iy$5GE>bY zfo0$XSkhRx8^p{CCqq&&v%aK$jK?gvz0+_3_k7{<_%vUOLQ>1uBaBRI)@D0y19$-r zMw*;}rj5Vr-#&qDl3SZZHfbTBfYmCt>|qVrq!YQ<@I<~NrnZ{8%Kj3Y>o+pBlK;pr X{ZX|mNXHCF00000NkvXXu0mjfJj|a+ literal 0 HcmV?d00001 diff --git a/res/drawable-ldpi/ic_stat.png b/res/drawable-ldpi/ic_stat.png new file mode 100644 index 0000000000000000000000000000000000000000..471322ba89305de40dc7b749ed4a0a4bcc2a93e1 GIT binary patch literal 326 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 FV1lIL#ZdqN literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_stat.png b/res/drawable-mdpi/ic_stat.png new file mode 100644 index 0000000000000000000000000000000000000000..e163c31596c2dbec61b840200a1103cce2836997 GIT binary patch literal 457 zcmV;)0XF`LP)P000>X1^@s6#OZ}&0004yNkl-{cwQn!-0Oyk{OHuyTCG#eW#QD3iw$A zj)CD<9UwQb#fzN)LqPtO!ICC(^G>YOay{<@XMrwo15AG=`bm8nxV7G_B=t9WMN%PY zJ0dO(o&$D($z(YqB1mIk3OE4fCCU6P>#g)ht^j914`?P+-}kgv2Ra=ah}VqUH!rNy zvu;H|9k>Iofl(8iCY}RT=O%zX;L3i&`61%~n$C?{?+&PEl4c}TC7nv@xWNVcqlmZ% z3Q3!imL!eYZvsU`JV-hk;B~B5l{Aw{>bdY35l?;}x4-a4*CZ`U>Kfm5Tyy;* + + + + + + + + + + + diff --git a/res/drawable/btn_flat.xml b/res/drawable/btn_flat.xml new file mode 100644 index 0000000..d44d996 --- /dev/null +++ b/res/drawable/btn_flat.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable/btn_round.xml b/res/drawable/btn_round.xml new file mode 100644 index 0000000..dc294cf --- /dev/null +++ b/res/drawable/btn_round.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/res/drawable/row_sel.xml b/res/drawable/row_sel.xml new file mode 100644 index 0000000..68db390 --- /dev/null +++ b/res/drawable/row_sel.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/drawable/seek_thumb.xml b/res/drawable/seek_thumb.xml new file mode 100644 index 0000000..1995a85 --- /dev/null +++ b/res/drawable/seek_thumb.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/res/drawable/seek_track.xml b/res/drawable/seek_track.xml new file mode 100644 index 0000000..6eff8de --- /dev/null +++ b/res/drawable/seek_track.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/res/drawable/tab_bg.xml b/res/drawable/tab_bg.xml new file mode 100644 index 0000000..82f37c2 --- /dev/null +++ b/res/drawable/tab_bg.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/drawable/thin_progress.xml b/res/drawable/thin_progress.xml new file mode 100644 index 0000000..d93f4b0 --- /dev/null +++ b/res/drawable/thin_progress.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/res/layout/activity_home.xml b/res/layout/activity_home.xml new file mode 100644 index 0000000..b288611 --- /dev/null +++ b/res/layout/activity_home.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/activity_login.xml b/res/layout/activity_login.xml new file mode 100644 index 0000000..ed0d3f2 --- /dev/null +++ b/res/layout/activity_login.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +