From 5a3424ca5e919f1f0f10435c8a3caff0113d6f01 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 11 Jan 2014 13:13:40 -0800 Subject: #46 Start of browse by tags --- .../daneren2005/dsub/activity/SettingsActivity.java | 8 ++++++++ .../daneren2005/dsub/service/RESTMusicService.java | 19 +++++++++++++------ .../dsub/service/parser/AlbumListParser.java | 4 +++- .../dsub/service/parser/StarredListParser.java | 8 ++++++-- src/github/daneren2005/dsub/util/Constants.java | 1 + src/github/daneren2005/dsub/util/Util.java | 10 +++++++++- 6 files changed, 40 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/activity/SettingsActivity.java b/src/github/daneren2005/dsub/activity/SettingsActivity.java index a1a58758..55415725 100644 --- a/src/github/daneren2005/dsub/activity/SettingsActivity.java +++ b/src/github/daneren2005/dsub/activity/SettingsActivity.java @@ -28,6 +28,7 @@ import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; @@ -339,6 +340,12 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer serverPasswordPreference.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); serverPasswordPreference.setSummary("***"); serverPasswordPreference.setTitle(R.string.settings_server_password); + + final CheckBoxPreference serverTagPreference = new CheckBoxPreference(this); + serverTagPreference.setKey(Constants.PREFERENCES_KEY_BROWSE_TAGS + instance); + serverTagPreference.setChecked(Util.isTagBrowsing(this, instance)); + serverTagPreference.setSummary(R.string.settings_browse_by_tags_summary); + serverTagPreference.setTitle(R.string.settings_browse_by_tags); final Preference serverOpenBrowser = new Preference(this); serverOpenBrowser.setKey(Constants.PREFERENCES_KEY_OPEN_BROWSER); @@ -405,6 +412,7 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer screen.addPreference(serverInternalUrlPreference); screen.addPreference(serverUsernamePreference); screen.addPreference(serverPasswordPreference); + screen.addPreference(serverTagPreference); screen.addPreference(serverRemoveServerPreference); screen.addPreference(serverTestConnectionPreference); screen.addPreference(serverOpenBrowser); diff --git a/src/github/daneren2005/dsub/service/RESTMusicService.java b/src/github/daneren2005/dsub/service/RESTMusicService.java index e220bf59..1927dc93 100644 --- a/src/github/daneren2005/dsub/service/RESTMusicService.java +++ b/src/github/daneren2005/dsub/service/RESTMusicService.java @@ -219,7 +219,7 @@ public class RESTMusicService implements MusicService { parameterValues.add(musicFolderId); } - Reader reader = getReader(context, progressListener, "getIndexes", null, parameterNames, parameterValues); + Reader reader = getReader(context, progressListener, Util.isTagBrowsing(context, getInstance(context)) ? "getArtists" : "getIndexes", null, parameterNames, parameterValues); try { Indexes indexes = new IndexesParser(context).parse(reader, progressListener); if (indexes != null) { @@ -307,7 +307,7 @@ public class RESTMusicService implements MusicService { List parameterNames = Arrays.asList("query", "artistCount", "albumCount", "songCount"); List parameterValues = Arrays.asList(critera.getQuery(), critera.getArtistCount(), critera.getAlbumCount(), critera.getSongCount()); - Reader reader = getReader(context, progressListener, "search2", null, parameterNames, parameterValues); + Reader reader = getReader(context, progressListener, Util.isTagBrowsing(context, getInstance(context)) ? "search3" : "search2", null, parameterNames, parameterValues); try { return new SearchResult2Parser(context).parse(reader, progressListener); } finally { @@ -505,7 +505,7 @@ public class RESTMusicService implements MusicService { @Override public MusicDirectory getAlbumList(String type, int size, int offset, Context context, ProgressListener progressListener) throws Exception { - Reader reader = getReader(context, progressListener, "getAlbumList", + Reader reader = getReader(context, progressListener, Util.isTagBrowsing(context, getInstance(context)) ? "getAlbumList2" : "getAlbumList", null, Arrays.asList("type", "size", "offset"), Arrays.asList(type, size, offset)); try { return new AlbumListParser(context).parse(reader, progressListener); @@ -545,7 +545,7 @@ public class RESTMusicService implements MusicService { values.add(decade + 10); } - Reader reader = getReader(context, progressListener, "getAlbumList", null, names, values); + Reader reader = getReader(context, progressListener, Util.isTagBrowsing(context, getInstance(context)) ? "getAlbumList2" : "getAlbumList", null, names, values); try { return new AlbumListParser(context).parse(reader, progressListener); } finally { @@ -555,7 +555,7 @@ public class RESTMusicService implements MusicService { @Override public MusicDirectory getStarredList(Context context, ProgressListener progressListener) throws Exception { - Reader reader = getReader(context, progressListener, "getStarred", null); + Reader reader = getReader(context, progressListener, Util.isTagBrowsing(context, getInstance(context)) ? "getStarred2" : "getStarred", null); try { return new StarredListParser(context).parse(reader, progressListener); } finally { @@ -1440,7 +1440,14 @@ public class RESTMusicService implements MusicService { NetworkInfo networkInfo = manager.getActiveNetworkInfo(); return networkInfo == null ? -1 : networkInfo.getType(); } - + + private int getInstance(Context context) { + if(instance == null) { + return Util.getActiveServer(context); + } else { + return instance; + } + } public String getRestUrl(Context context, String method) { return getRestUrl(context, method, true); } diff --git a/src/github/daneren2005/dsub/service/parser/AlbumListParser.java b/src/github/daneren2005/dsub/service/parser/AlbumListParser.java index 64145d67..9cf064e6 100644 --- a/src/github/daneren2005/dsub/service/parser/AlbumListParser.java +++ b/src/github/daneren2005/dsub/service/parser/AlbumListParser.java @@ -47,7 +47,9 @@ public class AlbumListParser extends MusicDirectoryEntryParser { if (eventType == XmlPullParser.START_TAG) { String name = getElementName(); if ("album".equals(name)) { - dir.addChild(parseEntry("")); + MusicDirectory.Entry entry = parseEntry(""); + entry.setDirectory(true); + dir.addChild(entry); } else if ("error".equals(name)) { handleError(); } diff --git a/src/github/daneren2005/dsub/service/parser/StarredListParser.java b/src/github/daneren2005/dsub/service/parser/StarredListParser.java index fc4cd175..54e419d3 100644 --- a/src/github/daneren2005/dsub/service/parser/StarredListParser.java +++ b/src/github/daneren2005/dsub/service/parser/StarredListParser.java @@ -47,9 +47,13 @@ public class StarredListParser extends MusicDirectoryEntryParser { if (eventType == XmlPullParser.START_TAG) { String name = getElementName(); if ("album".equals(name) || "song".equals(name)) { - dir.addChild(parseEntry("")); + MusicDirectory.Entry entry = parseEntry(""); + entry.setDirectory(true); + dir.addChild(entry); } else if("artist".equals(name)) { - dir.addChild(parseArtist()); + MusicDirectory.Entry entry = parseArtist(); + entry.setDirectory(true); + dir.addChild(entry); } else if ("error".equals(name)) { handleError(); } diff --git a/src/github/daneren2005/dsub/util/Constants.java b/src/github/daneren2005/dsub/util/Constants.java index 6eb859a8..8865c4fa 100644 --- a/src/github/daneren2005/dsub/util/Constants.java +++ b/src/github/daneren2005/dsub/util/Constants.java @@ -137,6 +137,7 @@ public final class Constants { public static final String PREFERENCES_KEY_MENU_STAR = "showStar"; public static final String PREFERENCES_KEY_MENU_SHARED = "showShared"; public static final String PREFERENCES_KEY_SHARED_ENABLED = "sharedEnabled"; + public static final String PREFERENCES_KEY_BROWSE_TAGS = "browseTags"; public static final String OFFLINE_SCROBBLE_COUNT = "scrobbleCount"; public static final String OFFLINE_SCROBBLE_ID = "scrobbleID"; diff --git a/src/github/daneren2005/dsub/util/Util.java b/src/github/daneren2005/dsub/util/Util.java index 51e64686..ceeb6ade 100644 --- a/src/github/daneren2005/dsub/util/Util.java +++ b/src/github/daneren2005/dsub/util/Util.java @@ -383,9 +383,17 @@ public final class Util { return builder.toString(); } + + public static boolean isTagBrowsing(Context context) { + return isTagBrowsing(context, Util.getActiveServer(context)); + } + public static boolean isTagBrowsing(Context context, int instance) { + SharedPreferences prefs = getPreferences(context); + return prefs.getBoolean(Constants.PREFERENCES_KEY_BROWSE_TAGS + instance, false); + } public static String getVideoPlayerType(Context context) { - SharedPreferences prefs = getPreferences(context); + SharedPreferences prefs = getPreferences(context); return prefs.getString(Constants.PREFERENCES_KEY_VIDEO_PLAYER, "raw"); } -- cgit v1.2.3 From 4333c8992f7b440d5e4013f017e3b4134a53ae71 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 12 Jan 2014 20:38:05 -0800 Subject: #46 Finish adding basic browse by tag support --- .../daneren2005/dsub/fragments/SearchFragment.java | 1 + .../dsub/fragments/SelectArtistFragment.java | 5 +- .../dsub/fragments/SelectDirectoryFragment.java | 25 +++++++++- .../dsub/fragments/SubsonicFragment.java | 12 ++++- .../dsub/service/CachedMusicService.java | 56 +++++++++++++++++----- .../daneren2005/dsub/service/MusicService.java | 6 ++- .../dsub/service/OfflineMusicService.java | 14 +++++- .../daneren2005/dsub/service/RESTMusicService.java | 47 +++++++++++++++--- .../dsub/service/parser/IndexesParser.java | 2 +- .../service/parser/MusicDirectoryEntryParser.java | 3 ++ .../dsub/service/parser/MusicDirectoryParser.java | 12 +++-- .../dsub/service/parser/SearchResult2Parser.java | 4 +- .../dsub/service/parser/StarredListParser.java | 4 +- .../dsub/util/compat/RemoteControlClientKK.java | 2 +- 14 files changed, 158 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/SearchFragment.java b/src/github/daneren2005/dsub/fragments/SearchFragment.java index b77df12b..86f31041 100644 --- a/src/github/daneren2005/dsub/fragments/SearchFragment.java +++ b/src/github/daneren2005/dsub/fragments/SearchFragment.java @@ -298,6 +298,7 @@ public class SearchFragment extends SubsonicFragment { if(autoplay) { args.putBoolean(Constants.INTENT_EXTRA_NAME_AUTOPLAY, true); } + args.putBoolean(Constants.INTENT_EXTRA_NAME_ARTIST, true); fragment.setArguments(args); replaceFragment(fragment, R.id.fragment_list_layout); diff --git a/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java b/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java index 5b46b40c..df4e2d95 100644 --- a/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java @@ -171,6 +171,7 @@ public class SelectArtistFragment extends SubsonicFragment implements AdapterVie if("root".equals(artist.getId())) { args.putSerializable(Constants.FRAGMENT_LIST, (Serializable) entries); } + args.putBoolean(Constants.INTENT_EXTRA_NAME_ARTIST, true); fragment.setArguments(args); replaceFragment(fragment, R.id.fragment_list_layout); @@ -185,7 +186,7 @@ public class SelectArtistFragment extends SubsonicFragment implements AdapterVie private void load(final boolean refresh) { setTitle(R.string.button_bar_browse); - if (Util.isOffline(context)) { + if (Util.isOffline(context) || Util.isTagBrowsing(context)) { folderButton.setVisibility(View.GONE); } else { folderButton.setVisibility(View.VISIBLE); @@ -196,7 +197,7 @@ public class SelectArtistFragment extends SubsonicFragment implements AdapterVie @Override protected Indexes doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(context); - if (!Util.isOffline(context)) { + if (!Util.isOffline(context) && !Util.isTagBrowsing(context)) { musicFolders = musicService.getMusicFolders(refresh, context, this); } String musicFolderId = Util.getSelectedMusicFolderId(context); diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 93558a03..0b58c618 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -68,6 +68,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter int albumListSize; boolean refreshListing = false; boolean showAll = false; + boolean artist = false; public SelectDirectoryFragment() { @@ -136,6 +137,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter albumListExtra = args.getString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_EXTRA); albumListSize = args.getInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 0); refreshListing = args.getBoolean(Constants.INTENT_EXTRA_REFRESH_LISTINGS); + artist = args.getBoolean(Constants.INTENT_EXTRA_NAME_ARTIST, false); if(entries == null) { entries = (List) args.getSerializable(Constants.FRAGMENT_LIST); } @@ -320,6 +322,9 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter if ("newest".equals(albumListType)) { args.putBoolean(Constants.INTENT_EXTRA_REFRESH_LISTINGS, true); } + if(entry.getArtist() == null && entry.getParent() == null) { + args.putBoolean(Constants.INTENT_EXTRA_NAME_ARTIST, true); + } fragment.setArguments(args); replaceFragment(fragment, rootId, true); @@ -390,7 +395,15 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter new LoadTask() { @Override protected MusicDirectory load(MusicService service) throws Exception { - return service.getMusicDirectory(id, name, refresh, context, this); + if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { + if(artist) { + return service.getArtist(id, name, refresh, context, this); + } else { + return service.getAlbum(id, name, refresh, context, this); + } + } else { + return service.getMusicDirectory(id, name, refresh, context, this); + } } @Override @@ -409,7 +422,15 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter protected MusicDirectory load(MusicService service) throws Exception { MusicDirectory root; if(share == null) { - root = service.getMusicDirectory(id, name, refresh, context, this); + if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { + if(artist) { + root = service.getArtist(id, name, refresh, context, this); + } else { + root = service.getAlbum(id, name, refresh, context, this); + } + } else { + root = service.getMusicDirectory(id, name, refresh, context, this); + } } else { root = share.getMusicDirectory(); } diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index 4bba4e89..8907a534 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -588,7 +588,11 @@ public class SubsonicFragment extends Fragment { @Override protected Void doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(context); - musicService.setStarred(entry.getId(), starred, context, null); + if(entry.isDirectory() && Util.isTagBrowsing(context) && !Util.isOffline(context)) { + musicService.setStarred(null, null, entry.getId(), starred, context, null); + } else { + musicService.setStarred(entry.getId(), null, null, starred, context, null); + } // Make sure to clear parent cache String s = Util.getRestUrl(context, null) + entry.getParent(); @@ -627,7 +631,11 @@ public class SubsonicFragment extends Fragment { @Override protected Void doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(context); - musicService.setStarred(entry.getId(), starred, context, null); + if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { + musicService.setStarred(null, entry.getId(), null, starred, context, null); + } else { + musicService.setStarred(entry.getId(), null, null, starred, context, null); + } return null; } diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java index b93a6e1e..f223c5a6 100644 --- a/src/github/daneren2005/dsub/service/CachedMusicService.java +++ b/src/github/daneren2005/dsub/service/CachedMusicService.java @@ -126,21 +126,53 @@ public class CachedMusicService implements MusicService { @Override public MusicDirectory getMusicDirectory(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception { - MusicDirectory dir = null; + MusicDirectory dir = null; - if(!refresh) { - dir = FileUtil.deserialize(context, getCacheName(context, "directory", id), MusicDirectory.class); - } + if(!refresh) { + dir = FileUtil.deserialize(context, getCacheName(context, "directory", id), MusicDirectory.class); + } - if(dir == null) { - dir = musicService.getMusicDirectory(id, name, refresh, context, progressListener); - FileUtil.serialize(context, dir, getCacheName(context, "directory", id)); - } + if(dir == null) { + dir = musicService.getMusicDirectory(id, name, refresh, context, progressListener); + FileUtil.serialize(context, dir, getCacheName(context, "directory", id)); + } - return dir; + return dir; } - @Override + @Override + public MusicDirectory getArtist(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception { + MusicDirectory dir = null; + + if(!refresh) { + dir = FileUtil.deserialize(context, getCacheName(context, "artist", id), MusicDirectory.class); + } + + if(dir == null) { + dir = musicService.getArtist(id, name, refresh, context, progressListener); + FileUtil.serialize(context, dir, getCacheName(context, "artist", id)); + } + + return dir; + } + + @Override + public MusicDirectory getAlbum(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception { + MusicDirectory dir = null; + + if(!refresh) { + dir = FileUtil.deserialize(context, getCacheName(context, "album", id), MusicDirectory.class); + } + + if(dir == null) { + dir = musicService.getAlbum(id, name, refresh, context, progressListener); + FileUtil.serialize(context, dir, getCacheName(context, "album", id)); + } + + return dir; + } + + @Override public SearchResult search(SearchCritera criteria, Context context, ProgressListener progressListener) throws Exception { return musicService.search(criteria, context, progressListener); } @@ -309,8 +341,8 @@ public class CachedMusicService implements MusicService { } @Override - public void setStarred(String id, boolean starred, Context context, ProgressListener progressListener) throws Exception { - musicService.setStarred(id, starred, context, progressListener); + public void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { + musicService.setStarred(id, artistId, albumId, starred, context, progressListener); } @Override diff --git a/src/github/daneren2005/dsub/service/MusicService.java b/src/github/daneren2005/dsub/service/MusicService.java index 0946c4f7..28fc2036 100644 --- a/src/github/daneren2005/dsub/service/MusicService.java +++ b/src/github/daneren2005/dsub/service/MusicService.java @@ -57,6 +57,10 @@ public interface MusicService { MusicDirectory getMusicDirectory(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception; + MusicDirectory getArtist(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception; + + MusicDirectory getAlbum(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception; + SearchResult search(SearchCritera criteria, Context context, ProgressListener progressListener) throws Exception; MusicDirectory getStarredList(Context context, ProgressListener progressListener) throws Exception; @@ -113,7 +117,7 @@ public interface MusicService { RemoteStatus setJukeboxGain(float gain, Context context, ProgressListener progressListener) throws Exception; - void setStarred(String id, boolean starred, Context context, ProgressListener progressListener) throws Exception; + void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception; List getShares(Context context, ProgressListener progressListener) throws Exception; diff --git a/src/github/daneren2005/dsub/service/OfflineMusicService.java b/src/github/daneren2005/dsub/service/OfflineMusicService.java index 80ad375a..2196afbb 100644 --- a/src/github/daneren2005/dsub/service/OfflineMusicService.java +++ b/src/github/daneren2005/dsub/service/OfflineMusicService.java @@ -133,7 +133,17 @@ public class OfflineMusicService extends RESTMusicService { return result; } - private String getName(File file) { + @Override + public MusicDirectory getArtist(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception { + throw new OfflineException("Artist by tags not available in offline mode"); + } + + @Override + public MusicDirectory getAlbum(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception { + throw new OfflineException("Album by tags not available in offline mode"); + } + + private String getName(File file) { String name = file.getName(); if (file.isDirectory()) { return name; @@ -535,7 +545,7 @@ public class OfflineMusicService extends RESTMusicService { } @Override - public void setStarred(String id, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { SharedPreferences prefs = Util.getPreferences(context); String cacheLocn = prefs.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, null); diff --git a/src/github/daneren2005/dsub/service/RESTMusicService.java b/src/github/daneren2005/dsub/service/RESTMusicService.java index 1927dc93..906d2ad4 100644 --- a/src/github/daneren2005/dsub/service/RESTMusicService.java +++ b/src/github/daneren2005/dsub/service/RESTMusicService.java @@ -274,7 +274,27 @@ public class RESTMusicService implements MusicService { } } - @Override + @Override + public MusicDirectory getArtist(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception { + Reader reader = getReader(context, progressListener, "getArtist", null, "id", id); + try { + return new MusicDirectoryParser(context).parse(name, reader, progressListener); + } finally { + Util.close(reader); + } + } + + @Override + public MusicDirectory getAlbum(String id, String name, boolean refresh, Context context, ProgressListener progressListener) throws Exception { + Reader reader = getReader(context, progressListener, "getAlbum", null, "id", id); + try { + return new MusicDirectoryParser(context).parse(name, reader, progressListener); + } finally { + Util.close(reader); + } + } + + @Override public SearchResult search(SearchCritera critera, Context context, ProgressListener progressListener) throws Exception { try { return searchNew(critera, context, progressListener); @@ -802,11 +822,24 @@ public class RESTMusicService implements MusicService { } @Override - public void setStarred(String id, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { checkServerVersion(context, "1.8", "Starring is not supported."); - id = getOfflineSongId(id, context, progressListener); + + List names = new ArrayList(); + List values = new ArrayList(); + + if(id != null) { + names.add("id"); + values.add(getOfflineSongId(id, context, progressListener)); + } else if(artistId != null) { + names.add("artistId"); + values.add(artistId); + } else if(albumId != null) { + names.add("albumId"); + values.add(albumId); + } - Reader reader = getReader(context, progressListener, starred ? "star" : "unstar", null, "id", id); + Reader reader = getReader(context, progressListener, starred ? "star" : "unstar", null, names, values); try { new ErrorParser(context).parse(reader); } finally { @@ -1183,7 +1216,7 @@ public class RESTMusicService implements MusicService { String id = offline.getString(Constants.OFFLINE_STAR_ID + i, null); boolean starred = offline.getBoolean(Constants.OFFLINE_STAR_SETTING + i, false); if(id != null) { - setStarred(id, starred, context, progressListener); + setStarred(id, null, null, starred, context, progressListener); } else { String search = offline.getString(Constants.OFFLINE_STAR_SEARCH + i, ""); try{ @@ -1191,10 +1224,10 @@ public class RESTMusicService implements MusicService { SearchResult result = searchNew(critera, context, progressListener); if(result.getSongs().size() == 1){ Log.i(TAG, "Query '" + search + "' returned song " + result.getSongs().get(0).getTitle() + " by " + result.getSongs().get(0).getArtist() + " with id " + result.getSongs().get(0).getId()); - setStarred(result.getSongs().get(0).getId(), starred, context, progressListener); + setStarred(result.getSongs().get(0).getId(), null, null, starred, context, progressListener); } else if(result.getAlbums().size() == 1){ Log.i(TAG, "Query '" + search + "' returned song " + result.getAlbums().get(0).getTitle() + " by " + result.getAlbums().get(0).getArtist() + " with id " + result.getAlbums().get(0).getId()); - setStarred(result.getAlbums().get(0).getId(), starred, context, progressListener); + setStarred(result.getAlbums().get(0).getId(), null, null, starred, context, progressListener); } else{ throw new Exception("Song not found on server"); diff --git a/src/github/daneren2005/dsub/service/parser/IndexesParser.java b/src/github/daneren2005/dsub/service/parser/IndexesParser.java index bf5bd8b1..30ea190b 100644 --- a/src/github/daneren2005/dsub/service/parser/IndexesParser.java +++ b/src/github/daneren2005/dsub/service/parser/IndexesParser.java @@ -67,7 +67,7 @@ public class IndexesParser extends MusicDirectoryEntryParser { eventType = nextParseEvent(); if (eventType == XmlPullParser.START_TAG) { String name = getElementName(); - if ("indexes".equals(name)) { + if ("indexes".equals(name) || "artists".equals(name)) { changed = true; lastModified = getLong("lastModified"); ignoredArticles = get("ignoredArticles"); diff --git a/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java b/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java index 3c12dfd4..e58427f5 100644 --- a/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java +++ b/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java @@ -34,6 +34,9 @@ public class MusicDirectoryEntryParser extends AbstractParser { entry.setId(get("id")); entry.setParent(get("parent")); entry.setTitle(get("title")); + if(entry.getTitle() == null) { + entry.setTitle(get("name")); + } entry.setDirectory(getBoolean("isDir")); entry.setCoverArt(get("coverArt")); entry.setArtist(get("artist")); diff --git a/src/github/daneren2005/dsub/service/parser/MusicDirectoryParser.java b/src/github/daneren2005/dsub/service/parser/MusicDirectoryParser.java index 7a49cfa5..75f878be 100644 --- a/src/github/daneren2005/dsub/service/parser/MusicDirectoryParser.java +++ b/src/github/daneren2005/dsub/service/parser/MusicDirectoryParser.java @@ -49,19 +49,25 @@ public class MusicDirectoryParser extends MusicDirectoryEntryParser { MusicDirectory dir = new MusicDirectory(); int eventType; + boolean isArtist = false; do { eventType = nextParseEvent(); if (eventType == XmlPullParser.START_TAG) { String name = getElementName(); - if ("child".equals(name)) { + if ("child".equals(name) || "song".equals(name) || "video".equals(name)) { MusicDirectory.Entry entry = parseEntry(artist); entry.setGrandParent(dir.getParent()); dir.addChild(entry); - } else if ("directory".equals(name)) { + } else if ("directory".equals(name) || "artist".equals(name) || ("album".equals(name) && !isArtist)) { dir.setName(get("name")); dir.setId(get("id")); dir.setParent(get("parent")); - } else if ("error".equals(name)) { + isArtist = true; + } else if("album".equals(name)) { + MusicDirectory.Entry entry = parseEntry(artist); + entry.setDirectory(true); + dir.addChild(entry); + } else if ("error".equals(name)) { handleError(); } } diff --git a/src/github/daneren2005/dsub/service/parser/SearchResult2Parser.java b/src/github/daneren2005/dsub/service/parser/SearchResult2Parser.java index a0be07ac..abf96d7f 100644 --- a/src/github/daneren2005/dsub/service/parser/SearchResult2Parser.java +++ b/src/github/daneren2005/dsub/service/parser/SearchResult2Parser.java @@ -57,7 +57,9 @@ public class SearchResult2Parser extends MusicDirectoryEntryParser { artist.setName(get("name")); artists.add(artist); } else if ("album".equals(name)) { - albums.add(parseEntry("")); + MusicDirectory.Entry entry = parseEntry(""); + entry.setDirectory(true); + albums.add(entry); } else if ("song".equals(name)) { songs.add(parseEntry("")); } else if ("error".equals(name)) { diff --git a/src/github/daneren2005/dsub/service/parser/StarredListParser.java b/src/github/daneren2005/dsub/service/parser/StarredListParser.java index 54e419d3..bd2a7888 100644 --- a/src/github/daneren2005/dsub/service/parser/StarredListParser.java +++ b/src/github/daneren2005/dsub/service/parser/StarredListParser.java @@ -48,7 +48,9 @@ public class StarredListParser extends MusicDirectoryEntryParser { String name = getElementName(); if ("album".equals(name) || "song".equals(name)) { MusicDirectory.Entry entry = parseEntry(""); - entry.setDirectory(true); + if("album".equals(name)) { + entry.setDirectory(true); + } dir.addChild(entry); } else if("artist".equals(name)) { MusicDirectory.Entry entry = parseArtist(); diff --git a/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java b/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java index e88b4122..2c041d71 100644 --- a/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java +++ b/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java @@ -64,7 +64,7 @@ public class RemoteControlClientKK extends RemoteControlClientJB { protected Void doInBackground(Void... params) { try { MusicService musicService = MusicServiceFactory.getMusicService(downloadService); - musicService.setStarred(entry.getId(), starred, downloadService, null); + musicService.setStarred(entry.getId(), null, null, starred, downloadService, null); // Make sure to clear parent cache String s = Util.getRestUrl(downloadService, null) + entry.getParent(); -- cgit v1.2.3 From fdda03ceed2b46a4a008dac48e88c4bc5e654aa3 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 13 Jan 2014 07:34:28 -0800 Subject: #46 Fix index cache with id3 tags --- src/github/daneren2005/dsub/service/CachedMusicService.java | 5 ++++- src/github/daneren2005/dsub/service/RESTMusicService.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java index f223c5a6..a7a61f71 100644 --- a/src/github/daneren2005/dsub/service/CachedMusicService.java +++ b/src/github/daneren2005/dsub/service/CachedMusicService.java @@ -66,6 +66,7 @@ public class CachedMusicService implements MusicService { private final TimeLimitedCache> cachedMusicFolders = new TimeLimitedCache>(10 * 3600, TimeUnit.SECONDS); private final TimeLimitedCache> cachedPodcastChannels = new TimeLimitedCache>(10 * 3600, TimeUnit.SECONDS); private String restUrl; + private boolean isTagBrowsing = false; public CachedMusicService(RESTMusicService musicService) { this.musicService = musicService; @@ -503,13 +504,15 @@ public class CachedMusicService implements MusicService { private void checkSettingsChanged(Context context) { String newUrl = musicService.getRestUrl(context, null, false); - if (!Util.equals(newUrl, restUrl)) { + boolean newIsTagBrowsing = Util.isTagBrowsing(context); + if (!Util.equals(newUrl, restUrl) || isTagBrowsing != newIsTagBrowsing) { cachedMusicFolders.clear(); cachedLicenseValid.clear(); cachedIndexes.clear(); cachedPlaylists.clear(); cachedPodcastChannels.clear(); restUrl = newUrl; + isTagBrowsing = newIsTagBrowsing; } } } diff --git a/src/github/daneren2005/dsub/service/RESTMusicService.java b/src/github/daneren2005/dsub/service/RESTMusicService.java index 906d2ad4..f9fcc604 100644 --- a/src/github/daneren2005/dsub/service/RESTMusicService.java +++ b/src/github/daneren2005/dsub/service/RESTMusicService.java @@ -248,7 +248,7 @@ public class RESTMusicService implements MusicService { private String getCachedIndexesFilename(Context context, String musicFolderId) { String s = getRestUrl(context, null) + musicFolderId; - return "indexes-" + Math.abs(s.hashCode()) + ".ser"; + return (Util.isTagBrowsing(context, getInstance(context)) ? "artists-" : "indexes-") + Math.abs(s.hashCode()) + ".ser"; } @Override -- cgit v1.2.3 From c2e5a218575741d11034f021002abdabfbcec003 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 19 Jan 2014 14:13:29 -0800 Subject: #46 Don't use folder ID when shuffling by tags --- src/github/daneren2005/dsub/service/RESTMusicService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/service/RESTMusicService.java b/src/github/daneren2005/dsub/service/RESTMusicService.java index f9fcc604..f980422d 100644 --- a/src/github/daneren2005/dsub/service/RESTMusicService.java +++ b/src/github/daneren2005/dsub/service/RESTMusicService.java @@ -594,7 +594,7 @@ public class RESTMusicService implements MusicService { names.add("size"); values.add(size); - if (musicFolderId != null && !"".equals(musicFolderId)) { + if (musicFolderId != null && !"".equals(musicFolderId) && !Util.isTagBrowsing(context, getInstance(context))) { names.add("musicFolderId"); values.add(musicFolderId); } -- cgit v1.2.3 From eb061b6b1bfc365dd8fc5439d2bb00fa28a02bf0 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 20 Jan 2014 10:51:11 -0800 Subject: Abstract getting music dir, use it for cache command --- .../dsub/fragments/SelectDirectoryFragment.java | 21 ++------------------- .../dsub/fragments/SubsonicFragment.java | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 0b58c618..eae48ca0 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -68,7 +68,6 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter int albumListSize; boolean refreshListing = false; boolean showAll = false; - boolean artist = false; public SelectDirectoryFragment() { @@ -395,15 +394,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter new LoadTask() { @Override protected MusicDirectory load(MusicService service) throws Exception { - if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { - if(artist) { - return service.getArtist(id, name, refresh, context, this); - } else { - return service.getAlbum(id, name, refresh, context, this); - } - } else { - return service.getMusicDirectory(id, name, refresh, context, this); - } + return getMusicDirectory(id, name, refresh, service, this); } @Override @@ -422,15 +413,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter protected MusicDirectory load(MusicService service) throws Exception { MusicDirectory root; if(share == null) { - if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { - if(artist) { - root = service.getArtist(id, name, refresh, context, this); - } else { - root = service.getAlbum(id, name, refresh, context, this); - } - } else { - root = service.getMusicDirectory(id, name, refresh, context, this); - } + root = getMusicDirectory(id, name, refresh, service, this); } else { root = share.getMusicDirectory(); } diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index 8907a534..1504b7a4 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -62,6 +62,7 @@ import github.daneren2005.dsub.service.ServerTooOldException; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.FileUtil; import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.util.LoadingTask; import github.daneren2005.dsub.util.Util; @@ -92,6 +93,7 @@ public class SubsonicFragment extends Fragment { protected static Random random = new Random(); protected GestureDetector gestureScanner; protected Share share; + protected boolean artist = false; public SubsonicFragment() { super(); @@ -685,7 +687,7 @@ public class SubsonicFragment extends Fragment { root = share.getMusicDirectory(); } else if(isDirectory) { - root = musicService.getMusicDirectory(id, name, false, context, this); + root = getMusicDirectory(id, name, false, musicService, this); } else { root = musicService.getPlaylist(true, id, name, context, this); @@ -735,6 +737,18 @@ public class SubsonicFragment extends Fragment { task.execute(); } + protected MusicDirectory getMusicDirectory(String id, String name, boolean refresh, MusicService service, ProgressListener listener) throws Exception { + if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { + if(artist) { + return service.getArtist(id, name, refresh, context, listener); + } else { + return service.getAlbum(id, name, refresh, context, listener); + } + } else { + return service.getMusicDirectory(id, name, refresh, context, listener); + } + } + protected void addToPlaylist(final List songs) { if(songs.isEmpty()) { Util.toast(context, "No songs selected"); -- cgit v1.2.3 From 43c6695b68e4dd349fb0d13a356a6c0893b3f96b Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 20 Jan 2014 11:09:38 -0800 Subject: Fix Show All Media --- .../daneren2005/dsub/fragments/SelectDirectoryFragment.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index eae48ca0..f88de757 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -427,7 +427,14 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter songs.addAll(parent.getChildren(false, true)); for (MusicDirectory.Entry dir : parent.getChildren(true, false)) { MusicService musicService = MusicServiceFactory.getMusicService(context); - getSongsRecursively(musicService.getMusicDirectory(dir.getId(), dir.getTitle(), refresh, context, this), songs); + + MusicDirectory musicDirectory; + if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { + musicDirectory = musicService.getAlbum(dir.getId(), dir.getTitle(), false, context, this); + } else { + musicDirectory = musicService.getMusicDirectory(dir.getId(), dir.getTitle(), false, context, this); + } + getSongsRecursively(musicDirectory, songs); } } -- cgit v1.2.3 From 45a8c652b81e2e357c8537f7bb21bd671ce67893 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 20 Jan 2014 11:18:14 -0800 Subject: Fix play now/cache from artist level --- src/github/daneren2005/dsub/fragments/SelectArtistFragment.java | 1 + src/github/daneren2005/dsub/fragments/SubsonicFragment.java | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java b/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java index df4e2d95..909165b7 100644 --- a/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java @@ -51,6 +51,7 @@ public class SelectArtistFragment extends SubsonicFragment implements AdapterVie artists = (List) bundle.getSerializable(Constants.FRAGMENT_LIST); musicFolders = (List) bundle.getSerializable(Constants.FRAGMENT_LIST2); } + artist = true; } @Override diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index 1504b7a4..8e9dbbb9 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -709,7 +709,14 @@ public class SubsonicFragment extends Fragment { } for (MusicDirectory.Entry dir : parent.getChildren(true, false)) { MusicService musicService = MusicServiceFactory.getMusicService(context); - getSongsRecursively(musicService.getMusicDirectory(dir.getId(), dir.getTitle(), false, context, this), songs); + + MusicDirectory musicDirectory; + if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { + musicDirectory = musicService.getAlbum(dir.getId(), dir.getTitle(), false, context, this); + } else { + musicDirectory = musicService.getMusicDirectory(dir.getId(), dir.getTitle(), false, context, this); + } + getSongsRecursively(musicDirectory, songs); } } -- cgit v1.2.3 From 8ab225e2cd3f9393bdd592654811a5275440a342 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 20 Jan 2014 11:26:58 -0800 Subject: Fix Show Artist for tags --- src/github/daneren2005/dsub/fragments/SubsonicFragment.java | 1 + .../daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java | 6 ++++++ 2 files changed, 7 insertions(+) (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index 8e9dbbb9..e4cb3d81 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -1110,6 +1110,7 @@ public class SubsonicFragment extends Fragment { Bundle args = new Bundle(); args.putString(Constants.INTENT_EXTRA_NAME_ID, entry.getParent()); args.putString(Constants.INTENT_EXTRA_NAME_NAME, entry.getArtist()); + args.putBoolean(Constants.INTENT_EXTRA_NAME_ARTIST, true); fragment.setArguments(args); replaceFragment(fragment, getRootId(), true); diff --git a/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java b/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java index e58427f5..94aaa8c4 100644 --- a/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java +++ b/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java @@ -33,6 +33,12 @@ public class MusicDirectoryEntryParser extends AbstractParser { MusicDirectory.Entry entry = new MusicDirectory.Entry(); entry.setId(get("id")); entry.setParent(get("parent")); + if(entry.getParent() == null) { + entry.setParent(get("albumId")); + if(entry.getParent() == null) { + entry.setParent(get("artistId")); + } + } entry.setTitle(get("title")); if(entry.getTitle() == null) { entry.setTitle(get("name")); -- cgit v1.2.3 From 35ee7293c9ee8364795607ee3571f4010dab509e Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 20 Jan 2014 11:36:20 -0800 Subject: Fix Show Album as well --- .../dsub/service/parser/MusicDirectoryEntryParser.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java b/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java index 94aaa8c4..b9a77aa8 100644 --- a/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java +++ b/src/github/daneren2005/dsub/service/parser/MusicDirectoryEntryParser.java @@ -32,12 +32,15 @@ public class MusicDirectoryEntryParser extends AbstractParser { protected MusicDirectory.Entry parseEntry(String artist) { MusicDirectory.Entry entry = new MusicDirectory.Entry(); entry.setId(get("id")); - entry.setParent(get("parent")); + String albumId = get("albumId"); + if(albumId != null) { + entry.setParent(albumId); + entry.setGrandParent(get("artistId")); + } else { + entry.setParent(get("parent")); + } if(entry.getParent() == null) { - entry.setParent(get("albumId")); - if(entry.getParent() == null) { - entry.setParent(get("artistId")); - } + entry.setParent(get("artistId")); } entry.setTitle(get("title")); if(entry.getTitle() == null) { -- cgit v1.2.3 From 25740fa10121aad331c9612420c04334c2f9e8e2 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 21 Jan 2014 05:30:39 -0800 Subject: Hack for downloadRecursively on album context menu --- src/github/daneren2005/dsub/fragments/SubsonicFragment.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index e4cb3d81..19cfe7d4 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -94,6 +94,7 @@ public class SubsonicFragment extends Fragment { protected GestureDetector gestureScanner; protected Share share; protected boolean artist = false; + protected boolean artistOverride = false; public SubsonicFragment() { super(); @@ -268,21 +269,27 @@ public class SubsonicFragment extends Fragment { toggleStarred(artist); break; case R.id.album_menu_play_now: + artistOverride = true; downloadRecursively(entry.getId(), false, false, true, false, false); break; case R.id.album_menu_play_shuffled: + artistOverride = true; downloadRecursively(entry.getId(), false, false, true, true, false); break; case R.id.album_menu_play_next: + artistOverride = true; downloadRecursively(entry.getId(), false, true, false, false, false, true); break; case R.id.album_menu_play_last: + artistOverride = true; downloadRecursively(entry.getId(), false, true, false, false, false); break; case R.id.album_menu_download: + artistOverride = true; downloadRecursively(entry.getId(), false, true, false, false, true); break; case R.id.album_menu_pin: + artistOverride = true; downloadRecursively(entry.getId(), true, true, false, false, true); break; case R.id.album_menu_star: @@ -738,6 +745,7 @@ public class SubsonicFragment extends Fragment { downloadService.downloadBackground(songs, save); } } + artistOverride = false; } }; @@ -746,7 +754,7 @@ public class SubsonicFragment extends Fragment { protected MusicDirectory getMusicDirectory(String id, String name, boolean refresh, MusicService service, ProgressListener listener) throws Exception { if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { - if(artist) { + if(artist && !artistOverride) { return service.getArtist(id, name, refresh, context, listener); } else { return service.getAlbum(id, name, refresh, context, listener); -- cgit v1.2.3 From 07cd966b83c84a386dfca985fd3a81de71ffac71 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 21 Jan 2014 06:00:00 -0800 Subject: Fix album not showing as cached --- src/github/daneren2005/dsub/util/FileUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/util/FileUtil.java b/src/github/daneren2005/dsub/util/FileUtil.java index 8ee8d0ba..8fa9796e 100644 --- a/src/github/daneren2005/dsub/util/FileUtil.java +++ b/src/github/daneren2005/dsub/util/FileUtil.java @@ -213,7 +213,7 @@ public class FileUtil { } else { // Do a special lookup since 4.7+ doesn't match artist/album to entry.getPath String s = Util.getRestUrl(context, null, false) + entry.getId(); - String cacheName = "directory-" + s.hashCode() + ".ser"; + String cacheName = (Util.isTagBrowsing(context) ? "album-" : "directory-") + s.hashCode() + ".ser"; MusicDirectory entryDir = FileUtil.deserialize(context, cacheName, MusicDirectory.class); if(entryDir != null) { -- cgit v1.2.3 From 11e9575df92b561e620a8b0a31dae5ec0a9b1c90 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 24 Jan 2014 07:43:58 -0800 Subject: #265 Add a method to mass unstar songs --- res/menu/unstar.xml | 7 +++ .../dsub/fragments/SelectDirectoryFragment.java | 54 ++++++++++++++++++++++ .../dsub/fragments/SubsonicFragment.java | 5 +- .../dsub/service/CachedMusicService.java | 4 +- .../daneren2005/dsub/service/MusicService.java | 2 +- .../dsub/service/OfflineMusicService.java | 5 +- .../daneren2005/dsub/service/RESTMusicService.java | 22 +++++---- .../dsub/util/compat/RemoteControlClientKK.java | 3 +- 8 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 res/menu/unstar.xml (limited to 'src') diff --git a/res/menu/unstar.xml b/res/menu/unstar.xml new file mode 100644 index 00000000..4b629cda --- /dev/null +++ b/res/menu/unstar.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 4776295e..eb782163 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -200,6 +200,10 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter } } } + + if("starred".equals(albumListType)) { + menuInflater.inflate(R.menu.unstar, menu); + } } @Override @@ -247,6 +251,10 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter case R.id.menu_show_all: showAll = true; refresh(true); + return true; + case R.id.menu_unstar: + unstarSelected(); + return true; } if(super.onOptionsItemSelected(item)) { @@ -864,6 +872,52 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter }); } + public void unstarSelected() { + if(getSelectedSongs().size() == 0) { + selectAll(true, false); + } + final List selected = getSelectedSongs(); + if(selected.size() == 0) { + return; + } + + new LoadingTask(context, true) { + @Override + protected Void doInBackground() throws Throwable { + MusicService musicService = MusicServiceFactory.getMusicService(context); + List ids = new ArrayList(); + for(MusicDirectory.Entry entry: selected) { + ids.add(entry.getId()); + } + musicService.setStarred(ids, null, null, false, context, this); + return null; + } + + @Override + protected void done(Void result) { + Util.toast(context, context.getResources().getString(R.string.starring_content_unstarred, Integer.toString(selected.size()))); + + for(MusicDirectory.Entry entry: selected) { + entries.remove(entry); + } + entryAdapter.notifyDataSetChanged(); + selectAll(false, false); + } + + @Override + protected void error(Throwable error) { + String msg; + if (error instanceof OfflineException || error instanceof ServerTooOldException) { + msg = getErrorMessage(error); + } else { + msg = context.getResources().getString(R.string.starring_content_error, Integer.toString(selected.size())) + " " + getErrorMessage(error); + } + + Util.toast(context, msg, false); + } + }.execute(); + } + private void checkLicenseAndTrialPeriod(LoadingTask onValid) { if (licenseValid) { onValid.execute(); diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index 19cfe7d4..c99d5d1c 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -71,6 +71,7 @@ import java.io.Serializable; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -600,7 +601,7 @@ public class SubsonicFragment extends Fragment { if(entry.isDirectory() && Util.isTagBrowsing(context) && !Util.isOffline(context)) { musicService.setStarred(null, null, entry.getId(), starred, context, null); } else { - musicService.setStarred(entry.getId(), null, null, starred, context, null); + musicService.setStarred(Arrays.asList(entry.getId()), null, null, starred, context, null); } // Make sure to clear parent cache @@ -643,7 +644,7 @@ public class SubsonicFragment extends Fragment { if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { musicService.setStarred(null, entry.getId(), null, starred, context, null); } else { - musicService.setStarred(entry.getId(), null, null, starred, context, null); + musicService.setStarred(Arrays.asList(entry.getId()), null, null, starred, context, null); } return null; } diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java index 99f21d6e..048e2827 100644 --- a/src/github/daneren2005/dsub/service/CachedMusicService.java +++ b/src/github/daneren2005/dsub/service/CachedMusicService.java @@ -27,8 +27,6 @@ import org.apache.http.HttpResponse; import android.content.Context; import android.graphics.Bitmap; -import android.support.v4.util.LruCache; -import android.util.Log; import github.daneren2005.dsub.domain.Bookmark; import github.daneren2005.dsub.domain.ChatMessage; @@ -351,7 +349,7 @@ public class CachedMusicService implements MusicService { } @Override - public void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(List id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { musicService.setStarred(id, artistId, albumId, starred, context, progressListener); } diff --git a/src/github/daneren2005/dsub/service/MusicService.java b/src/github/daneren2005/dsub/service/MusicService.java index 28fc2036..a88dd04a 100644 --- a/src/github/daneren2005/dsub/service/MusicService.java +++ b/src/github/daneren2005/dsub/service/MusicService.java @@ -117,7 +117,7 @@ public interface MusicService { RemoteStatus setJukeboxGain(float gain, Context context, ProgressListener progressListener) throws Exception; - void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception; + void setStarred(List id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception; List getShares(Context context, ProgressListener progressListener) throws Exception; diff --git a/src/github/daneren2005/dsub/service/OfflineMusicService.java b/src/github/daneren2005/dsub/service/OfflineMusicService.java index c5803728..10d3c311 100644 --- a/src/github/daneren2005/dsub/service/OfflineMusicService.java +++ b/src/github/daneren2005/dsub/service/OfflineMusicService.java @@ -559,7 +559,7 @@ public class OfflineMusicService extends RESTMusicService { } @Override - public void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(List ids, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { SharedPreferences prefs = Util.getPreferences(context); String cacheLocn = prefs.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, null); @@ -567,7 +567,8 @@ public class OfflineMusicService extends RESTMusicService { int stars = offline.getInt(Constants.OFFLINE_STAR_COUNT, 0); stars++; SharedPreferences.Editor offlineEditor = offline.edit(); - + + String id = ids.get(0); if(id.indexOf(cacheLocn) != -1) { String searchCriteria = Util.parseOfflineIDSearch(context, id, cacheLocn); offlineEditor.putString(Constants.OFFLINE_STAR_SEARCH + stars, searchCriteria); diff --git a/src/github/daneren2005/dsub/service/RESTMusicService.java b/src/github/daneren2005/dsub/service/RESTMusicService.java index f980422d..f4816bcd 100644 --- a/src/github/daneren2005/dsub/service/RESTMusicService.java +++ b/src/github/daneren2005/dsub/service/RESTMusicService.java @@ -63,7 +63,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; @@ -822,15 +821,22 @@ public class RESTMusicService implements MusicService { } @Override - public void setStarred(String id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(List ids, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { checkServerVersion(context, "1.8", "Starring is not supported."); List names = new ArrayList(); List values = new ArrayList(); - if(id != null) { - names.add("id"); - values.add(getOfflineSongId(id, context, progressListener)); + if(ids != null) { + if(ids.size() > 1) { + for (String id : ids) { + names.add("id"); + values.add(id); + } + } else { + names.add("id"); + values.add(getOfflineSongId(ids.get(0), context, progressListener)); + } } else if(artistId != null) { names.add("artistId"); values.add(artistId); @@ -1216,7 +1222,7 @@ public class RESTMusicService implements MusicService { String id = offline.getString(Constants.OFFLINE_STAR_ID + i, null); boolean starred = offline.getBoolean(Constants.OFFLINE_STAR_SETTING + i, false); if(id != null) { - setStarred(id, null, null, starred, context, progressListener); + setStarred(Arrays.asList(id), null, null, starred, context, progressListener); } else { String search = offline.getString(Constants.OFFLINE_STAR_SEARCH + i, ""); try{ @@ -1224,10 +1230,10 @@ public class RESTMusicService implements MusicService { SearchResult result = searchNew(critera, context, progressListener); if(result.getSongs().size() == 1){ Log.i(TAG, "Query '" + search + "' returned song " + result.getSongs().get(0).getTitle() + " by " + result.getSongs().get(0).getArtist() + " with id " + result.getSongs().get(0).getId()); - setStarred(result.getSongs().get(0).getId(), null, null, starred, context, progressListener); + setStarred(Arrays.asList(result.getSongs().get(0).getId()), null, null, starred, context, progressListener); } else if(result.getAlbums().size() == 1){ Log.i(TAG, "Query '" + search + "' returned song " + result.getAlbums().get(0).getTitle() + " by " + result.getAlbums().get(0).getArtist() + " with id " + result.getAlbums().get(0).getId()); - setStarred(result.getAlbums().get(0).getId(), null, null, starred, context, progressListener); + setStarred(Arrays.asList(result.getAlbums().get(0).getId()), null, null, starred, context, progressListener); } else{ throw new Exception("Song not found on server"); diff --git a/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java b/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java index 2c041d71..532aec5b 100644 --- a/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java +++ b/src/github/daneren2005/dsub/util/compat/RemoteControlClientKK.java @@ -22,6 +22,7 @@ import github.daneren2005.dsub.service.MusicServiceFactory; import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.util.Util; import java.io.File; +import java.util.Arrays; @TargetApi(19) public class RemoteControlClientKK extends RemoteControlClientJB { @@ -64,7 +65,7 @@ public class RemoteControlClientKK extends RemoteControlClientJB { protected Void doInBackground(Void... params) { try { MusicService musicService = MusicServiceFactory.getMusicService(downloadService); - musicService.setStarred(entry.getId(), null, null, starred, downloadService, null); + musicService.setStarred(Arrays.asList(entry.getId()), null, null, starred, downloadService, null); // Make sure to clear parent cache String s = Util.getRestUrl(downloadService, null) + entry.getParent(); -- cgit v1.2.3 From f7a1afb0155d957ffaac2af54ddb25860523bd82 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 24 Jan 2014 08:06:23 -0800 Subject: #265 Mass unstar artists/albums, fix unstarring artist from starred screen --- .../dsub/fragments/SelectDirectoryFragment.java | 30 +++++++++++++++------- .../dsub/fragments/SubsonicFragment.java | 8 ++++-- .../dsub/service/CachedMusicService.java | 2 +- .../daneren2005/dsub/service/MusicService.java | 2 +- .../dsub/service/OfflineMusicService.java | 2 +- .../daneren2005/dsub/service/RESTMusicService.java | 22 ++++++++++------ 6 files changed, 44 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index eb782163..f96bf578 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -873,31 +873,43 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter } public void unstarSelected() { - if(getSelectedSongs().size() == 0) { - selectAll(true, false); + List selected = getSelectedSongs(); + if(selected.size() == 0) { + selected = entries; } - final List selected = getSelectedSongs(); if(selected.size() == 0) { return; } + final List unstar = new ArrayList(); + unstar.addAll(selected); new LoadingTask(context, true) { @Override protected Void doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(context); List ids = new ArrayList(); - for(MusicDirectory.Entry entry: selected) { - ids.add(entry.getId()); + List artists = new ArrayList(); + List albums = new ArrayList(); + for(MusicDirectory.Entry entry: unstar) { + if(entry.isDirectory()) { + if(entry.getArtist() == null || entry.getParent() == null) { + artists.add(entry.getId()); + } else { + albums.add(entry.getId()); + } + } else { + ids.add(entry.getId()); + } } - musicService.setStarred(ids, null, null, false, context, this); + musicService.setStarred(ids, artists, albums, false, context, this); return null; } @Override protected void done(Void result) { - Util.toast(context, context.getResources().getString(R.string.starring_content_unstarred, Integer.toString(selected.size()))); + Util.toast(context, context.getResources().getString(R.string.starring_content_unstarred, Integer.toString(unstar.size()))); - for(MusicDirectory.Entry entry: selected) { + for(MusicDirectory.Entry entry: unstar) { entries.remove(entry); } entryAdapter.notifyDataSetChanged(); @@ -910,7 +922,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter if (error instanceof OfflineException || error instanceof ServerTooOldException) { msg = getErrorMessage(error); } else { - msg = context.getResources().getString(R.string.starring_content_error, Integer.toString(selected.size())) + " " + getErrorMessage(error); + msg = context.getResources().getString(R.string.starring_content_error, Integer.toString(unstar.size())) + " " + getErrorMessage(error); } Util.toast(context, msg, false); diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index c99d5d1c..3ec1471f 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -599,7 +599,11 @@ public class SubsonicFragment extends Fragment { protected Void doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(context); if(entry.isDirectory() && Util.isTagBrowsing(context) && !Util.isOffline(context)) { - musicService.setStarred(null, null, entry.getId(), starred, context, null); + if(entry.getParent() == null || entry.getArtist() == null) { + musicService.setStarred(null, Arrays.asList(entry.getId()), null, starred, context, null); + } else { + musicService.setStarred(null, null, Arrays.asList(entry.getId()), starred, context, null); + } } else { musicService.setStarred(Arrays.asList(entry.getId()), null, null, starred, context, null); } @@ -642,7 +646,7 @@ public class SubsonicFragment extends Fragment { protected Void doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(context); if(Util.isTagBrowsing(context) && !Util.isOffline(context)) { - musicService.setStarred(null, entry.getId(), null, starred, context, null); + musicService.setStarred(null, Arrays.asList(entry.getId()), null, starred, context, null); } else { musicService.setStarred(Arrays.asList(entry.getId()), null, null, starred, context, null); } diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java index 048e2827..b8b440d7 100644 --- a/src/github/daneren2005/dsub/service/CachedMusicService.java +++ b/src/github/daneren2005/dsub/service/CachedMusicService.java @@ -349,7 +349,7 @@ public class CachedMusicService implements MusicService { } @Override - public void setStarred(List id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(List id, List artistId, List albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { musicService.setStarred(id, artistId, albumId, starred, context, progressListener); } diff --git a/src/github/daneren2005/dsub/service/MusicService.java b/src/github/daneren2005/dsub/service/MusicService.java index a88dd04a..3674fd01 100644 --- a/src/github/daneren2005/dsub/service/MusicService.java +++ b/src/github/daneren2005/dsub/service/MusicService.java @@ -117,7 +117,7 @@ public interface MusicService { RemoteStatus setJukeboxGain(float gain, Context context, ProgressListener progressListener) throws Exception; - void setStarred(List id, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception; + void setStarred(List id, List artistId, List albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception; List getShares(Context context, ProgressListener progressListener) throws Exception; diff --git a/src/github/daneren2005/dsub/service/OfflineMusicService.java b/src/github/daneren2005/dsub/service/OfflineMusicService.java index 10d3c311..a3cdd437 100644 --- a/src/github/daneren2005/dsub/service/OfflineMusicService.java +++ b/src/github/daneren2005/dsub/service/OfflineMusicService.java @@ -559,7 +559,7 @@ public class OfflineMusicService extends RESTMusicService { } @Override - public void setStarred(List ids, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(List ids, List artistId, List albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { SharedPreferences prefs = Util.getPreferences(context); String cacheLocn = prefs.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, null); diff --git a/src/github/daneren2005/dsub/service/RESTMusicService.java b/src/github/daneren2005/dsub/service/RESTMusicService.java index f4816bcd..43b5f887 100644 --- a/src/github/daneren2005/dsub/service/RESTMusicService.java +++ b/src/github/daneren2005/dsub/service/RESTMusicService.java @@ -821,13 +821,13 @@ public class RESTMusicService implements MusicService { } @Override - public void setStarred(List ids, String artistId, String albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { + public void setStarred(List ids, List artistId, List albumId, boolean starred, Context context, ProgressListener progressListener) throws Exception { checkServerVersion(context, "1.8", "Starring is not supported."); List names = new ArrayList(); List values = new ArrayList(); - if(ids != null) { + if(ids != null && ids.size() > 0) { if(ids.size() > 1) { for (String id : ids) { names.add("id"); @@ -837,12 +837,18 @@ public class RESTMusicService implements MusicService { names.add("id"); values.add(getOfflineSongId(ids.get(0), context, progressListener)); } - } else if(artistId != null) { - names.add("artistId"); - values.add(artistId); - } else if(albumId != null) { - names.add("albumId"); - values.add(albumId); + } + if(artistId != null && artistId.size() > 0) { + for (String id : artistId) { + names.add("artistId"); + values.add(id); + } + } + if(albumId != null && albumId.size() > 0) { + for (String id : albumId) { + names.add("albumId"); + values.add(id); + } } Reader reader = getReader(context, progressListener, starred ? "star" : "unstar", null, names, values); -- cgit v1.2.3