diff options
author | Scott Jackson <daneren2005@gmail.com> | 2014-08-19 16:26:55 -0700 |
---|---|---|
committer | Scott Jackson <daneren2005@gmail.com> | 2014-08-19 16:26:55 -0700 |
commit | e376bc4abd109cbc9c15db2a0dbaf3341ec77871 (patch) | |
tree | 99c752893a1443abcd6be541ef32e6bf9f50e1fd | |
parent | 394f80983202b053c39e14a6795c38908ec2590f (diff) | |
download | dsub-e376bc4abd109cbc9c15db2a0dbaf3341ec77871.tar.gz dsub-e376bc4abd109cbc9c15db2a0dbaf3341ec77871.tar.bz2 dsub-e376bc4abd109cbc9c15db2a0dbaf3341ec77871.zip |
Optimizations to reduce the number of needless re-serializations
In a single user environment, this will reduce most of the needless re-serialization. Previously, if the user starred something, then went into the starred list, it would re-write the serialization for the directory even though it was already update from when they called setStarred in the first place. This code is really only needed for the case where bookmarks/stars are added from a separate device.
-rw-r--r-- | src/github/daneren2005/dsub/service/CachedMusicService.java | 128 |
1 files changed, 78 insertions, 50 deletions
diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java index d919775b..129fd564 100644 --- a/src/github/daneren2005/dsub/service/CachedMusicService.java +++ b/src/github/daneren2005/dsub/service/CachedMusicService.java @@ -372,31 +372,47 @@ public class CachedMusicService implements MusicService { // Left overs in oldList need to be unstarred updateStarredList(context, oldList, false, isTagBrowsing); - new PlaylistDirectoryUpdater(context) { - @Override - public boolean checkResult(Entry check) { - for(Entry entry: oldList) { - if(check.getId().equals(entry.getId())) { - check.setStarred(false); - return true; + + // Remove non-songs from lists before updating playlists + for(Iterator<Entry> it = oldList.iterator(); it.hasNext(); ) { + if(it.next().isDirectory()) { + it.remove(); + } + } + for(Iterator<Entry> it = newList.iterator(); it.hasNext(); ) { + if(it.next().isDirectory()) { + it.remove(); + } + } + + // Only try to update playlists if there was at least one song in new or old set + if(newList.size() > 0 || oldList.size() > 0) { + new PlaylistDirectoryUpdater(context) { + @Override + public boolean checkResult(Entry check) { + for(Entry entry: oldList) { + if(check.getId().equals(entry.getId()) && check.isStarred() != false) { + check.setStarred(false); + return true; + } } - } - - for(Entry entry: newList) { - if(check.getId().equals(entry.getId())) { - check.setStarred(true); - return true; + + for(Entry entry: newList) { + if(check.getId().equals(entry.getId()) && check.isStarred() != true) { + check.setStarred(true); + return true; + } } + + return false; } - return false; - } - - @Override - public void updateResult(Entry result) { - - } - }.execute(); + @Override + public void updateResult(Entry result) { + + } + }.execute(); + } } FileUtil.serialize(context, dir, "starred"); @@ -405,11 +421,6 @@ public class CachedMusicService implements MusicService { private void updateStarredList(Context context, List<Entry> list, final boolean starred, final boolean isTagBrowsing) { for(final Entry entry: list) { - // Don't waste time when status is the same - if(entry.isStarred() == starred) { - continue; - } - String cacheName, parent = null; boolean isArtist = false; if(isTagBrowsing) { @@ -439,7 +450,7 @@ public class CachedMusicService implements MusicService { new IndexesUpdater(context, isTagBrowsing ? "artists" : "indexes") { @Override public boolean checkResult(Artist check) { - if(entry.getId().equals(check.getId())) { + if(entry.getId().equals(check.getId()) && check.isStarred() != starred) { return true; } @@ -455,7 +466,7 @@ public class CachedMusicService implements MusicService { new MusicDirectoryUpdater(context, cacheName, parent) { @Override public boolean checkResult(Entry check) { - if (entry.getId().equals(check.getId())) { + if (entry.getId().equals(check.getId()) && entry.isStarred() != starred) { return true; } @@ -801,30 +812,35 @@ public class CachedMusicService implements MusicService { // Add new bookmarks for things in new list setBookmarkCache(context, newList, false); - new PlaylistDirectoryUpdater(context) { - @Override - public boolean checkResult(Entry check) { - for(Entry entry: oldList) { - if(entry.getId().equals(check.getId())) { - setBookmarkCache(check, -1); - return true; + if(oldList.size() > 0 || nextList.size() > 0) { + new PlaylistDirectoryUpdater(context) { + @Override + public boolean checkResult(Entry check) { + for(Entry entry: oldList) { + if(entry.getId().equals(check.getId()) && check.getBookmark() != null) { + check.setBookmark(null); + return true; + } } - } - for(Entry entry: newList) { - if(entry.getId().equals(check.getId())) { - setBookmarkCache(check, entry.getBookmark().getPosition()); - return true; + for(Entry entry: newList) { + if(entry.getId().equals(check.getId())) { + int newPosition = entry.getBookmark().getPosition(); + if(check.getBookmark() == null || check.getBookmark().getPosition() != newPosition) { + setBookmarkCache(check, newPosition); + return true; + } + } } + + return false; } - return false; - } - - @Override - public void updateResult(Entry result) { - - } - }.execute(); + @Override + public void updateResult(Entry result) { + + } + }.execute(); + } } FileUtil.serialize(context, bookmarks, "bookmarks"); @@ -863,7 +879,7 @@ public class CachedMusicService implements MusicService { new MusicDirectoryUpdater(context, "directory", parent) { @Override public boolean checkResult(Entry check) { - return id.equals(check.getId()); + return shouldBookmarkUpdate(check, id, position); } @Override @@ -877,7 +893,7 @@ public class CachedMusicService implements MusicService { new PlaylistDirectoryUpdater(context) { @Override public boolean checkResult(Entry check) { - return id.equals(check.getId()); + return shouldBookmarkUpdate(check, id, position); } @Override @@ -887,6 +903,18 @@ public class CachedMusicService implements MusicService { }.execute(); } + private boolean shouldBookmarkUpdate(Entry check, String id, int position) { + if(id.equals(check.getId()) { + if(position == -1 && check.getBookmark() != null) { + return true; + } else if(position >= 0 && (check.getBookmark() == null || check.getBookmark().getPosition() != position)) { + return true; + } + } + + return false; + } + private void setBookmarkCache(Entry result, int position) { // If position == -1, then it is a delete if(result.getBookmark() != null && position == -1) { |