diff options
Diffstat (limited to 'app/src/main/java')
14 files changed, 113 insertions, 34 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java index d67893ef..dc64e9d1 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java @@ -954,6 +954,22 @@ public class SubsonicActivity extends AppCompatActivity implements OnItemSelecte runnable.run(); } else { afterServiceAvailable.add(runnable); + checkIfServiceAvailable(); + } + } + private void checkIfServiceAvailable() { + if(getDownloadService() == null) { + handler.postDelayed(new Runnable() { + @Override + public void run() { + checkIfServiceAvailable(); + } + }, 50); + } else if(afterServiceAvailable.size() > 0) { + for(Runnable runnable: afterServiceAvailable) { + handler.post(runnable); + } + afterServiceAvailable.clear(); } } diff --git a/app/src/main/java/github/daneren2005/dsub/domain/MusicDirectory.java b/app/src/main/java/github/daneren2005/dsub/domain/MusicDirectory.java index 42aa5288..42c97b9e 100644 --- a/app/src/main/java/github/daneren2005/dsub/domain/MusicDirectory.java +++ b/app/src/main/java/github/daneren2005/dsub/domain/MusicDirectory.java @@ -20,6 +20,7 @@ package github.daneren2005.dsub.domain; import android.annotation.TargetApi; import android.content.Context; +import android.content.SharedPreferences; import android.media.MediaMetadataRetriever; import android.os.Build; import android.util.Log; @@ -525,6 +526,18 @@ public class MusicDirectory implements Serializable { this.closeness = closeness; } + public boolean isOnlineId(Context context) { + try { + String cacheLocation = Util.getPreferences(context).getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, null); + return cacheLocation == null || id == null || id.indexOf(cacheLocation) == -1; + } catch(Exception e) { + Log.w(TAG, "Failed to check online id validity"); + + // Err on the side of default functionality + return true; + } + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/ChatFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/ChatFragment.java index 3e48f1a6..febf22de 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/ChatFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/ChatFragment.java @@ -81,6 +81,7 @@ public class ChatFragment extends SubsonicFragment { }); chatListView = (ListView) rootView.findViewById(R.id.chat_entries); + chatListView.setStackFromBottom(true); messageEditText.setImeActionLabel("Send", KeyEvent.KEYCODE_ENTER); messageEditText.addTextChangedListener(new TextWatcher() { diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java index ea894485..cb94ed19 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java @@ -1,6 +1,7 @@ package github.daneren2005.dsub.fragments; import android.content.res.Resources; +import android.os.Environment; import android.support.v7.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; @@ -247,7 +248,7 @@ public class MainFragment extends SelectRecyclerFragment<Integer> { @Override protected File doInBackground() throws Throwable { updateProgress("Gathering Logs"); - File logcat = new File(FileUtil.getSubsonicDirectory(context), "logcat.txt"); + File logcat = new File(Environment.getExternalStorageDirectory(), "dsub-logcat.txt"); Util.delete(logcat); Process logcatProc = null; diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java index f312675f..892891d2 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java @@ -560,7 +560,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis @Override public boolean onContextItemSelected(MenuItem menuItem, UpdateView<DownloadFile> updateView, DownloadFile downloadFile) { - if(onContextItemSelected(menuItem, downloadFile)) { + if(onContextItemSelected(menuItem, downloadFile.getSong())) { return true; } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index abd1c6aa..2db10c2e 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -858,7 +858,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section RecursiveLoader onValid = new RecursiveLoader(context) { @Override protected Boolean doInBackground() throws Throwable { - getSongsRecursively(entries, songs); + getSongsRecursively(entries, true); getDownloadService().downloadBackground(songs, save); return null; } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java index 8a0752be..8672f534 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -1943,7 +1943,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR new RecursiveLoader(context) { @Override protected Boolean doInBackground() throws Throwable { - getSongsRecursively(entries, songs); + getSongsRecursively(entries, true); getDownloadService().downloadBackground(songs, save); return null; } @@ -2018,14 +2018,24 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } protected void getSongsRecursively(List<Entry> entry) throws Exception { - getSongsRecursively(entry, songs); + getSongsRecursively(entry, false); + } + protected void getSongsRecursively(List<Entry> entry, boolean allowVideo) throws Exception { + getSongsRecursively(entry, songs, allowVideo); } protected void getSongsRecursively(List<Entry> entry, List<Entry> songs) throws Exception { + getSongsRecursively(entry, songs, false); + } + protected void getSongsRecursively(List<Entry> entry, List<Entry> songs, boolean allowVideo) throws Exception { MusicDirectory dir = new MusicDirectory(); dir.addChildren(entry); - getSongsRecursively(dir, songs); + getSongsRecursively(dir, songs, allowVideo); } + protected void getSongsRecursively(MusicDirectory parent, List<Entry> songs) throws Exception { + getSongsRecursively(parent, songs, false); + } + protected void getSongsRecursively(MusicDirectory parent, List<Entry> songs, boolean allowVideo) throws Exception { if (songs.size() > MAX_SONGS) { return; } @@ -2045,7 +2055,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } for (Entry song : parent.getChildren(false, true)) { - if (!song.isVideo() && song.getRating() != 1) { + if ((!song.isVideo() || allowVideo) && song.getRating() != 1) { songs.add(song); } } diff --git a/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java b/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java index 83733618..18660fa2 100644 --- a/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java +++ b/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java @@ -165,10 +165,14 @@ public class DSubWidgetProvider extends AppWidgetProvider { MusicDirectory.Entry currentPlaying = null; if(service == null) { // Deserialize from playling list to setup - PlayerQueue state = FileUtil.deserialize(context, DownloadServiceLifecycleSupport.FILENAME_DOWNLOADS_SER, PlayerQueue.class); - if(state != null && state.currentPlayingIndex != -1) { - currentPlaying = state.songs.get(state.currentPlayingIndex); - } + try { + PlayerQueue state = FileUtil.deserialize(context, DownloadServiceLifecycleSupport.FILENAME_DOWNLOADS_SER, PlayerQueue.class); + if (state != null && state.currentPlayingIndex != -1) { + currentPlaying = state.songs.get(state.currentPlayingIndex); + } + } catch(Exception e) { + Log.e(TAG, "Failed to grab current playing", e); + } } else { currentPlaying = service.getCurrentPlaying() == null ? null : service.getCurrentPlaying().getSong(); } diff --git a/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java b/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java index a729ed4e..2f6ecd90 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java +++ b/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java @@ -319,21 +319,22 @@ public class ChromeCastController extends RemoteController { meta.putString(MediaMetadata.KEY_ALBUM_ARTIST, song.getArtist()); meta.putString(MediaMetadata.KEY_ALBUM_TITLE, song.getAlbum()); - String coverArt = ""; - if(proxy == null || proxy instanceof WebProxy) { - coverArt = musicService.getCoverArtUrl(downloadService, song); + if(castDevice.hasCapability(CastDevice.CAPABILITY_VIDEO_OUT)) { + if (proxy == null || proxy instanceof WebProxy) { + String coverArt = musicService.getCoverArtUrl(downloadService, song); - // If proxy is going, it is a web proxy - if(proxy != null) { - coverArt = proxy.getPublicAddress(coverArt); - } + // If proxy is going, it is a web proxy + if (proxy != null) { + coverArt = proxy.getPublicAddress(coverArt); + } - meta.addImage(new WebImage(Uri.parse(coverArt))); - } else { - File coverArtFile = FileUtil.getAlbumArtFile(downloadService, song); - if(coverArtFile != null && coverArtFile.exists()) { - coverArt = proxy.getPublicAddress(coverArtFile.getPath()); meta.addImage(new WebImage(Uri.parse(coverArt))); + } else { + File coverArtFile = FileUtil.getAlbumArtFile(downloadService, song); + if (coverArtFile != null && coverArtFile.exists()) { + String coverArt = proxy.getPublicAddress(coverArtFile.getPath()); + meta.addImage(new WebImage(Uri.parse(coverArt))); + } } } } diff --git a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java index bc465e74..7af21831 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java @@ -1754,6 +1754,7 @@ public class DownloadService extends Service { autoPlayStart = false; } else { setPlayerState(PAUSED); + onSongProgress(); } } diff --git a/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java b/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java index 442d3dc1..4c8ac586 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java +++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java @@ -18,7 +18,6 @@ */ package github.daneren2005.dsub.service; -import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -41,7 +40,6 @@ import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.domain.PlayerQueue; import github.daneren2005.dsub.domain.PlayerState; import github.daneren2005.dsub.domain.ServerInfo; -import github.daneren2005.dsub.util.BackgroundTask; import github.daneren2005.dsub.util.CacheCleaner; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.FileUtil; @@ -323,11 +321,19 @@ public class DownloadServiceLifecycleSupport { position = 0; } + MusicDirectory.Entry currentPlaying = state.songs.get(index); + List<MusicDirectory.Entry> songs = new ArrayList<>(); + for(MusicDirectory.Entry song: state.songs) { + if(song.isOnlineId(downloadService)) { + songs.add(song); + } + } + MusicService musicService = MusicServiceFactory.getMusicService(downloadService); - musicService.savePlayQueue(state.songs, state.songs.get(index), position, downloadService, null); - currentSavePlayQueueTask = null; + musicService.savePlayQueue(songs, currentPlaying, position, downloadService, null); } catch (Exception e) { Log.e(TAG, "Failed to save playing queue to server", e); + } finally { currentSavePlayQueueTask = null; } diff --git a/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java index 2146cd15..17aaf804 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java @@ -394,8 +394,8 @@ public class OfflineMusicService implements MusicService { Reader reader = null; BufferedReader buffer = null; + int songCount = 0; try { - int songCount = 0; reader = new FileReader(file); buffer = new BufferedReader(reader); @@ -427,7 +427,9 @@ public class OfflineMusicService implements MusicService { Util.close(reader); } - playlists.add(playlist); + if(songCount > 0) { + playlists.add(playlist); + } } } diff --git a/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java index 97899529..b405211d 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java @@ -41,7 +41,9 @@ import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.params.ConnPerRouteBean; @@ -730,6 +732,22 @@ public class RESTMusicService implements MusicService { values.add(genre); } if(startYear != null && !"".equals(startYear)) { + // Check to make sure user isn't doing 2015 -> 2010 since Subsonic will return no results + if(endYear != null && !"".equals(endYear)) { + try { + int startYearInt = Integer.parseInt(startYear); + int endYearInt = Integer.parseInt(endYear); + + if(startYearInt > endYearInt) { + String tmp = startYear; + startYear = endYear; + endYear = tmp; + } + } catch(Exception e) { + Log.w(TAG, "Failed to convert start/end year into ints", e); + } + } + names.add("fromYear"); values.add(startYear); } @@ -1886,7 +1904,7 @@ public class RESTMusicService implements MusicService { while (true) { attempts++; HttpContext httpContext = new BasicHttpContext(); - final HttpPost request = new HttpPost(url); + final HttpRequestBase request = (url.indexOf("rest") == -1) ? new HttpGet(url) : new HttpPost(url); if (task != null) { // Attempt to abort the HTTP request if the task is cancelled. @@ -1913,12 +1931,12 @@ public class RESTMusicService implements MusicService { }); } - if (parameterNames != null) { + if (parameterNames != null && request instanceof HttpPost) { List<NameValuePair> params = new ArrayList<NameValuePair>(); for (int i = 0; i < parameterNames.size(); i++) { params.add(new BasicNameValuePair(parameterNames.get(i), String.valueOf(parameterValues.get(i)))); } - request.setEntity(new UrlEncodedFormEntity(params, Constants.UTF_8)); + ((HttpPost) request).setEntity(new UrlEncodedFormEntity(params, Constants.UTF_8)); } if (requestParams != null) { diff --git a/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java b/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java index 9ecbba52..664adcfb 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java +++ b/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java @@ -23,6 +23,7 @@ import java.io.Reader; import org.xmlpull.v1.XmlPullParser; import android.content.Context; +import android.util.Log; import android.util.Xml; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.ServerInfo; @@ -34,7 +35,7 @@ import github.daneren2005.dsub.util.Util; * @author Sindre Mehus */ public abstract class AbstractParser { - + private static final String TAG = AbstractParser.class.getSimpleName(); protected final Context context; protected final int instance; private XmlPullParser parser; @@ -101,7 +102,12 @@ public abstract class AbstractParser { protected Integer getInteger(String name) { String s = get(name); - return s == null ? null : Integer.valueOf(s); + try { + return (s == null || "".equals(s)) ? null : Integer.valueOf(s); + } catch(Exception e) { + Log.w(TAG, "Failed to parse " + s + " into integer"); + return null; + } } protected Long getLong(String name) { |