From c7109e9e119f1406cb0408363b8b7385d15c1933 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 16 Jan 2015 16:40:46 -0800 Subject: Update to latest beta versionCode --- AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 429091ac..98eb63b4 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ Date: Fri, 16 Jan 2015 17:01:29 -0800 Subject: Fix header space not updating with HeaderGridView --- .../daneren2005/dsub/fragments/SelectDirectoryFragment.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 805c0de0..9587ff4e 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -27,6 +27,8 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ImageButton; import android.widget.ImageView; @@ -1414,10 +1416,20 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter artistView.setText(ss); artistView.setMaxLines(100); + if(albumList instanceof HeaderGridView) { + HeaderGridView headerGridView = (HeaderGridView) albumList; + ((BaseAdapter) headerGridView.getAdapter()).notifyDataSetChanged(); + } + vlp = (ViewGroup.MarginLayoutParams) titleView.getLayoutParams(); vlp.leftMargin = width; } else { artistView.setMaxLines(5); + + if(albumList instanceof HeaderGridView) { + HeaderGridView headerGridView = (HeaderGridView) albumList; + ((BaseAdapter) headerGridView.getAdapter()).notifyDataSetChanged(); + } } } }); -- cgit v1.2.3 From b245d3850b5682cad2515be471dfa5b5975464a2 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 16 Jan 2015 17:10:08 -0800 Subject: Put ImageView on bottom so it always gets click events even when LeadingMarginSpan puts invisible space in front of it --- res/layout/select_album_header.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/res/layout/select_album_header.xml b/res/layout/select_album_header.xml index abc16e58..19464103 100644 --- a/res/layout/select_album_header.xml +++ b/res/layout/select_album_header.xml @@ -3,16 +3,6 @@ android:id="@+id/select_album_header" android:layout_width="fill_parent" android:layout_height="wrap_content"> - - + + -- cgit v1.2.3 From 82c49dc8fda740a06f39c227167e9845b85b7ba9 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 17 Jan 2015 14:23:46 -0800 Subject: Don't try to load artistInfo when offline either --- src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 9587ff4e..0d160a59 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -690,7 +690,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter } // If artist, we want to load the artist info to use later - if(artist && ServerInfo.checkServerVersion(context, "1.11")) { + if(artist && ServerInfo.checkServerVersion(context, "1.11") && !Util.isOffline(context)) { artistInfo = musicService.getArtistInfo(id, refresh, context, this); } -- cgit v1.2.3 From 8ddcb7446b42c7892982220170954d34996c11d6 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 17 Jan 2015 15:06:08 -0800 Subject: Don't display share button on artist header --- src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 0d160a59..d13d9fa5 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -1464,7 +1464,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter } private void setupButtonEvents(View header) { ImageView shareButton = (ImageView) header.findViewById(R.id.select_album_share); - if(share != null || podcastId != null || !Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_MENU_SHARED, true) || Util.isOffline(context) || !UserUtil.canShare()) { + if(share != null || podcastId != null || !Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_MENU_SHARED, true) || Util.isOffline(context) || !UserUtil.canShare() || artistInfo != null) { shareButton.setVisibility(View.GONE); } else { shareButton.setOnClickListener(new View.OnClickListener() { -- cgit v1.2.3 From 59612891378b0799595ec7d4875da37af14cc423 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 17 Jan 2015 15:27:12 -0800 Subject: Add onCompletionListener method --- src/github/daneren2005/dsub/util/BackgroundTask.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/github/daneren2005/dsub/util/BackgroundTask.java b/src/github/daneren2005/dsub/util/BackgroundTask.java index fda881c9..9b39ac82 100644 --- a/src/github/daneren2005/dsub/util/BackgroundTask.java +++ b/src/github/daneren2005/dsub/util/BackgroundTask.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicBoolean; @@ -46,6 +47,7 @@ public abstract class BackgroundTask implements ProgressListener { private final Context context; protected AtomicBoolean cancelled = new AtomicBoolean(false); protected OnCancelListener cancelListener; + protected Runnable onCompletionListener = null; protected Task task; private static final int DEFAULT_CONCURRENCY = 8; @@ -170,6 +172,10 @@ public abstract class BackgroundTask implements ProgressListener { updateProgress(context.getResources().getString(messageId)); } + public void setOnCompletionListener(Runnable onCompletionListener) { + this.onCompletionListener = onCompletionListener; + } + protected class Task { private Thread thread; private AtomicBoolean taskStart = new AtomicBoolean(false); @@ -256,6 +262,10 @@ public abstract class BackgroundTask implements ProgressListener { } public void onDone(T result) { done(result); + + if(onCompletionListener != null) { + onCompletionListener.run(); + } } public void onError(Throwable t) { error(t); -- cgit v1.2.3 From 73b0497234ade5fd061b6d226737a27c8ac5bf61 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 17 Jan 2015 15:34:27 -0800 Subject: Increase the number of description lines on tablets --- res/values-large/integers.xml | 1 + res/values/integers.xml | 1 + src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java | 7 ++++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/res/values-large/integers.xml b/res/values-large/integers.xml index 93883e2a..be82d55a 100644 --- a/res/values-large/integers.xml +++ b/res/values-large/integers.xml @@ -1,4 +1,5 @@ 3 + 10 \ No newline at end of file diff --git a/res/values/integers.xml b/res/values/integers.xml index 729cf1cd..48561512 100644 --- a/res/values/integers.xml +++ b/res/values/integers.xml @@ -1,4 +1,5 @@ 2 + 10 \ 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 d13d9fa5..6d94327c 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -1385,7 +1385,8 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter } artistView.setText(spanned); artistView.setSingleLine(false); - artistView.setLines(5); + final int minLines = context.getResources().getInteger(R.integer.TextDescriptionLength); + artistView.setLines(minLines); artistView.setTextAppearance(context, android.R.style.TextAppearance_Small); final Spanned spannedText = spanned; @@ -1393,7 +1394,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void onClick(View v) { - if(artistView.getMaxLines() == 5) { + if(artistView.getMaxLines() == minLines) { // Use LeadingMarginSpan2 to try to make text flow around image Display display = context.getWindowManager().getDefaultDisplay(); View coverArtView = header.findViewById(R.id.select_album_art); @@ -1424,7 +1425,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter vlp = (ViewGroup.MarginLayoutParams) titleView.getLayoutParams(); vlp.leftMargin = width; } else { - artistView.setMaxLines(5); + artistView.setMaxLines(minLines); if(albumList instanceof HeaderGridView) { HeaderGridView headerGridView = (HeaderGridView) albumList; -- cgit v1.2.3 From 8924cfb4e18e9e591f96fd488cb7a27676a31aa0 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 17 Jan 2015 15:59:47 -0800 Subject: Fix accidently setting standard text lines to 10 --- res/values/integers.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/integers.xml b/res/values/integers.xml index 48561512..de6c6067 100644 --- a/res/values/integers.xml +++ b/res/values/integers.xml @@ -1,5 +1,5 @@ 2 - 10 + 5 \ No newline at end of file -- cgit v1.2.3 From dd7b96daca111c45610895a78bbed1a53b5f531c Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 17 Jan 2015 16:00:55 -0800 Subject: #436 On starred images, try to load artist image instead of a sub-album --- src/github/daneren2005/dsub/util/ImageLoader.java | 74 ++++++++++++++++++++++- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/src/github/daneren2005/dsub/util/ImageLoader.java b/src/github/daneren2005/dsub/util/ImageLoader.java index 5adf5e34..9a790b7a 100644 --- a/src/github/daneren2005/dsub/util/ImageLoader.java +++ b/src/github/daneren2005/dsub/util/ImageLoader.java @@ -41,7 +41,9 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; import github.daneren2005.dsub.R; +import github.daneren2005.dsub.domain.ArtistInfo; import github.daneren2005.dsub.domain.MusicDirectory; +import github.daneren2005.dsub.domain.ServerInfo; import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.service.MusicServiceFactory; @@ -181,8 +183,14 @@ public class ImageLoader { return bitmap; } - public ImageTask loadImage(View view, MusicDirectory.Entry entry, boolean large, boolean crossfade) { - if(entry != null && entry.getCoverArt() == null && entry.isDirectory() && !Util.isOffline(context)) { + public SilentBackgroundTask loadImage(View view, MusicDirectory.Entry entry, boolean large, boolean crossfade) { + // TODO: If we know this a artist, try to load artist info instead + int size = large ? imageSizeLarge : imageSizeDefault; + if(entry != null && !entry.isAlbum() && ServerInfo.checkServerVersion(context, "1.11") && !Util.isOffline(context)) { + SilentBackgroundTask task = new ArtistImageTask(view.getContext(), entry, size, imageSizeLarge, large, view, crossfade); + task.execute(); + return task; + } else if(entry != null && entry.getCoverArt() == null && entry.isDirectory() && !Util.isOffline(context)) { // Try to lookup child cover art MusicDirectory.Entry firstChild = FileUtil.lookupChild(context, entry, true); if(firstChild != null) { @@ -191,7 +199,6 @@ public class ImageLoader { } Bitmap bitmap; - int size = large ? imageSizeLarge : imageSizeDefault; if (entry == null || entry.getCoverArt() == null) { bitmap = getUnknownImage(entry, size); setImage(view, Util.createDrawableFromBitmap(context, bitmap), crossfade); @@ -411,6 +418,61 @@ public class ImageLoader { } } + private class ArtistImageTask extends SilentBackgroundTask { + private final Context mContext; + private final MusicDirectory.Entry mEntry; + private final int mSize; + private final int mSaveSize; + private final boolean mIsNowPlaying; + private Drawable mDrawable; + private boolean mCrossfade; + private View mView; + + private SilentBackgroundTask subTask; + + public ArtistImageTask(Context context, MusicDirectory.Entry entry, int size, int saveSize, boolean isNowPlaying, View view, boolean crossfade) { + super(context); + mContext = context; + mEntry = entry; + mSize = size; + mSaveSize = saveSize; + mIsNowPlaying = isNowPlaying; + mView = view; + mCrossfade = crossfade; + } + + @Override + protected Void doInBackground() throws Throwable { + MusicService musicService = MusicServiceFactory.getMusicService(mContext); + ArtistInfo artistInfo = musicService.getArtistInfo(mEntry.getId(), false, mContext, null); + String url = artistInfo.getImageUrl(); + + // Figure out whether we are going to get a artist image or the standard image + if(url != null) { + // If getting the artist image fails for any reason, retry for the standard version + subTask = new ViewUrlTask(mContext, mView, url, mSize) { + @Override + protected void failedToDownload() { + new ViewImageTask(mContext, mEntry, mSize, mSaveSize, mIsNowPlaying, mView, mCrossfade).execute(); + } + }; + } else { + subTask = new ViewImageTask(mContext, mEntry, mSize, mSaveSize, mIsNowPlaying, mView, mCrossfade); + } + + // Execute whichever way we decided to go + subTask.doInBackground(); + return null; + } + + @Override + public void done(Void result) { + if(subTask != null) { + subTask.done(result); + } + } + } + private class ViewUrlTask extends SilentBackgroundTask { private final Context mContext; private final String mUrl; @@ -451,8 +513,14 @@ public class ImageLoader { protected void done(Void result) { if(mDrawable != null) { mView.setImageDrawable(mDrawable); + } else { + failedToDownload(); } } + + protected void failedToDownload() { + + } } private class AvatarTask extends SilentBackgroundTask { -- cgit v1.2.3 From ff394f3e0c0c35c607d0c97ab6a22c209c9254e8 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 18 Jan 2015 14:47:25 -0800 Subject: Fix crash when we fail to download from url --- src/github/daneren2005/dsub/util/ImageLoader.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/github/daneren2005/dsub/util/ImageLoader.java b/src/github/daneren2005/dsub/util/ImageLoader.java index 9a790b7a..3d554496 100644 --- a/src/github/daneren2005/dsub/util/ImageLoader.java +++ b/src/github/daneren2005/dsub/util/ImageLoader.java @@ -454,6 +454,9 @@ public class ImageLoader { @Override protected void failedToDownload() { new ViewImageTask(mContext, mEntry, mSize, mSaveSize, mIsNowPlaying, mView, mCrossfade).execute(); + + // Delete subTask so it doesn't get called in done + subTask = null; } }; } else { -- cgit v1.2.3 From 3422edac972bbc3c9aa8da10b2c7066c61cc714b Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 18 Jan 2015 15:00:23 -0800 Subject: Fix crash if both artist info url is null and cover art id is null --- src/github/daneren2005/dsub/util/ImageLoader.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/github/daneren2005/dsub/util/ImageLoader.java b/src/github/daneren2005/dsub/util/ImageLoader.java index 3d554496..97c7f626 100644 --- a/src/github/daneren2005/dsub/util/ImageLoader.java +++ b/src/github/daneren2005/dsub/util/ImageLoader.java @@ -453,14 +453,20 @@ public class ImageLoader { subTask = new ViewUrlTask(mContext, mView, url, mSize) { @Override protected void failedToDownload() { - new ViewImageTask(mContext, mEntry, mSize, mSaveSize, mIsNowPlaying, mView, mCrossfade).execute(); + // Call loadImage so we can take advantage of all of it's logic checks + loadImage(mView, mEntry, mSize == imageSizeLarge, mCrossfade); // Delete subTask so it doesn't get called in done subTask = null; } }; - } else { + } else if(mEntry != null && mEntry.getCoverArt() != null) { subTask = new ViewImageTask(mContext, mEntry, mSize, mSaveSize, mIsNowPlaying, mView, mCrossfade); + } else { + // If entry is null as well, we need to just set as a blank image + Bitmap bitmap = getUnknownImage(mEntry, mSize); + mDrawable = Util.createDrawableFromBitmap(mContext, bitmap); + return null; } // Execute whichever way we decided to go @@ -472,6 +478,8 @@ public class ImageLoader { public void done(Void result) { if(subTask != null) { subTask.done(result); + } else if(mDrawable != null) { + setImage(mView, mDrawable, mCrossfade); } } } -- cgit v1.2.3 From 5104fa7fa27a82a29e53177424729072ab8dc219 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 18 Jan 2015 15:09:58 -0800 Subject: If we have a proxy going when we try to seek, try restarting at that position instead since seeking won't work on Android 4.4+ --- src/github/daneren2005/dsub/service/DownloadService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/github/daneren2005/dsub/service/DownloadService.java b/src/github/daneren2005/dsub/service/DownloadService.java index 87144402..5732ec83 100644 --- a/src/github/daneren2005/dsub/service/DownloadService.java +++ b/src/github/daneren2005/dsub/service/DownloadService.java @@ -898,6 +898,11 @@ public class DownloadService extends Service { if (remoteState != LOCAL) { remoteController.changePosition(position / 1000); } else { + if(proxy != null && currentPlaying.isCompleteFileAvailable()) { + doPlay(currentPlaying, position, playerState == STARTED); + return; + } + mediaPlayer.seekTo(position); cachedPosition = position; subtractPosition = 0; -- cgit v1.2.3 From a59c846034c8d51add774c5dcf52afd635bcd410 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 19 Jan 2015 16:49:42 -0800 Subject: #440 Hide folder selection if there is only a single one anyways --- src/github/daneren2005/dsub/fragments/SelectArtistFragment.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java b/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java index d0ea96b3..6477f6cc 100644 --- a/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java @@ -174,6 +174,12 @@ public class SelectArtistFragment extends SelectListFragment { public List getObjects(MusicService musicService, boolean refresh, ProgressListener listener) throws Exception { if(!Util.isOffline(context) && !Util.isTagBrowsing(context)) { musicFolders = musicService.getMusicFolders(refresh, context, listener); + + // Hide folders option if there is only one + if(musicFolders.size() == 1) { + musicFolders = null; + Util.setSelectedMusicFolderId(context, null); + } } String musicFolderId = Util.getSelectedMusicFolderId(context); @@ -199,7 +205,7 @@ public class SelectArtistFragment extends SelectListFragment { folderButton = folderButtonParent.findViewById(R.id.select_artist_folder); } - if (Util.isOffline(context) || Util.isTagBrowsing(context)) { + if (Util.isOffline(context) || Util.isTagBrowsing(context) || musicFolders == null) { folderButton.setVisibility(View.GONE); } else { folderButton.setVisibility(View.VISIBLE); -- cgit v1.2.3 From d5758b2ec0edfc257bab18dd7cab572e2e02dbbe Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 19 Jan 2015 17:00:29 -0800 Subject: Fix index cache not being cleared when changing musicFolderId --- src/github/daneren2005/dsub/service/CachedMusicService.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java index 232d0acf..38508e42 100644 --- a/src/github/daneren2005/dsub/service/CachedMusicService.java +++ b/src/github/daneren2005/dsub/service/CachedMusicService.java @@ -30,6 +30,7 @@ import org.apache.http.HttpResponse; import android.content.Context; import android.graphics.Bitmap; +import android.util.Log; import github.daneren2005.dsub.domain.Artist; import github.daneren2005.dsub.domain.ArtistInfo; @@ -72,6 +73,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 String musicFolderId; private boolean isTagBrowsing = false; public CachedMusicService(RESTMusicService musicService) { @@ -1300,8 +1302,9 @@ public class CachedMusicService implements MusicService { } private void checkSettingsChanged(Context context) { + int instance = musicService.getInstance(context); String newUrl = musicService.getRestUrl(context, null, false); - boolean newIsTagBrowsing = Util.isTagBrowsing(context); + boolean newIsTagBrowsing = Util.isTagBrowsing(context, instance); if (!Util.equals(newUrl, restUrl) || isTagBrowsing != newIsTagBrowsing) { cachedMusicFolders.clear(); cachedLicenseValid.clear(); @@ -1311,5 +1314,11 @@ public class CachedMusicService implements MusicService { restUrl = newUrl; isTagBrowsing = newIsTagBrowsing; } + + String newMusicFolderId = Util.getSelectedMusicFolderId(context, instance); + if(!Util.equals(newMusicFolderId, musicFolderId)) { + cachedIndexes.clear(); + musicFolderId = newMusicFolderId; + } } } -- cgit v1.2.3