Use disk cache

This commit is contained in:
Karim Abou Zeid 2016-01-02 23:57:14 +01:00
commit 533708e63d
18 changed files with 77 additions and 94 deletions

View file

@ -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) {

View file

@ -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<SearchAdapter.ViewHolder
holder.text.setText(album.getArtistName());
Glide.with(activity)
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId()))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.drawable.default_album_art)
.animate(android.R.anim.fade_in)
.signature(new MediaStoreSignature("", album.getDateModified(), 0))
.into(holder.image);
break;
case ARTIST:

View file

@ -13,6 +13,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.AbsMultiSelectAdapter;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
@ -123,9 +124,10 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId()))
.asBitmap()
.transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.drawable.default_album_art)
.animate(android.R.anim.fade_in)
.signature(new MediaStoreSignature("", album.getDateModified(), 0))
.into(new PhonographColoredTarget(holder.image) {
@Override
public void onLoadCleared(Drawable placeholder) {

View file

@ -17,6 +17,7 @@ import android.widget.TextView;
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.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
@ -76,9 +77,10 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> 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) {

View file

@ -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<SongAdapter.ViewHolder, S
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
.asBitmap()
.transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class)
.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(new PhonographColoredTarget(holder.image) {
@Override
public void onLoadCleared(Drawable placeholder) {

View file

@ -19,6 +19,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.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.model.Song;
@ -88,7 +89,8 @@ public class WidgetMedium extends AppWidgetProvider {
Glide.with(context)
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.signature(new MediaStoreSignature("", song.dateModified, 0))
.into(target);
}
});

View file

@ -1,12 +1,13 @@
package com.kabouzeid.gramophone.glide.audiocover;
import android.content.Context;
import android.media.MediaMetadataRetriever;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.data.DataFetcher;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.MusicUtil;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@ -33,19 +34,18 @@ public class AudioFileCoverFetcher implements DataFetcher<InputStream> {
@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"};

View file

@ -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);
}
});

View file

@ -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<Album> getAllAlbums(@NonNull final Context context) {
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(

View file

@ -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

View file

@ -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 +

View file

@ -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());
}

View file

@ -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<? super BitmapPaletteWrapper> 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();
}
}

View file

@ -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) {

View file

@ -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);

View file

@ -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();
}

View file

@ -128,8 +128,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> 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<BitmapPaletteWrapper>() {
.into(new SimpleTarget<BitmapPaletteWrapper>(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<? super BitmapPaletteWrapper> 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();

View file

@ -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) {