aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--res/values/strings.xml6
-rw-r--r--src/github/daneren2005/dsub/service/parser/PlaylistParser.java5
-rw-r--r--src/github/daneren2005/dsub/service/sync/MostRecentSyncAdapter.java14
-rw-r--r--src/github/daneren2005/dsub/service/sync/PlaylistSyncAdapter.java10
-rw-r--r--src/github/daneren2005/dsub/service/sync/PodcastSyncAdapter.java10
-rw-r--r--src/github/daneren2005/dsub/service/sync/StarredSyncAdapter.java6
-rw-r--r--src/github/daneren2005/dsub/service/sync/SubsonicSyncAdapter.java10
-rw-r--r--src/github/daneren2005/dsub/util/SyncUtil.java35
8 files changed, 85 insertions, 11 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b1e8c10d..17b54c87 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -194,6 +194,12 @@
<string name="download.save_bookmark">Bookmark created</string>
<string name="download.downloading_title">Downloading %1$d songs</string>
<string name="download.downloading_summary">Current: %1$s</string>
+
+ <string name="sync.title">New content is available</string>
+ <string name="sync.new_podcasts">New podcasts for: %s</string>
+ <string name="sync.new_playlists">New songs in playlists: %s</string>
+ <string name="sync.new_albums">New albums: %s</string>
+ <string name="sync.new_starred">New starred songs</string>
<string name="starring_content_starred">Starred \"%s\"</string>
<string name="starring_content_unstarred">Unstarred \"%s\"</string>
diff --git a/src/github/daneren2005/dsub/service/parser/PlaylistParser.java b/src/github/daneren2005/dsub/service/parser/PlaylistParser.java
index 8c6cfc6f..c630eb44 100644
--- a/src/github/daneren2005/dsub/service/parser/PlaylistParser.java
+++ b/src/github/daneren2005/dsub/service/parser/PlaylistParser.java
@@ -49,7 +49,10 @@ public class PlaylistParser extends MusicDirectoryEntryParser {
dir.addChild(parseEntry(""));
} else if ("error".equals(name)) {
handleError();
- }
+ } else if ("playlist".equals(name)) {
+ dir.setName(get("name"));
+ dir.setId(get("id"));
+ }
}
} while (eventType != XmlPullParser.END_DOCUMENT);
diff --git a/src/github/daneren2005/dsub/service/sync/MostRecentSyncAdapter.java b/src/github/daneren2005/dsub/service/sync/MostRecentSyncAdapter.java
index 7bead10b..3ac1ca23 100644
--- a/src/github/daneren2005/dsub/service/sync/MostRecentSyncAdapter.java
+++ b/src/github/daneren2005/dsub/service/sync/MostRecentSyncAdapter.java
@@ -27,6 +27,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
+import github.daneren2005.dsub.R;
import github.daneren2005.dsub.domain.MusicDirectory;
import github.daneren2005.dsub.domain.PodcastEpisode;
import github.daneren2005.dsub.service.DownloadFile;
@@ -55,20 +56,21 @@ public class MostRecentSyncAdapter extends SubsonicSyncAdapter {
try {
ArrayList<String> syncedList = SyncUtil.getSyncedMostRecent(context, instance);
MusicDirectory albumList = musicService.getAlbumList("newest", 20, 0, context, null);
- boolean updated = false;
+ List<String> updated = new ArrayList<String>();
+ boolean firstRun = false;
if(syncedList.size() == 0) {
// Get the initial set of albums on first run, don't sync any of these!
for(MusicDirectory.Entry album: albumList.getChildren()) {
syncedList.add(album.getId());
}
- updated = true;
+ firstRun = true;
} else {
for(MusicDirectory.Entry album: albumList.getChildren()) {
if(!syncedList.contains(album.getId())) {
try {
downloadRecursively(null, musicService.getMusicDirectory(album.getId(), album.getTitle(), true, context, null), context, false);
syncedList.add(album.getId());
- updated = true;
+ updated.add(album.getTitle());
} catch(Exception e) {
Log.w(TAG, "Failed to get songs for " + album.getId() + " on " + Util.getServerName(context, instance));
}
@@ -76,13 +78,17 @@ public class MostRecentSyncAdapter extends SubsonicSyncAdapter {
}
}
- if(updated) {
+ if(updated.size() > 0) {
FileUtil.serialize(context, syncedList, SyncUtil.getMostRecentSyncFile(context, instance));
// If there is a new album on the active server, chances are artists need to be refreshed
if(Util.getActiveServer(context) == instance) {
musicService.getIndexes(Util.getSelectedMusicFolderId(context), true, context, null);
}
+
+ SyncUtil.showSyncNotification(context, R.string.sync_new_albums, SyncUtil.joinNames(updated));
+ } else if(firstRun) {
+ FileUtil.serialize(context, syncedList, SyncUtil.getMostRecentSyncFile(context, instance));
}
} catch(Exception e) {
Log.e(TAG, "Failed to get most recent list for " + Util.getServerName(context, instance));
diff --git a/src/github/daneren2005/dsub/service/sync/PlaylistSyncAdapter.java b/src/github/daneren2005/dsub/service/sync/PlaylistSyncAdapter.java
index 6724e561..fddfcc01 100644
--- a/src/github/daneren2005/dsub/service/sync/PlaylistSyncAdapter.java
+++ b/src/github/daneren2005/dsub/service/sync/PlaylistSyncAdapter.java
@@ -23,8 +23,10 @@ import android.annotation.TargetApi;
import android.content.Context;
import android.util.Log;
+import java.util.ArrayList;
import java.util.List;
+import github.daneren2005.dsub.R;
import github.daneren2005.dsub.domain.MusicDirectory;
import github.daneren2005.dsub.service.DownloadFile;
import github.daneren2005.dsub.service.parser.SubsonicRESTException;
@@ -58,6 +60,7 @@ public class PlaylistSyncAdapter extends SubsonicSyncAdapter {
}
List<String> playlistList = SyncUtil.getSyncedPlaylists(context, instance);
+ List<String> updated = new ArrayList<String>();
for(int i = 0; i < playlistList.size(); i++) {
String id = playlistList.get(i);
try {
@@ -67,6 +70,9 @@ public class PlaylistSyncAdapter extends SubsonicSyncAdapter {
DownloadFile file = new DownloadFile(context, entry, true);
while(!file.isSaved() && !file.isFailedMax()) {
file.downloadNow(musicService);
+ if(!updated.contains(playlist.getName())) {
+ updated.add(playlist.getName());
+ }
}
}
} catch(SubsonicRESTException e) {
@@ -77,6 +83,10 @@ public class PlaylistSyncAdapter extends SubsonicSyncAdapter {
} catch(Exception e) {
Log.e(TAG, "Failed to get playlist " + id + " for " + serverName);
}
+
+ if(updated.size() > 0) {
+ SyncUtil.showSyncNotification(context, R.string.sync_new_playlists, SyncUtil.joinNames(updated));
+ }
}
}
}
diff --git a/src/github/daneren2005/dsub/service/sync/PodcastSyncAdapter.java b/src/github/daneren2005/dsub/service/sync/PodcastSyncAdapter.java
index 4826c214..d22a11b9 100644
--- a/src/github/daneren2005/dsub/service/sync/PodcastSyncAdapter.java
+++ b/src/github/daneren2005/dsub/service/sync/PodcastSyncAdapter.java
@@ -27,6 +27,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
+import github.daneren2005.dsub.R;
import github.daneren2005.dsub.domain.MusicDirectory;
import github.daneren2005.dsub.domain.PodcastEpisode;
import github.daneren2005.dsub.service.DownloadFile;
@@ -66,7 +67,7 @@ public class PodcastSyncAdapter extends SubsonicSyncAdapter {
musicService.getPodcastChannels(true, context, null);
}
- boolean updated = false;
+ List<String> updated = new ArrayList<String>();
for(int i = 0; i < podcastList.size(); i++) {
SyncSet set = podcastList.get(i);
String id = set.id;
@@ -84,7 +85,9 @@ public class PodcastSyncAdapter extends SubsonicSyncAdapter {
// Only add if actualy downloaded correctly
if(file.isSaved()) {
existingEpisodes.add(entry.getId());
- updated = true;
+ if(!updated.contains(entry.getAlbum())) {
+ updated.add(entry.getAlbum());
+ }
}
}
}
@@ -99,8 +102,9 @@ public class PodcastSyncAdapter extends SubsonicSyncAdapter {
}
// Make sure there are is at least one change before re-syncing
- if(updated) {
+ if(updated.size() > 0) {
FileUtil.serialize(context, podcastList, SyncUtil.getPodcastSyncFile(context, instance));
+ SyncUtil.showSyncNotification(context, R.string.sync_new_podcasts, SyncUtil.joinNames(updated));
}
} catch(Exception e) {
Log.w(TAG, "Failed to get podcasts for " + Util.getServerName(context, instance));
diff --git a/src/github/daneren2005/dsub/service/sync/StarredSyncAdapter.java b/src/github/daneren2005/dsub/service/sync/StarredSyncAdapter.java
index 10ab58b6..ff153e33 100644
--- a/src/github/daneren2005/dsub/service/sync/StarredSyncAdapter.java
+++ b/src/github/daneren2005/dsub/service/sync/StarredSyncAdapter.java
@@ -27,6 +27,7 @@ import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import github.daneren2005.dsub.R;
import github.daneren2005.dsub.domain.MusicDirectory;
import github.daneren2005.dsub.util.FileUtil;
import github.daneren2005.dsub.util.SyncUtil;
@@ -54,7 +55,7 @@ public class StarredSyncAdapter extends SubsonicSyncAdapter {
MusicDirectory starredList = musicService.getStarredList(context, null);
// Pin all the starred stuff
- downloadRecursively(syncedList, starredList, context, true);
+ boolean updated = downloadRecursively(syncedList, starredList, context, true);
// Get old starred list
ArrayList<String> oldSyncedList = SyncUtil.getSyncedStarred(context, instance);
@@ -75,6 +76,9 @@ public class StarredSyncAdapter extends SubsonicSyncAdapter {
}
FileUtil.serialize(context, syncedList, SyncUtil.getStarredSyncFile(context, instance));
+ if(updated) {
+ SyncUtil.showSyncNotification(context, R.string.sync_new_starred, null);
+ }
} catch(Exception e) {
Log.e(TAG, "Failed to get starred list for " + Util.getServerName(context, instance));
}
diff --git a/src/github/daneren2005/dsub/service/sync/SubsonicSyncAdapter.java b/src/github/daneren2005/dsub/service/sync/SubsonicSyncAdapter.java
index 1c45d8e1..97a68835 100644
--- a/src/github/daneren2005/dsub/service/sync/SubsonicSyncAdapter.java
+++ b/src/github/daneren2005/dsub/service/sync/SubsonicSyncAdapter.java
@@ -119,12 +119,14 @@ public class SubsonicSyncAdapter extends AbstractThreadedSyncAdapter {
}
- protected void downloadRecursively(List<String> paths, MusicDirectory parent, Context context, boolean save) throws Exception {
+ protected boolean downloadRecursively(List<String> paths, MusicDirectory parent, Context context, boolean save) throws Exception {
+ boolean downloaded = false;
for (MusicDirectory.Entry song: parent.getChildren(false, true)) {
if (!song.isVideo()) {
DownloadFile file = new DownloadFile(context, song, save);
while(!(save && file.isSaved() || !save && file.isCompleteFileAvailable()) && !file.isFailedMax()) {
file.downloadNow(musicService);
+ downloaded = true;
}
if(paths != null && file.isCompleteFileAvailable()) {
@@ -134,7 +136,11 @@ public class SubsonicSyncAdapter extends AbstractThreadedSyncAdapter {
}
for (MusicDirectory.Entry dir: parent.getChildren(true, false)) {
- downloadRecursively(paths, musicService.getMusicDirectory(dir.getId(), dir.getTitle(), true, context, null), context, save);
+ if(downloadRecursively(paths, musicService.getMusicDirectory(dir.getId(), dir.getTitle(), true, context, null), context, save)) {
+ downloaded = true;
+ }
}
+
+ return downloaded;
}
}
diff --git a/src/github/daneren2005/dsub/util/SyncUtil.java b/src/github/daneren2005/dsub/util/SyncUtil.java
index 5a8b79f4..4fb639a5 100644
--- a/src/github/daneren2005/dsub/util/SyncUtil.java
+++ b/src/github/daneren2005/dsub/util/SyncUtil.java
@@ -1,11 +1,19 @@
package github.daneren2005.dsub.util;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
+import android.support.v4.app.NotificationCompat;
+import android.util.Log;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
+import github.daneren2005.dsub.R;
+import github.daneren2005.dsub.activity.SubsonicFragmentActivity;
+
/**
* Created by Scott on 11/24/13.
*/
@@ -133,6 +141,33 @@ public final class SyncUtil {
return "sync-most_recent-" + (Util.getRestUrl(context, null, instance)).hashCode() + ".ser";
}
+ public static void showSyncNotification(final Context context, int stringId, String extra) {
+ String content = (extra != null) ? context.getResources().getString(stringId, extra) : context.getResources().getString(stringId);
+
+ NotificationCompat.Builder builder;
+ builder = new NotificationCompat.Builder(context)
+ .setSmallIcon(R.drawable.stat_notify_download)
+ .setContentTitle(context.getResources().getString(R.string.sync_title))
+ .setContentText(content)
+ .setOngoing(false);
+
+ Intent notificationIntent = new Intent(context, SubsonicFragmentActivity.class);
+ notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ builder.setContentIntent(PendingIntent.getActivity(context, 0, notificationIntent, 0));
+
+ NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.notify(stringId, builder.build());
+ }
+
+ public static String joinNames(List<String> names) {
+ StringBuilder builder = new StringBuilder();
+ for (String val : names) {
+ builder.append(val).append(", ");
+ }
+ builder.setLength(builder.length() - 2);
+ return builder.toString();
+ }
+
public static class SyncSet implements Serializable {
public String id;
public List<String> synced;