Now using OkHttp Glide module, also improved the artist image loading and caching.

This commit is contained in:
Karim Abou Zeid 2016-01-04 17:04:47 +01:00
commit 524273228d
8 changed files with 39 additions and 18 deletions

View file

@ -98,12 +98,13 @@ dependencies {
transitive = true transitive = true
} }
compile('com.afollestad.material-dialogs:core:0.8.5.2@aar') { compile('com.github.afollestad.material-dialogs:core:0.8.5.3@aar') {
transitive = true transitive = true
} }
compile('com.afollestad.material-dialogs:commons:0.8.5.2@aar') { compile('com.github.afollestad.material-dialogs:commons:0.8.5.3@aar') {
transitive = true transitive = true
} }
compile('com.afollestad:material-cab:0.1.6@aar') { compile('com.afollestad:material-cab:0.1.6@aar') {
transitive = true transitive = true
} }
@ -124,7 +125,6 @@ dependencies {
compile 'com.github.kabouzeid:AndroidSlidingUpPanel:3.2.1' compile 'com.github.kabouzeid:AndroidSlidingUpPanel:3.2.1'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.okhttp:okhttp:2.7.0'
compile 'com.jakewharton:butterknife:7.0.1' compile 'com.jakewharton:butterknife:7.0.1'
compile 'org.solovyev.android.views:linear-layout-manager:0.5@aar' compile 'org.solovyev.android.views:linear-layout-manager:0.5@aar'
//noinspection GradleDynamicVersion //noinspection GradleDynamicVersion
@ -132,4 +132,5 @@ dependencies {
compile 'de.psdev.licensesdialog:licensesdialog:1.8.0' compile 'de.psdev.licensesdialog:licensesdialog:1.8.0'
compile 'com.github.kabouzeid:AppIntro:3.3.0k' compile 'com.github.kabouzeid:AppIntro:3.3.0k'
compile 'com.github.bumptech.glide:glide:3.6.1' compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.github.bumptech.glide:okhttp-integration:1.3.1@aar'
} }

View file

@ -22,8 +22,7 @@
-keepattributes Signature -keepattributes Signature
-keepattributes Exceptions -keepattributes Exceptions
# Glide # Glide Modules
-keepnames class com.kabouzeid.gramophone.glide.PhonographGlideModule
-keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * implements com.bumptech.glide.module.GlideModule
# ButterKnife # ButterKnife

View file

@ -10,7 +10,9 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.Target;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.SongGlideRequest;
@ -108,9 +110,11 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
Glide.with(activity) Glide.with(activity)
.load(new ArtistImage(artist.name, false)) .load(new ArtistImage(artist.name, false))
.diskCacheStrategy(DiskCacheStrategy.SOURCE) .diskCacheStrategy(DiskCacheStrategy.SOURCE)
.error(R.drawable.default_artist_image) .placeholder(R.drawable.default_artist_image)
.animate(android.R.anim.fade_in) .animate(android.R.anim.fade_in)
.priority(Priority.LOW)
.signature(ArtistSignatureUtil.getInstance(activity).getArtistSignature(artist.name)) .signature(ArtistSignatureUtil.getInstance(activity).getArtistSignature(artist.name))
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(holder.image); .into(holder.image);
break; break;
case SONG: case SONG:

View file

@ -14,6 +14,7 @@ import android.view.ViewGroup;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority; import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.Target;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
@ -125,11 +126,11 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
.asBitmap() .asBitmap()
.transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class) .transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.SOURCE) .diskCacheStrategy(DiskCacheStrategy.SOURCE)
.error(R.drawable.default_artist_image) .placeholder(R.drawable.default_artist_image)
.animate(android.R.anim.fade_in) .animate(android.R.anim.fade_in)
.priority(Priority.LOW) .priority(Priority.LOW)
.signature(ArtistSignatureUtil.getInstance(activity).getArtistSignature(artist.name)) .signature(ArtistSignatureUtil.getInstance(activity).getArtistSignature(artist.name))
.thumbnail(0.001f) .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(new PhonographColoredTarget(holder.image) { .into(new PhonographColoredTarget(holder.image) {
@Override @Override
public void onLoadCleared(Drawable placeholder) { public void onLoadCleared(Drawable placeholder) {

View file

@ -4,8 +4,8 @@ import android.content.Context;
import com.bumptech.glide.Priority; import com.bumptech.glide.Priority;
import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.data.DataFetcher;
import com.bumptech.glide.load.data.HttpUrlFetcher;
import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.model.ModelLoader;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.LastFmArtist; import com.kabouzeid.gramophone.lastfm.rest.model.LastFmArtist;
import com.kabouzeid.gramophone.util.LastFMUtil; import com.kabouzeid.gramophone.util.LastFMUtil;
@ -18,16 +18,23 @@ import java.io.InputStream;
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class ArtistImageFetcher implements DataFetcher<InputStream> { public class ArtistImageFetcher implements DataFetcher<InputStream> {
public static final String TAG = ArtistImageFetcher.class.getSimpleName();
private Context context; private Context context;
private final LastFMRestClient lastFMRestClient; private final LastFMRestClient lastFMRestClient;
private final ArtistImage model; private final ArtistImage model;
private HttpUrlFetcher urlFetcher; private ModelLoader<GlideUrl, InputStream> urlLoader;
private final int width;
private final int height;
private volatile boolean isCancelled; private volatile boolean isCancelled;
private DataFetcher<InputStream> urlFetcher;
public ArtistImageFetcher(Context context, LastFMRestClient lastFMRestClient, ArtistImage model) { public ArtistImageFetcher(Context context, LastFMRestClient lastFMRestClient, ArtistImage model, ModelLoader<GlideUrl, InputStream> urlLoader, int width, int height) {
this.context = context; this.context = context;
this.lastFMRestClient = lastFMRestClient; this.lastFMRestClient = lastFMRestClient;
this.model = model; this.model = model;
this.urlLoader = urlLoader;
this.width = width;
this.height = height;
} }
@Override @Override
@ -42,7 +49,7 @@ public class ArtistImageFetcher implements DataFetcher<InputStream> {
if (isCancelled) return null; if (isCancelled) return null;
urlFetcher = new HttpUrlFetcher(new GlideUrl(LastFMUtil.getLargestArtistImageUrl(lastFmArtist.getArtist().getImage()))); urlFetcher = urlLoader.getResourceFetcher(new GlideUrl(LastFMUtil.getLargestArtistImageUrl(lastFmArtist.getArtist().getImage())), width, height);
return urlFetcher.loadData(priority); return urlFetcher.loadData(priority);
} }
return null; return null;

View file

@ -2,8 +2,10 @@ package com.kabouzeid.gramophone.glide.artistimage;
import android.content.Context; import android.content.Context;
import com.bumptech.glide.integration.okhttp.OkHttpUrlLoader;
import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.data.DataFetcher;
import com.bumptech.glide.load.model.GenericLoaderFactory; import com.bumptech.glide.load.model.GenericLoaderFactory;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.model.ModelLoader; import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.load.model.ModelLoaderFactory; import com.bumptech.glide.load.model.ModelLoaderFactory;
import com.bumptech.glide.load.model.stream.StreamModelLoader; import com.bumptech.glide.load.model.stream.StreamModelLoader;
@ -18,20 +20,24 @@ import java.io.InputStream;
public class ArtistImageLoader implements StreamModelLoader<ArtistImage> { public class ArtistImageLoader implements StreamModelLoader<ArtistImage> {
private Context context; private Context context;
private LastFMRestClient lastFMRestClient; private LastFMRestClient lastFMRestClient;
private ModelLoader<GlideUrl, InputStream> urlLoader;
public ArtistImageLoader(Context context, LastFMRestClient lastFMRestClient) { public ArtistImageLoader(Context context, LastFMRestClient lastFMRestClient, ModelLoader<GlideUrl, InputStream> urlLoader) {
this.context = context; this.context = context;
this.lastFMRestClient = lastFMRestClient; this.lastFMRestClient = lastFMRestClient;
this.urlLoader = urlLoader;
} }
@Override @Override
public DataFetcher<InputStream> getResourceFetcher(ArtistImage model, int width, int height) { public DataFetcher<InputStream> getResourceFetcher(ArtistImage model, int width, int height) {
return new ArtistImageFetcher(context, lastFMRestClient, model); return new ArtistImageFetcher(context, lastFMRestClient, model, urlLoader, width, height);
} }
public static class Factory implements ModelLoaderFactory<ArtistImage, InputStream> { public static class Factory implements ModelLoaderFactory<ArtistImage, InputStream> {
private static volatile LastFMRestClient internalClient; private static volatile LastFMRestClient internalClient;
private LastFMRestClient client; private LastFMRestClient client;
private OkHttpUrlLoader.Factory okHttpFactory;
private static LastFMRestClient getInternalClient(Context context) { private static LastFMRestClient getInternalClient(Context context) {
if (internalClient == null) { if (internalClient == null) {
@ -49,15 +55,17 @@ public class ArtistImageLoader implements StreamModelLoader<ArtistImage> {
*/ */
public Factory(Context context) { public Factory(Context context) {
client = getInternalClient(context); client = getInternalClient(context);
okHttpFactory = new OkHttpUrlLoader.Factory();
} }
@Override @Override
public ModelLoader<ArtistImage, InputStream> build(Context context, GenericLoaderFactory factories) { public ModelLoader<ArtistImage, InputStream> build(Context context, GenericLoaderFactory factories) {
return new ArtistImageLoader(context, client); return new ArtistImageLoader(context, client, okHttpFactory.build(context, factories));
} }
@Override @Override
public void teardown() { public void teardown() {
okHttpFactory.teardown();
} }
} }
} }

View file

@ -259,9 +259,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
.asBitmap() .asBitmap()
.transcode(new BitmapPaletteTranscoder(this), BitmapPaletteWrapper.class) .transcode(new BitmapPaletteTranscoder(this), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.SOURCE) .diskCacheStrategy(DiskCacheStrategy.SOURCE)
.error(R.drawable.default_artist_image) .placeholder(R.drawable.default_artist_image)
.signature(ArtistSignatureUtil.getInstance(this).getArtistSignature(artist.name)) .signature(ArtistSignatureUtil.getInstance(this).getArtistSignature(artist.name))
.dontAnimate() .dontAnimate()
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.listener(new RequestListener<ArtistImage, BitmapPaletteWrapper>() { .listener(new RequestListener<ArtistImage, BitmapPaletteWrapper>() {
@Override @Override
public boolean onException(Exception e, ArtistImage model, Target<BitmapPaletteWrapper> target, boolean isFirstResource) { public boolean onException(Exception e, ArtistImage model, Target<BitmapPaletteWrapper> target, boolean isFirstResource) {

View file

@ -294,7 +294,7 @@ public final class PreferenceUtil {
} }
public final int getArtistGridSize(Context context) { public final int getArtistGridSize(Context context) {
return mPreferences.getInt(ARTIST_GRID_SIZE, context.getResources().getInteger(R.integer.default_grid_columns)); return mPreferences.getInt(ARTIST_GRID_SIZE, context.getResources().getInteger(R.integer.default_list_columns));
} }
public void setAlbumGridSizeLand(final int gridSize) { public void setAlbumGridSizeLand(final int gridSize) {
@ -324,7 +324,7 @@ public final class PreferenceUtil {
} }
public final int getArtistGridSizeLand(Context context) { public final int getArtistGridSizeLand(Context context) {
return mPreferences.getInt(ARTIST_GRID_SIZE_LAND, context.getResources().getInteger(R.integer.default_grid_columns_land)); return mPreferences.getInt(ARTIST_GRID_SIZE_LAND, context.getResources().getInteger(R.integer.default_list_columns_land));
} }
public void setAlbumColoredFooters(final boolean value) { public void setAlbumColoredFooters(final boolean value) {