Merge branch 'custom_artist_image'
This commit is contained in:
commit
24ef548bc3
11 changed files with 350 additions and 105 deletions
|
|
@ -65,6 +65,10 @@ public class App extends Application {
|
||||||
return BuildConfig.DEBUG || app.billingProcessor.isPurchased(PRO_VERSION_PRODUCT_ID);
|
return BuildConfig.DEBUG || app.billingProcessor.isPurchased(PRO_VERSION_PRODUCT_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static App getInstance() {
|
||||||
|
return app;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTerminate() {
|
public void onTerminate() {
|
||||||
super.onTerminate();
|
super.onTerminate();
|
||||||
|
|
|
||||||
|
|
@ -10,20 +10,16 @@ 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.request.target.Target;
|
|
||||||
import com.kabouzeid.appthemehelper.util.ATHUtil;
|
import com.kabouzeid.appthemehelper.util.ATHUtil;
|
||||||
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.ArtistGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.artistimage.ArtistImage;
|
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||||
import com.kabouzeid.gramophone.model.Album;
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
|
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
|
||||||
|
|
@ -85,15 +81,8 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
|
||||||
final Artist artist = (Artist) dataSet.get(position);
|
final Artist artist = (Artist) dataSet.get(position);
|
||||||
holder.title.setText(artist.getName());
|
holder.title.setText(artist.getName());
|
||||||
holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
|
holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
|
||||||
Glide.with(activity)
|
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
|
||||||
.load(new ArtistImage(artist.getName(), false))
|
.build().into(holder.image);
|
||||||
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
|
|
||||||
.placeholder(R.drawable.default_artist_image)
|
|
||||||
.animate(android.R.anim.fade_in)
|
|
||||||
.priority(Priority.LOW)
|
|
||||||
.signature(ArtistSignatureUtil.getInstance(activity).getArtistSignature(artist.getName()))
|
|
||||||
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
|
||||||
.into(holder.image);
|
|
||||||
break;
|
break;
|
||||||
case SONG:
|
case SONG:
|
||||||
final Song song = (Song) dataSet.get(position);
|
final Song song = (Song) dataSet.get(position);
|
||||||
|
|
|
||||||
|
|
@ -12,23 +12,17 @@ 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.request.target.Target;
|
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
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;
|
||||||
|
import com.kabouzeid.gramophone.glide.ArtistGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.PhonographColoredTarget;
|
import com.kabouzeid.gramophone.glide.PhonographColoredTarget;
|
||||||
import com.kabouzeid.gramophone.glide.artistimage.ArtistImage;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
|
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
|
||||||
|
|
@ -128,16 +122,8 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
||||||
|
|
||||||
protected void loadArtistImage(Artist artist, final ViewHolder holder) {
|
protected void loadArtistImage(Artist artist, final ViewHolder holder) {
|
||||||
if (holder.image == null) return;
|
if (holder.image == null) return;
|
||||||
Glide.with(activity)
|
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
|
||||||
.load(new ArtistImage(artist.getName(), false))
|
.generatePalette(activity).build()
|
||||||
.asBitmap()
|
|
||||||
.transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class)
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
|
|
||||||
.placeholder(R.drawable.default_artist_image)
|
|
||||||
.animate(android.R.anim.fade_in)
|
|
||||||
.priority(Priority.LOW)
|
|
||||||
.signature(ArtistSignatureUtil.getInstance(activity).getArtistSignature(artist.getName()))
|
|
||||||
.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) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,134 @@
|
||||||
|
package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
|
import com.bumptech.glide.BitmapRequestBuilder;
|
||||||
|
import com.bumptech.glide.DrawableRequestBuilder;
|
||||||
|
import com.bumptech.glide.DrawableTypeRequest;
|
||||||
|
import com.bumptech.glide.Priority;
|
||||||
|
import com.bumptech.glide.RequestManager;
|
||||||
|
import com.bumptech.glide.load.Key;
|
||||||
|
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||||
|
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
|
import com.kabouzeid.gramophone.App;
|
||||||
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.artistimage.ArtistImage;
|
||||||
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
|
||||||
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
|
import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
|
||||||
|
import com.kabouzeid.gramophone.util.CustomArtistImageUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
|
*/
|
||||||
|
public class ArtistGlideRequest {
|
||||||
|
|
||||||
|
private static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.SOURCE;
|
||||||
|
private static final int DEFAULT_ERROR_IMAGE = R.drawable.default_artist_image;
|
||||||
|
public static final int DEFAULT_ANIMATION = android.R.anim.fade_in;
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
final RequestManager requestManager;
|
||||||
|
final Artist artist;
|
||||||
|
boolean noCustomImage;
|
||||||
|
boolean forceDownload;
|
||||||
|
|
||||||
|
public static Builder from(@NonNull RequestManager requestManager, Artist artist) {
|
||||||
|
return new Builder(requestManager, artist);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Builder(@NonNull RequestManager requestManager, Artist artist) {
|
||||||
|
this.requestManager = requestManager;
|
||||||
|
this.artist = artist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaletteBuilder generatePalette(Context context) {
|
||||||
|
return new PaletteBuilder(this, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitmapBuilder asBitmap() {
|
||||||
|
return new BitmapBuilder(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder noCustomImage(boolean noCustomImage) {
|
||||||
|
this.noCustomImage = noCustomImage;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder forceDownload(boolean forceDownload) {
|
||||||
|
this.forceDownload = forceDownload;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DrawableRequestBuilder<GlideDrawable> build() {
|
||||||
|
//noinspection unchecked
|
||||||
|
return createBaseRequest(requestManager, artist, noCustomImage, forceDownload)
|
||||||
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
|
.error(DEFAULT_ERROR_IMAGE)
|
||||||
|
.animate(DEFAULT_ANIMATION)
|
||||||
|
.priority(Priority.LOW)
|
||||||
|
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
||||||
|
.signature(createSignature(artist));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class BitmapBuilder {
|
||||||
|
private final Builder builder;
|
||||||
|
|
||||||
|
public BitmapBuilder(Builder builder) {
|
||||||
|
this.builder = builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitmapRequestBuilder<?, Bitmap> build() {
|
||||||
|
//noinspection unchecked
|
||||||
|
return createBaseRequest(builder.requestManager, builder.artist, builder.noCustomImage, builder.forceDownload)
|
||||||
|
.asBitmap()
|
||||||
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
|
.error(DEFAULT_ERROR_IMAGE)
|
||||||
|
.animate(DEFAULT_ANIMATION)
|
||||||
|
.priority(Priority.LOW)
|
||||||
|
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
||||||
|
.signature(createSignature(builder.artist));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class PaletteBuilder {
|
||||||
|
final Context context;
|
||||||
|
private final Builder builder;
|
||||||
|
|
||||||
|
public PaletteBuilder(Builder builder, Context context) {
|
||||||
|
this.builder = builder;
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitmapRequestBuilder<?, BitmapPaletteWrapper> build() {
|
||||||
|
//noinspection unchecked
|
||||||
|
return createBaseRequest(builder.requestManager, builder.artist, builder.noCustomImage, builder.forceDownload)
|
||||||
|
.asBitmap()
|
||||||
|
.transcode(new BitmapPaletteTranscoder(context), BitmapPaletteWrapper.class)
|
||||||
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
|
.error(DEFAULT_ERROR_IMAGE)
|
||||||
|
.animate(DEFAULT_ANIMATION)
|
||||||
|
.priority(Priority.LOW)
|
||||||
|
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
||||||
|
.signature(createSignature(builder.artist));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, Artist artist, boolean noCustomImage, boolean forceDownload) {
|
||||||
|
boolean hasCustomImage = CustomArtistImageUtil.getInstance(App.getInstance()).hasCustomArtistImage(artist);
|
||||||
|
if (noCustomImage || !hasCustomImage) {
|
||||||
|
return requestManager.load(new ArtistImage(artist.getName(), forceDownload));
|
||||||
|
} else {
|
||||||
|
return requestManager.load(CustomArtistImageUtil.getFile(artist));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Key createSignature(Artist artist) {
|
||||||
|
return ArtistSignatureUtil.getInstance(App.getInstance()).getArtistSignature(artist.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -25,9 +25,6 @@ import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
|
||||||
import com.bumptech.glide.request.RequestListener;
|
|
||||||
import com.bumptech.glide.request.target.Target;
|
|
||||||
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
|
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
|
|
@ -36,10 +33,8 @@ import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter;
|
||||||
import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
|
import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
|
||||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
||||||
|
import com.kabouzeid.gramophone.glide.ArtistGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.PhonographColoredTarget;
|
import com.kabouzeid.gramophone.glide.PhonographColoredTarget;
|
||||||
import com.kabouzeid.gramophone.glide.artistimage.ArtistImage;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||||
|
|
@ -52,15 +47,14 @@ import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||||
import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
|
import com.kabouzeid.gramophone.util.CustomArtistImageUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PhonographColorUtil;
|
import com.kabouzeid.gramophone.util.PhonographColorUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
|
|
@ -75,6 +69,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
|
|
||||||
public static final String TAG = ArtistDetailActivity.class.getSimpleName();
|
public static final String TAG = ArtistDetailActivity.class.getSimpleName();
|
||||||
private static final int LOADER_ID = LoaderIds.ARTIST_DETAIL_ACTIVITY;
|
private static final int LOADER_ID = LoaderIds.ARTIST_DETAIL_ACTIVITY;
|
||||||
|
private static final int REQUEST_CODE_SELECT_IMAGE = 1000;
|
||||||
|
|
||||||
public static final String EXTRA_ARTIST_ID = "extra_artist_id";
|
public static final String EXTRA_ARTIST_ID = "extra_artist_id";
|
||||||
|
|
||||||
|
|
@ -109,6 +104,8 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
|
|
||||||
private LastFMRestClient lastFMRestClient;
|
private LastFMRestClient lastFMRestClient;
|
||||||
|
|
||||||
|
private boolean forceDownload;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
@ -269,49 +266,34 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadArtistImage(final boolean forceDownload) {
|
private void loadArtistImage() {
|
||||||
if (forceDownload) {
|
ArtistGlideRequest.Builder.from(Glide.with(this), artist)
|
||||||
ArtistSignatureUtil.getInstance(this).updateArtistSignature(getArtist().getName());
|
.forceDownload(forceDownload)
|
||||||
}
|
.generatePalette(this).build()
|
||||||
Glide.with(this)
|
|
||||||
.load(new ArtistImage(getArtist().getName(), forceDownload))
|
|
||||||
.asBitmap()
|
|
||||||
.transcode(new BitmapPaletteTranscoder(this), BitmapPaletteWrapper.class)
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
|
|
||||||
.placeholder(R.drawable.default_artist_image)
|
|
||||||
.signature(ArtistSignatureUtil.getInstance(this).getArtistSignature(getArtist().getName()))
|
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
|
||||||
.listener(new RequestListener<ArtistImage, BitmapPaletteWrapper>() {
|
|
||||||
@Override
|
|
||||||
public boolean onException(@Nullable Exception e, ArtistImage model, Target<BitmapPaletteWrapper> target, boolean isFirstResource) {
|
|
||||||
if (forceDownload) {
|
|
||||||
Toast.makeText(ArtistDetailActivity.this, e != null ? e.getClass().getSimpleName() : "Error", Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onResourceReady(BitmapPaletteWrapper resource, ArtistImage model, Target<BitmapPaletteWrapper> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
|
||||||
if (forceDownload) {
|
|
||||||
Toast.makeText(ArtistDetailActivity.this, getString(R.string.updated_artist_image), Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.into(new PhonographColoredTarget(artistImage) {
|
.into(new PhonographColoredTarget(artistImage) {
|
||||||
@Override
|
@Override
|
||||||
public void onColorReady(int color) {
|
public void onColorReady(int color) {
|
||||||
setColors(color);
|
setColors(color);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
forceDownload = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
if (resultCode == RESULT_OK) {
|
switch (requestCode) {
|
||||||
reload();
|
case REQUEST_CODE_SELECT_IMAGE:
|
||||||
|
if (resultCode == RESULT_OK) {
|
||||||
|
CustomArtistImageUtil.getInstance(this).setCustomArtistImage(artist, data.getData());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (resultCode == RESULT_OK) {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -387,9 +369,15 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
loadBiography();
|
loadBiography();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_re_download_artist_image:
|
case R.id.action_set_artist_image:
|
||||||
|
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||||
|
intent.setType("image/*");
|
||||||
|
startActivityForResult(Intent.createChooser(intent, getString(R.string.pick_from_local_storage)), REQUEST_CODE_SELECT_IMAGE);
|
||||||
|
return true;
|
||||||
|
case R.id.action_reset_artist_image:
|
||||||
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updating), Toast.LENGTH_SHORT).show();
|
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updating), Toast.LENGTH_SHORT).show();
|
||||||
loadArtistImage(true);
|
CustomArtistImageUtil.getInstance(ArtistDetailActivity.this).resetCustomArtistImage(artist);
|
||||||
|
forceDownload = true;
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_colored_footers:
|
case R.id.action_colored_footers:
|
||||||
item.setChecked(!item.isChecked());
|
item.setChecked(!item.isChecked());
|
||||||
|
|
@ -451,7 +439,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
|
|
||||||
private void setArtist(Artist artist) {
|
private void setArtist(Artist artist) {
|
||||||
this.artist = artist;
|
this.artist = artist;
|
||||||
loadArtistImage(false);
|
loadArtistImage();
|
||||||
|
|
||||||
if (Util.isAllowedToDownloadMetadata(this)) {
|
if (Util.isAllowedToDownloadMetadata(this)) {
|
||||||
loadBiography();
|
loadBiography();
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
public static final String EXTRA_ID = "extra_id";
|
public static final String EXTRA_ID = "extra_id";
|
||||||
public static final String EXTRA_PALETTE = "extra_palette";
|
public static final String EXTRA_PALETTE = "extra_palette";
|
||||||
private static final String TAG = AbsTagEditorActivity.class.getSimpleName();
|
private static final String TAG = AbsTagEditorActivity.class.getSimpleName();
|
||||||
private static final int REQUEST_CODE_SELECT_IMAGE = 1337;
|
private static final int REQUEST_CODE_SELECT_IMAGE = 1000;
|
||||||
@BindView(R.id.play_pause_fab)
|
@BindView(R.id.play_pause_fab)
|
||||||
FloatingActionButton fab;
|
FloatingActionButton fab;
|
||||||
@BindView(R.id.observableScrollView)
|
@BindView(R.id.observableScrollView)
|
||||||
|
|
@ -429,6 +429,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
Uri selectedImage = imageReturnedIntent.getData();
|
Uri selectedImage = imageReturnedIntent.getData();
|
||||||
loadImageFromFile(selectedImage);
|
loadImageFromFile(selectedImage);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
|
||||||
import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum;
|
import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum;
|
||||||
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
import com.kabouzeid.gramophone.util.ImageUtil;
|
||||||
import com.kabouzeid.gramophone.util.LastFMUtil;
|
import com.kabouzeid.gramophone.util.LastFMUtil;
|
||||||
import com.kabouzeid.gramophone.util.PhonographColorUtil;
|
import com.kabouzeid.gramophone.util.PhonographColorUtil;
|
||||||
|
|
||||||
|
|
@ -123,7 +124,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
|
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
|
||||||
albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048);
|
albumArtBitmap = ImageUtil.resizeBitmap(resource.getBitmap(), 2048);
|
||||||
setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.defaultFooterColor)));
|
setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.defaultFooterColor)));
|
||||||
deleteAlbumArt = false;
|
deleteAlbumArt = false;
|
||||||
dataChanged();
|
dataChanged();
|
||||||
|
|
@ -208,7 +209,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
||||||
@Override
|
@Override
|
||||||
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
|
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
|
||||||
PhonographColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT);
|
PhonographColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT);
|
||||||
albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048);
|
albumArtBitmap = ImageUtil.resizeBitmap(resource.getBitmap(), 2048);
|
||||||
setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.defaultFooterColor)));
|
setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.defaultFooterColor)));
|
||||||
deleteAlbumArt = false;
|
deleteAlbumArt = false;
|
||||||
dataChanged();
|
dataChanged();
|
||||||
|
|
@ -232,32 +233,6 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
||||||
dataChanged();
|
dataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Bitmap getResizedAlbumCover(@NonNull Bitmap src, int maxForSmallerSize) {
|
|
||||||
int width = src.getWidth();
|
|
||||||
int height = src.getHeight();
|
|
||||||
|
|
||||||
final int dstWidth;
|
|
||||||
final int dstHeight;
|
|
||||||
|
|
||||||
if (width < height) {
|
|
||||||
if (maxForSmallerSize >= width) {
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
float ratio = (float) height / width;
|
|
||||||
dstWidth = maxForSmallerSize;
|
|
||||||
dstHeight = Math.round(maxForSmallerSize * ratio);
|
|
||||||
} else {
|
|
||||||
if (maxForSmallerSize >= height) {
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
float ratio = (float) width / height;
|
|
||||||
dstWidth = Math.round(maxForSmallerSize * ratio);
|
|
||||||
dstHeight = maxForSmallerSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setColors(int color) {
|
protected void setColors(int color) {
|
||||||
super.setColors(color);
|
super.setColors(color);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,132 @@
|
||||||
|
package com.kabouzeid.gramophone.util;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
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.kabouzeid.gramophone.App;
|
||||||
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
|
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CustomArtistImageUtil {
|
||||||
|
private static final String CUSTOM_ARTIST_IMAGE_PREFS = "custom_artist_image";
|
||||||
|
private static final String FOLDER_NAME = "/custom_artist_images/";
|
||||||
|
|
||||||
|
private static CustomArtistImageUtil sInstance;
|
||||||
|
|
||||||
|
private final SharedPreferences mPreferences;
|
||||||
|
|
||||||
|
private CustomArtistImageUtil(@NonNull final Context context) {
|
||||||
|
mPreferences = context.getApplicationContext().getSharedPreferences(CUSTOM_ARTIST_IMAGE_PREFS, Context.MODE_PRIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CustomArtistImageUtil getInstance(@NonNull final Context context) {
|
||||||
|
if (sInstance == null) {
|
||||||
|
sInstance = new CustomArtistImageUtil(context.getApplicationContext());
|
||||||
|
}
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomArtistImage(final Artist artist, Uri uri) {
|
||||||
|
Glide.with(App.getInstance())
|
||||||
|
.load(uri)
|
||||||
|
.asBitmap()
|
||||||
|
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||||
|
.skipMemoryCache(true)
|
||||||
|
.into(new SimpleTarget<Bitmap>() {
|
||||||
|
@Override
|
||||||
|
public void onLoadFailed(Exception e, Drawable errorDrawable) {
|
||||||
|
super.onLoadFailed(e, errorDrawable);
|
||||||
|
e.printStackTrace();
|
||||||
|
Toast.makeText(App.getInstance(), e.toString(), Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResourceReady(final Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
|
||||||
|
new AsyncTask<Void, Void, Void>() {
|
||||||
|
@SuppressLint("ApplySharedPref")
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params) {
|
||||||
|
File dir = new File(App.getInstance().getFilesDir(), FOLDER_NAME);
|
||||||
|
if (!dir.exists()) {
|
||||||
|
if (!dir.mkdirs()) { // create the folder
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
File file = new File(dir, getFileName(artist));
|
||||||
|
|
||||||
|
boolean succesful = false;
|
||||||
|
try {
|
||||||
|
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
|
||||||
|
succesful = ImageUtil.resizeBitmap(resource, 2048).compress(Bitmap.CompressFormat.JPEG, 100, os);
|
||||||
|
os.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Toast.makeText(App.getInstance(), e.toString(), Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (succesful) {
|
||||||
|
mPreferences.edit().putBoolean(getFileName(artist), true).commit();
|
||||||
|
ArtistSignatureUtil.getInstance(App.getInstance()).updateArtistSignature(artist.getName());
|
||||||
|
App.getInstance().getContentResolver().notifyChange(Uri.parse("content://media"), null); // trigger media store changed to force artist image reload
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetCustomArtistImage(final Artist artist) {
|
||||||
|
new AsyncTask<Void, Void, Void>() {
|
||||||
|
@SuppressLint("ApplySharedPref")
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params) {
|
||||||
|
mPreferences.edit().putBoolean(getFileName(artist), false).commit();
|
||||||
|
ArtistSignatureUtil.getInstance(App.getInstance()).updateArtistSignature(artist.getName());
|
||||||
|
App.getInstance().getContentResolver().notifyChange(Uri.parse("content://media"), null); // trigger media store changed to force artist image reload
|
||||||
|
|
||||||
|
File file = getFile(artist);
|
||||||
|
if (!file.exists()) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
// shared prefs saves us many IO operations
|
||||||
|
public boolean hasCustomArtistImage(Artist artist) {
|
||||||
|
return mPreferences.getBoolean(getFileName(artist), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getFileName(Artist artist) {
|
||||||
|
return String.format(Locale.US, "#%d#%s.jpeg", artist.getId(), artist.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getFile(Artist artist) {
|
||||||
|
File dir = new File(App.getInstance().getFilesDir(), FOLDER_NAME);
|
||||||
|
return new File(dir, getFileName(artist));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
package com.kabouzeid.gramophone.util;
|
package com.kabouzeid.gramophone.util;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
|
|
@ -29,4 +32,30 @@ public class ImageUtil {
|
||||||
|
|
||||||
return inSampleSize;
|
return inSampleSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Bitmap resizeBitmap(@NonNull Bitmap src, int maxForSmallerSize) {
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
|
||||||
|
final int dstWidth;
|
||||||
|
final int dstHeight;
|
||||||
|
|
||||||
|
if (width < height) {
|
||||||
|
if (maxForSmallerSize >= width) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
float ratio = (float) height / width;
|
||||||
|
dstWidth = maxForSmallerSize;
|
||||||
|
dstHeight = Math.round(maxForSmallerSize * ratio);
|
||||||
|
} else {
|
||||||
|
if (maxForSmallerSize >= height) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
float ratio = (float) width / height;
|
||||||
|
dstWidth = Math.round(maxForSmallerSize * ratio);
|
||||||
|
dstHeight = maxForSmallerSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,13 @@
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_re_download_artist_image"
|
android:id="@+id/action_set_artist_image"
|
||||||
android:title="@string/action_re_download_artist_image"
|
android:title="@string/set_artist_image"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_reset_artist_image"
|
||||||
|
android:title="@string/reset_artist_image"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
|
|
|
||||||
|
|
@ -294,4 +294,6 @@
|
||||||
<string name="clear_blacklist">Clear blacklist</string>
|
<string name="clear_blacklist">Clear blacklist</string>
|
||||||
<string name="do_you_want_to_clear_the_blacklist">Do you want to clear the blacklist?</string>
|
<string name="do_you_want_to_clear_the_blacklist">Do you want to clear the blacklist?</string>
|
||||||
<string name="pref_summary_blacklist">The content of blacklisted folders is hidden from your library.</string>
|
<string name="pref_summary_blacklist">The content of blacklisted folders is hidden from your library.</string>
|
||||||
|
<string name="reset_artist_image">Reset artist image</string>
|
||||||
|
<string name="set_artist_image">Set artist image</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue