Replaced UIL with Picasso

Huge replacement
Hopefully better performance
This commit is contained in:
Karim Abou Zeid 2015-03-11 13:33:06 +01:00
commit cfce92535b
27 changed files with 398 additions and 457 deletions

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@ -40,9 +41,8 @@ import com.nhaarman.listviewanimations.appearance.AnimationAdapter;
import com.nhaarman.listviewanimations.appearance.simple.ScaleInAnimationAdapter;
import com.nineoldandroids.view.ViewHelper;
import com.nineoldandroids.view.ViewPropertyAnimator;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -131,7 +131,6 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
if (Util.hasLollipopSDK()) postponeEnterTransition();
app = (App) getApplicationContext();
setTheme(app.getAppTheme());
setUpTranslucence();
@ -153,7 +152,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
setUpObservableListViewParams();
setUpToolBar();
setUpViews();
if (!Util.hasLollipopSDK()) animateEnterActivity();
animateEnterActivity();
}
@Override
@ -203,38 +202,16 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
@SuppressLint("NewApi")
private void setUpAlbumArtAndApplyPalette() {
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(album.id).toString(), albumArtImageView, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
albumArtImageView.setImageResource(R.drawable.default_album_art);
if (Util.hasLollipopSDK()) {
startPostponedEnterTransition();
animateEnterActivity();
}
}
@Override
public void onLoadingComplete(String imageUri, final View view, Bitmap loadedImage) {
applyPalette(loadedImage);
if (Util.hasLollipopSDK()) {
startPostponedEnterTransition();
animateEnterActivity();
}
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
albumArtImageView.setImageResource(R.drawable.default_album_art);
if (Util.hasLollipopSDK()) {
startPostponedEnterTransition();
animateEnterActivity();
}
}
});
Picasso.with(this).load(MusicUtil.getAlbumArtUri(album.id))
.placeholder(R.drawable.default_album_art)
.into(albumArtImageView, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
super.onSuccess();
final Bitmap bitmap = ((BitmapDrawable) albumArtImageView.getDrawable()).getBitmap();
if (bitmap != null) applyPalette(bitmap);
}
});
}
private void applyPalette(Bitmap bitmap) {

View file

@ -6,6 +6,7 @@ import android.app.Fragment;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
@ -28,7 +29,7 @@ import com.google.samples.apps.iosched.ui.widget.SlidingTabLayout;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.interfaces.OnMusicRemoteEventListener;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistImageLoader;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistImageUrlLoader;
import com.kabouzeid.gramophone.loader.ArtistLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.Artist;
@ -42,6 +43,8 @@ import com.kabouzeid.gramophone.util.ViewUtil;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.view.ViewHelper;
import com.nineoldandroids.view.ViewPropertyAnimator;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
/*
*
@ -149,7 +152,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
private void setUpObservableListViewParams() {
artistImageViewHeight = getResources().getDimensionPixelSize(R.dimen.header_image_height);
toolbarColor = Util.resolveColor(this, R.attr.colorPrimary);
toolbarColor = getResources().getColor(R.color.materialmusic_default_bar_color);
toolbarHeight = Util.getActionBarSize(this);
titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height);
headerOffset = toolbarHeight;
@ -314,17 +317,23 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
}
private void setUpArtistImageAndApplyPalette(final boolean forceDownload) {
LastFMArtistImageLoader.loadArtistImage(this, artist.name, forceDownload, new LastFMArtistImageLoader.ArtistImageLoaderCallback() {
@SuppressLint("NewApi")
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, artist.name, forceDownload, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
@Override
public void onArtistImageLoaded(Bitmap artistImage) {
if (artistImage != null) {
artistImageView.setImageBitmap(artistImage);
applyPalette(artistImage);
}
if(forceDownload){
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updated_artist_image_for) + " " + artist.name, Toast.LENGTH_SHORT).show();
}
public void onArtistImageUrlLoaded(String url) {
Picasso.with(ArtistDetailActivity.this)
.load(url)
.placeholder(R.drawable.default_artist_image)
.into(artistImageView, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
super.onSuccess();
final Bitmap bitmap = ((BitmapDrawable) artistImageView.getDrawable()).getBitmap();
if (bitmap != null) applyPalette(bitmap);
if (forceDownload) {
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updated_artist_image_for) + " " + artist.name, Toast.LENGTH_SHORT).show();
}
}
});
}
});
}

View file

@ -38,11 +38,10 @@ import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AlbumViewFrag
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.ArtistViewFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.MainActivityFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.SongViewFragment;
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.squareup.picasso.Picasso;
public class MainActivity extends AbsFabActivity
@ -152,7 +151,11 @@ public class MainActivity extends AbsFabActivity
if (navigationDrawerFragment != null) {
Song song = getApp().getMusicPlayerRemote().getCurrentSong();
if (song.id != -1) {
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(song.albumId).toString(), navigationDrawerFragment.getAlbumArtImageView(), new ImageLoaderUtil.defaultAlbumArtOnFailed());
Picasso.with(this)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.error(R.drawable.default_album_art)
.placeholder(R.drawable.default_album_art)
.into(navigationDrawerFragment.getAlbumArtImageView());
navigationDrawerFragment.getSongTitle().setText(song.title);
navigationDrawerFragment.getSongArtist().setText(song.artistName);
}
@ -164,7 +167,7 @@ public class MainActivity extends AbsFabActivity
try {
super.enableViews();
toolbar.setEnabled(true);
((MainActivityFragment)viewPagerAdapter.getItem(viewPager.getCurrentItem())).enableViews();
((MainActivityFragment) viewPagerAdapter.getItem(viewPager.getCurrentItem())).enableViews();
} catch (NullPointerException e) {
Log.e(TAG, "wasn't able to enable the views", e);
}
@ -174,7 +177,7 @@ public class MainActivity extends AbsFabActivity
public void disableViews() {
try {
super.disableViews();
((MainActivityFragment)viewPagerAdapter.getItem(viewPager.getCurrentItem())).disableViews();
((MainActivityFragment) viewPagerAdapter.getItem(viewPager.getCurrentItem())).disableViews();
} catch (NullPointerException e) {
Log.e(TAG, "wasn't able to disable the views", e);
}

View file

@ -2,6 +2,8 @@ package com.kabouzeid.gramophone.ui.activities;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.util.Pair;
@ -23,7 +25,7 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.PlayingQueueDialogHelper;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.interfaces.OnMusicRemoteEventListener;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistImageLoader;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistImageUrlLoader;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.MusicRemoteEvent;
@ -35,9 +37,9 @@ import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.nineoldandroids.view.ViewPropertyAnimator;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import java.io.File;
@ -229,29 +231,18 @@ public class MusicControllerActivity extends AbsFabActivity implements OnMusicRe
}
private void setUpAlbumArtAndApplyPalette() {
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(song.albumId).toString(), albumArt, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
albumArt.setImageResource(R.drawable.default_album_art);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
albumArt.setImageResource(R.drawable.default_album_art);
setStandardColors();
}
@Override
public void onLoadingComplete(String imageUri, final View view, Bitmap loadedImage) {
applyPalette(loadedImage);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
albumArt.setImageResource(R.drawable.default_album_art);
setStandardColors();
}
});
setStandardColors();
Picasso.with(this)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(albumArt, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
super.onSuccess();
final Bitmap bitmap = ((BitmapDrawable) albumArt.getDrawable()).getBitmap();
if (bitmap != null) applyPalette(bitmap);
}
});
}
private void applyPalette(Bitmap bitmap) {
@ -296,10 +287,14 @@ public class MusicControllerActivity extends AbsFabActivity implements OnMusicRe
private void setUpArtistArt() {
if (artistArt != null) {
artistArt.setImageResource(R.drawable.default_artist_image);
LastFMArtistImageLoader.loadArtistImage(this, song.artistName, new LastFMArtistImageLoader.ArtistImageLoaderCallback() {
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, song.artistName, false, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
@Override
public void onArtistImageLoaded(Bitmap artistImage) {
artistArt.setImageBitmap(artistImage);
public void onArtistImageUrlLoaded(String url) {
Picasso.with(MusicControllerActivity.this)
.load(url)
.placeholder(R.drawable.default_artist_image)
.error(R.drawable.default_artist_image)
.into(artistArt);
}
});
}

View file

@ -30,8 +30,6 @@ import com.kabouzeid.gramophone.util.ViewUtil;
import com.melnykov.fab.FloatingActionButton;
import com.nineoldandroids.view.ViewHelper;
import com.nineoldandroids.view.ViewPropertyAnimator;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.utils.MemoryCacheUtils;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
@ -356,13 +354,11 @@ public abstract class AbsTagEditorActivity extends ActionBarActivity {
}
if (deleteArtwork) {
String imagePath = MusicUtil.getAlbumArtUri(getId()).toString();
ImageLoader.getInstance().getDiskCache().remove(imagePath);
MemoryCacheUtils.removeFromCache(imagePath, ImageLoader.getInstance().getMemoryCache());
//TODO delete from picasso cache
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
} else if (artwork != null) {
String imagePath = MusicUtil.getAlbumArtUri(getId()).toString();
MemoryCacheUtils.removeFromCache(imagePath, ImageLoader.getInstance().getMemoryCache());
ImageLoader.getInstance().getDiskCache().remove(imagePath);
//TODO delete from Picasso cache
}
progressDialog.dismiss();
rescanMedia();

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.ui.activities.tageditor;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
@ -10,15 +11,13 @@ import android.widget.EditText;
import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.lastfm.album.LastFMAlbumImageLoader;
import com.kabouzeid.gramophone.lastfm.album.LastFMAlbumImageUrlLoader;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.process.BitmapProcessor;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.images.Artwork;
@ -89,20 +88,42 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
Toast.makeText(this, getResources().getString(R.string.album_or_artist_empty), Toast.LENGTH_SHORT).show();
return;
}
LastFMAlbumImageLoader.loadAlbumImage(this, albumTitleStr, albumArtistNameStr, new LastFMAlbumImageLoader.AlbumImageLoaderCallback() {
@Override
public void onAlbumImageLoaded(Bitmap albumImage, String uri) {
if (albumImage != null) {
setImageBitmap(albumImage);
albumArtBitmap = albumImage;
deleteAlbumArt = false;
dataChanged();
Toast.makeText(AlbumTagEditorActivity.this, "Success.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(AlbumTagEditorActivity.this, "Failed.", Toast.LENGTH_SHORT).show();
LastFMAlbumImageUrlLoader.loadAlbumImageUrl(this, albumTitleStr, albumArtistNameStr, new LastFMAlbumImageUrlLoader.AlbumImageUrlLoaderCallback() {
@Override
public void onAlbumImageUrlLoaded(String url) {
Picasso.with(AlbumTagEditorActivity.this)
.load(url)
.resize(500, 500)
.centerCrop()
.onlyScaleDown()
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
albumArtBitmap = bitmap;
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
Toast.makeText(AlbumTagEditorActivity.this, "Success.", Toast.LENGTH_SHORT).show();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Toast.makeText(AlbumTagEditorActivity.this, "Failed.", Toast.LENGTH_SHORT).show();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
}
@Override
public void onError() {
Toast.makeText(AlbumTagEditorActivity.this, "Failed.", Toast.LENGTH_SHORT).show();
}
}
}
});
);
}
@Override
@ -166,24 +187,30 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override
protected void loadImageFromFile(final Uri selectedFileUri) {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(false)
.postProcessor(new BitmapProcessor() {
Picasso.with(this)
.load(selectedFileUri)
.resize(500, 500)
.centerCrop()
.onlyScaleDown()
.into(new Target() {
@Override
public Bitmap process(Bitmap bmp) {
Bitmap scaledBitmap = Util.getAlbumArtScaledBitmap(bmp, true);
bmp.recycle();
return scaledBitmap;
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
albumArtBitmap = bitmap;
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
}
})
.build();
albumArtBitmap = ImageLoader.getInstance().loadImageSync(selectedFileUri.toString(), options);
if (albumArtBitmap != null) {
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
//TODO Toast could not read file
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
}
@Override