diff --git a/.project b/.project
index 2df865c9..9c079c04 100644
--- a/.project
+++ b/.project
@@ -1,33 +1,33 @@
-
-
- Subsonic-Android
-
-
-
-
-
- com.android.ide.eclipse.adt.ResourceManagerBuilder
-
-
-
-
- com.android.ide.eclipse.adt.PreCompilerBuilder
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- com.android.ide.eclipse.adt.ApkBuilder
-
-
-
-
-
- com.android.ide.eclipse.adt.AndroidNature
- org.eclipse.jdt.core.javanature
-
-
+
+
+ Subsonic
+
+
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 67a4d201..b2aa3783 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2,7 +2,7 @@
+ a:versionName="3.9.9.3" a:installLocation="auto">
@@ -12,7 +12,7 @@
-
+
diff --git a/bin/AndroidManifest.xml b/bin/AndroidManifest.xml
index 67a4d201..b2aa3783 100644
--- a/bin/AndroidManifest.xml
+++ b/bin/AndroidManifest.xml
@@ -2,7 +2,7 @@
+ a:versionName="3.9.9.3" a:installLocation="auto">
@@ -12,7 +12,7 @@
-
+
diff --git a/bin/Subsonic.apk b/bin/Subsonic.apk
new file mode 100644
index 00000000..a1fcfd2d
Binary files /dev/null and b/bin/Subsonic.apk differ
diff --git a/bin/classes.dex b/bin/classes.dex
index 2c0877ca..0d0938f8 100644
Binary files a/bin/classes.dex and b/bin/classes.dex differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$id.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$id.class
index 2e05ac7d..0ad196f8 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$id.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$id.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$integer.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$integer.class
index 76bda81e..dee47312 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$integer.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$integer.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$layout.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$layout.class
index 634b3c77..046f5e61 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$layout.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$layout.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$menu.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$menu.class
index e8c66111..f3f4a7b9 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$menu.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$menu.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$plurals.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$plurals.class
index fd0b9169..de26749d 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$plurals.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$plurals.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$string.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$string.class
index bd9b1be3..a502b58a 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$string.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$string.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$style.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$style.class
index 80217149..00e78889 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$style.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$style.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/R$xml.class b/bin/classes/net/sourceforge/subsonic/androidapp/R$xml.class
index cfe477ea..3dc7210c 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/R$xml.class and b/bin/classes/net/sourceforge/subsonic/androidapp/R$xml.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$17.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$17.class
index 28888254..f14cb0d9 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$17.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$17.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18$1.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18$1.class
index f9af3b8d..f4cb3791 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18$1.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18$1.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18.class
index a7f9de88..cb9a7b83 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$18.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$19.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$19.class
index 9e3edb30..2bb3a6e9 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$19.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$19.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$20.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$20.class
index 295429b3..f64e310e 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$20.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$20.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$21.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$21.class
index 4c5cd01d..73133e30 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$21.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$21.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$SongListAdapter.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$SongListAdapter.class
index 9b79be34..232b10b3 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$SongListAdapter.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity$SongListAdapter.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.class
index 1895f2ba..bf60f9c5 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity$1.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity$1.class
index 4ba2be93..bec7f311 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity$1.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity$1.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.class
index 95984c26..8df27006 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$1.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$1.class
index 29d3e917..5e497ffb 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$1.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$1.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$2.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$2.class
index 8b9dfdbf..22ca512d 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$2.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$2.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$3.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$3.class
index d70d7912..0e78044f 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$3.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$3.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$4.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$4.class
index 21e3e199..01690190 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$4.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$4.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$5.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$5.class
index e35c22c0..5f775335 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$5.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity$5.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity.class
index 501936d3..d3761ddd 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/MainActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/PlayVideoActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/PlayVideoActivity.class
index 9cd10652..475be75c 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/PlayVideoActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/PlayVideoActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$2.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$2.class
index 3a99121b..39c7d1aa 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$2.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$2.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$3.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$3.class
index 22d77f9d..d0f80a00 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$3.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity$3.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity.class
index 378fc86c..f3438f57 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SearchActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$10.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$10.class
index ed15e501..0f64c61e 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$10.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$10.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$11.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$11.class
index 72b0aefe..795a9f40 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$11.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$11.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12$1.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12$1.class
index ad88cb43..c16ed238 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12$1.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12$1.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12.class
index b94b6eb7..bad0c1d3 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$12.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$13.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$13.class
index 1a8041f6..5b1383b0 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$13.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$13.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$14.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$14.class
index 7c15a6d9..8f29d411 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$14.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$14.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$15.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$15.class
index 0ca8425c..4c3664bf 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$15.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$15.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$2.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$2.class
index c1a8c12c..504517e8 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$2.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$2.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$3.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$3.class
index b787d54c..21fb3234 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$3.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$3.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$4.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$4.class
index a3df7d17..81d5a0f5 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$4.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$4.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$5.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$5.class
index 495b008f..93d64096 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$5.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$5.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$6.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$6.class
index 679f85ea..26febc0a 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$6.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$6.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$7.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$7.class
index e04b7579..b80a13ad 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$7.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$7.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$8.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$8.class
index c43fd9aa..f8bb3638 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$8.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$8.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$9.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$9.class
index 3a81173b..999153ab 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$9.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$9.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$LoadTask.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$LoadTask.class
index e2e49fbc..3f0de021 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$LoadTask.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity$LoadTask.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.class
index 4e1db453..4dbced3a 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$1.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$1.class
index 9b76bbfb..852a3b5b 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$1.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$1.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$2.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$2.class
index 01312152..2f9e2ae9 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$2.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$2.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$3.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$3.class
index 71b769b0..788fe293 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$3.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity$3.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.class
index 26cf84c6..c0b1213a 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$1.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$1.class
index 317da238..e922fdf1 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$1.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$1.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$2.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$2.class
index acbc55bf..87c342b5 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$2.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$2.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$PlaylistAdapter.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$PlaylistAdapter.class
index 89ca0070..7b17d653 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$PlaylistAdapter.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity$PlaylistAdapter.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.class
index 8871170a..d53e7398 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$1.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$1.class
index 3e272cf9..c213b222 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$1.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$1.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$2.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$2.class
index 7e6d7e2a..81d4578a 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$2.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$2.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$3.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$3.class
index 18bd11b2..73d5862e 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$3.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$3.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$4.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$4.class
index 62e3e127..e7ec5dde 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$4.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$4.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$5.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$5.class
index 2b9e466d..ad92adc4 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$5.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$5.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$6.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$6.class
index a208511f..6d644c20 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$6.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$6.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$7.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$7.class
new file mode 100644
index 00000000..20c24695
Binary files /dev/null and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$7.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$GestureActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$GestureActivity.class
new file mode 100644
index 00000000..bfa6fc91
Binary files /dev/null and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$GestureActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$SubsonicUncaughtExceptionHandler.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$SubsonicUncaughtExceptionHandler.class
index 0b88a4b7..c3e656c0 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$SubsonicUncaughtExceptionHandler.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$SubsonicUncaughtExceptionHandler.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$SwipeDirection.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$SwipeDirection.class
new file mode 100644
index 00000000..9fe6b65b
Binary files /dev/null and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity$SwipeDirection.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.class b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.class
index 234b75f6..87322e03 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.class and b/bin/classes/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/util/SongView.class b/bin/classes/net/sourceforge/subsonic/androidapp/util/SongView.class
index e8d77ce5..86d94ad1 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/util/SongView.class and b/bin/classes/net/sourceforge/subsonic/androidapp/util/SongView.class differ
diff --git a/bin/classes/net/sourceforge/subsonic/androidapp/util/Util.class b/bin/classes/net/sourceforge/subsonic/androidapp/util/Util.class
index 20554247..3c7fa3e9 100644
Binary files a/bin/classes/net/sourceforge/subsonic/androidapp/util/Util.class and b/bin/classes/net/sourceforge/subsonic/androidapp/util/Util.class differ
diff --git a/bin/resources.ap_ b/bin/resources.ap_
index 22a355c9..fe90e560 100644
Binary files a/bin/resources.ap_ and b/bin/resources.ap_ differ
diff --git a/gen/net/sourceforge/subsonic/androidapp/R.java b/gen/net/sourceforge/subsonic/androidapp/R.java
index 355b111f..20262695 100644
--- a/gen/net/sourceforge/subsonic/androidapp/R.java
+++ b/gen/net/sourceforge/subsonic/androidapp/R.java
@@ -144,19 +144,19 @@ public final class R {
public static final int action_button_4=0x7f0d0003;
public static final int actionbar_home_icon=0x7f0d0000;
public static final int actionbar_title_text=0x7f0d0001;
- public static final int album=0x7f0d0050;
+ public static final int album=0x7f0d0051;
public static final int album_artist=0x7f0d0008;
public static final int album_coverart=0x7f0d0006;
- public static final int album_menu_pin=0x7f0d008a;
- public static final int album_menu_play_last=0x7f0d0089;
- public static final int album_menu_play_now=0x7f0d0088;
+ public static final int album_menu_pin=0x7f0d008b;
+ public static final int album_menu_play_last=0x7f0d008a;
+ public static final int album_menu_play_now=0x7f0d0089;
public static final int album_title=0x7f0d0007;
public static final int appwidget_coverart=0x7f0d0009;
public static final int appwidget_top=0x7f0d000b;
public static final int artist=0x7f0d000d;
- public static final int artist_menu_pin=0x7f0d008d;
- public static final int artist_menu_play_last=0x7f0d008c;
- public static final int artist_menu_play_now=0x7f0d008b;
+ public static final int artist_menu_pin=0x7f0d008e;
+ public static final int artist_menu_play_last=0x7f0d008d;
+ public static final int artist_menu_play_now=0x7f0d008c;
public static final int button_bar=0x7f0d0011;
public static final int button_bar_home=0x7f0d0012;
public static final int button_bar_music=0x7f0d0013;
@@ -166,7 +166,7 @@ public final class R {
public static final int control_next=0x7f0d0010;
public static final int control_play=0x7f0d000f;
public static final int control_previous=0x7f0d000e;
- public static final int control_stop=0x7f0d0051;
+ public static final int control_stop=0x7f0d0052;
public static final int download_album=0x7f0d002d;
public static final int download_album_art_image=0x7f0d0027;
public static final int download_album_art_layout=0x7f0d0026;
@@ -203,86 +203,87 @@ public final class R {
public static final int help_buttons=0x7f0d0037;
public static final int help_close=0x7f0d0039;
public static final int help_contents=0x7f0d003a;
- public static final int ic_menu_shuffle=0x7f0d0080;
- public static final int icon=0x7f0d0076;
+ public static final int ic_menu_shuffle=0x7f0d0081;
+ public static final int icon=0x7f0d0077;
public static final int jukebox_volume_progress_bar=0x7f0d003c;
public static final int linearLayout1=0x7f0d000a;
- public static final int lyrics_artist=0x7f0d003d;
- public static final int lyrics_text=0x7f0d003f;
- public static final int lyrics_title=0x7f0d003e;
- public static final int main_select_server_1=0x7f0d0043;
- public static final int main_select_server_2=0x7f0d0044;
- public static final int main_albums=0x7f0d0045;
- public static final int main_albums_frequent=0x7f0d0048;
- public static final int main_albums_highest=0x7f0d0049;
- public static final int main_albums_newest=0x7f0d0046;
- public static final int main_albums_random=0x7f0d004b;
- public static final int main_albums_recent=0x7f0d0047;
- public static final int main_albums_starred=0x7f0d004a;
- public static final int main_dummy=0x7f0d0041;
- public static final int main_list=0x7f0d0040;
- public static final int main_select_server=0x7f0d0042;
- public static final int menu_exit=0x7f0d007d;
- public static final int menu_help=0x7f0d007f;
- public static final int menu_lyrics=0x7f0d0085;
- public static final int menu_remove=0x7f0d0086;
- public static final int menu_remove_all=0x7f0d0082;
- public static final int menu_save_playlist=0x7f0d0081;
- public static final int menu_screen_on_off=0x7f0d0083;
- public static final int menu_settings=0x7f0d007e;
- public static final int menu_show_album=0x7f0d0084;
- public static final int menu_shuffle=0x7f0d0087;
- public static final int notification_image=0x7f0d004d;
- public static final int play_video_contents=0x7f0d0052;
- public static final int progress_message=0x7f0d0053;
- public static final int save_playlist_name=0x7f0d0055;
- public static final int save_playlist_root=0x7f0d0054;
- public static final int search_albums=0x7f0d0059;
- public static final int search_artists=0x7f0d0058;
- public static final int search_list=0x7f0d0056;
- public static final int search_more_albums=0x7f0d005c;
- public static final int search_more_artists=0x7f0d005b;
- public static final int search_more_songs=0x7f0d005d;
- public static final int search_search=0x7f0d0057;
- public static final int search_songs=0x7f0d005a;
- public static final int select_album_cover_art=0x7f0d0067;
- public static final int select_album_delete=0x7f0d0065;
- public static final int select_album_empty=0x7f0d005e;
- public static final int select_album_entries=0x7f0d005f;
- public static final int select_album_more=0x7f0d0066;
- public static final int select_album_pin=0x7f0d0063;
- public static final int select_album_play_all=0x7f0d006a;
- public static final int select_album_play_last=0x7f0d0062;
- public static final int select_album_play_now=0x7f0d0061;
- public static final int select_album_select=0x7f0d0060;
- public static final int select_album_text1=0x7f0d0068;
- public static final int select_album_text2=0x7f0d0069;
- public static final int select_album_unpin=0x7f0d0064;
- public static final int select_artist_folder=0x7f0d006c;
- public static final int select_artist_folder_1=0x7f0d006d;
- public static final int select_artist_folder_2=0x7f0d006e;
- public static final int select_artist_list=0x7f0d006b;
- public static final int select_playlist_empty=0x7f0d006f;
- public static final int select_playlist_list=0x7f0d0070;
- public static final int song_artist=0x7f0d0074;
- public static final int song_check=0x7f0d0071;
- public static final int song_duration=0x7f0d0075;
- public static final int song_menu_play_last=0x7f0d0090;
- public static final int song_menu_play_next=0x7f0d008f;
- public static final int song_menu_play_now=0x7f0d008e;
- public static final int song_status=0x7f0d0073;
- public static final int song_title=0x7f0d0072;
- public static final int status_icon=0x7f0d004e;
- public static final int status_media_collapse=0x7f0d007a;
- public static final int status_media_next=0x7f0d0079;
- public static final int status_media_play=0x7f0d0078;
- public static final int status_media_prev=0x7f0d0077;
- public static final int statusbar=0x7f0d004c;
- public static final int tab_progress=0x7f0d007b;
- public static final int tab_progress_message=0x7f0d007c;
+ public static final int lyrics_artist=0x7f0d003e;
+ public static final int lyrics_scrollview=0x7f0d003d;
+ public static final int lyrics_text=0x7f0d0040;
+ public static final int lyrics_title=0x7f0d003f;
+ public static final int main_select_server_1=0x7f0d0044;
+ public static final int main_select_server_2=0x7f0d0045;
+ public static final int main_albums=0x7f0d0046;
+ public static final int main_albums_frequent=0x7f0d0049;
+ public static final int main_albums_highest=0x7f0d004a;
+ public static final int main_albums_newest=0x7f0d0047;
+ public static final int main_albums_random=0x7f0d004c;
+ public static final int main_albums_recent=0x7f0d0048;
+ public static final int main_albums_starred=0x7f0d004b;
+ public static final int main_dummy=0x7f0d0042;
+ public static final int main_list=0x7f0d0041;
+ public static final int main_select_server=0x7f0d0043;
+ public static final int menu_exit=0x7f0d007e;
+ public static final int menu_help=0x7f0d0080;
+ public static final int menu_lyrics=0x7f0d0086;
+ public static final int menu_remove=0x7f0d0087;
+ public static final int menu_remove_all=0x7f0d0083;
+ public static final int menu_save_playlist=0x7f0d0082;
+ public static final int menu_screen_on_off=0x7f0d0084;
+ public static final int menu_settings=0x7f0d007f;
+ public static final int menu_show_album=0x7f0d0085;
+ public static final int menu_shuffle=0x7f0d0088;
+ public static final int notification_image=0x7f0d004e;
+ public static final int play_video_contents=0x7f0d0053;
+ public static final int progress_message=0x7f0d0054;
+ public static final int save_playlist_name=0x7f0d0056;
+ public static final int save_playlist_root=0x7f0d0055;
+ public static final int search_albums=0x7f0d005a;
+ public static final int search_artists=0x7f0d0059;
+ public static final int search_list=0x7f0d0057;
+ public static final int search_more_albums=0x7f0d005d;
+ public static final int search_more_artists=0x7f0d005c;
+ public static final int search_more_songs=0x7f0d005e;
+ public static final int search_search=0x7f0d0058;
+ public static final int search_songs=0x7f0d005b;
+ public static final int select_album_cover_art=0x7f0d0068;
+ public static final int select_album_delete=0x7f0d0066;
+ public static final int select_album_empty=0x7f0d005f;
+ public static final int select_album_entries=0x7f0d0060;
+ public static final int select_album_more=0x7f0d0067;
+ public static final int select_album_pin=0x7f0d0064;
+ public static final int select_album_play_all=0x7f0d006b;
+ public static final int select_album_play_last=0x7f0d0063;
+ public static final int select_album_play_now=0x7f0d0062;
+ public static final int select_album_select=0x7f0d0061;
+ public static final int select_album_text1=0x7f0d0069;
+ public static final int select_album_text2=0x7f0d006a;
+ public static final int select_album_unpin=0x7f0d0065;
+ public static final int select_artist_folder=0x7f0d006d;
+ public static final int select_artist_folder_1=0x7f0d006e;
+ public static final int select_artist_folder_2=0x7f0d006f;
+ public static final int select_artist_list=0x7f0d006c;
+ public static final int select_playlist_empty=0x7f0d0070;
+ public static final int select_playlist_list=0x7f0d0071;
+ public static final int song_artist=0x7f0d0075;
+ public static final int song_check=0x7f0d0072;
+ public static final int song_duration=0x7f0d0076;
+ public static final int song_menu_play_last=0x7f0d0091;
+ public static final int song_menu_play_next=0x7f0d0090;
+ public static final int song_menu_play_now=0x7f0d008f;
+ public static final int song_status=0x7f0d0074;
+ public static final int song_title=0x7f0d0073;
+ public static final int status_icon=0x7f0d004f;
+ public static final int status_media_collapse=0x7f0d007b;
+ public static final int status_media_next=0x7f0d007a;
+ public static final int status_media_play=0x7f0d0079;
+ public static final int status_media_prev=0x7f0d0078;
+ public static final int statusbar=0x7f0d004d;
+ public static final int tab_progress=0x7f0d007c;
+ public static final int tab_progress_message=0x7f0d007d;
public static final int title=0x7f0d000c;
public static final int toast_layout_root=0x7f0d003b;
- public static final int trackname=0x7f0d004f;
+ public static final int trackname=0x7f0d0050;
}
public static final class integer {
public static final int config_activityDefaultDur=0x7f080001;
diff --git a/res/layout/lyrics.xml b/res/layout/lyrics.xml
index 7b446b78..670237d0 100644
--- a/res/layout/lyrics.xml
+++ b/res/layout/lyrics.xml
@@ -7,6 +7,7 @@
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.java
index f342071d..072135af 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/DownloadActivity.java
@@ -323,6 +323,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
onProgressChanged();
}
});
+ playlistView.setOnTouchListener(gestureListener);
registerForContextMenu(playlistView);
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.java
index 0ec75e2c..dce79ad8 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/LyricsActivity.java
@@ -1,72 +1,79 @@
-/*
- 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 android.os.Bundle;
-import android.widget.TextView;
-import net.sourceforge.subsonic.androidapp.R;
-import net.sourceforge.subsonic.androidapp.domain.Lyrics;
-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.Constants;
-import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
-
-/**
- * Displays song lyrics.
- *
- * @author Sindre Mehus
- */
-public final class LyricsActivity extends SubsonicTabActivity {
-
- @Override
- protected void onCreate(Bundle bundle) {
- super.onCreate(bundle);
- setContentView(R.layout.lyrics);
- load();
- }
-
- private void load() {
- BackgroundTask task = new TabActivityBackgroundTask(this) {
- @Override
- protected Lyrics doInBackground() throws Throwable {
- String artist = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ARTIST);
- String title = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_TITLE);
- MusicService musicService = MusicServiceFactory.getMusicService(LyricsActivity.this);
- return musicService.getLyrics(artist, title, LyricsActivity.this, this);
- }
-
- @Override
- protected void done(Lyrics result) {
- TextView artistView = (TextView) findViewById(R.id.lyrics_artist);
- TextView titleView = (TextView) findViewById(R.id.lyrics_title);
- TextView textView = (TextView) findViewById(R.id.lyrics_text);
- if (result != null && result.getArtist() != null) {
- artistView.setText(result.getArtist());
- titleView.setText(result.getTitle());
- textView.setText(result.getText());
- } else {
- artistView.setText(R.string.lyrics_nomatch);
- }
- }
- };
- task.execute();
- }
+/*
+ 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 android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import net.sourceforge.subsonic.androidapp.R;
+import net.sourceforge.subsonic.androidapp.domain.Lyrics;
+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.Constants;
+import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
+
+/**
+ * Displays song lyrics.
+ *
+ * @author Sindre Mehus
+ */
+public final class LyricsActivity extends SubsonicTabActivity {
+
+ @Override
+ protected void onCreate(Bundle bundle) {
+ super.onCreate(bundle);
+ setContentView(R.layout.lyrics);
+ View view = findViewById(R.id.lyrics_scrollview);
+ if (view != null) view.setOnTouchListener(gestureListener);
+ load();
+ }
+
+ private void load() {
+ BackgroundTask task = new TabActivityBackgroundTask(this) {
+ @Override
+ protected Lyrics doInBackground() throws Throwable {
+ String artist = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ARTIST);
+ String title = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_TITLE);
+ MusicService musicService = MusicServiceFactory.getMusicService(LyricsActivity.this);
+ return musicService.getLyrics(artist, title, LyricsActivity.this, this);
+ }
+
+ @Override
+ protected void done(Lyrics result) {
+ TextView artistView = (TextView) findViewById(R.id.lyrics_artist);
+ TextView titleView = (TextView) findViewById(R.id.lyrics_title);
+ TextView textView = (TextView) findViewById(R.id.lyrics_text);
+
+ if (result != null && result.getArtist() != null) {
+ artistView.setText(result.getArtist());
+ titleView.setText(result.getTitle());
+ textView.setText(result.getText());
+ } else {
+ artistView.setText(R.string.lyrics_nomatch);
+ }
+
+ }
+ };
+ task.execute();
+ }
}
\ No newline at end of file
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/MainActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/MainActivity.java
index 9ff0f7b2..5d5d0e0e 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/MainActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/MainActivity.java
@@ -90,6 +90,7 @@ public class MainActivity extends SubsonicTabActivity {
serverTextView.setText(name);
ListView list = (ListView) findViewById(R.id.main_list);
+ list.setOnTouchListener(gestureListener);
MergeAdapter adapter = new MergeAdapter();
adapter.addViews(Arrays.asList(serverButton), true);
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/SearchActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/SearchActivity.java
index 354ab814..353d51d3 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/SearchActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/SearchActivity.java
@@ -1,374 +1,376 @@
-/*
- 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.ArrayList;
-import java.util.List;
-import java.util.Arrays;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.ContextMenu;
-import android.view.LayoutInflater;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.MenuItem;
-import android.widget.AdapterView;
-import android.widget.ImageButton;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.net.Uri;
-import net.sourceforge.subsonic.androidapp.R;
-import net.sourceforge.subsonic.androidapp.domain.Artist;
-import net.sourceforge.subsonic.androidapp.domain.MusicDirectory;
-import net.sourceforge.subsonic.androidapp.domain.SearchCritera;
-import net.sourceforge.subsonic.androidapp.domain.SearchResult;
-import net.sourceforge.subsonic.androidapp.service.MusicService;
-import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory;
-import net.sourceforge.subsonic.androidapp.service.DownloadService;
-import net.sourceforge.subsonic.androidapp.util.ArtistAdapter;
-import net.sourceforge.subsonic.androidapp.util.BackgroundTask;
-import net.sourceforge.subsonic.androidapp.util.Constants;
-import net.sourceforge.subsonic.androidapp.util.EntryAdapter;
-import net.sourceforge.subsonic.androidapp.util.MergeAdapter;
-import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
-import net.sourceforge.subsonic.androidapp.util.Util;
-
-/**
- * Performs searches and displays the matching artists, albums and songs.
- *
- * @author Sindre Mehus
- */
-public class SearchActivity extends SubsonicTabActivity {
-
- private static final int DEFAULT_ARTISTS = 3;
- private static final int DEFAULT_ALBUMS = 5;
- private static final int DEFAULT_SONGS = 10;
-
- private static final int MAX_ARTISTS = 10;
- private static final int MAX_ALBUMS = 20;
- private static final int MAX_SONGS = 25;
- private ListView list;
-
- private View artistsHeading;
- private View albumsHeading;
- private View songsHeading;
- private TextView searchButton;
- private View moreArtistsButton;
- private View moreAlbumsButton;
- private View moreSongsButton;
- private SearchResult searchResult;
- private MergeAdapter mergeAdapter;
- private ArtistAdapter artistAdapter;
- private ListAdapter moreArtistsAdapter;
- private EntryAdapter albumAdapter;
- private ListAdapter moreAlbumsAdapter;
- private ListAdapter moreSongsAdapter;
- private EntryAdapter songAdapter;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.search);
-
- setTitle(R.string.search_title);
-
- View buttons = LayoutInflater.from(this).inflate(R.layout.search_buttons, null);
-
- artistsHeading = buttons.findViewById(R.id.search_artists);
- albumsHeading = buttons.findViewById(R.id.search_albums);
- songsHeading = buttons.findViewById(R.id.search_songs);
-
- searchButton = (TextView) buttons.findViewById(R.id.search_search);
- moreArtistsButton = buttons.findViewById(R.id.search_more_artists);
- moreAlbumsButton = buttons.findViewById(R.id.search_more_albums);
- moreSongsButton = buttons.findViewById(R.id.search_more_songs);
-
- list = (ListView) findViewById(R.id.search_list);
-
- list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- if (view == searchButton) {
- onSearchRequested();
- } else if (view == moreArtistsButton) {
- expandArtists();
- } else if (view == moreAlbumsButton) {
- expandAlbums();
- } else if (view == moreSongsButton) {
- expandSongs();
- } else {
- Object item = parent.getItemAtPosition(position);
- if (item instanceof Artist) {
- onArtistSelected((Artist) item);
- } else if (item instanceof MusicDirectory.Entry) {
- MusicDirectory.Entry entry = (MusicDirectory.Entry) item;
- if (entry.isDirectory()) {
- onAlbumSelected(entry, false);
- } else if (entry.isVideo()) {
- onVideoSelected(entry);
- } else {
- onSongSelected(entry, false, true, true, false);
- }
-
- }
- }
- }
- });
- registerForContextMenu(list);
-
- // Button 1: gone
- findViewById(R.id.action_button_1).setVisibility(View.GONE);
-
- // Button 2: gone
- findViewById(R.id.action_button_2).setVisibility(View.GONE);
-
- // Button 3: gone
- findViewById(R.id.action_button_3).setVisibility(View.GONE);
-
- // Button 4: search
- final ImageButton actionSearchButton = (ImageButton)findViewById(R.id.action_button_4);
- actionSearchButton.setImageResource(R.drawable.ic_menu_search);
- actionSearchButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- onSearchRequested();
- }
- });
-
- onNewIntent(getIntent());
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- String query = intent.getStringExtra(Constants.INTENT_EXTRA_NAME_QUERY);
- boolean autoplay = intent.getBooleanExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, false);
- boolean requestsearch = intent.getBooleanExtra(Constants.INTENT_EXTRA_REQUEST_SEARCH, false);
-
- if (query != null) {
- mergeAdapter = new MergeAdapter();
- list.setAdapter(mergeAdapter);
- search(query, autoplay);
- } else {
- populateList();
- if (requestsearch)
- onSearchRequested();
- }
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, view, menuInfo);
-
- AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
- Object selectedItem = list.getItemAtPosition(info.position);
-
- boolean isArtist = selectedItem instanceof Artist;
- boolean isAlbum = selectedItem instanceof MusicDirectory.Entry && ((MusicDirectory.Entry) selectedItem).isDirectory();
- boolean isSong = selectedItem instanceof MusicDirectory.Entry && (!((MusicDirectory.Entry) selectedItem).isDirectory())
- && (!((MusicDirectory.Entry) selectedItem).isVideo());
-
- if (isArtist || isAlbum) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.select_album_context, menu);
- } else if (isSong) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.select_song_context, menu);
- }
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem menuItem) {
- AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo();
- Object selectedItem = list.getItemAtPosition(info.position);
-
- Artist artist = selectedItem instanceof Artist ? (Artist) selectedItem : null;
- MusicDirectory.Entry entry = selectedItem instanceof MusicDirectory.Entry ? (MusicDirectory.Entry) selectedItem : null;
- String id = artist != null ? artist.getId() : entry.getId();
-
- switch (menuItem.getItemId()) {
- case R.id.album_menu_play_now:
- downloadRecursively(id, false, false, true);
- break;
- case R.id.album_menu_play_last:
- downloadRecursively(id, false, true, false);
- break;
- case R.id.album_menu_pin:
- downloadRecursively(id, true, true, false);
- break;
- case R.id.song_menu_play_now:
- onSongSelected(entry, false, false, true, false);
- break;
- case R.id.song_menu_play_next:
- onSongSelected(entry, false, true, false, true);
- break;
- case R.id.song_menu_play_last:
- onSongSelected(entry, false, true, false, false);
- break;
- default:
- return super.onContextItemSelected(menuItem);
- }
-
- return true;
- }
-
- private void search(final String query, final boolean autoplay) {
- BackgroundTask task = new TabActivityBackgroundTask(this) {
- @Override
- protected SearchResult doInBackground() throws Throwable {
- SearchCritera criteria = new SearchCritera(query, MAX_ARTISTS, MAX_ALBUMS, MAX_SONGS);
- MusicService service = MusicServiceFactory.getMusicService(SearchActivity.this);
- return service.search(criteria, SearchActivity.this, this);
- }
-
- @Override
- protected void done(SearchResult result) {
- searchResult = result;
- populateList();
- if (autoplay) {
- autoplay();
- }
-
- }
- };
- task.execute();
- }
-
- private void populateList() {
- mergeAdapter = new MergeAdapter();
- mergeAdapter.addView(searchButton, true);
-
- if (searchResult != null) {
- List artists = searchResult.getArtists();
- if (!artists.isEmpty()) {
- mergeAdapter.addView(artistsHeading);
- List displayedArtists = new ArrayList(artists.subList(0, Math.min(DEFAULT_ARTISTS, artists.size())));
- artistAdapter = new ArtistAdapter(this, displayedArtists);
- mergeAdapter.addAdapter(artistAdapter);
- if (artists.size() > DEFAULT_ARTISTS) {
- moreArtistsAdapter = mergeAdapter.addView(moreArtistsButton, true);
- }
- }
-
- List albums = searchResult.getAlbums();
- if (!albums.isEmpty()) {
- mergeAdapter.addView(albumsHeading);
- List displayedAlbums = new ArrayList(albums.subList(0, Math.min(DEFAULT_ALBUMS, albums.size())));
- albumAdapter = new EntryAdapter(this, getImageLoader(), displayedAlbums, false);
- mergeAdapter.addAdapter(albumAdapter);
- if (albums.size() > DEFAULT_ALBUMS) {
- moreAlbumsAdapter = mergeAdapter.addView(moreAlbumsButton, true);
- }
- }
-
- List songs = searchResult.getSongs();
- if (!songs.isEmpty()) {
- mergeAdapter.addView(songsHeading);
- List displayedSongs = new ArrayList(songs.subList(0, Math.min(DEFAULT_SONGS, songs.size())));
- songAdapter = new EntryAdapter(this, getImageLoader(), displayedSongs, false);
- mergeAdapter.addAdapter(songAdapter);
- if (songs.size() > DEFAULT_SONGS) {
- moreSongsAdapter = mergeAdapter.addView(moreSongsButton, true);
- }
- }
-
- boolean empty = searchResult.getArtists().isEmpty() && searchResult.getAlbums().isEmpty() && searchResult.getSongs().isEmpty();
- searchButton.setText(empty ? R.string.search_no_match : R.string.search_search);
- }
-
- list.setAdapter(mergeAdapter);
- }
-
- private void expandArtists() {
- artistAdapter.clear();
- for (Artist artist : searchResult.getArtists()) {
- artistAdapter.add(artist);
- }
- artistAdapter.notifyDataSetChanged();
- mergeAdapter.removeAdapter(moreArtistsAdapter);
- mergeAdapter.notifyDataSetChanged();
- }
-
- private void expandAlbums() {
- albumAdapter.clear();
- for (MusicDirectory.Entry album : searchResult.getAlbums()) {
- albumAdapter.add(album);
- }
- albumAdapter.notifyDataSetChanged();
- mergeAdapter.removeAdapter(moreAlbumsAdapter);
- mergeAdapter.notifyDataSetChanged();
- }
-
- private void expandSongs() {
- songAdapter.clear();
- for (MusicDirectory.Entry song : searchResult.getSongs()) {
- songAdapter.add(song);
- }
- songAdapter.notifyDataSetChanged();
- mergeAdapter.removeAdapter(moreSongsAdapter);
- mergeAdapter.notifyDataSetChanged();
- }
-
- private void onArtistSelected(Artist artist) {
- Intent intent = new Intent(this, SelectAlbumActivity.class);
- intent.putExtra(Constants.INTENT_EXTRA_NAME_ID, artist.getId());
- intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, artist.getName());
- Util.startActivityWithoutTransition(this, intent);
- }
-
- private void onAlbumSelected(MusicDirectory.Entry album, boolean autoplay) {
- Intent intent = new Intent(SearchActivity.this, SelectAlbumActivity.class);
- intent.putExtra(Constants.INTENT_EXTRA_NAME_ID, album.getId());
- intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, album.getTitle());
- intent.putExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, autoplay);
- Util.startActivityWithoutTransition(SearchActivity.this, intent);
- }
-
- private void onSongSelected(MusicDirectory.Entry song, boolean save, boolean append, boolean autoplay, boolean playNext) {
- DownloadService downloadService = getDownloadService();
- if (downloadService != null) {
- if (!append) {
- downloadService.clear();
- }
- downloadService.download(Arrays.asList(song), save, false, playNext);
- if (autoplay) {
- downloadService.play(downloadService.size() - 1);
- }
-
- Util.toast(SearchActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_added, 1, 1));
- }
- }
-
- private void onVideoSelected(MusicDirectory.Entry entry) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse(MusicServiceFactory.getMusicService(this).getVideoUrl(this, entry.getId())));
- startActivity(intent);
- }
-
- private void autoplay() {
- if (!searchResult.getSongs().isEmpty()) {
- onSongSelected(searchResult.getSongs().get(0), false, false, true, false);
- } else if (!searchResult.getAlbums().isEmpty()) {
- onAlbumSelected(searchResult.getAlbums().get(0), true);
- }
- }
+/*
+ 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.ArrayList;
+import java.util.List;
+import java.util.Arrays;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.ContextMenu;
+import android.view.LayoutInflater;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.MenuItem;
+import android.widget.AdapterView;
+import android.widget.ImageButton;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.net.Uri;
+import net.sourceforge.subsonic.androidapp.R;
+import net.sourceforge.subsonic.androidapp.domain.Artist;
+import net.sourceforge.subsonic.androidapp.domain.MusicDirectory;
+import net.sourceforge.subsonic.androidapp.domain.SearchCritera;
+import net.sourceforge.subsonic.androidapp.domain.SearchResult;
+import net.sourceforge.subsonic.androidapp.service.MusicService;
+import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory;
+import net.sourceforge.subsonic.androidapp.service.DownloadService;
+import net.sourceforge.subsonic.androidapp.util.ArtistAdapter;
+import net.sourceforge.subsonic.androidapp.util.BackgroundTask;
+import net.sourceforge.subsonic.androidapp.util.Constants;
+import net.sourceforge.subsonic.androidapp.util.EntryAdapter;
+import net.sourceforge.subsonic.androidapp.util.MergeAdapter;
+import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
+import net.sourceforge.subsonic.androidapp.util.Util;
+
+/**
+ * Performs searches and displays the matching artists, albums and songs.
+ *
+ * @author Sindre Mehus
+ */
+public class SearchActivity extends SubsonicTabActivity {
+
+ private static final int DEFAULT_ARTISTS = 3;
+ private static final int DEFAULT_ALBUMS = 5;
+ private static final int DEFAULT_SONGS = 10;
+
+ private static final int MAX_ARTISTS = 10;
+ private static final int MAX_ALBUMS = 20;
+ private static final int MAX_SONGS = 25;
+ private ListView list;
+
+ private View artistsHeading;
+ private View albumsHeading;
+ private View songsHeading;
+ private TextView searchButton;
+ private View moreArtistsButton;
+ private View moreAlbumsButton;
+ private View moreSongsButton;
+ private SearchResult searchResult;
+ private MergeAdapter mergeAdapter;
+ private ArtistAdapter artistAdapter;
+ private ListAdapter moreArtistsAdapter;
+ private EntryAdapter albumAdapter;
+ private ListAdapter moreAlbumsAdapter;
+ private ListAdapter moreSongsAdapter;
+ private EntryAdapter songAdapter;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.search);
+
+ setTitle(R.string.search_title);
+
+ View buttons = LayoutInflater.from(this).inflate(R.layout.search_buttons, null);
+
+ artistsHeading = buttons.findViewById(R.id.search_artists);
+ albumsHeading = buttons.findViewById(R.id.search_albums);
+ songsHeading = buttons.findViewById(R.id.search_songs);
+
+ searchButton = (TextView) buttons.findViewById(R.id.search_search);
+ moreArtistsButton = buttons.findViewById(R.id.search_more_artists);
+ moreAlbumsButton = buttons.findViewById(R.id.search_more_albums);
+ moreSongsButton = buttons.findViewById(R.id.search_more_songs);
+
+ list = (ListView) findViewById(R.id.search_list);
+
+ list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ if (view == searchButton) {
+ onSearchRequested();
+ } else if (view == moreArtistsButton) {
+ expandArtists();
+ } else if (view == moreAlbumsButton) {
+ expandAlbums();
+ } else if (view == moreSongsButton) {
+ expandSongs();
+ } else {
+ Object item = parent.getItemAtPosition(position);
+ if (item instanceof Artist) {
+ onArtistSelected((Artist) item);
+ } else if (item instanceof MusicDirectory.Entry) {
+ MusicDirectory.Entry entry = (MusicDirectory.Entry) item;
+ if (entry.isDirectory()) {
+ onAlbumSelected(entry, false);
+ } else if (entry.isVideo()) {
+ onVideoSelected(entry);
+ } else {
+ onSongSelected(entry, false, true, true, false);
+ }
+
+ }
+ }
+ }
+ });
+ list.setOnTouchListener(gestureListener);
+
+ registerForContextMenu(list);
+
+ // Button 1: gone
+ findViewById(R.id.action_button_1).setVisibility(View.GONE);
+
+ // Button 2: gone
+ findViewById(R.id.action_button_2).setVisibility(View.GONE);
+
+ // Button 3: gone
+ findViewById(R.id.action_button_3).setVisibility(View.GONE);
+
+ // Button 4: search
+ final ImageButton actionSearchButton = (ImageButton)findViewById(R.id.action_button_4);
+ actionSearchButton.setImageResource(R.drawable.ic_menu_search);
+ actionSearchButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ onSearchRequested();
+ }
+ });
+
+ onNewIntent(getIntent());
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ String query = intent.getStringExtra(Constants.INTENT_EXTRA_NAME_QUERY);
+ boolean autoplay = intent.getBooleanExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, false);
+ boolean requestsearch = intent.getBooleanExtra(Constants.INTENT_EXTRA_REQUEST_SEARCH, false);
+
+ if (query != null) {
+ mergeAdapter = new MergeAdapter();
+ list.setAdapter(mergeAdapter);
+ search(query, autoplay);
+ } else {
+ populateList();
+ if (requestsearch)
+ onSearchRequested();
+ }
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, view, menuInfo);
+
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
+ Object selectedItem = list.getItemAtPosition(info.position);
+
+ boolean isArtist = selectedItem instanceof Artist;
+ boolean isAlbum = selectedItem instanceof MusicDirectory.Entry && ((MusicDirectory.Entry) selectedItem).isDirectory();
+ boolean isSong = selectedItem instanceof MusicDirectory.Entry && (!((MusicDirectory.Entry) selectedItem).isDirectory())
+ && (!((MusicDirectory.Entry) selectedItem).isVideo());
+
+ if (isArtist || isAlbum) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.select_album_context, menu);
+ } else if (isSong) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.select_song_context, menu);
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem menuItem) {
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo();
+ Object selectedItem = list.getItemAtPosition(info.position);
+
+ Artist artist = selectedItem instanceof Artist ? (Artist) selectedItem : null;
+ MusicDirectory.Entry entry = selectedItem instanceof MusicDirectory.Entry ? (MusicDirectory.Entry) selectedItem : null;
+ String id = artist != null ? artist.getId() : entry.getId();
+
+ switch (menuItem.getItemId()) {
+ case R.id.album_menu_play_now:
+ downloadRecursively(id, false, false, true);
+ break;
+ case R.id.album_menu_play_last:
+ downloadRecursively(id, false, true, false);
+ break;
+ case R.id.album_menu_pin:
+ downloadRecursively(id, true, true, false);
+ break;
+ case R.id.song_menu_play_now:
+ onSongSelected(entry, false, false, true, false);
+ break;
+ case R.id.song_menu_play_next:
+ onSongSelected(entry, false, true, false, true);
+ break;
+ case R.id.song_menu_play_last:
+ onSongSelected(entry, false, true, false, false);
+ break;
+ default:
+ return super.onContextItemSelected(menuItem);
+ }
+
+ return true;
+ }
+
+ private void search(final String query, final boolean autoplay) {
+ BackgroundTask task = new TabActivityBackgroundTask(this) {
+ @Override
+ protected SearchResult doInBackground() throws Throwable {
+ SearchCritera criteria = new SearchCritera(query, MAX_ARTISTS, MAX_ALBUMS, MAX_SONGS);
+ MusicService service = MusicServiceFactory.getMusicService(SearchActivity.this);
+ return service.search(criteria, SearchActivity.this, this);
+ }
+
+ @Override
+ protected void done(SearchResult result) {
+ searchResult = result;
+ populateList();
+ if (autoplay) {
+ autoplay();
+ }
+
+ }
+ };
+ task.execute();
+ }
+
+ private void populateList() {
+ mergeAdapter = new MergeAdapter();
+ mergeAdapter.addView(searchButton, true);
+
+ if (searchResult != null) {
+ List artists = searchResult.getArtists();
+ if (!artists.isEmpty()) {
+ mergeAdapter.addView(artistsHeading);
+ List displayedArtists = new ArrayList(artists.subList(0, Math.min(DEFAULT_ARTISTS, artists.size())));
+ artistAdapter = new ArtistAdapter(this, displayedArtists);
+ mergeAdapter.addAdapter(artistAdapter);
+ if (artists.size() > DEFAULT_ARTISTS) {
+ moreArtistsAdapter = mergeAdapter.addView(moreArtistsButton, true);
+ }
+ }
+
+ List albums = searchResult.getAlbums();
+ if (!albums.isEmpty()) {
+ mergeAdapter.addView(albumsHeading);
+ List displayedAlbums = new ArrayList(albums.subList(0, Math.min(DEFAULT_ALBUMS, albums.size())));
+ albumAdapter = new EntryAdapter(this, getImageLoader(), displayedAlbums, false);
+ mergeAdapter.addAdapter(albumAdapter);
+ if (albums.size() > DEFAULT_ALBUMS) {
+ moreAlbumsAdapter = mergeAdapter.addView(moreAlbumsButton, true);
+ }
+ }
+
+ List songs = searchResult.getSongs();
+ if (!songs.isEmpty()) {
+ mergeAdapter.addView(songsHeading);
+ List displayedSongs = new ArrayList(songs.subList(0, Math.min(DEFAULT_SONGS, songs.size())));
+ songAdapter = new EntryAdapter(this, getImageLoader(), displayedSongs, false);
+ mergeAdapter.addAdapter(songAdapter);
+ if (songs.size() > DEFAULT_SONGS) {
+ moreSongsAdapter = mergeAdapter.addView(moreSongsButton, true);
+ }
+ }
+
+ boolean empty = searchResult.getArtists().isEmpty() && searchResult.getAlbums().isEmpty() && searchResult.getSongs().isEmpty();
+ searchButton.setText(empty ? R.string.search_no_match : R.string.search_search);
+ }
+
+ list.setAdapter(mergeAdapter);
+ }
+
+ private void expandArtists() {
+ artistAdapter.clear();
+ for (Artist artist : searchResult.getArtists()) {
+ artistAdapter.add(artist);
+ }
+ artistAdapter.notifyDataSetChanged();
+ mergeAdapter.removeAdapter(moreArtistsAdapter);
+ mergeAdapter.notifyDataSetChanged();
+ }
+
+ private void expandAlbums() {
+ albumAdapter.clear();
+ for (MusicDirectory.Entry album : searchResult.getAlbums()) {
+ albumAdapter.add(album);
+ }
+ albumAdapter.notifyDataSetChanged();
+ mergeAdapter.removeAdapter(moreAlbumsAdapter);
+ mergeAdapter.notifyDataSetChanged();
+ }
+
+ private void expandSongs() {
+ songAdapter.clear();
+ for (MusicDirectory.Entry song : searchResult.getSongs()) {
+ songAdapter.add(song);
+ }
+ songAdapter.notifyDataSetChanged();
+ mergeAdapter.removeAdapter(moreSongsAdapter);
+ mergeAdapter.notifyDataSetChanged();
+ }
+
+ private void onArtistSelected(Artist artist) {
+ Intent intent = new Intent(this, SelectAlbumActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_ID, artist.getId());
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, artist.getName());
+ Util.startActivityWithoutTransition(this, intent);
+ }
+
+ private void onAlbumSelected(MusicDirectory.Entry album, boolean autoplay) {
+ Intent intent = new Intent(SearchActivity.this, SelectAlbumActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_ID, album.getId());
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, album.getTitle());
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, autoplay);
+ Util.startActivityWithoutTransition(SearchActivity.this, intent);
+ }
+
+ private void onSongSelected(MusicDirectory.Entry song, boolean save, boolean append, boolean autoplay, boolean playNext) {
+ DownloadService downloadService = getDownloadService();
+ if (downloadService != null) {
+ if (!append) {
+ downloadService.clear();
+ }
+ downloadService.download(Arrays.asList(song), save, false, playNext);
+ if (autoplay) {
+ downloadService.play(downloadService.size() - 1);
+ }
+
+ Util.toast(SearchActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_added, 1, 1));
+ }
+ }
+
+ private void onVideoSelected(MusicDirectory.Entry entry) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse(MusicServiceFactory.getMusicService(this).getVideoUrl(this, entry.getId())));
+ startActivity(intent);
+ }
+
+ private void autoplay() {
+ if (!searchResult.getSongs().isEmpty()) {
+ onSongSelected(searchResult.getSongs().get(0), false, false, true, false);
+ } else if (!searchResult.getAlbums().isEmpty()) {
+ onAlbumSelected(searchResult.getAlbums().get(0), true);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.java
index 1548fcfc..dc235e2e 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/SelectAlbumActivity.java
@@ -96,6 +96,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
}
}
});
+ entryList.setOnTouchListener(gestureListener);
coverArtView = (ImageView) findViewById(R.id.actionbar_home_icon);
selectButton = (Button) findViewById(R.id.select_album_select);
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.java
index a7370f6a..e8caef3a 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/SelectArtistActivity.java
@@ -1,236 +1,237 @@
-/*
- 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 android.content.Intent;
-import android.os.Bundle;
-import android.view.ContextMenu;
-import android.view.LayoutInflater;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ImageButton;
-import android.widget.ListView;
-import android.widget.TextView;
-import net.sourceforge.subsonic.androidapp.R;
-import net.sourceforge.subsonic.androidapp.domain.Artist;
-import net.sourceforge.subsonic.androidapp.domain.Indexes;
-import net.sourceforge.subsonic.androidapp.domain.MusicFolder;
-import net.sourceforge.subsonic.androidapp.service.MusicService;
-import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory;
-import net.sourceforge.subsonic.androidapp.util.ArtistAdapter;
-import net.sourceforge.subsonic.androidapp.util.BackgroundTask;
-import net.sourceforge.subsonic.androidapp.util.Constants;
-import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
-import net.sourceforge.subsonic.androidapp.util.Util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class SelectArtistActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener {
-
- private static final int MENU_GROUP_MUSIC_FOLDER = 10;
-
- private ListView artistList;
- private View folderButton;
- private TextView folderName;
- private List musicFolders;
-
- /**
- * Called when the activity is first created.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.select_artist);
-
- artistList = (ListView) findViewById(R.id.select_artist_list);
- artistList.setOnItemClickListener(this);
-
- folderButton = LayoutInflater.from(this).inflate(R.layout.select_artist_header, artistList, false);
- folderName = (TextView) folderButton.findViewById(R.id.select_artist_folder_2);
-
- if (!Util.isOffline(this)) {
- artistList.addHeaderView(folderButton);
- }
-
- registerForContextMenu(artistList);
-
- setTitle(Util.isOffline(this) ? R.string.music_library_label_offline : R.string.music_library_label);
-
- // Button 1: gone
- findViewById(R.id.action_button_1).setVisibility(View.GONE);
-
- // Button 2: gone
- findViewById(R.id.action_button_2).setVisibility(View.GONE);
-
- // Button 3: shuffle
- ImageButton shuffleButton = (ImageButton) findViewById(R.id.action_button_3);
- shuffleButton.setImageResource(R.drawable.ic_menu_shuffle);
- shuffleButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- Intent intent = new Intent(SelectArtistActivity.this, DownloadActivity.class);
- intent.putExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, true);
- Util.startActivityWithoutTransition(SelectArtistActivity.this, intent);
- }
- });
-
- // Button 4: refresh
- ImageButton refreshButton = (ImageButton) findViewById(R.id.action_button_4);
- refreshButton.setImageResource(R.drawable.ic_menu_refresh);
- refreshButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- refresh();
- }
- });
-
-
-
- musicFolders = null;
- load();
- }
-
- private void refresh() {
- finish();
- Intent intent = getIntent();
- intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true);
- Util.startActivityWithoutTransition(this, intent);
- }
-
- private void selectFolder() {
- folderButton.showContextMenu();
- }
-
- private void load() {
- BackgroundTask task = new TabActivityBackgroundTask(this) {
- @Override
- protected Indexes doInBackground() throws Throwable {
- boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false);
- MusicService musicService = MusicServiceFactory.getMusicService(SelectArtistActivity.this);
- if (!Util.isOffline(SelectArtistActivity.this)) {
- musicFolders = musicService.getMusicFolders(SelectArtistActivity.this, this);
- }
- String musicFolderId = Util.getSelectedMusicFolderId(SelectArtistActivity.this);
- return musicService.getIndexes(musicFolderId, refresh, SelectArtistActivity.this, this);
- }
-
- @Override
- protected void done(Indexes result) {
- List artists = new ArrayList(result.getShortcuts().size() + result.getArtists().size());
- artists.addAll(result.getShortcuts());
- artists.addAll(result.getArtists());
- artistList.setAdapter(new ArtistAdapter(SelectArtistActivity.this, artists));
-
- // Display selected music folder
- if (musicFolders != null) {
- String musicFolderId = Util.getSelectedMusicFolderId(SelectArtistActivity.this);
- if (musicFolderId == null) {
- folderName.setText(R.string.select_artist_all_folders);
- } else {
- for (MusicFolder musicFolder : musicFolders) {
- if (musicFolder.getId().equals(musicFolderId)) {
- folderName.setText(musicFolder.getName());
- break;
- }
- }
- }
- }
- }
- };
- task.execute();
- }
-
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- if (view == folderButton) {
- selectFolder();
- } else {
- Artist artist = (Artist) parent.getItemAtPosition(position);
- Intent intent = new Intent(this, SelectAlbumActivity.class);
- intent.putExtra(Constants.INTENT_EXTRA_NAME_ID, artist.getId());
- intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, artist.getName());
- Util.startActivityWithoutTransition(this, intent);
- }
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, view, menuInfo);
-
- AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
-
- if (artistList.getItemAtPosition(info.position) instanceof Artist) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.select_artist_context, menu);
- } else if (info.position == 0) {
- String musicFolderId = Util.getSelectedMusicFolderId(this);
- MenuItem menuItem = menu.add(MENU_GROUP_MUSIC_FOLDER, -1, 0, R.string.select_artist_all_folders);
- if (musicFolderId == null) {
- menuItem.setChecked(true);
- }
- if (musicFolders != null) {
- for (int i = 0; i < musicFolders.size(); i++) {
- MusicFolder musicFolder = musicFolders.get(i);
- menuItem = menu.add(MENU_GROUP_MUSIC_FOLDER, i, i + 1, musicFolder.getName());
- if (musicFolder.getId().equals(musicFolderId)) {
- menuItem.setChecked(true);
- }
- }
- }
- menu.setGroupCheckable(MENU_GROUP_MUSIC_FOLDER, true, true);
- }
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem menuItem) {
- AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo();
-
- Artist artist = (Artist) artistList.getItemAtPosition(info.position);
-
- if (artist != null) {
- switch (menuItem.getItemId()) {
- case R.id.artist_menu_play_now:
- downloadRecursively(artist.getId(), false, false, true);
- break;
- case R.id.artist_menu_play_last:
- downloadRecursively(artist.getId(), false, true, false);
- break;
- case R.id.artist_menu_pin:
- downloadRecursively(artist.getId(), true, true, false);
- break;
- default:
- return super.onContextItemSelected(menuItem);
- }
- } else if (info.position == 0) {
- MusicFolder selectedFolder = menuItem.getItemId() == -1 ? null : musicFolders.get(menuItem.getItemId());
- String musicFolderId = selectedFolder == null ? null : selectedFolder.getId();
- String musicFolderName = selectedFolder == null ? getString(R.string.select_artist_all_folders)
- : selectedFolder.getName();
- Util.setSelectedMusicFolderId(this, musicFolderId);
- folderName.setText(musicFolderName);
- refresh();
- }
-
- return true;
- }
+/*
+ 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 android.content.Intent;
+import android.os.Bundle;
+import android.view.ContextMenu;
+import android.view.LayoutInflater;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ImageButton;
+import android.widget.ListView;
+import android.widget.TextView;
+import net.sourceforge.subsonic.androidapp.R;
+import net.sourceforge.subsonic.androidapp.domain.Artist;
+import net.sourceforge.subsonic.androidapp.domain.Indexes;
+import net.sourceforge.subsonic.androidapp.domain.MusicFolder;
+import net.sourceforge.subsonic.androidapp.service.MusicService;
+import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory;
+import net.sourceforge.subsonic.androidapp.util.ArtistAdapter;
+import net.sourceforge.subsonic.androidapp.util.BackgroundTask;
+import net.sourceforge.subsonic.androidapp.util.Constants;
+import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
+import net.sourceforge.subsonic.androidapp.util.Util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SelectArtistActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener {
+
+ private static final int MENU_GROUP_MUSIC_FOLDER = 10;
+
+ private ListView artistList;
+ private View folderButton;
+ private TextView folderName;
+ private List musicFolders;
+
+ /**
+ * Called when the activity is first created.
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.select_artist);
+
+ artistList = (ListView) findViewById(R.id.select_artist_list);
+ artistList.setOnItemClickListener(this);
+ artistList.setOnTouchListener(gestureListener);
+
+ folderButton = LayoutInflater.from(this).inflate(R.layout.select_artist_header, artistList, false);
+ folderName = (TextView) folderButton.findViewById(R.id.select_artist_folder_2);
+
+ if (!Util.isOffline(this)) {
+ artistList.addHeaderView(folderButton);
+ }
+
+ registerForContextMenu(artistList);
+
+ setTitle(Util.isOffline(this) ? R.string.music_library_label_offline : R.string.music_library_label);
+
+ // Button 1: gone
+ findViewById(R.id.action_button_1).setVisibility(View.GONE);
+
+ // Button 2: gone
+ findViewById(R.id.action_button_2).setVisibility(View.GONE);
+
+ // Button 3: shuffle
+ ImageButton shuffleButton = (ImageButton) findViewById(R.id.action_button_3);
+ shuffleButton.setImageResource(R.drawable.ic_menu_shuffle);
+ shuffleButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(SelectArtistActivity.this, DownloadActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, true);
+ Util.startActivityWithoutTransition(SelectArtistActivity.this, intent);
+ }
+ });
+
+ // Button 4: refresh
+ ImageButton refreshButton = (ImageButton) findViewById(R.id.action_button_4);
+ refreshButton.setImageResource(R.drawable.ic_menu_refresh);
+ refreshButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ refresh();
+ }
+ });
+
+
+
+ musicFolders = null;
+ load();
+ }
+
+ private void refresh() {
+ finish();
+ Intent intent = getIntent();
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true);
+ Util.startActivityWithoutTransition(this, intent);
+ }
+
+ private void selectFolder() {
+ folderButton.showContextMenu();
+ }
+
+ private void load() {
+ BackgroundTask task = new TabActivityBackgroundTask(this) {
+ @Override
+ protected Indexes doInBackground() throws Throwable {
+ boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false);
+ MusicService musicService = MusicServiceFactory.getMusicService(SelectArtistActivity.this);
+ if (!Util.isOffline(SelectArtistActivity.this)) {
+ musicFolders = musicService.getMusicFolders(SelectArtistActivity.this, this);
+ }
+ String musicFolderId = Util.getSelectedMusicFolderId(SelectArtistActivity.this);
+ return musicService.getIndexes(musicFolderId, refresh, SelectArtistActivity.this, this);
+ }
+
+ @Override
+ protected void done(Indexes result) {
+ List artists = new ArrayList(result.getShortcuts().size() + result.getArtists().size());
+ artists.addAll(result.getShortcuts());
+ artists.addAll(result.getArtists());
+ artistList.setAdapter(new ArtistAdapter(SelectArtistActivity.this, artists));
+
+ // Display selected music folder
+ if (musicFolders != null) {
+ String musicFolderId = Util.getSelectedMusicFolderId(SelectArtistActivity.this);
+ if (musicFolderId == null) {
+ folderName.setText(R.string.select_artist_all_folders);
+ } else {
+ for (MusicFolder musicFolder : musicFolders) {
+ if (musicFolder.getId().equals(musicFolderId)) {
+ folderName.setText(musicFolder.getName());
+ break;
+ }
+ }
+ }
+ }
+ }
+ };
+ task.execute();
+ }
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ if (view == folderButton) {
+ selectFolder();
+ } else {
+ Artist artist = (Artist) parent.getItemAtPosition(position);
+ Intent intent = new Intent(this, SelectAlbumActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_ID, artist.getId());
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, artist.getName());
+ Util.startActivityWithoutTransition(this, intent);
+ }
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, view, menuInfo);
+
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
+
+ if (artistList.getItemAtPosition(info.position) instanceof Artist) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.select_artist_context, menu);
+ } else if (info.position == 0) {
+ String musicFolderId = Util.getSelectedMusicFolderId(this);
+ MenuItem menuItem = menu.add(MENU_GROUP_MUSIC_FOLDER, -1, 0, R.string.select_artist_all_folders);
+ if (musicFolderId == null) {
+ menuItem.setChecked(true);
+ }
+ if (musicFolders != null) {
+ for (int i = 0; i < musicFolders.size(); i++) {
+ MusicFolder musicFolder = musicFolders.get(i);
+ menuItem = menu.add(MENU_GROUP_MUSIC_FOLDER, i, i + 1, musicFolder.getName());
+ if (musicFolder.getId().equals(musicFolderId)) {
+ menuItem.setChecked(true);
+ }
+ }
+ }
+ menu.setGroupCheckable(MENU_GROUP_MUSIC_FOLDER, true, true);
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem menuItem) {
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo();
+
+ Artist artist = (Artist) artistList.getItemAtPosition(info.position);
+
+ if (artist != null) {
+ switch (menuItem.getItemId()) {
+ case R.id.artist_menu_play_now:
+ downloadRecursively(artist.getId(), false, false, true);
+ break;
+ case R.id.artist_menu_play_last:
+ downloadRecursively(artist.getId(), false, true, false);
+ break;
+ case R.id.artist_menu_pin:
+ downloadRecursively(artist.getId(), true, true, false);
+ break;
+ default:
+ return super.onContextItemSelected(menuItem);
+ }
+ } else if (info.position == 0) {
+ MusicFolder selectedFolder = menuItem.getItemId() == -1 ? null : musicFolders.get(menuItem.getItemId());
+ String musicFolderId = selectedFolder == null ? null : selectedFolder.getId();
+ String musicFolderName = selectedFolder == null ? getString(R.string.select_artist_all_folders)
+ : selectedFolder.getName();
+ Util.setSelectedMusicFolderId(this, musicFolderId);
+ folderName.setText(musicFolderName);
+ refresh();
+ }
+
+ return true;
+ }
}
\ No newline at end of file
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.java
index a7be53d4..c98839e8 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/SelectPlaylistActivity.java
@@ -1,151 +1,152 @@
-/*
- 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 android.content.Intent;
-import android.os.Bundle;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageButton;
-import android.widget.ListView;
-import net.sourceforge.subsonic.androidapp.R;
-import net.sourceforge.subsonic.androidapp.domain.Playlist;
-import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory;
-import net.sourceforge.subsonic.androidapp.service.MusicService;
-import net.sourceforge.subsonic.androidapp.util.BackgroundTask;
-import net.sourceforge.subsonic.androidapp.util.Constants;
-import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
-import net.sourceforge.subsonic.androidapp.util.Util;
-
-import java.util.List;
-
-public class SelectPlaylistActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener {
-
- private static final int MENU_ITEM_PLAY_ALL = 1;
-
- private ListView list;
- private View emptyTextView;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.select_playlist);
-
- list = (ListView) findViewById(R.id.select_playlist_list);
- emptyTextView = findViewById(R.id.select_playlist_empty);
- list.setOnItemClickListener(this);
- registerForContextMenu(list);
-
- // Title: Playlists
- setTitle(R.string.playlist_label);
-
- // Button 1: gone
- findViewById(R.id.action_button_1).setVisibility(View.GONE);
-
- // Button 2: gone
- findViewById(R.id.action_button_2).setVisibility(View.GONE);
-
- // Button 3: gone
- findViewById(R.id.action_button_3).setVisibility(View.GONE);
-
- // Button 4: refresh
- ImageButton refreshButton = (ImageButton) findViewById(R.id.action_button_4);
- refreshButton.setImageResource(R.drawable.ic_menu_refresh);
- refreshButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- refresh();
- }
- });
-
- load();
- }
-
- private void refresh() {
- finish();
- Intent intent = new Intent(this, SelectPlaylistActivity.class);
- intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true);
- Util.startActivityWithoutTransition(this, intent);
- }
-
- private void load() {
- BackgroundTask> task = new TabActivityBackgroundTask>(this) {
- @Override
- protected List doInBackground() throws Throwable {
- MusicService musicService = MusicServiceFactory.getMusicService(SelectPlaylistActivity.this);
- boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false);
- return musicService.getPlaylists(refresh, SelectPlaylistActivity.this, this);
- }
-
- @Override
- protected void done(List result) {
- list.setAdapter(new PlaylistAdapter(result));
- emptyTextView.setVisibility(result.isEmpty() ? View.VISIBLE : View.GONE);
- }
- };
- task.execute();
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, view, menuInfo);
- menu.add(Menu.NONE, MENU_ITEM_PLAY_ALL, MENU_ITEM_PLAY_ALL, R.string.common_play_now);
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem menuItem) {
- AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo();
- Playlist playlist = (Playlist) list.getItemAtPosition(info.position);
-
- switch (menuItem.getItemId()) {
- case MENU_ITEM_PLAY_ALL:
- Intent intent = new Intent(SelectPlaylistActivity.this, SelectAlbumActivity.class);
- intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID, playlist.getId());
- intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME, playlist.getName());
- intent.putExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, true);
- Util.startActivityWithoutTransition(SelectPlaylistActivity.this, intent);
- break;
- default:
- return super.onContextItemSelected(menuItem);
- }
- return true;
- }
-
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
-
- Playlist playlist = (Playlist) parent.getItemAtPosition(position);
-
- Intent intent = new Intent(SelectPlaylistActivity.this, SelectAlbumActivity.class);
- intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID, playlist.getId());
- intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME, playlist.getName());
- Util.startActivityWithoutTransition(SelectPlaylistActivity.this, intent);
- }
-
- private class PlaylistAdapter extends ArrayAdapter {
- public PlaylistAdapter(List playlists) {
- super(SelectPlaylistActivity.this, R.layout.playlist_list_item, playlists);
- }
- }
+/*
+ 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 android.content.Intent;
+import android.os.Bundle;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageButton;
+import android.widget.ListView;
+import net.sourceforge.subsonic.androidapp.R;
+import net.sourceforge.subsonic.androidapp.domain.Playlist;
+import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory;
+import net.sourceforge.subsonic.androidapp.service.MusicService;
+import net.sourceforge.subsonic.androidapp.util.BackgroundTask;
+import net.sourceforge.subsonic.androidapp.util.Constants;
+import net.sourceforge.subsonic.androidapp.util.TabActivityBackgroundTask;
+import net.sourceforge.subsonic.androidapp.util.Util;
+
+import java.util.List;
+
+public class SelectPlaylistActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener {
+
+ private static final int MENU_ITEM_PLAY_ALL = 1;
+
+ private ListView list;
+ private View emptyTextView;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.select_playlist);
+
+ list = (ListView) findViewById(R.id.select_playlist_list);
+ emptyTextView = findViewById(R.id.select_playlist_empty);
+ list.setOnItemClickListener(this);
+ list.setOnTouchListener(gestureListener);
+ registerForContextMenu(list);
+
+ // Title: Playlists
+ setTitle(R.string.playlist_label);
+
+ // Button 1: gone
+ findViewById(R.id.action_button_1).setVisibility(View.GONE);
+
+ // Button 2: gone
+ findViewById(R.id.action_button_2).setVisibility(View.GONE);
+
+ // Button 3: gone
+ findViewById(R.id.action_button_3).setVisibility(View.GONE);
+
+ // Button 4: refresh
+ ImageButton refreshButton = (ImageButton) findViewById(R.id.action_button_4);
+ refreshButton.setImageResource(R.drawable.ic_menu_refresh);
+ refreshButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ refresh();
+ }
+ });
+
+ load();
+ }
+
+ private void refresh() {
+ finish();
+ Intent intent = new Intent(this, SelectPlaylistActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true);
+ Util.startActivityWithoutTransition(this, intent);
+ }
+
+ private void load() {
+ BackgroundTask> task = new TabActivityBackgroundTask>(this) {
+ @Override
+ protected List doInBackground() throws Throwable {
+ MusicService musicService = MusicServiceFactory.getMusicService(SelectPlaylistActivity.this);
+ boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false);
+ return musicService.getPlaylists(refresh, SelectPlaylistActivity.this, this);
+ }
+
+ @Override
+ protected void done(List result) {
+ list.setAdapter(new PlaylistAdapter(result));
+ emptyTextView.setVisibility(result.isEmpty() ? View.VISIBLE : View.GONE);
+ }
+ };
+ task.execute();
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, view, menuInfo);
+ menu.add(Menu.NONE, MENU_ITEM_PLAY_ALL, MENU_ITEM_PLAY_ALL, R.string.common_play_now);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem menuItem) {
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo();
+ Playlist playlist = (Playlist) list.getItemAtPosition(info.position);
+
+ switch (menuItem.getItemId()) {
+ case MENU_ITEM_PLAY_ALL:
+ Intent intent = new Intent(SelectPlaylistActivity.this, SelectAlbumActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID, playlist.getId());
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME, playlist.getName());
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, true);
+ Util.startActivityWithoutTransition(SelectPlaylistActivity.this, intent);
+ break;
+ default:
+ return super.onContextItemSelected(menuItem);
+ }
+ return true;
+ }
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+
+ Playlist playlist = (Playlist) parent.getItemAtPosition(position);
+
+ Intent intent = new Intent(SelectPlaylistActivity.this, SelectAlbumActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID, playlist.getId());
+ intent.putExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME, playlist.getName());
+ Util.startActivityWithoutTransition(SelectPlaylistActivity.this, intent);
+ }
+
+ private class PlaylistAdapter extends ArrayAdapter {
+ public PlaylistAdapter(List playlists) {
+ super(SelectPlaylistActivity.this, R.layout.playlist_list_item, playlists);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.java b/src/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.java
index 4af81b60..7d28f7d0 100644
--- a/src/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.java
+++ b/src/net/sourceforge/subsonic/androidapp/activity/SubsonicTabActivity.java
@@ -33,13 +33,19 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
+import android.view.GestureDetector;
+import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.MotionEvent;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.Window;
+import android.view.animation.TranslateAnimation;
import android.widget.TextView;
+import android.widget.Toast;
import net.sourceforge.subsonic.androidapp.R;
import net.sourceforge.subsonic.androidapp.domain.MusicDirectory;
import net.sourceforge.subsonic.androidapp.service.DownloadService;
@@ -54,10 +60,12 @@ import net.sourceforge.subsonic.androidapp.util.Util;
/**
* @author Sindre Mehus
*/
-public class SubsonicTabActivity extends Activity {
-
+public class SubsonicTabActivity extends Activity implements OnClickListener{
private static final String TAG = SubsonicTabActivity.class.getSimpleName();
private static ImageLoader IMAGE_LOADER;
+ private static final int SWIPE_MIN_DISTANCE = 120;
+ private static final int SWIPE_MAX_OFF_PATH = 250;
+ private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private boolean destroyed;
private View homeButton;
@@ -65,6 +73,15 @@ public class SubsonicTabActivity extends Activity {
private View searchButton;
private View playlistButton;
private View nowPlayingButton;
+
+ private GestureDetector gestureDetector;
+ View.OnTouchListener gestureListener;
+
+ enum SwipeDirection
+ {
+ Left,
+ Right
+ };
@Override
protected void onCreate(Bundle bundle) {
@@ -74,6 +91,14 @@ public class SubsonicTabActivity extends Activity {
requestWindowFeature(Window.FEATURE_NO_TITLE);
startService(new Intent(this, DownloadServiceImpl.class));
setVolumeControlStream(AudioManager.STREAM_MUSIC);
+
+ gestureDetector = new GestureDetector(new GestureActivity());
+ gestureListener = new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ return gestureDetector.onTouchEvent(event);
+ }
+ };
}
@Override
@@ -89,7 +114,7 @@ public class SubsonicTabActivity extends Activity {
Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent);
}
});
-
+
musicButton = findViewById(R.id.button_bar_music);
musicButton.setOnClickListener(new View.OnClickListener() {
@Override
@@ -385,5 +410,105 @@ public class SubsonicTabActivity extends Activity {
}
}
}
+
+ @Override
+ public void onClick(View arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ class GestureActivity extends SimpleOnGestureListener {
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+ try {
+ if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
+ return false;
+
+ SwipeDirection swipe = null;
+
+ // right to left swipe
+ if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
+ swipe = SwipeDirection.Left;
+ } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
+ swipe = SwipeDirection.Right;
+ }
+
+ String name = SubsonicTabActivity.this.getClass().getSimpleName();
+
+ switch (swipe)
+ {
+ case Right:
+ if (name.equalsIgnoreCase("MainActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, DownloadActivity.class);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ else if (name.equalsIgnoreCase("SelectArtistActivity") || name.equalsIgnoreCase("SelectAlbumActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, MainActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ else if (name.equalsIgnoreCase("SearchActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, SelectArtistActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ else if (name.equalsIgnoreCase("SelectPlaylistActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, SearchActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_REQUEST_SEARCH, true);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ else if (name.equalsIgnoreCase("DownloadActivity") || name.equalsIgnoreCase("LyricsActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, SelectPlaylistActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+
+ break;
+ case Left:
+ if (name.equalsIgnoreCase("MainActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, SelectArtistActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ if (name.equalsIgnoreCase("SelectArtistActivity") || name.equalsIgnoreCase("SelectAlbumActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, SearchActivity.class);
+ intent.putExtra(Constants.INTENT_EXTRA_REQUEST_SEARCH, true);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ else if (name.equalsIgnoreCase("SearchActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, SelectPlaylistActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ else if (name.equalsIgnoreCase("SelectPlaylistActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, DownloadActivity.class);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+ else if (name.equalsIgnoreCase("DownloadActivity") || name.equalsIgnoreCase("LyricsActivity"))
+ {
+ Intent intent = new Intent(SubsonicTabActivity.this, MainActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ SubsonicTabActivity.this.startActivity(intent);
+ }
+
+ break;
+ }
+ } catch (Exception e) {
+ // nothing
+ }
+
+ return false;
+ }
+
+ }
}
diff --git a/src/net/sourceforge/subsonic/androidapp/service/DownloadServiceImpl.java b/src/net/sourceforge/subsonic/androidapp/service/DownloadServiceImpl.java
index 18b34686..69e85ecd 100644
--- a/src/net/sourceforge/subsonic/androidapp/service/DownloadServiceImpl.java
+++ b/src/net/sourceforge/subsonic/androidapp/service/DownloadServiceImpl.java
@@ -74,8 +74,8 @@ public class DownloadServiceImpl extends Service implements DownloadService {
private final List cleanupCandidates = new ArrayList();
private final Scrobbler scrobbler = new Scrobbler();
private final JukeboxService jukeboxService = new JukeboxService(this);
- private final Notification notification = new Notification(R.drawable.ic_stat_subsonic, null, System.currentTimeMillis());
-
+ private final Notification notification = new Notification(R.drawable.ic_stat_subsonic, null, System.currentTimeMillis());
+
private DownloadFile currentPlaying;
private DownloadFile currentDownloading;
private CancellableTask bufferTask;
diff --git a/src/net/sourceforge/subsonic/androidapp/util/Util.java b/src/net/sourceforge/subsonic/androidapp/util/Util.java
index fb2b43b2..b83fe84d 100644
--- a/src/net/sourceforge/subsonic/androidapp/util/Util.java
+++ b/src/net/sourceforge/subsonic/androidapp/util/Util.java
@@ -801,19 +801,18 @@ public class Util extends DownloadActivity {
pendingIntent = PendingIntent.getService(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.control_play, pendingIntent);
- intent = new Intent("2"); // Use a unique action name to ensure a different PendingIntent to be created.
+ intent = new Intent("2");
intent.setComponent(new ComponentName(context, DownloadServiceImpl.class));
intent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT));
pendingIntent = PendingIntent.getService(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.control_next, pendingIntent);
- intent = new Intent("3"); // Use a unique action name to ensure a different PendingIntent to be created.
+ intent = new Intent("3");
intent.setComponent(new ComponentName(context, DownloadServiceImpl.class));
intent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS));
pendingIntent = PendingIntent.getService(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.control_previous, pendingIntent);
- // Emulate media button clicks.
intent = new Intent("4");
intent.setComponent(new ComponentName(context, DownloadServiceImpl.class));
intent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP));