commit c0b807de17b21903158a2fec3e43e305e3b81c50 Author: haxzamatic Date: Sun Feb 26 15:25:13 2012 -0500 Sindre Mehus diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 00000000..2566593c --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ant.properties b/ant.properties new file mode 100644 index 00000000..fb0849b1 --- /dev/null +++ b/ant.properties @@ -0,0 +1,20 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked in Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + +key.store=subsonic.keystore +key.alias=subsonic + diff --git a/assets/fonts/Storopia.ttf b/assets/fonts/Storopia.ttf new file mode 100644 index 00000000..cbdc4c1f Binary files /dev/null and b/assets/fonts/Storopia.ttf differ diff --git a/assets/html/en/index.html b/assets/html/en/index.html new file mode 100644 index 00000000..6462ef1f --- /dev/null +++ b/assets/html/en/index.html @@ -0,0 +1,98 @@ + + + Subsonic Help + + + + + + +

Welcome to Subsonic

+ +

+ With Subsonic you can easily stream or download music from your home computer to your Android phone + (and do lots of other cool stuff too). +

+ +

+ To install the Subsonic server software on your computer, please visit subsonic.org. + It's available for Windows, Mac, Linux and Unix. +

+ +

+ By default, this program is configured to use the Subsonic demo server. Once you've set up your own + server, please go to Settings and change the configuration so that it connects to your own computer. +

+ +

+ You can use this program freely for 30 days. After that you will have to make a donation to the Subsonic project. + As a donor you get the following benefits: +

+ + +

+ The suggested donation amount is €20, but you can give any amount you like. +

+ +

+ Click one of the buttons to go to PayPal where you can pay by credit card or by using your PayPal account. + Once the donation is processed, you will receive a license key by email. +

+ + + + + + + + +
+ + + + + + + +
€10
+
+ + + + + + + +
€20
+
+ + + + + + + +
€25
+
+ + + + + + + +
€30
+
+ +

+ For more information, please visit subsonic.org +

+ + + diff --git a/assets/html/fr/index.html b/assets/html/fr/index.html new file mode 100644 index 00000000..4ac8c9c3 --- /dev/null +++ b/assets/html/fr/index.html @@ -0,0 +1,100 @@ + + + Aide de Subsonic + + + + + + +

Bienvenue dans Subsonic

+ +

