From 533708e63dda385168f680aecce560288f8403c5 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 2 Jan 2016 23:57:14 +0100 Subject: [PATCH] Use disk cache --- .../adapter/AlbumCoverPagerAdapter.java | 4 ++- .../gramophone/adapter/SearchAdapter.java | 4 ++- .../adapter/album/AlbumAdapter.java | 4 ++- .../adapter/song/ArtistSongAdapter.java | 4 ++- .../gramophone/adapter/song/SongAdapter.java | 4 ++- .../gramophone/appwidget/WidgetMedium.java | 4 ++- .../audiocover/AudioFileCoverFetcher.java | 28 +++++++++--------- .../helper/PlayingNotificationHelper.java | 4 ++- .../gramophone/loader/AlbumLoader.java | 3 -- .../com/kabouzeid/gramophone/model/Album.java | 20 ++++++++----- .../com/kabouzeid/gramophone/model/Song.java | 2 +- .../gramophone/service/MusicService.java | 4 ++- .../ui/activities/AlbumDetailActivity.java | 23 +++++++-------- .../ui/activities/MainActivity.java | 4 ++- .../ui/activities/SettingsActivity.java | 10 ------- .../tageditor/AbsTagEditorActivity.java | 13 ++++----- .../tageditor/AlbumTagEditorActivity.java | 7 ++--- .../kabouzeid/gramophone/util/ColorUtil.java | 29 ++----------------- 18 files changed, 77 insertions(+), 94 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java index a7b9acd0..c5f40637 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java @@ -11,6 +11,7 @@ import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.signature.MediaStoreSignature; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.glide.PhonographColoredTarget; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder; @@ -132,8 +133,9 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter { .loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId)) .asBitmap() .transcode(new BitmapPaletteTranscoder(getActivity()), BitmapPaletteWrapper.class) - .diskCacheStrategy(DiskCacheStrategy.NONE) + .diskCacheStrategy(DiskCacheStrategy.ALL) .error(R.drawable.default_album_art) + .signature(new MediaStoreSignature("", song.dateModified, 0)) .into(new PhonographColoredTarget(albumCover) { @Override public void onColorReady(int color) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java index 3f9a688f..b2f8fb0a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.signature.MediaStoreSignature; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.glide.artistimage.ArtistImageRequest; @@ -98,9 +99,10 @@ public class SearchAdapter extends RecyclerView.Adapter implements MaterialCab Glide.with(activity) .loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId)) - .diskCacheStrategy(DiskCacheStrategy.NONE) + .diskCacheStrategy(DiskCacheStrategy.ALL) .error(R.drawable.default_album_art) .animate(android.R.anim.fade_in) + .signature(new MediaStoreSignature("", song.dateModified, 0)) .into(albumArt); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java index 8ba31987..501470f5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java @@ -14,6 +14,7 @@ import android.view.ViewGroup; import com.afollestad.materialcab.MaterialCab; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.signature.MediaStoreSignature; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; @@ -125,9 +126,10 @@ public class SongAdapter extends AbsMultiSelectAdapter { @Override public InputStream loadData(Priority priority) throws Exception { -// MediaMetadataRetriever retriever = new MediaMetadataRetriever(); -// try { -// retriever.setDataSource(model.data); -// byte[] picture = retriever.getEmbeddedPicture(); -// if (picture != null) { -// return new ByteArrayInputStream(picture); -// } else { -// return fallback(model.data); -// } -// } finally { -// retriever.release(); -// } - return context.getContentResolver().openInputStream(MusicUtil.getAlbumArtUri(model.albumId)); + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + retriever.setDataSource(model.data); + byte[] picture = retriever.getEmbeddedPicture(); + if (picture != null) { + return new ByteArrayInputStream(picture); + } else { + return fallback(model.data); + } + } finally { + retriever.release(); + } } private static final String[] FALLBACKS = {"cover.jpg", "album.jpg", "folder.jpg"}; diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java index 0d99f0d9..29ff2aa5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java @@ -25,6 +25,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.signature.MediaStoreSignature; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; @@ -198,7 +199,8 @@ public class PlayingNotificationHelper { .loadFromMediaStore(MusicUtil.getAlbumArtUri(currentSong.albumId)) .asBitmap() .transcode(new BitmapPaletteTranscoder(service), BitmapPaletteWrapper.class) - .diskCacheStrategy(DiskCacheStrategy.NONE) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .signature(new MediaStoreSignature("", currentSong.dateModified, 0)) .into(target); } }); diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java index 27c72ce8..46b72579 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java @@ -15,14 +15,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import hugo.weaving.DebugLog; - /** * @author Karim Abou Zeid (kabouzeid) */ public class AlbumLoader { - @DebugLog @NonNull public static ArrayList getAllAlbums(@NonNull final Context context) { ArrayList songs = SongLoader.getSongs(SongLoader.makeSongCursor( diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java index 7089ee6d..372e7807 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -2,6 +2,7 @@ package com.kabouzeid.gramophone.model; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.NonNull; import java.util.ArrayList; @@ -20,27 +21,32 @@ public class Album implements Parcelable { } public int getId() { - return songs.get(0).albumId; + return safeGetFirstSong().albumId; } public String getTitle() { - return songs.get(0).albumName; + return safeGetFirstSong().albumName; } public int getArtistId() { - return songs.get(0).artistId; + return safeGetFirstSong().artistId; } public String getArtistName() { - return songs.get(0).artistName; + return safeGetFirstSong().artistName; } public int getYear() { - return songs.get(0).year; + return safeGetFirstSong().year; } - public int getSongCount() { - return songs.size(); + public long getDateModified() { + return safeGetFirstSong().dateModified; + } + + @NonNull + public Song safeGetFirstSong() { + return songs.isEmpty() ? new Song() : songs.get(0); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java index 9774efd3..47854670 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java @@ -94,7 +94,7 @@ public class Song implements Parcelable { ", year=" + year + ", duration=" + duration + ", data='" + data + '\'' + - ", dateModified=" + dateModified + + ", getDateModified=" + dateModified + ", albumId=" + albumId + ", albumName='" + albumName + '\'' + ", artistId=" + artistId + diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index ee6efb39..57863e16 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -36,6 +36,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.signature.MediaStoreSignature; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.appwidget.WidgetMedium; import com.kabouzeid.gramophone.glide.BlurTransformation; @@ -448,7 +449,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP final BitmapRequestBuilder request = Glide.with(MusicService.this) .loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId)) .asBitmap() - .diskCacheStrategy(DiskCacheStrategy.NONE); + .diskCacheStrategy(DiskCacheStrategy.ALL) + .signature(new MediaStoreSignature("", song.dateModified, 0)); if (blurAlbumArt) { request.transform(new BlurTransformation.Builder(MusicService.this).build()); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 2e3b4cd7..fca50937 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -19,6 +19,7 @@ import com.afollestad.materialdialogs.util.DialogUtils; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.signature.MediaStoreSignature; import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.song.AlbumSongAdapter; @@ -149,16 +150,17 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements albumTitleView.setText(album.getTitle()); setUpRecyclerViewView(); setUpSongsAdapter(); - setUpAlbumArtAndApplyPalette(); + loadAlbumCover(); } - private void setUpAlbumArtAndApplyPalette() { + private void loadAlbumCover() { Glide.with(this) .loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId())) .asBitmap() .transcode(new BitmapPaletteTranscoder(this), BitmapPaletteWrapper.class) - .diskCacheStrategy(DiskCacheStrategy.NONE) + .diskCacheStrategy(DiskCacheStrategy.ALL) .error(R.drawable.default_album_art) + .signature(new MediaStoreSignature("", album.getDateModified(), 0)) .into(new PhonographColoredTarget(albumArtImageView) { @Override public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation glideAnimation) { @@ -242,12 +244,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements }); } - private void reloadDataSet() { - adapter.swapDataSet(album.songs); - } - - private void reloadAlbum() { + private void refresh() { album = AlbumLoader.getAlbum(this, album.getId()); + albumTitleView.setText(album.getTitle()); + loadAlbumCover(); + adapter.swapDataSet(album.songs); } @Override @@ -302,9 +303,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAG_EDITOR_REQUEST) { - getAlbumFromIntentExtras(); - albumTitleView.setText(album.getTitle()); - setUpAlbumArtAndApplyPalette(); + refresh(); setResult(RESULT_OK); } } @@ -349,6 +348,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements @Override public void onMediaStoreChanged() { super.onMediaStoreChanged(); - reloadDataSet(); + refresh(); } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 64f6d91a..975537c6 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -37,6 +37,7 @@ import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialdialogs.internal.ThemeSingleton; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.signature.MediaStoreSignature; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.PagerAdapter; import com.kabouzeid.gramophone.dialogs.ChangelogDialog; @@ -276,9 +277,10 @@ public class MainActivity extends AbsSlidingMusicPanelActivity ((TextView) navigationDrawerHeader.findViewById(R.id.text)).setText(song.artistName); Glide.with(this) .loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId)) - .diskCacheStrategy(DiskCacheStrategy.NONE) + .diskCacheStrategy(DiskCacheStrategy.ALL) .error(R.drawable.default_album_art) .animate(android.R.anim.fade_in) + .signature(new MediaStoreSignature("", song.dateModified, 0)) .into(((ImageView) navigationDrawerHeader.findViewById(R.id.image))); } else { if (navigationDrawerHeader != null) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index e6d18dc1..9b8dfd01 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -19,7 +19,6 @@ import android.view.MenuItem; import android.view.View; import com.afollestad.materialdialogs.color.ColorChooserDialog; -import com.bumptech.glide.Glide; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.prefs.ColorChooserPreference; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; @@ -194,15 +193,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia }); } - Preference ignoreMediaStoreArtwork = findPreference("ignore_media_store_artwork"); - ignoreMediaStoreArtwork.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - Glide.get(getActivity()).clearMemory(); - return true; - } - }); - Preference equalizer = findPreference("equalizer"); if (!hasEqualizer()) { equalizer.setEnabled(false); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index 86db808e..a63da241 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -22,10 +22,8 @@ import android.view.View; import android.view.animation.OvershootInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; -import com.bumptech.glide.Glide; import com.github.ksoichiro.android.observablescrollview.ObservableScrollView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks; @@ -275,7 +273,11 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { } protected void setImageBitmap(@Nullable final Bitmap bitmap, int bgColor) { - image.setImageBitmap(bitmap); + if (bitmap == null) { + image.setImageResource(R.drawable.default_album_art); + } else { + image.setImageBitmap(bitmap); + } setColors(bgColor); } @@ -355,11 +357,8 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { }); if (deleteArtwork) { MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId()); - Glide.get(AbsTagEditorActivity.this).clearMemory(); - Toast.makeText(AbsTagEditorActivity.this, R.string.tag_editor_restart_notice, Toast.LENGTH_SHORT).show(); } else if (artwork != null) { - Glide.get(AbsTagEditorActivity.this).clearMemory(); - Toast.makeText(AbsTagEditorActivity.this, R.string.tag_editor_restart_notice, Toast.LENGTH_SHORT).show(); + // AlbumTagEditorActivity already inserts the album cover for us } rescanMediaAndQuitOnFinish(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java index e99a6ab2..0bba5ee4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -128,8 +128,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation glideAnimation) { - ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT); - albumArtBitmap = resource.getBitmap(); + albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048); setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); deleteAlbumArt = false; dataChanged(); @@ -215,7 +214,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text .transcode(new BitmapPaletteTranscoder(AlbumTagEditorActivity.this), BitmapPaletteWrapper.class) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) - .into(new SimpleTarget() { + .into(new SimpleTarget(4097, 4097) { @Override public void onLoadFailed(Exception e, Drawable errorDrawable) { super.onLoadFailed(e, errorDrawable); @@ -226,7 +225,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation glideAnimation) { ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT); - albumArtBitmap = resource.getBitmap(); + albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048); setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); deleteAlbumArt = false; dataChanged(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java index c6d8eee2..71ecf915 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java @@ -20,39 +20,14 @@ import com.kabouzeid.gramophone.R; public class ColorUtil { public static final int PALETTE_BITMAP_SIZE = 100; - @Deprecated - @ColorInt - public static int generateColor(Context context, Bitmap bitmap) { - return getColor(context, generatePalette(bitmap)); - } - + @Nullable public static Palette generatePalette(Bitmap bitmap) { + if (bitmap == null) return null; return Palette.from(bitmap) .resizeBitmapSize(PALETTE_BITMAP_SIZE) .generate(); } - @Deprecated - @ColorInt - public static int getColor(Context context, @Nullable Palette palette) { - if (palette != null) { - if (palette.getVibrantSwatch() != null) { - return palette.getVibrantSwatch().getRgb(); - } else if (palette.getMutedSwatch() != null) { - return palette.getMutedSwatch().getRgb(); - } else if (palette.getDarkVibrantSwatch() != null) { - return palette.getDarkVibrantSwatch().getRgb(); - } else if (palette.getDarkMutedSwatch() != null) { - return palette.getDarkMutedSwatch().getRgb(); - } else if (palette.getLightVibrantSwatch() != null) { - return palette.getLightVibrantSwatch().getRgb(); - } else if (palette.getLightMutedSwatch() != null) { - return palette.getLightMutedSwatch().getRgb(); - } - } - return ColorUtil.resolveColor(context, R.attr.default_bar_color); - } - @ColorInt public static int getColor(@Nullable Palette palette, int fallback) { if (palette != null) {