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));