Switched from Picasso to Ion

Much better performance.
Not well tested yet but it should work.
This commit is contained in:
Karim Abou Zeid 2015-04-17 00:56:55 +02:00
commit a11535c8a3
39 changed files with 733 additions and 419 deletions

View file

@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.adapter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v4.util.Pair;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.RecyclerView;
@ -17,16 +16,19 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.ImageViewBitmapInfo;
import com.koushikdutta.ion.Ion;
import com.koushikdutta.ion.bitmap.BitmapInfo;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -45,36 +47,51 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
return new ViewHolder(view);
}
@Override
public void onViewRecycled(ViewHolder holder) {
super.onViewRecycled(holder);
Object tag = holder.image.getTag();
if (tag instanceof Future) {
((Future) tag).cancel();
}
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final Album album = dataSet.get(position);
resetColors(holder.title, holder.artist, holder.footer);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id))
.placeholder(R.drawable.default_album_art)
.into(holder.image, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
super.onSuccess();
if (usePalette) {
final Bitmap bitmap = ((BitmapDrawable) holder.image.getDrawable()).getBitmap();
if (bitmap != null)
applyPalette(bitmap, holder.title, holder.artist, holder.footer);
}
}
@Override
public void onError() {
super.onError();
if (usePalette) {
paletteBlackAndWhite(holder.title, holder.artist, holder.footer);
}
}
});
holder.title.setText(album.title);
holder.artist.setText(album.artistName);
holder.image.setTag(
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id).toString())
.withBitmap()
.resize(holder.image.getWidth(), holder.image.getHeight())
.centerCrop()
.intoImageView(holder.image)
.withBitmapInfo()
.setCallback(new FutureCallback<ImageViewBitmapInfo>() {
@Override
public void onCompleted(Exception e, ImageViewBitmapInfo result) {
if(result != null){
BitmapInfo info = result.getBitmapInfo();
if(info != null){
Bitmap bitmap = info.bitmap;
if (bitmap != null) {
if (usePalette)
applyPalette(bitmap, holder.title, holder.artist, holder.footer);
return;
}
}
}
holder.image.setImageResource(R.drawable.default_album_art);
if (usePalette)
paletteBlackAndWhite(holder.title, holder.artist, holder.footer);
}
})
);
}
@Override
@ -173,9 +190,9 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
}
@Subscribe
public void onUIChangeEvent(UIPreferenceChangedEvent event) {
public void onUIChangeEvent(UiPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED:
case UiPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED:
usePalette = (boolean) event.getValue();
notifyDataSetChanged();
break;

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.adapter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.support.v4.util.Pair;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@ -17,8 +18,9 @@ import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -54,12 +56,20 @@ public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(activity, artist.name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
@Override
public void onArtistThumbnailUrlLoaded(String url) {
Picasso.with(activity)
public void onArtistThumbnailUrlLoaded(final String url) {
Ion.with(activity)
.load(url)
.noFade()
.placeholder(R.drawable.default_artist_image)
.into(holder.artistImage);
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null)
holder.artistImage.setImageBitmap(result);
else {
holder.artistImage.setImageResource(R.drawable.default_artist_image);
}
}
});
}
});
}

View file

@ -14,7 +14,7 @@ import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
import java.util.List;
@ -48,10 +48,13 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
public void onBindViewHolder(final ViewHolder holder, int position) {
final Album album = dataSet.get(position);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id))
.placeholder(R.drawable.default_album_art)
.into(holder.image);
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id).toString())
.withBitmap()
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(holder.albumArt);
holder.title.setText(album.title);
holder.year.setText(String.valueOf(album.year));
@ -72,13 +75,13 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView image;
ImageView albumArt;
TextView title;
TextView year;
public ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.album_art);
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
title = (TextView) itemView.findViewById(R.id.album_title);
year = (TextView) itemView.findViewById(R.id.album_year);
itemView.setOnClickListener(this);
@ -87,12 +90,12 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
@Override
public void onClick(View v) {
Pair[] albumPairs = new Pair[]{
Pair.create(image,
Pair.create(albumArt,
activity.getResources().getString(R.string.transition_album_cover)
)};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getPosition()).id, albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).id, albumPairs);
}
}

View file

@ -1,7 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.util.Pair;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -11,24 +10,15 @@ import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
import java.io.File;
import java.util.List;
/**
@ -56,10 +46,13 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> {
songTitle.setText(song.title);
songInfo.setText(song.albumName);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(albumArt);
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(albumArt.getWidth(), albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(albumArt);
final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
overflowButton.setOnClickListener(new View.OnClickListener() {

View file

@ -20,7 +20,7 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
import java.util.List;
@ -43,6 +43,11 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
return new ViewHolder(view);
}
@Override
public void onViewRecycled(ViewHolder holder) {
super.onViewRecycled(holder);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final Song song = dataSet.get(position);
@ -50,10 +55,15 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(holder.albumArt);
holder.albumArt.setTag(
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(holder.albumArt)
);
}
@Override

View file

@ -1,7 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.support.v4.util.Pair;
import android.support.v7.widget.RecyclerView;
@ -15,25 +14,18 @@ import android.widget.TextView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util;
import com.koushikdutta.ion.Ion;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.List;
/**
@ -75,10 +67,13 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(holder.albumArt);
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(holder.albumArt);
} else {
int accentColor = Util.resolveColor(activity, R.attr.colorAccent);
holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase());