aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java17
-rw-r--r--app/src/main/java/github/daneren2005/dsub/domain/MusicDirectory.java35
-rw-r--r--app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java8
-rw-r--r--app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java37
-rw-r--r--app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java27
-rw-r--r--app/src/main/java/github/daneren2005/dsub/service/DownloadService.java1
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java2
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/ProgressListener.java2
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/UpdateHelper.java2
-rw-r--r--app/src/main/java/github/daneren2005/dsub/view/AlbumView.java14
10 files changed, 118 insertions, 27 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java
index 0d8dd0df..e6be70f7 100644
--- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java
+++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java
@@ -868,7 +868,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
public void onSongsChanged(List<DownloadFile> songs, DownloadFile currentPlaying, int currentPlayingIndex) {
if(this.currentPlaying != currentPlaying || this.currentPlaying == null) {
onSongChanged(currentPlaying, currentPlayingIndex);
- onMetadataUpdate(currentPlaying != null ? currentPlaying.getSong() : null, DownloadService.METADATA_UPDATED_ALL);
}
}
@@ -886,7 +885,21 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
}
@Override
- public void onMetadataUpdate(MusicDirectory.Entry entry, int fieldChange) {
+ public void onMetadataUpdate(MusicDirectory.Entry song, int fieldChange) {
+ if(song != null && coverArtView != null && fieldChange == DownloadService.METADATA_UPDATED_COVER_ART) {
+ int height = coverArtView.getHeight();
+ if (height <= 0) {
+ int[] attrs = new int[]{R.attr.actionBarSize};
+ TypedArray typedArray = this.obtainStyledAttributes(attrs);
+ height = typedArray.getDimensionPixelSize(0, 0);
+ typedArray.recycle();
+ }
+ getImageLoader().loadImage(coverArtView, song, false, height, false);
+ // We need to update it immediately since it won't update if updater is not running for it
+ if(nowPlayingFragment != null && slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
+ nowPlayingFragment.onMetadataUpdate(song, fieldChange);
+ }
+ }
}
}
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 3c022cea..cd84c0a3 100644
--- a/app/src/main/java/github/daneren2005/dsub/domain/MusicDirectory.java
+++ b/app/src/main/java/github/daneren2005/dsub/domain/MusicDirectory.java
@@ -32,7 +32,9 @@ import java.io.Serializable;
import java.util.Collections;
import java.util.Comparator;
+import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.util.Constants;
+import github.daneren2005.dsub.util.UpdateHelper;
import github.daneren2005.dsub.util.Util;
/**
@@ -135,13 +137,14 @@ public class MusicDirectory implements Serializable {
EntryComparator.sort(children, byYear);
}
- public synchronized void updateMetadata(MusicDirectory refreshedDirectory) {
+ public synchronized boolean updateMetadata(MusicDirectory refreshedDirectory) {
+ boolean metadataUpdated = false;
Iterator<Entry> it = children.iterator();
while(it.hasNext()) {
Entry entry = it.next();
int index = refreshedDirectory.children.indexOf(entry);
if(index != -1) {
- Entry refreshed = refreshedDirectory.children.get(index);
+ final Entry refreshed = refreshedDirectory.children.get(index);
entry.setTitle(refreshed.getTitle());
entry.setAlbum(refreshed.getAlbum());
@@ -155,8 +158,36 @@ public class MusicDirectory implements Serializable {
entry.setStarred(refreshed.isStarred());
entry.setRating(refreshed.getRating());
entry.setType(refreshed.getType());
+ if(!Util.equals(entry.getCoverArt(), refreshed.getCoverArt())) {
+ metadataUpdated = true;
+ entry.setCoverArt(refreshed.getCoverArt());
+ }
+
+ new UpdateHelper.EntryInstanceUpdater(entry) {
+ @Override
+ public void update(Entry found) {
+ found.setTitle(refreshed.getTitle());
+ found.setAlbum(refreshed.getAlbum());
+ found.setArtist(refreshed.getArtist());
+ found.setTrack(refreshed.getTrack());
+ found.setYear(refreshed.getYear());
+ found.setGenre(refreshed.getGenre());
+ found.setTranscodedContentType(refreshed.getTranscodedContentType());
+ found.setTranscodedSuffix(refreshed.getTranscodedSuffix());
+ found.setDiscNumber(refreshed.getDiscNumber());
+ found.setStarred(refreshed.isStarred());
+ found.setRating(refreshed.getRating());
+ found.setType(refreshed.getType());
+ if(!Util.equals(found.getCoverArt(), refreshed.getCoverArt())) {
+ found.setCoverArt(refreshed.getCoverArt());
+ metadataUpdate = DownloadService.METADATA_UPDATED_COVER_ART;
+ }
+ }
+ }.execute();
}
}
+
+ return metadataUpdated;
}
public synchronized boolean updateEntriesList(Context context, int instance, MusicDirectory refreshedDirectory) {
boolean changed = false;
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 c557a174..d77f476f 100644
--- a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java
+++ b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java
@@ -678,13 +678,13 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis
}
}
private void onResumeHandlers() {
- final Handler handler = new Handler();
executorService = Executors.newSingleThreadScheduledExecutor();
setControlsVisible(true);
final DownloadService downloadService = getDownloadService();
if (downloadService == null || downloadService.getCurrentPlaying() == null || startFlipped) {
playlistFlipper.setDisplayedChild(1);
+ startFlipped = false;
}
if (downloadService != null && downloadService.getKeepScreenOn()) {
context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@@ -701,7 +701,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis
context.runWhenServiceAvailable(new Runnable() {
@Override
public void run() {
- if(primaryFragment) {
+ if (primaryFragment) {
DownloadService downloadService = getDownloadService();
downloadService.startRemoteScan();
downloadService.addOnSongChangedListener(NowPlayingFragment.this, true);
@@ -1334,6 +1334,10 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis
}
bookmarkButton.setImageResource(bookmark);
}
+
+ if(song != null && albumArtImageView != null && fieldChange == DownloadService.METADATA_UPDATED_COVER_ART) {
+ getImageLoader().loadImage(albumArtImageView, song, true, true);
+ }
}
public void updateRepeatButton() {
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 76fde7e5..4209cfd6 100644
--- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java
+++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java
@@ -39,6 +39,7 @@ import github.daneren2005.dsub.domain.ArtistInfo;
import github.daneren2005.dsub.domain.MusicDirectory;
import github.daneren2005.dsub.domain.ServerInfo;
import github.daneren2005.dsub.domain.Share;
+import github.daneren2005.dsub.service.CachedMusicService;
import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.util.DrawableTint;
import github.daneren2005.dsub.util.ImageLoader;
@@ -86,6 +87,11 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section
private ArtistInfo artistInfo;
private String artistInfoDelayed;
+ private SilentBackgroundTask updateCoverArtTask;
+ private ImageView coverArtView;
+ private Entry coverArtRep;
+ private String coverArtId;
+
String id;
String name;
Entry directory;
@@ -654,9 +660,19 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section
}
@Override
- public void updateCache() {
- if(entryGridAdapter != null) {
+ public void updateCache(int changeCode) {
+ if(entryGridAdapter != null && changeCode == CachedMusicService.CACHE_UPDATE_LIST) {
entryGridAdapter.notifyDataSetChanged();
+ } else if(changeCode == CachedMusicService.CACHE_UPDATE_METADATA) {
+ if(coverArtView != null && coverArtRep != null && !Util.equals(coverArtRep.getCoverArt(), coverArtId)) {
+ synchronized (coverArtRep) {
+ if (updateCoverArtTask != null && updateCoverArtTask.isRunning()) {
+ updateCoverArtTask.cancel();
+ }
+ updateCoverArtTask = getImageLoader().loadImage(coverArtView, coverArtRep, false, true);
+ coverArtId = coverArtRep.getCoverArt();
+ }
+ }
}
}
}
@@ -1113,22 +1129,22 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section
});
imageLoader.loadImage(coverArtView, url, false);
} else if(entries.size() > 0) {
- Entry coverArt = null;
- for (int i = 0; (i < 3) && (coverArt == null || coverArt.getCoverArt() == null); i++) {
- coverArt = entries.get(random.nextInt(entries.size()));
+ coverArtRep = null;
+ this.coverArtView = coverArtView;
+ for (int i = 0; (i < 3) && (coverArtRep == null || coverArtRep.getCoverArt() == null); i++) {
+ coverArtRep = entries.get(random.nextInt(entries.size()));
}
- final Entry albumRep = coverArt;
coverArtView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- if (albumRep.getCoverArt() == null) {
+ if (coverArtRep == null || coverArtRep.getCoverArt() == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
ImageView fullScreenView = new ImageView(context);
- imageLoader.loadImage(fullScreenView, albumRep, true, true);
+ imageLoader.loadImage(fullScreenView, coverArtRep, true, true);
builder.setCancelable(true);
AlertDialog imageDialog = builder.create();
@@ -1137,7 +1153,10 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section
imageDialog.show();
}
});
- imageLoader.loadImage(coverArtView, albumRep, false, true);
+ synchronized (coverArtRep) {
+ coverArtId = coverArtRep.getCoverArt();
+ updateCoverArtTask = imageLoader.loadImage(coverArtView, coverArtRep, false, true);
+ }
}
coverArtView.setOnInvalidated(new RecyclingImageView.OnInvalidated() {
diff --git a/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java
index 53433f5c..49cb217d 100644
--- a/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java
+++ b/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java
@@ -57,6 +57,7 @@ import github.daneren2005.dsub.util.SongDBHandler;
import github.daneren2005.dsub.util.SyncUtil;
import github.daneren2005.dsub.util.TimeLimitedCache;
import github.daneren2005.dsub.util.FileUtil;
+import github.daneren2005.dsub.util.UpdateHelper;
import github.daneren2005.dsub.util.Util;
import static github.daneren2005.dsub.domain.MusicDirectory.Entry;
@@ -69,6 +70,8 @@ public class CachedMusicService implements MusicService {
private static final int MUSIC_DIR_CACHE_SIZE = 20;
private static final int TTL_MUSIC_DIR = 5 * 60; // Five minutes
+ public static final int CACHE_UPDATE_LIST = 1;
+ public static final int CACHE_UPDATE_METADATA = 2;
private final RESTMusicService musicService;
private final TimeLimitedCache<Boolean> cachedLicenseValid = new TimeLimitedCache<Boolean>(120, TimeUnit.SECONDS);
@@ -121,7 +124,7 @@ public class CachedMusicService implements MusicService {
if(!refresh) {
result = FileUtil.deserialize(context, getCacheName(context, "musicFolders"), ArrayList.class);
}
-
+
if(result == null) {
result = musicService.getMusicFolders(refresh, context, progressListener);
FileUtil.serialize(context, new ArrayList<MusicFolder>(result), getCacheName(context, "musicFolders"));
@@ -150,7 +153,7 @@ public class CachedMusicService implements MusicService {
if(!refresh) {
result = FileUtil.deserialize(context, name, Indexes.class);
}
-
+
if(result == null) {
result = musicService.getIndexes(musicFolderId, refresh, context, progressListener);
FileUtil.serialize(context, result, name);
@@ -169,12 +172,13 @@ public class CachedMusicService implements MusicService {
new SilentBackgroundTask<Void>(context) {
MusicDirectory refreshed;
+ private boolean metadataUpdated;
@Override
protected Void doInBackground() throws Throwable {
refreshed = musicService.getMusicDirectory(id, name, true, context, null);
updateAllSongs(context, refreshed);
- cached.updateMetadata(refreshed);
+ metadataUpdated = cached.updateMetadata(refreshed);
deleteRemovedEntries(context, refreshed, cached);
FileUtil.serialize(context, refreshed, getCacheName(context, "directory", id));
return null;
@@ -185,7 +189,10 @@ public class CachedMusicService implements MusicService {
public void done(Void result) {
if(progressListener != null) {
if(cached.updateEntriesList(context, musicService.getInstance(context), refreshed)) {
- progressListener.updateCache();
+ progressListener.updateCache(CACHE_UPDATE_LIST);
+ }
+ if(metadataUpdated) {
+ progressListener.updateCache(CACHE_UPDATE_METADATA);
}
}
}
@@ -201,7 +208,7 @@ public class CachedMusicService implements MusicService {
dir = musicService.getMusicDirectory(id, name, refresh, context, progressListener);
updateAllSongs(context, dir);
FileUtil.serialize(context, dir, getCacheName(context, "directory", id));
-
+
// If a cached copy exists to check against, look for removes
deleteRemovedEntries(context, dir, cached);
}
@@ -234,7 +241,7 @@ public class CachedMusicService implements MusicService {
public void done(Void result) {
if(progressListener != null) {
if(cached.updateEntriesList(context, musicService.getInstance(context), refreshed)) {
- progressListener.updateCache();
+ progressListener.updateCache(CACHE_UPDATE_LIST);
}
}
}
@@ -267,12 +274,13 @@ public class CachedMusicService implements MusicService {
new SilentBackgroundTask<Void>(context) {
MusicDirectory refreshed;
+ private boolean metadataUpdated;
@Override
protected Void doInBackground() throws Throwable {
refreshed = musicService.getAlbum(id, name, refresh, context, null);
updateAllSongs(context, refreshed);
- cached.updateMetadata(refreshed);
+ metadataUpdated = cached.updateMetadata(refreshed);
deleteRemovedEntries(context, refreshed, cached);
FileUtil.serialize(context, refreshed, getCacheName(context, "album", id));
return null;
@@ -283,7 +291,10 @@ public class CachedMusicService implements MusicService {
public void done(Void result) {
if(progressListener != null) {
if(cached.updateEntriesList(context, musicService.getInstance(context), refreshed)) {
- progressListener.updateCache();
+ progressListener.updateCache(CACHE_UPDATE_LIST);
+ }
+ if(metadataUpdated) {
+ progressListener.updateCache(CACHE_UPDATE_METADATA);
}
}
}
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 d48d7540..cde246c1 100644
--- a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java
+++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java
@@ -116,6 +116,7 @@ public class DownloadService extends Service {
public static final int METADATA_UPDATED_STAR = 1;
public static final int METADATA_UPDATED_RATING = 2;
public static final int METADATA_UPDATED_BOOKMARK = 4;
+ public static final int METADATA_UPDATED_COVER_ART = 8;
private RemoteControlClientBase mRemoteControl;
diff --git a/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java b/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java
index 18f245d5..fce855fe 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java
@@ -176,7 +176,7 @@ public abstract class BackgroundTask<T> implements ProgressListener {
}
@Override
- public void updateCache() {
+ public void updateCache(int changeCode) {
}
diff --git a/app/src/main/java/github/daneren2005/dsub/util/ProgressListener.java b/app/src/main/java/github/daneren2005/dsub/util/ProgressListener.java
index 22f35efc..603b1ccb 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/ProgressListener.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/ProgressListener.java
@@ -24,5 +24,5 @@ package github.daneren2005.dsub.util;
public interface ProgressListener {
void updateProgress(String message);
void updateProgress(int messageId);
- void updateCache();
+ void updateCache(int changeCode);
}
diff --git a/app/src/main/java/github/daneren2005/dsub/util/UpdateHelper.java b/app/src/main/java/github/daneren2005/dsub/util/UpdateHelper.java
index 49d4f7b1..79d3cf30 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/UpdateHelper.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/UpdateHelper.java
@@ -255,7 +255,7 @@ public final class UpdateHelper {
public static abstract class EntryInstanceUpdater {
private Entry entry;
- private int metadataUpdate = DownloadService.METADATA_UPDATED_ALL;
+ protected int metadataUpdate = DownloadService.METADATA_UPDATED_ALL;
public EntryInstanceUpdater(Entry entry) {
this.entry = entry;
diff --git a/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java b/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java
index 048d5a75..3084e962 100644
--- a/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java
+++ b/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java
@@ -30,6 +30,7 @@ import github.daneren2005.dsub.R;
import github.daneren2005.dsub.domain.MusicDirectory;
import github.daneren2005.dsub.util.FileUtil;
import github.daneren2005.dsub.util.ImageLoader;
+import github.daneren2005.dsub.util.Util;
import java.io.File;
@@ -40,6 +41,7 @@ public class AlbumView extends UpdateView2<MusicDirectory.Entry, ImageLoader> {
private TextView titleView;
private TextView artistView;
private boolean showArtist = true;
+ private String coverArtId;
public AlbumView(Context context, boolean cell) {
super(context);
@@ -82,12 +84,13 @@ public class AlbumView extends UpdateView2<MusicDirectory.Entry, ImageLoader> {
artist += album.getYear();
}
artistView.setText(album.getArtist() == null ? "" : artist);
- imageTask = imageLoader.loadImage(coverArtView, album, false, true);
+ onUpdateImageView();
file = null;
}
public void onUpdateImageView() {
imageTask = item2.loadImage(coverArtView, item, false, true);
+ coverArtId = item.getCoverArt();
}
@Override
@@ -101,6 +104,15 @@ public class AlbumView extends UpdateView2<MusicDirectory.Entry, ImageLoader> {
isRated = item.getRating();
}
+ @Override
+ public void update() {
+ super.update();
+
+ if(!Util.equals(item.getCoverArt(), coverArtId)) {
+ onUpdateImageView();
+ }
+ }
+
public MusicDirectory.Entry getEntry() {
return item;
}