+ Avec Subsonic, vous pouvez facilement écouter ou télécharger de la musique à partir de votre ordinateur personnel sur votre appareil Android + (et faire plein d'autres trucs cools aussi). +

+ +

+ Pour installer le serveur Subsonic sur votre ordinateur, veuillez visiter subsonic.org. + Celui-ci est disponible pour Windows, Mac, Linux et Unix. +

+ +

+ Par défaut, cette application est configuré pour utiliser le serveur démo Subsonic. + Après avoir configuré votre serveur personnel, veuillez accéder aux Paramètres et modifier la configuration + afin de vous connecter à votre propre ordinateur. +

+ +

+ Vous pouvez utiliser cette application gratuitement pendant 30 jours. + Ensuite, vous devrez effectuer un don au projet Subsonic. + En tant que donateur, vous obtiendrez les bénéfices suivants: +

+ + +

+ Le montant suggéré pour le don est de 20€, mais n'importe quel montant fera l'affaire. +

+ +

+ Cliquez l'un des boutons suivants pour accéder à PayPal, d'où vous pourrez payer soit par carte de crédit ou en utilisant votre compte PayPal. + Une fois le don reçu et traité, vous recevrez votre clé d'activation par courriel. +

+ + + + + + + + +
+ + + + + + + +
10€
+
+ + + + + + + +
20€
+
+ + + + + + + +
25€
+
+ + + + + + + +
30€
+
+ +

+ Pour plus d'information, veuillez visiter subsonic.org +

+ + + diff --git a/assets/html/img/paypal.gif b/assets/html/img/paypal.gif new file mode 100644 index 00000000..d017250a Binary files /dev/null and b/assets/html/img/paypal.gif differ diff --git a/assets/html/img/subsonic.png b/assets/html/img/subsonic.png new file mode 100644 index 00000000..38c521c5 Binary files /dev/null and b/assets/html/img/subsonic.png differ diff --git a/assets/html/style.css b/assets/html/style.css new file mode 100644 index 00000000..9c1d55f2 --- /dev/null +++ b/assets/html/style.css @@ -0,0 +1,11 @@ +/* +* Taken from http://yui.yahooapis.com/2.8.0r4/build/fonts/fonts.css +*/ +body { + font: 13px / 1.231 arial, helvetica, clean, sans-serif; +} + +table { + font-size:inherit; + font:100%; +} \ No newline at end of file diff --git a/build.xml b/build.xml new file mode 100644 index 00000000..02e7d6ab --- /dev/null +++ b/build.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/debug.keystore b/debug.keystore new file mode 100644 index 00000000..1cb2c3d1 Binary files /dev/null and b/debug.keystore differ diff --git a/local.properties b/local.properties new file mode 100644 index 00000000..d80ed913 --- /dev/null +++ b/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked in Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=c:/progs/android-sdk-windows diff --git a/patches/jukebox-patch.txt b/patches/jukebox-patch.txt new file mode 100644 index 00000000..e796d88f --- /dev/null +++ b/patches/jukebox-patch.txt @@ -0,0 +1,1234 @@ +Index: AndroidManifest.xml +=================================================================== +--- AndroidManifest.xml (revision 2441) ++++ AndroidManifest.xml (working copy) +@@ -114,7 +114,8 @@ + a:authorities="net.sourceforge.subsonic.androidapp.provider.SearchSuggestionProvider"/> + + ++ a:value="net.sourceforge.subsonic.androidapp.activity.QueryReceiverActivity"/> ++ + + + +Index: res/drawable/menu_jukebox.png +=================================================================== +Cannot display: file marked as a binary type. +svn:mime-type = application/octet-stream + +Property changes on: res/drawable/menu_jukebox.png +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +Index: res/drawable-hdpi-v4/menu_jukebox.png +=================================================================== +Cannot display: file marked as a binary type. +svn:mime-type = application/octet-stream + +Property changes on: res/drawable-hdpi-v4/menu_jukebox.png +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +Index: res/layout/button_bar.xml +=================================================================== +--- res/layout/button_bar.xml (revision 2441) ++++ res/layout/button_bar.xml (working copy) +@@ -47,6 +47,14 @@ + a:layout_weight="1" + a:layout_width="0dp" + a:layout_height="wrap_content"/> ++ ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +Index: res/menu/jukebox_context.xml +=================================================================== +--- res/menu/jukebox_context.xml (revision 0) ++++ res/menu/jukebox_context.xml (revision 0) +@@ -0,0 +1,8 @@ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +Index: res/menu/select_album_context.xml +=================================================================== +--- res/menu/select_album_context.xml (revision 2441) ++++ res/menu/select_album_context.xml (working copy) +@@ -15,5 +15,6 @@ + a:id="@+id/album_menu_pin" + a:title="@string/common.pin" + /> ++ + + +Index: res/menu/select_artist_context.xml +=================================================================== +--- res/menu/select_artist_context.xml (revision 2441) ++++ res/menu/select_artist_context.xml (working copy) +@@ -15,5 +15,6 @@ + a:id="@+id/artist_menu_pin" + a:title="@string/common.pin" + /> ++ + + +Index: res/menu/select_song_context.xml +=================================================================== +--- res/menu/select_song_context.xml (revision 2441) ++++ res/menu/select_song_context.xml (working copy) +@@ -15,5 +15,10 @@ + a:id="@+id/song_menu_play_last" + a:title="@string/common.play_last" + /> ++ ++ + + +Index: res/values/strings.xml +=================================================================== +--- res/values/strings.xml (revision 2441) ++++ res/values/strings.xml (working copy) +@@ -226,6 +226,14 @@ + + One day left of trial period + %d days left of trial period +- ++ ++ Jukebox ++ Start ++ Stop ++ Next ++ Previous ++ Clear ++ Remove ++ Add to Jukebox + + +Index: src/net/sourceforge/subsonic/androidapp/activity/JukeboxActivity.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/activity/JukeboxActivity.java (revision 0) ++++ src/net/sourceforge/subsonic/androidapp/activity/JukeboxActivity.java (revision 0) +@@ -0,0 +1,235 @@ ++/* ++ This file is part of Subsonic. ++ ++ Subsonic is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Subsonic is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Subsonic. If not, see . ++ ++ Copyright 2009 (C) Sindre Mehus ++ */ ++ ++package net.sourceforge.subsonic.androidapp.activity; ++ ++import java.util.List; ++ ++import net.sourceforge.subsonic.androidapp.R; ++import net.sourceforge.subsonic.androidapp.domain.Jukebox; ++import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; ++import net.sourceforge.subsonic.androidapp.domain.MusicDirectory.Entry; ++import net.sourceforge.subsonic.androidapp.service.MusicService; ++import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory; ++import net.sourceforge.subsonic.androidapp.util.BackgroundTask; ++import net.sourceforge.subsonic.androidapp.util.JukeboxSongView; ++import net.sourceforge.subsonic.androidapp.util.ProgressListener; ++import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask; ++import net.sourceforge.subsonic.androidapp.util.Util; ++import android.os.Bundle; ++import android.view.ContextMenu; ++import android.view.MenuInflater; ++import android.view.MenuItem; ++import android.view.View; ++import android.view.View.OnClickListener; ++import android.view.ViewGroup; ++import android.widget.AdapterView; ++import android.widget.AdapterView.OnItemClickListener; ++import android.widget.ArrayAdapter; ++import android.widget.ImageButton; ++import android.widget.ListView; ++import android.widget.SeekBar; ++import android.widget.SeekBar.OnSeekBarChangeListener; ++ ++/** ++ * @author meld0 ++ * ++ */ ++public class JukeboxActivity extends SubsonicTabActivity implements ProgressListener, OnClickListener, OnSeekBarChangeListener, OnItemClickListener{ ++ ++ private ImageButton play, stop, next, prev, shuffle; ++ private ListView entryList; ++ private SeekBar gain; ++ private Jukebox jukebox; ++ ++ @Override ++ public void onCreate(Bundle savedInstanceState){ ++ super.onCreate(savedInstanceState); ++ setContentView(R.layout.jukebox); ++ ++ jukebox = new Jukebox(); ++ ++ play = (ImageButton) findViewById(R.id.jukebox_start); ++ stop = (ImageButton) findViewById(R.id.jukebox_stop); ++ prev = (ImageButton) findViewById(R.id.jukebox_previous); ++ next = (ImageButton) findViewById(R.id.jukebox_next); ++ shuffle = (ImageButton) findViewById(R.id.jukebox_shuffle); ++ entryList = (ListView) findViewById(R.id.jukebox_list); ++ ++ gain = (SeekBar) findViewById(R.id.jukebox_seek); ++ gain.setMax(100); ++ ++ play.setOnClickListener(this); ++ stop.setOnClickListener(this); ++ next.setOnClickListener(this); ++ prev.setOnClickListener(this); ++ shuffle.setOnClickListener(this); ++ gain.setOnSeekBarChangeListener(this); ++ entryList.setOnItemClickListener(this); ++ ++ registerForContextMenu(entryList); ++ load(); ++ } ++ ++ @Override ++ public void updateProgress(int messageId){ ++ ++ } ++ ++ private void load(){ ++ load(Jukebox.GET); ++ } ++ ++ private void load(String action){ ++ load(action, ""); ++ } ++ ++ private void load(final String action, final String additional){ ++ BackgroundTask task = new TabActivityBackgroundTask(this){ ++ ++ protected Boolean doInBackground() throws Throwable{ ++ boolean update = false; ++ if (!Util.isOffline(JukeboxActivity.this)) { ++ MusicService musicService = MusicServiceFactory.getMusicService(JukeboxActivity.this); ++ jukebox.lastAction = action; ++ jukebox = musicService.getJukebox(jukebox, JukeboxActivity.this, this, additional); ++ update = true; ++ } ++ return update; ++ } ++ ++ protected void done(Boolean result){ ++ if (jukebox.isSuccess()) { ++ if (jukebox.lastAction.equals(Jukebox.SET_GAIN)) { ++ jukebox.setGain((int) (Double.valueOf(additional.split("=")[1]) * 100)); ++ gain.setProgress(jukebox.getGain()); ++ } else if (jukebox.lastAction.equals(Jukebox.REMOVE_ITEM)) ((SongListAdapter) entryList.getAdapter()).remove((Entry) entryList.getAdapter().getItem( ++ Integer.valueOf(additional.split("=")[1]))); ++ else if (jukebox.lastAction.equals(Jukebox.CLEAR_PLAYLIST)) ((SongListAdapter) entryList.getAdapter()).clear(); ++ else if (jukebox.lastAction.equals(Jukebox.SKIP_TO_INDEX)) jukebox.setCurrentIndex(Integer.valueOf(additional.split("=")[1])); ++ ++ if (jukebox.isNewPlaylist()) entryList.setAdapter(new SongListAdapter(jukebox.getChildren())); ++ } ++ } ++ }; ++ task.execute(); ++ } ++ ++ @Override ++ public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo){ ++ super.onCreateContextMenu(menu, view, menuInfo); ++ MenuInflater inflater = getMenuInflater(); ++ inflater.inflate(R.menu.jukebox_context, menu); ++ } ++ ++ @Override ++ public boolean onContextItemSelected(MenuItem menuItem){ ++ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo(); ++ switch (menuItem.getItemId()) { ++ case R.id.jukebox_remove: ++ load(Jukebox.REMOVE_ITEM, "index=" + info.position); ++ break; ++ case R.id.jukebox_clear: ++ load(Jukebox.CLEAR_PLAYLIST); ++ break; ++ default: ++ return super.onContextItemSelected(menuItem); ++ } ++ return true; ++ } ++ ++ @Override ++ protected void onResume(){ ++ super.onResume(); ++ load(); ++ } ++ ++ @Override ++ public void onClick(View arg0){ ++ if (arg0.equals(this.play)) { ++ load(Jukebox.START_PLAYBACK); ++ } else if (arg0.equals(this.stop)) { ++ load(Jukebox.STOP_PLAYBACK); ++ } else if (arg0.equals(this.prev)) { ++ loadW(); ++ load(Jukebox.SKIP_TO_INDEX, "index=" + (jukebox.getCurrentIndex() - 1)); // TODO // MAYBE // BETTER // ? ++ } else if (arg0.equals(this.next)) { ++ loadW(); ++ load(Jukebox.SKIP_TO_INDEX, "index=" + (jukebox.getCurrentIndex() + 1)); ++ } else if (arg0.equals(this.shuffle)) { ++ load(Jukebox.SHUFFLE_PLAYLIST); ++ load(); ++ } ++ } ++ ++ @Override ++ public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2){ ++ } ++ ++ @Override ++ public void onStartTrackingTouch(SeekBar arg0){ ++ } ++ ++ @Override ++ public void onStopTrackingTouch(SeekBar arg0){ ++ load(Jukebox.SET_GAIN, "gain=" + ((double) arg0.getProgress() / 100)); ++ } ++ ++ private class SongListAdapter extends ArrayAdapter{ ++ ++ public SongListAdapter(List entries){ ++ super(JukeboxActivity.this, android.R.layout.simple_list_item_1, entries); ++ } ++ ++ @Override ++ public View getView(int position, View convertView, ViewGroup parent){ ++ JukeboxSongView view; ++ if (convertView != null && convertView instanceof JukeboxSongView) { ++ view = (JukeboxSongView) convertView; ++ } else { ++ view = new JukeboxSongView(JukeboxActivity.this); ++ } ++ MusicDirectory.Entry entry = getItem(position); ++ ++ if (position == jukebox.getCurrentIndex()) { ++ view.setSong(entry, false, true); ++ } else view.setSong(entry, false, false); ++ return view; ++ } ++ } ++ ++ @Override ++ public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3){ ++ load(Jukebox.SKIP_TO_INDEX, "index=" + arg3); ++ } ++ ++ public void loadW(){ ++ if (!Util.isOffline(JukeboxActivity.this)) { ++ MusicService musicService = MusicServiceFactory.getMusicService(JukeboxActivity.this); ++ jukebox.lastAction = Jukebox.GET; ++ try { ++ jukebox = musicService.getJukebox(jukebox, JukeboxActivity.this, this, ""); ++ } catch (Exception e) { ++ // TODO Auto-generated catch block ++ e.printStackTrace(); ++ } ++ } ++ } ++ ++} +Index: src/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.java (working copy) +@@ -252,6 +252,9 @@ + case R.id.album_menu_pin: + downloadRecursively(entry.getId(), true, true, false); + break; ++ case R.id.album_menu_jukebox_add: ++ addToJukebox(entry.getId()); ++ break; + case R.id.song_menu_play_now: + getDownloadService().download(songs, false, true, true); + break; +@@ -261,6 +264,8 @@ + case R.id.song_menu_play_last: + getDownloadService().download(songs, false, false, false); + break; ++ case R.id.song_menu_jukebox_add: ++ addToJukebox(entry); + default: + return super.onContextItemSelected(menuItem); + } +Index: src/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.java (working copy) +@@ -210,6 +210,9 @@ + case R.id.artist_menu_pin: + downloadRecursively(artist.getId(), true, true, false); + break; ++ case R.id.artist_menu_jukebox_add: ++ addToJukebox(artist.getId()); ++ break; + default: + return super.onContextItemSelected(menuItem); + } +Index: src/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.java (working copy) +@@ -23,6 +23,16 @@ + import java.util.LinkedList; + import java.util.List; + ++import net.sourceforge.subsonic.androidapp.R; ++import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; ++import net.sourceforge.subsonic.androidapp.service.DownloadService; ++import net.sourceforge.subsonic.androidapp.service.DownloadServiceImpl; ++import net.sourceforge.subsonic.androidapp.service.MusicService; ++import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory; ++import net.sourceforge.subsonic.androidapp.util.Constants; ++import net.sourceforge.subsonic.androidapp.util.ImageLoader; ++import net.sourceforge.subsonic.androidapp.util.ModalBackgroundTask; ++import net.sourceforge.subsonic.androidapp.util.Util; + import android.app.Activity; + import android.content.Context; + import android.content.Intent; +@@ -39,16 +49,6 @@ + import android.view.View; + import android.view.Window; + import android.widget.TextView; +-import net.sourceforge.subsonic.androidapp.R; +-import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; +-import net.sourceforge.subsonic.androidapp.service.DownloadService; +-import net.sourceforge.subsonic.androidapp.service.DownloadServiceImpl; +-import net.sourceforge.subsonic.androidapp.service.MusicService; +-import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory; +-import net.sourceforge.subsonic.androidapp.util.Constants; +-import net.sourceforge.subsonic.androidapp.util.ImageLoader; +-import net.sourceforge.subsonic.androidapp.util.ModalBackgroundTask; +-import net.sourceforge.subsonic.androidapp.util.Util; + + /** + * @author Sindre Mehus +@@ -63,6 +63,7 @@ + private View musicButton; + private View searchButton; + private View playlistButton; ++ private View jukeboxButton; + private View nowPlayingButton; + + @Override +@@ -118,6 +119,14 @@ + Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); + } + }); ++ ++ jukeboxButton = findViewById(R.id.button_bar_jukebox); ++ jukeboxButton.setOnClickListener(new View.OnClickListener() { ++ @Override ++ public void onClick(View view) { ++ Util.startActivityWithoutTransition(SubsonicTabActivity.this, JukeboxActivity.class); ++ } ++ }); + + nowPlayingButton = findViewById(R.id.button_bar_now_playing); + nowPlayingButton.setOnClickListener(new View.OnClickListener() { +@@ -225,6 +234,22 @@ + int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE; + searchButton.setVisibility(visibility); + playlistButton.setVisibility(visibility); ++ jukeboxButton.setVisibility(visibility); ++ /* ++ * The following block would check for valid Permissions ++ * but it is called too often -> network traffic/ problems ? ++ * ++ MusicService musicService = MusicServiceFactory.getMusicService(this); ++ try { ++ User user = musicService.getUser(this, null); ++ if(!user.isJukeboxControl()){ ++ jukeboxButton.setVisibility(View.GONE); ++ } ++ } catch (Exception e) { ++ // TODO Auto-generated catch block ++ e.printStackTrace(); ++ } ++ */ + } + + public void setProgressVisible(boolean visible) { +@@ -363,5 +388,67 @@ + } + } + } ++ ++ protected void addToJukebox(String id) { ++ ++ List entries = new LinkedList(); ++ MusicService musicService = MusicServiceFactory.getMusicService(this); ++ MusicDirectory root; ++ ++ try { ++ root = musicService.getMusicDirectory(id, false, SubsonicTabActivity.this, null); ++ collectEntries(root, entries); ++ } catch (Exception e) { ++ // TODO Auto-generated catch block ++ e.printStackTrace(); ++ } ++ ++ ++ StringBuilder build = new StringBuilder(); ++ build.append("action=add"); ++ for(MusicDirectory.Entry entry2: entries){ ++ build.append("&id="); ++ build.append(entry2.getId()); ++ } ++ try { ++ musicService.getJukebox(null, this, null, build.toString()); ++ } catch (Exception e) { ++ // TODO Auto-generated catch block ++ e.printStackTrace(); ++ } ++ ++ } ++ ++ protected void addToJukebox(MusicDirectory.Entry entry) { ++ try { ++ MusicService musicService = MusicServiceFactory.getMusicService(this); ++ musicService.getJukebox(null, this, null, "action=add&id="+entry.getId()); ++ } catch (Exception e) { ++ // TODO Auto-generated catch block ++ e.printStackTrace(); ++ } ++ } ++ ++ private List collectEntries(MusicDirectory parent, List songs){ ++ for (MusicDirectory.Entry song : parent.getChildren(false, true)) { ++ if (!song.isVideo()) { ++ songs.add(song); ++ } ++ } ++ for (MusicDirectory.Entry dir : parent.getChildren(true, false)) { ++ MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); ++ try { ++ collectEntries(musicService.getMusicDirectory(dir.getId(), false, SubsonicTabActivity.this, null), songs); ++ } catch (Exception e) { ++ // TODO Auto-generated catch block ++ e.printStackTrace(); ++ } ++ } ++ ++ return songs; ++ } ++ ++ ++ + } + +Index: src/net/sourceforge/subsonic/androidapp/domain/Jukebox.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/domain/Jukebox.java (revision 0) ++++ src/net/sourceforge/subsonic/androidapp/domain/Jukebox.java (revision 0) +@@ -0,0 +1,113 @@ ++/* ++ This file is part of Subsonic. ++ ++ Subsonic is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Subsonic is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Subsonic. If not, see . ++ ++ Copyright 2009 (C) Sindre Mehus ++ */ ++ ++package net.sourceforge.subsonic.androidapp.domain; ++ ++import java.io.Serializable; ++import java.util.List; ++ ++/** ++ * @author meld0 ++ * ++ */ ++public class Jukebox extends MusicDirectory implements Serializable{ ++ ++ public String lastAction; ++ ++ //get, start, stop, skip, add, clear, remove, shuffle, setGain ++ public static final String GET = "get"; ++ public static final String START_PLAYBACK = "start"; ++ public static final String STOP_PLAYBACK = "stop"; ++ public static final String SKIP_TO_INDEX = "skip"; ++ public static final String ADD_TO_PLAYLIST = "add"; ++ public static final String CLEAR_PLAYLIST = "clear"; ++ public static final String REMOVE_ITEM = "remove"; ++ public static final String SHUFFLE_PLAYLIST = "shuffle"; ++ public static final String SET_GAIN = "setGain"; ++ ++ public Jukebox() { ++ super(); ++ } ++ ++ public boolean isPlaying() { ++ return playing; ++ } ++ ++ public void setPlaying(boolean playing) { ++ this.playing = playing; ++ } ++ ++ public int getGain() { ++ return gain; ++ } ++ ++ public void setGain(int gain) { ++ this.gain = gain; ++ } ++ ++ public int getCurrentIndex() { ++ return currentIndex; ++ } ++ ++ public void setCurrentIndex(int currentIndex) { ++ this.currentIndex = currentIndex; ++ } ++ ++ public boolean isAvailable() { ++ return available; ++ } ++ ++ public boolean isSuccess() { ++ return success; ++ } ++ ++ public void setAvailable(boolean available) { ++ this.available = available; ++ } ++ ++ public void setSuccess(boolean success) { ++ this.success = success; ++ } ++ ++ public boolean isNewPlaylist() { ++ return newPlaylist; ++ } ++ ++ public void setNewPlaylist(boolean newPlaylist) { ++ this.newPlaylist = newPlaylist; ++ } ++ ++ private boolean playing = false; ++ private int gain = 0; ++ private int currentIndex = 0; ++ private boolean available = false; ++ private boolean success = false; ++ private boolean newPlaylist = false; ++ ++ public void addChildren(List children){ ++ super.addChildren(children); ++ } ++ ++ public void reset(){ ++ this.available = false; ++ this.success = false; ++ this.newPlaylist = false; ++ } ++ ++} +Index: src/net/sourceforge/subsonic/androidapp/domain/MusicDirectory.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/domain/MusicDirectory.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/domain/MusicDirectory.java (working copy) +@@ -59,6 +59,13 @@ + } + return result; + } ++ ++ protected void addChildren(List children){ ++ if(!children.isEmpty()) { ++ this.children.clear(); ++ this.children.addAll(children); ++ } ++ } + + public static class Entry implements Serializable { + private String id; +Index: src/net/sourceforge/subsonic/androidapp/domain/User.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/domain/User.java (revision 0) ++++ src/net/sourceforge/subsonic/androidapp/domain/User.java (revision 0) +@@ -0,0 +1,43 @@ ++/* ++ This file is part of Subsonic. ++ ++ Subsonic is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Subsonic is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Subsonic. If not, see . ++ ++ Copyright 2009 (C) Sindre Mehus ++ */ ++ ++package net.sourceforge.subsonic.androidapp.domain; ++ ++import java.io.Serializable; ++ ++/** ++ * @author meld0 ++ * ++ */ ++public class User implements Serializable{ ++ ++ //TODO implement missing user attributes ++ ++ private boolean jukeboxControl; ++ ++ public boolean isJukeboxControl() { ++ return jukeboxControl; ++ } ++ ++ public void setJukeboxControl(boolean jukeboxControl) { ++ this.jukeboxControl = jukeboxControl; ++ } ++ ++ ++} +Index: src/net/sourceforge/subsonic/androidapp/service/CachedMusicService.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/service/CachedMusicService.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/service/CachedMusicService.java (working copy) +@@ -21,9 +21,11 @@ + import android.content.Context; + import android.graphics.Bitmap; + import net.sourceforge.subsonic.androidapp.domain.Indexes; ++import net.sourceforge.subsonic.androidapp.domain.Jukebox; + import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; + import net.sourceforge.subsonic.androidapp.domain.MusicFolder; + import net.sourceforge.subsonic.androidapp.domain.Playlist; ++import net.sourceforge.subsonic.androidapp.domain.User; + import net.sourceforge.subsonic.androidapp.domain.Version; + import net.sourceforge.subsonic.androidapp.domain.SearchResult; + import net.sourceforge.subsonic.androidapp.domain.SearchCritera; +@@ -199,4 +201,17 @@ + restUrl = newUrl; + } + } ++ ++ @Override ++ public Jukebox getJukebox(Jukebox jukebox, Context context, ++ ProgressListener progressListener, String action) throws Exception { ++ return musicService.getJukebox(jukebox, context, progressListener, action); ++ } ++ ++ @Override ++ public User getUser(Context context, ProgressListener progressListener) ++ throws Exception { ++ return musicService.getUser(context, progressListener); ++ } ++ + } +Index: src/net/sourceforge/subsonic/androidapp/service/MusicService.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/service/MusicService.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/service/MusicService.java (working copy) +@@ -21,9 +21,11 @@ + import android.content.Context; + import android.graphics.Bitmap; + import net.sourceforge.subsonic.androidapp.domain.Indexes; ++import net.sourceforge.subsonic.androidapp.domain.Jukebox; + import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; + import net.sourceforge.subsonic.androidapp.domain.MusicFolder; + import net.sourceforge.subsonic.androidapp.domain.Playlist; ++import net.sourceforge.subsonic.androidapp.domain.User; + import net.sourceforge.subsonic.androidapp.domain.Version; + import net.sourceforge.subsonic.androidapp.domain.SearchResult; + import net.sourceforge.subsonic.androidapp.domain.SearchCritera; +@@ -74,4 +76,8 @@ + Version getLatestVersion(Context context, ProgressListener progressListener) throws Exception; + + String getVideoUrl(Context context, String id); ++ ++ Jukebox getJukebox(Jukebox jukebox, Context context, ProgressListener progressListener , String action) throws Exception; ++ ++ User getUser(Context context, ProgressListener progressListener) throws Exception; + } +\ No newline at end of file +Index: src/net/sourceforge/subsonic/androidapp/service/RESTMusicService.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/service/RESTMusicService.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/service/RESTMusicService.java (working copy) +@@ -28,6 +28,7 @@ + import android.util.Log; + import net.sourceforge.subsonic.androidapp.R; + import net.sourceforge.subsonic.androidapp.domain.Indexes; ++import net.sourceforge.subsonic.androidapp.domain.Jukebox; + import net.sourceforge.subsonic.androidapp.domain.Lyrics; + import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; + import net.sourceforge.subsonic.androidapp.domain.MusicFolder; +@@ -35,10 +36,12 @@ + import net.sourceforge.subsonic.androidapp.domain.SearchCritera; + import net.sourceforge.subsonic.androidapp.domain.SearchResult; + import net.sourceforge.subsonic.androidapp.domain.ServerInfo; ++import net.sourceforge.subsonic.androidapp.domain.User; + import net.sourceforge.subsonic.androidapp.domain.Version; + import net.sourceforge.subsonic.androidapp.service.parser.AlbumListParser; + import net.sourceforge.subsonic.androidapp.service.parser.ErrorParser; + import net.sourceforge.subsonic.androidapp.service.parser.IndexesParser; ++import net.sourceforge.subsonic.androidapp.service.parser.JukeboxParser; + import net.sourceforge.subsonic.androidapp.service.parser.LicenseParser; + import net.sourceforge.subsonic.androidapp.service.parser.LyricsParser; + import net.sourceforge.subsonic.androidapp.service.parser.MusicDirectoryParser; +@@ -48,6 +51,7 @@ + import net.sourceforge.subsonic.androidapp.service.parser.RandomSongsParser; + import net.sourceforge.subsonic.androidapp.service.parser.SearchResult2Parser; + import net.sourceforge.subsonic.androidapp.service.parser.SearchResultParser; ++import net.sourceforge.subsonic.androidapp.service.parser.UserParser; + import net.sourceforge.subsonic.androidapp.service.parser.VersionParser; + import net.sourceforge.subsonic.androidapp.service.ssl.SSLSocketFactory; + import net.sourceforge.subsonic.androidapp.service.ssl.TrustSelfSignedStrategy; +@@ -195,6 +199,53 @@ + Util.close(reader); + } + } ++ ++ public Jukebox getJukebox(Jukebox jukebox, Context context, ProgressListener progressListener, String action) throws Exception { ++ ++ List parameterNames = new ArrayList(); ++ List parameterValues = new ArrayList(); ++ if(jukebox != null){ ++ parameterNames.add("action"); ++ parameterValues.add(jukebox.lastAction); ++ } ++ if(!action.isEmpty()){ ++ String[] names_values = action.split("&"); ++ for(String name_value: names_values){ ++ String[] pair = name_value.split("="); ++ parameterNames.add(pair[0]); ++ parameterValues.add(pair[1]); ++ } ++ } ++ ++ Reader reader = getReader(context, progressListener, "jukeboxControl", null, parameterNames, parameterValues); ++ ++ try { ++ return new JukeboxParser(context).parse(jukebox, reader, progressListener); ++ } finally { ++ Util.close(reader); ++ } ++ } ++ ++ public User getUser(Context context, ProgressListener progressListener) throws Exception { ++ ++ SharedPreferences prefs = Util.getPreferences(context); ++ int instance = prefs.getInt(Constants.PREFERENCES_KEY_SERVER_INSTANCE, 1); ++ String username = prefs.getString(Constants.PREFERENCES_KEY_USERNAME + instance, null); ++ ++ List parameterNames = new ArrayList(); ++ List parameterValues = new ArrayList(); ++ parameterNames.add("username"); ++ parameterValues.add(username); ++ ++ Reader reader = getReader(context, progressListener, "getUser", null, parameterNames, parameterValues); ++ ++ try { ++ return new UserParser(context).parse(reader, progressListener); ++ } finally { ++ Util.close(reader); ++ } ++ } ++ + + @Override + public Indexes getIndexes(String musicFolderId, boolean refresh, Context context, ProgressListener progressListener) throws Exception { +Index: src/net/sourceforge/subsonic/androidapp/service/parser/AbstractParser.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/service/parser/AbstractParser.java (revision 2441) ++++ src/net/sourceforge/subsonic/androidapp/service/parser/AbstractParser.java (working copy) +@@ -97,6 +97,11 @@ + String s = get(name); + return s == null ? null : Long.valueOf(s); + } ++ ++ protected Double getDouble(String name) { ++ String s = get(name); ++ return s == null ? null : Double.valueOf(s); ++ } + + protected void init(Reader reader) throws Exception { + parser = Xml.newPullParser(); +Index: src/net/sourceforge/subsonic/androidapp/service/parser/JukeboxParser.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/service/parser/JukeboxParser.java (revision 0) ++++ src/net/sourceforge/subsonic/androidapp/service/parser/JukeboxParser.java (revision 0) +@@ -0,0 +1,86 @@ ++/* ++ This file is part of Subsonic. ++ ++ Subsonic is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Subsonic is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Subsonic. If not, see . ++ ++ Copyright 2009 (C) Sindre Mehus ++ */ ++ ++package net.sourceforge.subsonic.androidapp.service.parser; ++ ++import java.io.Reader; ++ ++import net.sourceforge.subsonic.androidapp.R; ++import net.sourceforge.subsonic.androidapp.domain.Jukebox; ++import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; ++import net.sourceforge.subsonic.androidapp.util.ProgressListener; ++ ++import org.xmlpull.v1.XmlPullParser; ++ ++import android.content.Context; ++ ++/** ++ * @author meld0 ++ * ++ */ ++public class JukeboxParser extends MusicDirectoryEntryParser { ++ ++ public JukeboxParser(Context context) { ++ super(context); ++ } ++ ++ public Jukebox parse(Jukebox jukebox, Reader reader, ++ ProgressListener progressListener) throws Exception { ++ updateProgress(progressListener, R.string.parser_reading); ++ ++ if (jukebox == null) ++ jukebox = new Jukebox(); ++ jukebox.reset(); ++ init(reader); ++ jukebox.setAvailable(true); ++ ++ MusicDirectory dir = new MusicDirectory(); ++ ++ int eventType; ++ do { ++ eventType = nextParseEvent(); ++ if (eventType == XmlPullParser.START_TAG) { ++ String name = getElementName(); ++ if ("entry".equals(name)) { ++ dir.addChild(parseEntry()); ++ jukebox.setNewPlaylist(true); ++ } else if ("jukeboxPlaylist".equals(name)) { ++ jukebox.setPlaying(getBoolean("playing")); ++ jukebox.setGain((int) (getDouble("gain") * 100)); ++ jukebox.setCurrentIndex(getInteger("currentIndex")); ++ } else if ("subsonic-response".equals(name)) { ++ if (get("status").equals("ok")) ++ jukebox.setSuccess(true); ++ } else if ("error".equals(name)) { ++ handleError(); ++ } ++ } ++ } while (eventType != XmlPullParser.END_DOCUMENT); ++ ++ if(jukebox.isNewPlaylist()) { ++ jukebox.addChildren(dir.getChildren()); ++ } ++ ++ validate(); ++ updateProgress(progressListener, R.string.parser_reading_done); ++ ++ return jukebox; ++ } ++ ++} +Index: src/net/sourceforge/subsonic/androidapp/service/parser/UserParser.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/service/parser/UserParser.java (revision 0) ++++ src/net/sourceforge/subsonic/androidapp/service/parser/UserParser.java (revision 0) +@@ -0,0 +1,67 @@ ++/* ++ This file is part of Subsonic. ++ ++ Subsonic is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Subsonic is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Subsonic. If not, see . ++ ++ Copyright 2009 (C) Sindre Mehus ++ */ ++ ++package net.sourceforge.subsonic.androidapp.service.parser; ++ ++import java.io.Reader; ++ ++import net.sourceforge.subsonic.androidapp.R; ++import net.sourceforge.subsonic.androidapp.domain.User; ++import net.sourceforge.subsonic.androidapp.util.ProgressListener; ++ ++import org.xmlpull.v1.XmlPullParser; ++ ++import android.content.Context; ++ ++/** ++ * @author meld0 ++ * ++ */ ++public class UserParser extends AbstractParser{ ++ ++ public UserParser(Context context) { ++ super(context); ++ } ++ ++ public User parse(Reader reader, ProgressListener progressListener) throws Exception { ++ updateProgress(progressListener, R.string.parser_reading); ++ init(reader); ++ ++ User user = new User(); ++ int eventType; ++ do { ++ eventType = nextParseEvent(); ++ if (eventType == XmlPullParser.START_TAG) { ++ String name = getElementName(); ++ if ("user".equals(name)) { ++ user.setJukeboxControl(getBoolean("jukeboxRole")); ++ } else if ("error".equals(name)) { ++ handleError(); ++ } ++ } ++ } while (eventType != XmlPullParser.END_DOCUMENT); ++ ++ validate(); ++ updateProgress(progressListener, R.string.parser_reading_done); ++ ++ return user; ++ } ++ ++ ++} +Index: src/net/sourceforge/subsonic/androidapp/util/JukeboxSongView.java +=================================================================== +--- src/net/sourceforge/subsonic/androidapp/util/JukeboxSongView.java (revision 0) ++++ src/net/sourceforge/subsonic/androidapp/util/JukeboxSongView.java (revision 0) +@@ -0,0 +1,88 @@ ++/* ++ This file is part of Subsonic. ++ ++ Subsonic is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Subsonic is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Subsonic. If not, see . ++ ++ Copyright 2009 (C) Sindre Mehus ++ */ ++ ++package net.sourceforge.subsonic.androidapp.util; ++ ++import net.sourceforge.subsonic.androidapp.R; ++import net.sourceforge.subsonic.androidapp.domain.MusicDirectory; ++import android.content.Context; ++import android.view.LayoutInflater; ++import android.view.View; ++import android.widget.CheckedTextView; ++import android.widget.LinearLayout; ++import android.widget.TextView; ++ ++/** ++ * @author meld0 ++ * ++ */ ++public class JukeboxSongView extends LinearLayout{ ++ ++ private CheckedTextView checkedTextView; ++ private TextView titleTextView; ++ private TextView artistTextView; ++ private TextView durationTextView; ++ private TextView statusTextView; ++ private MusicDirectory.Entry song; ++ ++ public JukeboxSongView(Context context) { ++ super(context); ++ LayoutInflater.from(context).inflate(R.layout.song_list_item, this, true); ++ ++ checkedTextView = (CheckedTextView) findViewById(R.id.song_check); ++ titleTextView = (TextView) findViewById(R.id.song_title); ++ artistTextView = (TextView) findViewById(R.id.song_artist); ++ durationTextView = (TextView) findViewById(R.id.song_duration); ++ statusTextView = (TextView) findViewById(R.id.song_status); ++ ++ } ++ ++ public void setSong(MusicDirectory.Entry song, boolean checkable, boolean playing) { ++ this.song = song; ++ StringBuilder artist = new StringBuilder(40); ++ ++ String bitRate = null; ++ if (song.getBitRate() != null) { ++ bitRate = String.format(getContext().getString(R.string.song_details_kbps), song.getBitRate()); ++ } ++ ++ String fileFormat = null; ++ if (song.getTranscodedSuffix() != null && !song.getTranscodedSuffix().equals(song.getSuffix())) { ++ fileFormat = String.format("%s > %s", song.getSuffix(), song.getTranscodedSuffix()); ++ } else { ++ fileFormat = song.getSuffix(); ++ } ++ ++ artist.append(song.getArtist()).append(" (") ++ .append(String.format(getContext().getString(R.string.song_details_all), bitRate == null ? "" : bitRate, fileFormat)) ++ .append(")"); ++ ++ titleTextView.setText(song.getTitle()); ++ artistTextView.setText(artist); ++ durationTextView.setText(Util.formatDuration(song.getDuration())); ++ checkedTextView.setVisibility(checkable && !song.isVideo() ? View.VISIBLE : View.GONE); ++ ++ if(playing){ ++ titleTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.stat_notify_playing, 0, 0, 0); ++ }else{ ++ titleTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); ++ } ++ } ++ ++} diff --git a/proguard.cfg b/proguard.cfg new file mode 100644 index 00000000..f0b04dc3 --- /dev/null +++ b/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/project.properties b/project.properties new file mode 100644 index 00000000..f049142c --- /dev/null +++ b/project.properties @@ -0,0 +1,11 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-10 diff --git a/res/anim/push_down_in.xml b/res/anim/push_down_in.xml new file mode 100644 index 00000000..6ab9a047 --- /dev/null +++ b/res/anim/push_down_in.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/res/anim/push_down_out.xml b/res/anim/push_down_out.xml new file mode 100644 index 00000000..ce36458a --- /dev/null +++ b/res/anim/push_down_out.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/res/anim/push_up_in.xml b/res/anim/push_up_in.xml new file mode 100644 index 00000000..6ef582c4 --- /dev/null +++ b/res/anim/push_up_in.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/res/anim/push_up_out.xml b/res/anim/push_up_out.xml new file mode 100644 index 00000000..2b267d59 --- /dev/null +++ b/res/anim/push_up_out.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/res/drawable-hdpi-v4/action_play_all.png b/res/drawable-hdpi-v4/action_play_all.png new file mode 100644 index 00000000..ff61f00d Binary files /dev/null and b/res/drawable-hdpi-v4/action_play_all.png differ diff --git a/res/drawable-hdpi-v4/action_refresh.png b/res/drawable-hdpi-v4/action_refresh.png new file mode 100644 index 00000000..e922c3f3 Binary files /dev/null and b/res/drawable-hdpi-v4/action_refresh.png differ diff --git a/res/drawable-hdpi-v4/action_search.png b/res/drawable-hdpi-v4/action_search.png new file mode 100644 index 00000000..83933141 Binary files /dev/null and b/res/drawable-hdpi-v4/action_search.png differ diff --git a/res/drawable-hdpi-v4/action_shuffle.png b/res/drawable-hdpi-v4/action_shuffle.png new file mode 100644 index 00000000..df145309 Binary files /dev/null and b/res/drawable-hdpi-v4/action_shuffle.png differ diff --git a/res/drawable-hdpi-v4/actionbar_button_normal.9.png b/res/drawable-hdpi-v4/actionbar_button_normal.9.png new file mode 100644 index 00000000..385f751c Binary files /dev/null and b/res/drawable-hdpi-v4/actionbar_button_normal.9.png differ diff --git a/res/drawable-hdpi-v4/album_art_background.png b/res/drawable-hdpi-v4/album_art_background.png new file mode 100644 index 00000000..f0757695 Binary files /dev/null and b/res/drawable-hdpi-v4/album_art_background.png differ diff --git a/res/drawable-hdpi-v4/appwidget_bg.9.png b/res/drawable-hdpi-v4/appwidget_bg.9.png new file mode 100644 index 00000000..3b29eae7 Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_bg.9.png differ diff --git a/res/drawable-hdpi-v4/appwidget_divider.9.png b/res/drawable-hdpi-v4/appwidget_divider.9.png new file mode 100644 index 00000000..3445e842 Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_divider.9.png differ diff --git a/res/drawable-hdpi-v4/appwidget_inner_focus_c.9.png b/res/drawable-hdpi-v4/appwidget_inner_focus_c.9.png new file mode 100644 index 00000000..a949bd2c Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_inner_focus_c.9.png differ diff --git a/res/drawable-hdpi-v4/appwidget_inner_focus_l.9.png b/res/drawable-hdpi-v4/appwidget_inner_focus_l.9.png new file mode 100644 index 00000000..4aaca6c5 Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_inner_focus_l.9.png differ diff --git a/res/drawable-hdpi-v4/appwidget_inner_focus_r.9.png b/res/drawable-hdpi-v4/appwidget_inner_focus_r.9.png new file mode 100644 index 00000000..1fc0f900 Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_inner_focus_r.9.png differ diff --git a/res/drawable-hdpi-v4/appwidget_inner_press_c.9.png b/res/drawable-hdpi-v4/appwidget_inner_press_c.9.png new file mode 100644 index 00000000..ca6f16cd Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_inner_press_c.9.png differ diff --git a/res/drawable-hdpi-v4/appwidget_inner_press_l.9.png b/res/drawable-hdpi-v4/appwidget_inner_press_l.9.png new file mode 100644 index 00000000..642eb3d3 Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_inner_press_l.9.png differ diff --git a/res/drawable-hdpi-v4/appwidget_inner_press_r.9.png b/res/drawable-hdpi-v4/appwidget_inner_press_r.9.png new file mode 100644 index 00000000..5e1f70a3 Binary files /dev/null and b/res/drawable-hdpi-v4/appwidget_inner_press_r.9.png differ diff --git a/res/drawable-hdpi-v4/ic_appwidget_music_next.png b/res/drawable-hdpi-v4/ic_appwidget_music_next.png new file mode 100644 index 00000000..99d28766 Binary files /dev/null and b/res/drawable-hdpi-v4/ic_appwidget_music_next.png differ diff --git a/res/drawable-hdpi-v4/ic_appwidget_music_pause.png b/res/drawable-hdpi-v4/ic_appwidget_music_pause.png new file mode 100644 index 00000000..a05a8c50 Binary files /dev/null and b/res/drawable-hdpi-v4/ic_appwidget_music_pause.png differ diff --git a/res/drawable-hdpi-v4/ic_appwidget_music_play.png b/res/drawable-hdpi-v4/ic_appwidget_music_play.png new file mode 100644 index 00000000..a754b920 Binary files /dev/null and b/res/drawable-hdpi-v4/ic_appwidget_music_play.png differ diff --git a/res/drawable-hdpi-v4/ic_appwidget_music_previous.png b/res/drawable-hdpi-v4/ic_appwidget_music_previous.png new file mode 100644 index 00000000..7fb3921b Binary files /dev/null and b/res/drawable-hdpi-v4/ic_appwidget_music_previous.png differ diff --git a/res/drawable-hdpi-v4/ic_menu_exit.png b/res/drawable-hdpi-v4/ic_menu_exit.png new file mode 100644 index 00000000..28cad85e Binary files /dev/null and b/res/drawable-hdpi-v4/ic_menu_exit.png differ diff --git a/res/drawable-hdpi-v4/ic_menu_help.png b/res/drawable-hdpi-v4/ic_menu_help.png new file mode 100644 index 00000000..7e14e95d Binary files /dev/null and b/res/drawable-hdpi-v4/ic_menu_help.png differ diff --git a/res/drawable-hdpi-v4/ic_menu_remove_all.png b/res/drawable-hdpi-v4/ic_menu_remove_all.png new file mode 100644 index 00000000..112196be Binary files /dev/null and b/res/drawable-hdpi-v4/ic_menu_remove_all.png differ diff --git a/res/drawable-hdpi-v4/ic_menu_save.png b/res/drawable-hdpi-v4/ic_menu_save.png new file mode 100644 index 00000000..34f6e01a Binary files /dev/null and b/res/drawable-hdpi-v4/ic_menu_save.png differ diff --git a/res/drawable-hdpi-v4/ic_menu_screen_on_off.png b/res/drawable-hdpi-v4/ic_menu_screen_on_off.png new file mode 100644 index 00000000..db9235fc Binary files /dev/null and b/res/drawable-hdpi-v4/ic_menu_screen_on_off.png differ diff --git a/res/drawable-hdpi-v4/ic_menu_settings.png b/res/drawable-hdpi-v4/ic_menu_settings.png new file mode 100644 index 00000000..2ffcec52 Binary files /dev/null and b/res/drawable-hdpi-v4/ic_menu_settings.png differ diff --git a/res/drawable-hdpi-v4/ic_menu_shuffle.png b/res/drawable-hdpi-v4/ic_menu_shuffle.png new file mode 100644 index 00000000..22ee1d50 Binary files /dev/null and b/res/drawable-hdpi-v4/ic_menu_shuffle.png differ diff --git a/res/drawable-hdpi-v4/launch.png b/res/drawable-hdpi-v4/launch.png new file mode 100644 index 00000000..10693360 Binary files /dev/null and b/res/drawable-hdpi-v4/launch.png differ diff --git a/res/drawable-hdpi-v4/list_item_artist.9.png b/res/drawable-hdpi-v4/list_item_artist.9.png new file mode 100644 index 00000000..7bddbcef Binary files /dev/null and b/res/drawable-hdpi-v4/list_item_artist.9.png differ diff --git a/res/drawable-hdpi-v4/list_item_playlist.9.png b/res/drawable-hdpi-v4/list_item_playlist.9.png new file mode 100644 index 00000000..7bddbcef Binary files /dev/null and b/res/drawable-hdpi-v4/list_item_playlist.9.png differ diff --git a/res/drawable-hdpi-v4/main_exit.png b/res/drawable-hdpi-v4/main_exit.png new file mode 100644 index 00000000..9a8b2a5e Binary files /dev/null and b/res/drawable-hdpi-v4/main_exit.png differ diff --git a/res/drawable-hdpi-v4/main_header_icon.png b/res/drawable-hdpi-v4/main_header_icon.png new file mode 100644 index 00000000..4252ba5b Binary files /dev/null and b/res/drawable-hdpi-v4/main_header_icon.png differ diff --git a/res/drawable-hdpi-v4/main_help.png b/res/drawable-hdpi-v4/main_help.png new file mode 100644 index 00000000..cb063b00 Binary files /dev/null and b/res/drawable-hdpi-v4/main_help.png differ diff --git a/res/drawable-hdpi-v4/main_select_server.png b/res/drawable-hdpi-v4/main_select_server.png new file mode 100644 index 00000000..ccecc1d9 Binary files /dev/null and b/res/drawable-hdpi-v4/main_select_server.png differ diff --git a/res/drawable-hdpi-v4/main_settings.png b/res/drawable-hdpi-v4/main_settings.png new file mode 100644 index 00000000..81bca4ae Binary files /dev/null and b/res/drawable-hdpi-v4/main_settings.png differ diff --git a/res/drawable-hdpi-v4/main_shuffle.png b/res/drawable-hdpi-v4/main_shuffle.png new file mode 100644 index 00000000..22ee1d50 Binary files /dev/null and b/res/drawable-hdpi-v4/main_shuffle.png differ diff --git a/res/drawable-hdpi-v4/media_backward_normal.png b/res/drawable-hdpi-v4/media_backward_normal.png new file mode 100644 index 00000000..d2e44f1f Binary files /dev/null and b/res/drawable-hdpi-v4/media_backward_normal.png differ diff --git a/res/drawable-hdpi-v4/media_backward_pressed.png b/res/drawable-hdpi-v4/media_backward_pressed.png new file mode 100644 index 00000000..1ab22f24 Binary files /dev/null and b/res/drawable-hdpi-v4/media_backward_pressed.png differ diff --git a/res/drawable-hdpi-v4/media_forward_normal.png b/res/drawable-hdpi-v4/media_forward_normal.png new file mode 100644 index 00000000..2b4a2eee Binary files /dev/null and b/res/drawable-hdpi-v4/media_forward_normal.png differ diff --git a/res/drawable-hdpi-v4/media_forward_pressed.png b/res/drawable-hdpi-v4/media_forward_pressed.png new file mode 100644 index 00000000..a6cd62a7 Binary files /dev/null and b/res/drawable-hdpi-v4/media_forward_pressed.png differ diff --git a/res/drawable-hdpi-v4/media_pause_normal.png b/res/drawable-hdpi-v4/media_pause_normal.png new file mode 100644 index 00000000..c1eefc5b Binary files /dev/null and b/res/drawable-hdpi-v4/media_pause_normal.png differ diff --git a/res/drawable-hdpi-v4/media_pause_pressed.png b/res/drawable-hdpi-v4/media_pause_pressed.png new file mode 100644 index 00000000..f4de9fbd Binary files /dev/null and b/res/drawable-hdpi-v4/media_pause_pressed.png differ diff --git a/res/drawable-hdpi-v4/media_repeat_all.png b/res/drawable-hdpi-v4/media_repeat_all.png new file mode 100644 index 00000000..f8012f9f Binary files /dev/null and b/res/drawable-hdpi-v4/media_repeat_all.png differ diff --git a/res/drawable-hdpi-v4/media_repeat_off.png b/res/drawable-hdpi-v4/media_repeat_off.png new file mode 100644 index 00000000..caf2cdfb Binary files /dev/null and b/res/drawable-hdpi-v4/media_repeat_off.png differ diff --git a/res/drawable-hdpi-v4/media_repeat_single.png b/res/drawable-hdpi-v4/media_repeat_single.png new file mode 100644 index 00000000..99d534cb Binary files /dev/null and b/res/drawable-hdpi-v4/media_repeat_single.png differ diff --git a/res/drawable-hdpi-v4/media_shuffle_normal.png b/res/drawable-hdpi-v4/media_shuffle_normal.png new file mode 100644 index 00000000..18e69dea Binary files /dev/null and b/res/drawable-hdpi-v4/media_shuffle_normal.png differ diff --git a/res/drawable-hdpi-v4/media_shuffle_pressed.png b/res/drawable-hdpi-v4/media_shuffle_pressed.png new file mode 100644 index 00000000..4e2e77a2 Binary files /dev/null and b/res/drawable-hdpi-v4/media_shuffle_pressed.png differ diff --git a/res/drawable-hdpi-v4/media_start_normal.png b/res/drawable-hdpi-v4/media_start_normal.png new file mode 100644 index 00000000..f987b1c2 Binary files /dev/null and b/res/drawable-hdpi-v4/media_start_normal.png differ diff --git a/res/drawable-hdpi-v4/media_start_pressed.png b/res/drawable-hdpi-v4/media_start_pressed.png new file mode 100644 index 00000000..97edb4ab Binary files /dev/null and b/res/drawable-hdpi-v4/media_start_pressed.png differ diff --git a/res/drawable-hdpi-v4/media_stop_normal.png b/res/drawable-hdpi-v4/media_stop_normal.png new file mode 100644 index 00000000..6f03a5d3 Binary files /dev/null and b/res/drawable-hdpi-v4/media_stop_normal.png differ diff --git a/res/drawable-hdpi-v4/media_stop_pressed.png b/res/drawable-hdpi-v4/media_stop_pressed.png new file mode 100644 index 00000000..7d76ec08 Binary files /dev/null and b/res/drawable-hdpi-v4/media_stop_pressed.png differ diff --git a/res/drawable-hdpi-v4/media_toggle_list_normal.png b/res/drawable-hdpi-v4/media_toggle_list_normal.png new file mode 100644 index 00000000..05941b3d Binary files /dev/null and b/res/drawable-hdpi-v4/media_toggle_list_normal.png differ diff --git a/res/drawable-hdpi-v4/media_toggle_list_pressed.png b/res/drawable-hdpi-v4/media_toggle_list_pressed.png new file mode 100644 index 00000000..f1019360 Binary files /dev/null and b/res/drawable-hdpi-v4/media_toggle_list_pressed.png differ diff --git a/res/drawable-hdpi-v4/menu_browse.png b/res/drawable-hdpi-v4/menu_browse.png new file mode 100644 index 00000000..70a59154 Binary files /dev/null and b/res/drawable-hdpi-v4/menu_browse.png differ diff --git a/res/drawable-hdpi-v4/menu_home.png b/res/drawable-hdpi-v4/menu_home.png new file mode 100644 index 00000000..35cb52aa Binary files /dev/null and b/res/drawable-hdpi-v4/menu_home.png differ diff --git a/res/drawable-hdpi-v4/menu_now_playing.png b/res/drawable-hdpi-v4/menu_now_playing.png new file mode 100644 index 00000000..10af07fe Binary files /dev/null and b/res/drawable-hdpi-v4/menu_now_playing.png differ diff --git a/res/drawable-hdpi-v4/menu_playlists.png b/res/drawable-hdpi-v4/menu_playlists.png new file mode 100644 index 00000000..59345d5b Binary files /dev/null and b/res/drawable-hdpi-v4/menu_playlists.png differ diff --git a/res/drawable-hdpi-v4/menu_search.png b/res/drawable-hdpi-v4/menu_search.png new file mode 100644 index 00000000..f78234e4 Binary files /dev/null and b/res/drawable-hdpi-v4/menu_search.png differ diff --git a/res/drawable-hdpi-v4/menubar_button_disabled.9.png b/res/drawable-hdpi-v4/menubar_button_disabled.9.png new file mode 100644 index 00000000..94a48f7d Binary files /dev/null and b/res/drawable-hdpi-v4/menubar_button_disabled.9.png differ diff --git a/res/drawable-hdpi-v4/menubar_button_normal.9.png b/res/drawable-hdpi-v4/menubar_button_normal.9.png new file mode 100644 index 00000000..9ce38a61 Binary files /dev/null and b/res/drawable-hdpi-v4/menubar_button_normal.9.png differ diff --git a/res/drawable-hdpi-v4/menubar_button_pressed.9.png b/res/drawable-hdpi-v4/menubar_button_pressed.9.png new file mode 100644 index 00000000..4dff0907 Binary files /dev/null and b/res/drawable-hdpi-v4/menubar_button_pressed.9.png differ diff --git a/res/drawable-hdpi-v4/refresh.png b/res/drawable-hdpi-v4/refresh.png new file mode 100644 index 00000000..2f887c26 Binary files /dev/null and b/res/drawable-hdpi-v4/refresh.png differ diff --git a/res/drawable-hdpi-v4/search.png b/res/drawable-hdpi-v4/search.png new file mode 100644 index 00000000..43d8c87e Binary files /dev/null and b/res/drawable-hdpi-v4/search.png differ diff --git a/res/drawable-hdpi-v4/select_album_play_all_normal.png b/res/drawable-hdpi-v4/select_album_play_all_normal.png new file mode 100644 index 00000000..bcf0efe6 Binary files /dev/null and b/res/drawable-hdpi-v4/select_album_play_all_normal.png differ diff --git a/res/drawable-hdpi-v4/select_album_play_all_pressed.png b/res/drawable-hdpi-v4/select_album_play_all_pressed.png new file mode 100644 index 00000000..31bbfff0 Binary files /dev/null and b/res/drawable-hdpi-v4/select_album_play_all_pressed.png differ diff --git a/res/drawable-hdpi-v4/select_artist_folder.png b/res/drawable-hdpi-v4/select_artist_folder.png new file mode 100644 index 00000000..ccecc1d9 Binary files /dev/null and b/res/drawable-hdpi-v4/select_artist_folder.png differ diff --git a/res/drawable-hdpi-v4/stat_notify_playing.png b/res/drawable-hdpi-v4/stat_notify_playing.png new file mode 100644 index 00000000..bfd3e6a5 Binary files /dev/null and b/res/drawable-hdpi-v4/stat_notify_playing.png differ diff --git a/res/drawable-hdpi-v4/unknown_album.png b/res/drawable-hdpi-v4/unknown_album.png new file mode 100644 index 00000000..ba1e4e64 Binary files /dev/null and b/res/drawable-hdpi-v4/unknown_album.png differ diff --git a/res/drawable-hdpi-v4/unknown_album_large.png b/res/drawable-hdpi-v4/unknown_album_large.png new file mode 100644 index 00000000..bd9c6cc9 Binary files /dev/null and b/res/drawable-hdpi-v4/unknown_album_large.png differ diff --git a/res/drawable/action_play_all.png b/res/drawable/action_play_all.png new file mode 100644 index 00000000..dd718312 Binary files /dev/null and b/res/drawable/action_play_all.png differ diff --git a/res/drawable/action_refresh.png b/res/drawable/action_refresh.png new file mode 100644 index 00000000..0aa88f5d Binary files /dev/null and b/res/drawable/action_refresh.png differ diff --git a/res/drawable/action_search.png b/res/drawable/action_search.png new file mode 100644 index 00000000..3fba5ec5 Binary files /dev/null and b/res/drawable/action_search.png differ diff --git a/res/drawable/action_shuffle.png b/res/drawable/action_shuffle.png new file mode 100644 index 00000000..e1ed3177 Binary files /dev/null and b/res/drawable/action_shuffle.png differ diff --git a/res/drawable/actionbar_button.xml b/res/drawable/actionbar_button.xml new file mode 100644 index 00000000..be81b1f9 --- /dev/null +++ b/res/drawable/actionbar_button.xml @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable/actionbar_button_normal.9.png b/res/drawable/actionbar_button_normal.9.png new file mode 100644 index 00000000..385f751c Binary files /dev/null and b/res/drawable/actionbar_button_normal.9.png differ diff --git a/res/drawable/album_art_background.png b/res/drawable/album_art_background.png new file mode 100644 index 00000000..f0757695 Binary files /dev/null and b/res/drawable/album_art_background.png differ diff --git a/res/drawable/appwidget_art_default.png b/res/drawable/appwidget_art_default.png new file mode 100644 index 00000000..5bd39cc2 Binary files /dev/null and b/res/drawable/appwidget_art_default.png differ diff --git a/res/drawable/appwidget_art_unknown.png b/res/drawable/appwidget_art_unknown.png new file mode 100644 index 00000000..5bd39cc2 Binary files /dev/null and b/res/drawable/appwidget_art_unknown.png differ diff --git a/res/drawable/appwidget_bg.9.png b/res/drawable/appwidget_bg.9.png new file mode 100644 index 00000000..afe41b67 Binary files /dev/null and b/res/drawable/appwidget_bg.9.png differ diff --git a/res/drawable/appwidget_button_background.9.png b/res/drawable/appwidget_button_background.9.png new file mode 100644 index 00000000..b7d3b18f Binary files /dev/null and b/res/drawable/appwidget_button_background.9.png differ diff --git a/res/drawable/appwidget_button_background_r.9.png b/res/drawable/appwidget_button_background_r.9.png new file mode 100644 index 00000000..90e2cc82 Binary files /dev/null and b/res/drawable/appwidget_button_background_r.9.png differ diff --git a/res/drawable/appwidget_button_center.xml b/res/drawable/appwidget_button_center.xml new file mode 100644 index 00000000..b6a3be4b --- /dev/null +++ b/res/drawable/appwidget_button_center.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/res/drawable/appwidget_button_left.xml b/res/drawable/appwidget_button_left.xml new file mode 100644 index 00000000..5bfa124c --- /dev/null +++ b/res/drawable/appwidget_button_left.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/res/drawable/appwidget_button_right.xml b/res/drawable/appwidget_button_right.xml new file mode 100644 index 00000000..3d1181be --- /dev/null +++ b/res/drawable/appwidget_button_right.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/res/drawable/appwidget_divider.9.png b/res/drawable/appwidget_divider.9.png new file mode 100644 index 00000000..3445e842 Binary files /dev/null and b/res/drawable/appwidget_divider.9.png differ diff --git a/res/drawable/appwidget_divider_horizontal.9.png b/res/drawable/appwidget_divider_horizontal.9.png new file mode 100644 index 00000000..e2e80af9 Binary files /dev/null and b/res/drawable/appwidget_divider_horizontal.9.png differ diff --git a/res/drawable/appwidget_divider_vertical.png b/res/drawable/appwidget_divider_vertical.png new file mode 100644 index 00000000..efe466a6 Binary files /dev/null and b/res/drawable/appwidget_divider_vertical.png differ diff --git a/res/drawable/appwidget_inner_focus_c.9.png b/res/drawable/appwidget_inner_focus_c.9.png new file mode 100644 index 00000000..1450e65b Binary files /dev/null and b/res/drawable/appwidget_inner_focus_c.9.png differ diff --git a/res/drawable/appwidget_inner_focus_l.9.png b/res/drawable/appwidget_inner_focus_l.9.png new file mode 100644 index 00000000..6e8f100e Binary files /dev/null and b/res/drawable/appwidget_inner_focus_l.9.png differ diff --git a/res/drawable/appwidget_inner_focus_r.9.png b/res/drawable/appwidget_inner_focus_r.9.png new file mode 100644 index 00000000..bc8757b8 Binary files /dev/null and b/res/drawable/appwidget_inner_focus_r.9.png differ diff --git a/res/drawable/appwidget_inner_press_c.9.png b/res/drawable/appwidget_inner_press_c.9.png new file mode 100644 index 00000000..bd542bac Binary files /dev/null and b/res/drawable/appwidget_inner_press_c.9.png differ diff --git a/res/drawable/appwidget_inner_press_l.9.png b/res/drawable/appwidget_inner_press_l.9.png new file mode 100644 index 00000000..575ecf4e Binary files /dev/null and b/res/drawable/appwidget_inner_press_l.9.png differ diff --git a/res/drawable/appwidget_inner_press_r.9.png b/res/drawable/appwidget_inner_press_r.9.png new file mode 100644 index 00000000..79eaea35 Binary files /dev/null and b/res/drawable/appwidget_inner_press_r.9.png differ diff --git a/res/drawable/appwidget_overlay.png b/res/drawable/appwidget_overlay.png new file mode 100644 index 00000000..dfbbd3ec Binary files /dev/null and b/res/drawable/appwidget_overlay.png differ diff --git a/res/drawable/downloaded.png b/res/drawable/downloaded.png new file mode 100644 index 00000000..f854aaf4 Binary files /dev/null and b/res/drawable/downloaded.png differ diff --git a/res/drawable/downloading.png b/res/drawable/downloading.png new file mode 100755 index 00000000..afff39a9 Binary files /dev/null and b/res/drawable/downloading.png differ diff --git a/res/drawable/ic_appwidget_music_next.png b/res/drawable/ic_appwidget_music_next.png new file mode 100644 index 00000000..abc8e471 Binary files /dev/null and b/res/drawable/ic_appwidget_music_next.png differ diff --git a/res/drawable/ic_appwidget_music_pause.png b/res/drawable/ic_appwidget_music_pause.png new file mode 100644 index 00000000..25a2d387 Binary files /dev/null and b/res/drawable/ic_appwidget_music_pause.png differ diff --git a/res/drawable/ic_appwidget_music_play.png b/res/drawable/ic_appwidget_music_play.png new file mode 100644 index 00000000..52b8e452 Binary files /dev/null and b/res/drawable/ic_appwidget_music_play.png differ diff --git a/res/drawable/ic_appwidget_music_previous.png b/res/drawable/ic_appwidget_music_previous.png new file mode 100644 index 00000000..55db16f7 Binary files /dev/null and b/res/drawable/ic_appwidget_music_previous.png differ diff --git a/res/drawable/ic_menu_exit.png b/res/drawable/ic_menu_exit.png new file mode 100644 index 00000000..847a1ed3 Binary files /dev/null and b/res/drawable/ic_menu_exit.png differ diff --git a/res/drawable/ic_menu_help.png b/res/drawable/ic_menu_help.png new file mode 100644 index 00000000..9f11f434 Binary files /dev/null and b/res/drawable/ic_menu_help.png differ diff --git a/res/drawable/ic_menu_remove_all.png b/res/drawable/ic_menu_remove_all.png new file mode 100644 index 00000000..1a9f440b Binary files /dev/null and b/res/drawable/ic_menu_remove_all.png differ diff --git a/res/drawable/ic_menu_save.png b/res/drawable/ic_menu_save.png new file mode 100644 index 00000000..c2c5433b Binary files /dev/null and b/res/drawable/ic_menu_save.png differ diff --git a/res/drawable/ic_menu_screen_on_off.png b/res/drawable/ic_menu_screen_on_off.png new file mode 100644 index 00000000..0cf15235 Binary files /dev/null and b/res/drawable/ic_menu_screen_on_off.png differ diff --git a/res/drawable/ic_menu_settings.png b/res/drawable/ic_menu_settings.png new file mode 100644 index 00000000..48775c1e Binary files /dev/null and b/res/drawable/ic_menu_settings.png differ diff --git a/res/drawable/ic_menu_shuffle.png b/res/drawable/ic_menu_shuffle.png new file mode 100644 index 00000000..2ba6c8c5 Binary files /dev/null and b/res/drawable/ic_menu_shuffle.png differ diff --git a/res/drawable/launch.png b/res/drawable/launch.png new file mode 100644 index 00000000..b3befadf Binary files /dev/null and b/res/drawable/launch.png differ diff --git a/res/drawable/list_item_artist.9.png b/res/drawable/list_item_artist.9.png new file mode 100644 index 00000000..9967ecbd Binary files /dev/null and b/res/drawable/list_item_artist.9.png differ diff --git a/res/drawable/list_item_playlist.9.png b/res/drawable/list_item_playlist.9.png new file mode 100644 index 00000000..9967ecbd Binary files /dev/null and b/res/drawable/list_item_playlist.9.png differ diff --git a/res/drawable/main_exit.png b/res/drawable/main_exit.png new file mode 100644 index 00000000..d385b7a6 Binary files /dev/null and b/res/drawable/main_exit.png differ diff --git a/res/drawable/main_header_icon.png b/res/drawable/main_header_icon.png new file mode 100644 index 00000000..f4f3ce9e Binary files /dev/null and b/res/drawable/main_header_icon.png differ diff --git a/res/drawable/main_help.png b/res/drawable/main_help.png new file mode 100644 index 00000000..2c825473 Binary files /dev/null and b/res/drawable/main_help.png differ diff --git a/res/drawable/main_select_server.png b/res/drawable/main_select_server.png new file mode 100644 index 00000000..b9fc5fa3 Binary files /dev/null and b/res/drawable/main_select_server.png differ diff --git a/res/drawable/main_settings.png b/res/drawable/main_settings.png new file mode 100644 index 00000000..60dbff6d Binary files /dev/null and b/res/drawable/main_settings.png differ diff --git a/res/drawable/main_shuffle.png b/res/drawable/main_shuffle.png new file mode 100644 index 00000000..cb7009de Binary files /dev/null and b/res/drawable/main_shuffle.png differ diff --git a/res/drawable/media_backward.xml b/res/drawable/media_backward.xml new file mode 100644 index 00000000..8ed1c158 --- /dev/null +++ b/res/drawable/media_backward.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/media_backward_normal.png b/res/drawable/media_backward_normal.png new file mode 100644 index 00000000..e5372389 Binary files /dev/null and b/res/drawable/media_backward_normal.png differ diff --git a/res/drawable/media_backward_pressed.png b/res/drawable/media_backward_pressed.png new file mode 100644 index 00000000..82c421d0 Binary files /dev/null and b/res/drawable/media_backward_pressed.png differ diff --git a/res/drawable/media_forward.xml b/res/drawable/media_forward.xml new file mode 100644 index 00000000..a8e5b799 --- /dev/null +++ b/res/drawable/media_forward.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/media_forward_normal.png b/res/drawable/media_forward_normal.png new file mode 100644 index 00000000..6cb93917 Binary files /dev/null and b/res/drawable/media_forward_normal.png differ diff --git a/res/drawable/media_forward_pressed.png b/res/drawable/media_forward_pressed.png new file mode 100644 index 00000000..42ffbe4c Binary files /dev/null and b/res/drawable/media_forward_pressed.png differ diff --git a/res/drawable/media_pause.xml b/res/drawable/media_pause.xml new file mode 100644 index 00000000..8bd1233d --- /dev/null +++ b/res/drawable/media_pause.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/media_pause_normal.png b/res/drawable/media_pause_normal.png new file mode 100644 index 00000000..4fc03eb2 Binary files /dev/null and b/res/drawable/media_pause_normal.png differ diff --git a/res/drawable/media_pause_pressed.png b/res/drawable/media_pause_pressed.png new file mode 100644 index 00000000..dd9ae605 Binary files /dev/null and b/res/drawable/media_pause_pressed.png differ diff --git a/res/drawable/media_repeat_all.png b/res/drawable/media_repeat_all.png new file mode 100644 index 00000000..6a5d4e41 Binary files /dev/null and b/res/drawable/media_repeat_all.png differ diff --git a/res/drawable/media_repeat_off.png b/res/drawable/media_repeat_off.png new file mode 100644 index 00000000..a4417248 Binary files /dev/null and b/res/drawable/media_repeat_off.png differ diff --git a/res/drawable/media_repeat_single.png b/res/drawable/media_repeat_single.png new file mode 100644 index 00000000..3dec6958 Binary files /dev/null and b/res/drawable/media_repeat_single.png differ diff --git a/res/drawable/media_shuffle.xml b/res/drawable/media_shuffle.xml new file mode 100644 index 00000000..abe2b13d --- /dev/null +++ b/res/drawable/media_shuffle.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/media_shuffle_normal.png b/res/drawable/media_shuffle_normal.png new file mode 100644 index 00000000..dc6b8c8c Binary files /dev/null and b/res/drawable/media_shuffle_normal.png differ diff --git a/res/drawable/media_shuffle_pressed.png b/res/drawable/media_shuffle_pressed.png new file mode 100644 index 00000000..fb2639c8 Binary files /dev/null and b/res/drawable/media_shuffle_pressed.png differ diff --git a/res/drawable/media_start.xml b/res/drawable/media_start.xml new file mode 100644 index 00000000..617fa32b --- /dev/null +++ b/res/drawable/media_start.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/media_start_normal.png b/res/drawable/media_start_normal.png new file mode 100644 index 00000000..a3775d43 Binary files /dev/null and b/res/drawable/media_start_normal.png differ diff --git a/res/drawable/media_start_pressed.png b/res/drawable/media_start_pressed.png new file mode 100644 index 00000000..d7ace1ba Binary files /dev/null and b/res/drawable/media_start_pressed.png differ diff --git a/res/drawable/media_stop.xml b/res/drawable/media_stop.xml new file mode 100644 index 00000000..e883c9ff --- /dev/null +++ b/res/drawable/media_stop.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/media_stop_normal.png b/res/drawable/media_stop_normal.png new file mode 100644 index 00000000..120aecd0 Binary files /dev/null and b/res/drawable/media_stop_normal.png differ diff --git a/res/drawable/media_stop_pressed.png b/res/drawable/media_stop_pressed.png new file mode 100644 index 00000000..b590abe8 Binary files /dev/null and b/res/drawable/media_stop_pressed.png differ diff --git a/res/drawable/media_toggle_list.xml b/res/drawable/media_toggle_list.xml new file mode 100644 index 00000000..f9b02367 --- /dev/null +++ b/res/drawable/media_toggle_list.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/media_toggle_list_normal.png b/res/drawable/media_toggle_list_normal.png new file mode 100644 index 00000000..cc269b65 Binary files /dev/null and b/res/drawable/media_toggle_list_normal.png differ diff --git a/res/drawable/media_toggle_list_pressed.png b/res/drawable/media_toggle_list_pressed.png new file mode 100644 index 00000000..97b9a413 Binary files /dev/null and b/res/drawable/media_toggle_list_pressed.png differ diff --git a/res/drawable/menu_browse.png b/res/drawable/menu_browse.png new file mode 100644 index 00000000..3f1de60d Binary files /dev/null and b/res/drawable/menu_browse.png differ diff --git a/res/drawable/menu_home.png b/res/drawable/menu_home.png new file mode 100644 index 00000000..34943f66 Binary files /dev/null and b/res/drawable/menu_home.png differ diff --git a/res/drawable/menu_now_playing.png b/res/drawable/menu_now_playing.png new file mode 100644 index 00000000..22f203a8 Binary files /dev/null and b/res/drawable/menu_now_playing.png differ diff --git a/res/drawable/menu_playlists.png b/res/drawable/menu_playlists.png new file mode 100644 index 00000000..c01733d9 Binary files /dev/null and b/res/drawable/menu_playlists.png differ diff --git a/res/drawable/menu_search.png b/res/drawable/menu_search.png new file mode 100644 index 00000000..94446db9 Binary files /dev/null and b/res/drawable/menu_search.png differ diff --git a/res/drawable/menubar_button.xml b/res/drawable/menubar_button.xml new file mode 100644 index 00000000..3aae8fc4 --- /dev/null +++ b/res/drawable/menubar_button.xml @@ -0,0 +1,14 @@ + + +  + + + + + + + + + \ No newline at end of file diff --git a/res/drawable/menubar_button_disabled.9.png b/res/drawable/menubar_button_disabled.9.png new file mode 100644 index 00000000..94a48f7d Binary files /dev/null and b/res/drawable/menubar_button_disabled.9.png differ diff --git a/res/drawable/menubar_button_normal.9.png b/res/drawable/menubar_button_normal.9.png new file mode 100644 index 00000000..9ce38a61 Binary files /dev/null and b/res/drawable/menubar_button_normal.9.png differ diff --git a/res/drawable/menubar_button_pressed.9.png b/res/drawable/menubar_button_pressed.9.png new file mode 100644 index 00000000..4dff0907 Binary files /dev/null and b/res/drawable/menubar_button_pressed.9.png differ diff --git a/res/drawable/refresh.png b/res/drawable/refresh.png new file mode 100644 index 00000000..3838ba07 Binary files /dev/null and b/res/drawable/refresh.png differ diff --git a/res/drawable/saved.png b/res/drawable/saved.png new file mode 100644 index 00000000..6c7c276f Binary files /dev/null and b/res/drawable/saved.png differ diff --git a/res/drawable/search.png b/res/drawable/search.png new file mode 100644 index 00000000..3f8913e2 Binary files /dev/null and b/res/drawable/search.png differ diff --git a/res/drawable/select_album_play_all.xml b/res/drawable/select_album_play_all.xml new file mode 100644 index 00000000..7c26364f --- /dev/null +++ b/res/drawable/select_album_play_all.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/select_album_play_all_normal.png b/res/drawable/select_album_play_all_normal.png new file mode 100644 index 00000000..1ec33286 Binary files /dev/null and b/res/drawable/select_album_play_all_normal.png differ diff --git a/res/drawable/select_album_play_all_pressed.png b/res/drawable/select_album_play_all_pressed.png new file mode 100644 index 00000000..c3a18e77 Binary files /dev/null and b/res/drawable/select_album_play_all_pressed.png differ diff --git a/res/drawable/select_artist_folder.png b/res/drawable/select_artist_folder.png new file mode 100644 index 00000000..5ae85406 Binary files /dev/null and b/res/drawable/select_artist_folder.png differ diff --git a/res/drawable/slider_knob.png b/res/drawable/slider_knob.png new file mode 100644 index 00000000..ae21a4f9 Binary files /dev/null and b/res/drawable/slider_knob.png differ diff --git a/res/drawable/stat_notify_playing.png b/res/drawable/stat_notify_playing.png new file mode 100644 index 00000000..fd92c188 Binary files /dev/null and b/res/drawable/stat_notify_playing.png differ diff --git a/res/drawable/toast_frame.9.png b/res/drawable/toast_frame.9.png new file mode 100644 index 00000000..8f5d8119 Binary files /dev/null and b/res/drawable/toast_frame.9.png differ diff --git a/res/drawable/unknown_album.png b/res/drawable/unknown_album.png new file mode 100644 index 00000000..c6e77088 Binary files /dev/null and b/res/drawable/unknown_album.png differ diff --git a/res/drawable/unknown_album_large.png b/res/drawable/unknown_album_large.png new file mode 100644 index 00000000..50455c5d Binary files /dev/null and b/res/drawable/unknown_album_large.png differ diff --git a/res/layout-land/download.xml b/res/layout-land/download.xml new file mode 100644 index 00000000..981eb7b3 --- /dev/null +++ b/res/layout-land/download.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +