Added native image loader support for artist images. Automatically recreate activity onrResume when colors changed fixes issues #2 and #39. Also Butterknife should be used now everywhere #40

This commit is contained in:
Karim Abou Zeid 2015-07-14 04:08:43 +02:00
commit 8bdaf08a30
29 changed files with 485 additions and 521 deletions

View file

@ -13,9 +13,6 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.loader.ArtistLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
@ -33,9 +30,6 @@ import java.util.Collections;
import java.util.List;
import butterknife.ButterKnife;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
/**
* @author Karim Abou Zeid (kabouzeid)
@ -48,11 +42,9 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
private final AppCompatActivity activity;
private List results = Collections.emptyList();
private final LastFMRestClient lastFMRestClient;
public SearchAdapter(@NonNull AppCompatActivity activity) {
this.activity = activity;
lastFMRestClient = new LastFMRestClient(activity);
}
@SuppressWarnings("unchecked")
@ -122,37 +114,15 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
holder.image.setImageResource(R.drawable.default_artist_image);
break;
}
lastFMRestClient.getApiService().getArtistInfo(artist.name, null, new Callback<ArtistInfo>() {
@Override
public void success(@NonNull ArtistInfo artistInfo, Response response) {
if (artistInfo.getArtist() != null) {
int thumbnailIndex = 0;
List<Image> images = artistInfo.getArtist().getImage();
if (images.size() > 2) {
thumbnailIndex = 2;
} else if (images.size() > 1) {
thumbnailIndex = 1;
}
ImageLoader.getInstance().displayImage(images.get(thumbnailIndex).getText(),
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.showImageOnFail(R.drawable.default_artist_image)
.showImageForEmptyUri(R.drawable.default_artist_image)
.build()
);
} else {
holder.image.setImageResource(R.drawable.default_artist_image);
}
}
@Override
public void failure(RetrofitError error) {
holder.image.setImageResource(R.drawable.default_artist_image);
}
});
ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, false),
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.showImageOnFail(R.drawable.default_artist_image)
.build()
);
break;
case SONG:
final Song song = (Song) results.get(position);

View file

@ -10,7 +10,6 @@ import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
@ -26,7 +25,6 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
@ -34,6 +32,7 @@ import com.nostra13.universalimageloader.core.assist.LoadedFrom;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.process.BitmapProcessor;
import java.util.ArrayList;
import java.util.List;
@ -51,7 +50,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
protected int itemLayoutRes;
protected boolean usePalette;
protected boolean usePalette = false;
public AlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
@ -62,6 +61,11 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
setHasStableIds(true);
}
public void usePalette(boolean usePalette) {
this.usePalette = usePalette;
notifyDataSetChanged();
}
public List<Album> getDataSet() {
return dataSet;
}
@ -99,11 +103,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
final Album album = dataSet.get(position);
final int defaultBarColor = ColorUtil.resolveColor(activity, R.attr.default_bar_color);
ViewUtil.applyBackgroundColor(
defaultBarColor,
new View[]{holder.paletteColorContainer},
new TextView[]{holder.title, holder.text},
false);
setColors(defaultBarColor, holder);
final boolean isChecked = isChecked(album);
holder.itemView.setActivated(isChecked);
@ -125,6 +125,13 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
.cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art)
.resetViewBeforeLoading(true)
.postProcessor(new BitmapProcessor() {
@Override
public Bitmap process(Bitmap bitmap) {
holder.paletteColor = ColorUtil.generateColor(activity, bitmap);
return bitmap;
}
})
.displayer(new FadeInBitmapDisplayer(FADE_IN_TIME) {
@Override
public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
@ -135,12 +142,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
super.display(bitmap, imageAware, loadedFrom);
}
if (usePalette)
ViewUtil.applyBackgroundColorFromBitmap(
bitmap,
defaultBarColor,
new View[]{holder.paletteColorContainer},
new TextView[]{holder.title, holder.text},
!loadedFromMemoryCache);
setColors(holder.paletteColor, holder);
}
})
.build(),
@ -149,16 +151,25 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
FadeInBitmapDisplayer.animate(view, FADE_IN_TIME);
if (usePalette)
ViewUtil.applyBackgroundColor(
defaultBarColor,
new View[]{holder.paletteColorContainer},
new TextView[]{holder.title, holder.text},
true);
setColors(defaultBarColor, holder);
}
}
);
}
private void setColors(int color, ViewHolder holder) {
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color);
int textColor = ColorUtil.getTextColorForBackground(color);
if (holder.title != null) {
holder.title.setTextColor(textColor);
}
if (holder.text != null) {
holder.text.setTextColor(textColor);
}
}
}
@Override
public int getItemCount() {
return dataSet.size();

View file

@ -20,6 +20,7 @@ public class HorizontalAlbumAdapter extends AlbumAdapter {
public HorizontalAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet, @Nullable CabHolder cabHolder) {
super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, cabHolder);
usePalette = false;
}
@Override

View file

@ -17,9 +17,6 @@ import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song;
@ -32,10 +29,6 @@ import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -43,14 +36,12 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
protected final AppCompatActivity activity;
protected ArrayList<Artist> dataSet;
protected int itemLayoutRes;
protected final LastFMRestClient lastFMRestClient;
public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList<Artist> dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
this.dataSet = dataSet;
this.itemLayoutRes = itemLayoutRes;
lastFMRestClient = new LastFMRestClient(activity);
setHasStableIds(true);
}
@ -94,39 +85,15 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
return;
}
if (MusicUtil.isArtistNameUnknown(artist.name)) {
holder.image.setImageResource(R.drawable.default_artist_image);
return;
}
lastFMRestClient.getApiService().getArtistInfo(artist.name, null, new Callback<ArtistInfo>() {
@Override
public void success(@NonNull ArtistInfo artistInfo, Response response) {
if (artistInfo.getArtist() != null) {
List<Image> images = artistInfo.getArtist().getImage();
if (images == null || images.isEmpty()) {
return;
}
ImageLoader.getInstance().displayImage(images.get(images.size() - 1).getText(),
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.showImageOnFail(R.drawable.default_artist_image)
.showImageForEmptyUri(R.drawable.default_artist_image)
.build()
);
} else {
holder.image.setImageResource(R.drawable.default_artist_image);
}
}
@Override
public void failure(RetrofitError error) {
holder.image.setImageResource(R.drawable.default_artist_image);
}
});
ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, false),
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.showImageOnFail(R.drawable.default_artist_image)
.build()
);
}
@Override

View file

@ -41,11 +41,6 @@ public abstract class MediaEntryViewHolder extends RecyclerView.ViewHolder imple
@InjectView(R.id.menu)
public View menu;
@Nullable
@Optional
@InjectView(R.id.palette_color_container)
public View paletteColorContainer;
@Nullable
@Optional
@InjectView(R.id.separator)
@ -60,6 +55,12 @@ public abstract class MediaEntryViewHolder extends RecyclerView.ViewHolder imple
@InjectView(R.id.selected_indicator)
public View selectedIndicator;
@Nullable
@Optional
@InjectView(R.id.palette_color_container)
public View paletteColorContainer;
public int paletteColor;
public MediaEntryViewHolder(View itemView) {
super(itemView);
ButterKnife.inject(this, itemView);