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

@ -11,7 +11,6 @@ import com.android.volley.toolbox.Volley;
import com.crashlytics.android.Crashlytics;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
import io.fabric.sdk.android.Fabric;
@ -30,7 +29,6 @@ public class App extends Application {
public void onCreate() {
super.onCreate();
Fabric.with(this, new Crashlytics());
ImageLoaderUtil.initImageLoader(this);
}
public MusicPlayerRemote getMusicPlayerRemote() {

View file

@ -2,11 +2,13 @@ package com.kabouzeid.gramophone.adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.graphics.Palette;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
@ -15,9 +17,8 @@ import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.kabouzeid.gramophone.view.SquareImageView;
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;
@ -38,43 +39,48 @@ public class AlbumViewGridAdapter extends ArrayAdapter<Album> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Album album = getItem(position);
final ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.album_tile, parent, false);
viewHolder = new ViewHolder();
viewHolder.image = (SquareImageView) convertView.findViewById(R.id.album_art);
viewHolder.title = (TextView) convertView.findViewById(R.id.album_title);
viewHolder.artist = (TextView) convertView.findViewById(R.id.album_interpret);
viewHolder.footer = convertView.findViewById(R.id.footer);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final SquareImageView albumArt = (SquareImageView) convertView.findViewById(R.id.album_art);
final TextView title = (TextView) convertView.findViewById(R.id.album_title);
final TextView artist = (TextView) convertView.findViewById(R.id.album_interpret);
final View footer = convertView.findViewById(R.id.footer);
title.setText(album.title);
artist.setText(album.artistName);
if (usePalette) resetColors(viewHolder.title, viewHolder.artist, viewHolder.footer);
viewHolder.title.setText(album.title);
viewHolder.artist.setText(album.artistName);
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(album.id).toString(), albumArt, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
albumArt.setImageDrawable(null);
}
Picasso.with(context)
.load(MusicUtil.getAlbumArtUri(album.id))
.placeholder(R.drawable.default_album_art)
.error(R.drawable.default_album_art)
.into(viewHolder.image, new Callback.EmptyCallback(){
@Override
public void onSuccess() {
super.onSuccess();
if(usePalette) {
final Bitmap bitmap = ((BitmapDrawable) viewHolder.image.getDrawable()).getBitmap();
if (bitmap != null) applyPalette(bitmap, viewHolder.title, viewHolder.artist, viewHolder.footer);
}
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
if (usePalette) {
paletteBugFixBlackAndWhite(title, artist, footer);
}
albumArt.setImageResource(R.drawable.default_album_art);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (usePalette) {
applyPalette(loadedImage, title, artist, footer);
}
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
@Override
public void onError() {
super.onError();
if(usePalette) {
paletteBlackAndWhite(viewHolder.title, viewHolder.artist, viewHolder.footer);
}
}
});
return convertView;
}
@ -87,19 +93,32 @@ public class AlbumViewGridAdapter extends ArrayAdapter<Album> {
if (vibrantSwatch != null) {
title.setTextColor(vibrantSwatch.getTitleTextColor());
artist.setTextColor(vibrantSwatch.getTitleTextColor());
ViewUtil.animateViewColor(footer, getContext().getResources().getColor(R.color.materialmusic_default_bar_color),
vibrantSwatch.getRgb());
ViewUtil.animateViewColor(footer, getContext().getResources().getColor(R.color.materialmusic_default_bar_color),vibrantSwatch.getRgb());
} else {
paletteBugFixBlackAndWhite(title, artist, footer);
paletteBlackAndWhite(title, artist, footer);
}
}
});
}
private void paletteBugFixBlackAndWhite(TextView title, TextView artist, View footer) {
private void paletteBlackAndWhite(TextView title, TextView artist, View footer) {
title.setTextColor(Util.resolveColor(context, R.attr.title_text_color));
artist.setTextColor(Util.resolveColor(context, R.attr.caption_text_color));
int defaultBarColor = getContext().getResources().getColor(R.color.materialmusic_default_bar_color);
ViewUtil.animateViewColor(footer, defaultBarColor, defaultBarColor);
}
private void resetColors(TextView title, TextView artist, View footer){
title.setTextColor(Util.resolveColor(context, R.attr.title_text_color));
artist.setTextColor(Util.resolveColor(context, R.attr.caption_text_color));
int defaultBarColor = getContext().getResources().getColor(R.color.materialmusic_default_bar_color);
footer.setBackgroundColor(defaultBarColor);
}
static class ViewHolder {
ImageView image;
TextView title;
TextView artist;
View footer;
}
}

View file

@ -10,8 +10,9 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailLoader;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailUrlLoader;
import com.kabouzeid.gramophone.model.Artist;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -39,19 +40,13 @@ public class ArtistViewListAdapter extends ArrayAdapter<Artist> {
artistName.setText(artist.name);
artistArt.setImageResource(R.drawable.default_artist_image);
final Object tag = artist.name;
artistArt.setTag(tag);
LastFMArtistThumbnailLoader.loadArtistThumbnail(context, artist.name, new LastFMArtistThumbnailLoader.ArtistThumbnailLoaderCallback() {
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(context, artist.name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
@Override
public void onArtistThumbnailLoaded(Bitmap thumbnail) {
if (artistArt.getTag().equals(tag)) {
if (thumbnail != null) {
artistArt.setImageBitmap(thumbnail);
} else {
artistArt.setImageResource(R.drawable.default_artist_image);
}
}
public void onArtistThumbnailUrlLoaded(String url) {
Picasso.with(getContext())
.load(url)
.placeholder(R.drawable.default_artist_image)
.into(artistArt);
}
});

View file

@ -16,9 +16,8 @@ import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.List;
@ -81,7 +80,10 @@ public class SongViewListAdapter extends SongAdapter {
});
songTitle.setText(song.title);
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(song.albumId).toString(), albumArt, new ImageLoaderUtil.defaultAlbumArtOnFailed());
Picasso.with(getContext())
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(albumArt);
return convertView;
}

View file

@ -12,6 +12,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.support.v4.app.NotificationCompat;
import android.widget.RemoteViews;
@ -20,7 +21,9 @@ import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.squareup.picasso.MemoryPolicy;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
public class PlayingNotificationHelper {
public static final String TAG = PlayingNotificationHelper.class.getSimpleName();
@ -40,17 +43,12 @@ public class PlayingNotificationHelper {
.getSystemService(Context.NOTIFICATION_SERVICE);
}
public void buildNotification(Song song, final boolean isPlaying) {
public void buildNotification(final Song song, final boolean isPlaying) {
notificationLayout = new RemoteViews(service.getPackageName(),
R.layout.notification_playing);
notificationLayoutExpanded = new RemoteViews(service.getPackageName(),
R.layout.notification_playing_expanded);
setUpCollapsedLayout(song);
setUpExpandedLayout(song);
setUpPlaybackActions(isPlaying);
setUpExpandedPlaybackActions(isPlaying);
notification = new NotificationCompat.Builder(service)
.setSmallIcon(R.drawable.notification_icon)
.setContentIntent(getOpenMusicControllerPendingIntent())
@ -61,6 +59,12 @@ public class PlayingNotificationHelper {
.build();
notification.bigContentView = notificationLayoutExpanded;
setUpCollapsedLayout(song);
setUpExpandedLayout(song);
loadAlbumArt(song);
setUpPlaybackActions(isPlaying);
setUpExpandedPlaybackActions(isPlaying);
service.startForeground(NOTIFICATION_ID, notification);
}
@ -134,28 +138,35 @@ public class PlayingNotificationHelper {
return null;
}
private void setUpCollapsedLayout(Song song) {
loadAlbumArt(notificationLayout, MusicUtil.getAlbumArtUri(song.albumId).toString());
private void setUpCollapsedLayout(final Song song) {
notificationLayout.setTextViewText(R.id.song_title, song.title);
notificationLayout.setTextViewText(R.id.song_artist, song.title);
}
private static void loadAlbumArt(RemoteViews notificationView, String albumArtUri) {
Bitmap albumArtBitmap = ImageLoader.getInstance().loadImageSync(albumArtUri);
if (albumArtBitmap == null) {
notificationView.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
} else {
notificationView.setImageViewBitmap(R.id.album_art, albumArtBitmap);
}
}
private void setUpExpandedLayout(Song song) {
loadAlbumArt(notificationLayoutExpanded, MusicUtil.getAlbumArtUri(song.albumId).toString());
private void setUpExpandedLayout(final Song song) {
notificationLayoutExpanded.setTextViewText(R.id.song_title, song.title);
notificationLayoutExpanded.setTextViewText(R.id.song_artist, song.artistName);
notificationLayoutExpanded.setTextViewText(R.id.album_title, song.albumName);
}
private void loadAlbumArt(final Song song) {
resetAlbumArt();
Picasso.with(service)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.error(R.drawable.default_album_art)
.into(notificationLayoutExpanded, R.id.album_art, NOTIFICATION_ID, notification);
Picasso.with(service)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.error(R.drawable.default_album_art)
.into(notificationLayout, R.id.album_art, NOTIFICATION_ID, notification);
}
private void resetAlbumArt() {
notificationLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
notificationLayoutExpanded.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
notificationManager.notify(NOTIFICATION_ID, notification);
};
public void killNotification() {
service.stopForeground(true);
notification = null;

View file

@ -1,105 +0,0 @@
package com.kabouzeid.gramophone.lastfm.album;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.View;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.provider.AlbumJSONStore;
import com.kabouzeid.gramophone.util.Util;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.process.BitmapProcessor;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 01.01.15.
*/
public class LastFMAlbumImageLoader {
public static final String TAG = LastFMAlbumImageLoader.class.getSimpleName();
public static void loadAlbumImage(Context context, String queryAlbum, String queryArtist, AlbumImageLoaderCallback callback) {
if (queryAlbum != null) {
String albumJSON = AlbumJSONStore.getInstance(context).getAlbumJSON(queryAlbum + queryArtist);
if (albumJSON != null) {
try {
loadAlbumImageFromJSON(new JSONObject(albumJSON), callback);
} catch (JSONException e) {
Log.e(TAG, "Error while parsing string from cache to JSONObject", e);
}
} else {
downloadAlbumImage(context, queryAlbum, queryArtist, callback);
}
}
}
private static void loadAlbumImageFromJSON(JSONObject jsonObject, final AlbumImageLoaderCallback callback) {
String url = LastFMAlbumInfoUtil.getAlbumImageUrlFromJSON(jsonObject);
if (!url.trim().equals("")) {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(false)
.postProcessor(new BitmapProcessor() {
@Override
public Bitmap process(Bitmap bmp) {
return Util.getAlbumArtScaledBitmap(bmp, true);
}
})
.build();
ImageLoader.getInstance().loadImage(url, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
callback.onAlbumImageLoaded(null, null);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
callback.onAlbumImageLoaded(loadedImage, imageUri);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
callback.onAlbumImageLoaded(null, null);
}
});
} else {
callback.onAlbumImageLoaded(null, null);
}
}
private static void downloadAlbumImage(final Context context, final String album, final String artist, final AlbumImageLoaderCallback callback) {
App app = (App) context.getApplicationContext();
String albumUrl = LastFMAlbumInfoUtil.getAlbumUrl(album, artist);
JsonObjectRequest albumInfoJSONRequest = new JsonObjectRequest(0, albumUrl, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
LastFMAlbumInfoUtil.saveAlbumJSONDataToCacheAndDisk(context, album, artist, response);
loadAlbumImageFromJSON(response, callback);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Download failed!", error);
callback.onAlbumImageLoaded(null, null);
}
});
app.addToVolleyRequestQueue(albumInfoJSONRequest);
}
public static interface AlbumImageLoaderCallback {
public void onAlbumImageLoaded(Bitmap albumImage, String uri);
}
}

View file

@ -0,0 +1,58 @@
package com.kabouzeid.gramophone.lastfm.album;
import android.content.Context;
import android.util.Log;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.kabouzeid.gramophone.provider.AlbumJSONStore;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 01.01.15.
*/
public class LastFMAlbumImageUrlLoader {
public static final String TAG = LastFMAlbumImageUrlLoader.class.getSimpleName();
public static void loadAlbumImageUrl(Context context, String queryAlbum, String queryArtist, final AlbumImageUrlLoaderCallback callback) {
if (queryAlbum != null) {
String albumJSON = AlbumJSONStore.getInstance(context).getAlbumJSON(queryAlbum + queryArtist);
if (albumJSON != null) {
try {
loadAlbumImageUrlFromJSON(new JSONObject(albumJSON), callback);
} catch (JSONException e) {
Log.e(TAG, "Error while parsing string from cache to JSONObject", e);
}
} else {
LastFMAlbumInfoUtil.downloadAlbumInfoJSON(context, queryAlbum, queryArtist, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
loadAlbumImageUrlFromJSON(response, callback);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError();
}
});
}
}
}
private static void loadAlbumImageUrlFromJSON(final JSONObject jsonObject, final AlbumImageUrlLoaderCallback callback) {
String url = LastFMAlbumInfoUtil.getAlbumImageUrlFromJSON(jsonObject);
if (!url.trim().equals("")) {
callback.onAlbumImageUrlLoaded(url);
} else {
callback.onError();
}
}
public static interface AlbumImageUrlLoaderCallback {
public void onAlbumImageUrlLoaded(String url);
public void onError();
}
}

View file

@ -4,6 +4,10 @@ import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.lastfm.LastFMUtil;
import com.kabouzeid.gramophone.provider.AlbumJSONStore;
@ -80,6 +84,25 @@ public class LastFMAlbumInfoUtil {
}
}
public static void downloadAlbumInfoJSON(final Context context, final String album, final String artist, final Response.Listener<JSONObject> callbackSuccess, final Response.ErrorListener callbackError) {
App app = (App) context.getApplicationContext();
String albumUrl = LastFMAlbumInfoUtil.getAlbumUrl(album, artist);
JsonObjectRequest albumInfoJSONRequest = new JsonObjectRequest(0, albumUrl, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
LastFMAlbumInfoUtil.saveAlbumJSONDataToCacheAndDisk(context, album, artist, response);
callbackSuccess.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Download failed!", error);
callbackError.onErrorResponse(error);
}
});
app.addToVolleyRequestQueue(albumInfoJSONRequest);
}
public static void saveAlbumJSONDataToCacheAndDisk(Context context, String album, String artist, JSONObject jsonObject) {
AlbumJSONStore.getInstance(context).addAlbumJSON(album + artist, jsonObject.toString());
}

View file

@ -1,9 +1,14 @@
package com.kabouzeid.gramophone.lastfm.artist;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.util.Log;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.lastfm.LastFMUtil;
import com.kabouzeid.gramophone.provider.ArtistJSONStore;
@ -92,4 +97,23 @@ public class LastFMArtistInfoUtil {
ArtistJSONStore.getInstance(context).removeItem(artist);
ArtistJSONStore.getInstance(context).addArtistJSON(artist, jsonObject.toString());
}
public static void downloadArtistJSON(final Context context, final String artist, final Response.Listener<JSONObject> callback) {
App app = (App) context.getApplicationContext();
String artistUrl = LastFMArtistInfoUtil.getArtistUrl(artist);
JsonObjectRequest artistInfoJSONRequest = new JsonObjectRequest(0, artistUrl, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
LastFMArtistInfoUtil.saveArtistJSONDataToCacheAndDisk(context, artist, response);
callback.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Download failed!", error);
}
});
app.addToVolleyRequestQueue(artistInfoJSONRequest);
}
}

View file

@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.model;
import android.content.Context;
import android.widget.ImageView;
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.squareup.picasso.Picasso;
/**
* Created by karim on 22.11.14.
@ -49,6 +49,9 @@ public class Album implements SearchEntry {
@Override
public void loadImage(Context context, ImageView imageView) {
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(id).toString(), imageView, new ImageLoaderUtil.defaultAlbumArtOnFailed());
imageView.setImageResource(R.drawable.default_album_art);
Picasso.with(context)
.load(MusicUtil.getAlbumArtUri(id))
.into(imageView);
}
}

View file

@ -5,7 +5,8 @@ import android.graphics.Bitmap;
import android.widget.ImageView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailLoader;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailUrlLoader;
import com.squareup.picasso.Picasso;
/**
* Created by karim on 29.12.14.
@ -41,18 +42,14 @@ public class Artist implements SearchEntry {
}
@Override
public void loadImage(Context context, final ImageView imageView) {
imageView.setTag(name);
LastFMArtistThumbnailLoader.loadArtistThumbnail(context, name, new LastFMArtistThumbnailLoader.ArtistThumbnailLoaderCallback() {
public void loadImage(final Context context, final ImageView imageView) {
imageView.setImageResource(R.drawable.default_artist_image);
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(context, name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
@Override
public void onArtistThumbnailLoaded(Bitmap thumbnail) {
if (imageView.getTag().equals(name)) {
if (thumbnail != null) {
imageView.setImageBitmap(thumbnail);
} else {
imageView.setImageResource(R.drawable.default_artist_image);
}
}
public void onArtistThumbnailUrlLoaded(String url) {
Picasso.with(context)
.load(url)
.into(imageView);
}
});
}

View file

@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.model;
import android.content.Context;
import android.widget.ImageView;
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.squareup.picasso.Picasso;
import java.io.Serializable;
@ -57,6 +57,9 @@ public class Song implements Serializable, SearchEntry {
@Override
public void loadImage(Context context, ImageView imageView) {
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(albumId).toString(), imageView, new ImageLoaderUtil.defaultAlbumArtOnFailed());
imageView.setImageResource(R.drawable.default_album_art);
Picasso.with(context)
.load(MusicUtil.getAlbumArtUri(albumId))
.into(imageView);
}
}

View file

@ -9,6 +9,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
@ -30,7 +31,8 @@ import com.kabouzeid.gramophone.model.MusicRemoteEvent;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.InternalStorageUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import java.io.IOException;
import java.util.ArrayList;
@ -294,6 +296,8 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
playingNotificationHelper.updatePlayState(false);
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
updateNotification();
updateRemoteControlClient();
}
}
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.TRACK_CHANGED);
@ -307,14 +311,40 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
}
private void updateRemoteControlClient() {
Song song = getPlayingQueue().get(getPosition());
Bitmap loadedImage = ImageLoader.getInstance().loadImageSync(MusicUtil.getAlbumArtUri(song.albumId).toString());
final Song song = getPlayingQueue().get(getPosition());
remoteControlClient
.editMetadata(false)
.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, song.artistName)
.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, song.title)
.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, song.duration)
.putBitmap(RemoteControlClient.MetadataEditor.BITMAP_KEY_ARTWORK, loadedImage)
.apply();
Picasso.with(this)
.cancelRequest(remoteAlbumArt);
Picasso.with(this)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.into(remoteAlbumArt);
}
private Target remoteAlbumArt = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
updateRemoteControlClientBitmap(bitmap.copy(bitmap.getConfig(), true));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
updateRemoteControlClientBitmap(null);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
private void updateRemoteControlClientBitmap(final Bitmap albumArt) {
remoteControlClient
.editMetadata(false)
.putBitmap(RemoteControlClient.MetadataEditor.BITMAP_KEY_ARTWORK, albumArt)
.apply();
}

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

View file

@ -1,92 +0,0 @@
package com.kabouzeid.gramophone.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ImageView;
import com.kabouzeid.gramophone.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.utils.L;
/**
* Created by karim on 28.12.14.
*/
public class ImageLoaderUtil {
public static void initImageLoader(Context context) {
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(false)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.defaultDisplayImageOptions(defaultOptions)
//.memoryCache(new LRULimitedMemoryCache(1024*1024*CACHE_SIZE_MB))
.build();
ImageLoader.getInstance().init(config);
L.writeLogs(false);
}
public static DisplayImageOptions getCacheOnDiskOptions() {
return new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
}
public static DisplayImageOptions getCacheInMemoryOptions() {
return new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(false)
.build();
}
public static class defaultAlbumArtOnFailed implements ImageLoadingListener {
@Override
public void onLoadingStarted(String imageUri, View view) {
if (view != null) ((ImageView) view).setImageResource(R.drawable.default_album_art);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
if (view != null) ((ImageView) view).setImageResource(R.drawable.default_album_art);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
if (view != null) ((ImageView) view).setImageResource(R.drawable.default_album_art);
}
}
public static class defaultArtistArtOnFailed implements ImageLoadingListener {
@Override
public void onLoadingStarted(String imageUri, View view) {
if (view != null) ((ImageView) view).setImageResource(R.drawable.default_artist_image);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
if (view != null) ((ImageView) view).setImageResource(R.drawable.default_artist_image);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
if (view != null) ((ImageView) view).setImageResource(R.drawable.default_artist_image);
}
}
}

View file

@ -168,17 +168,6 @@ public class Util {
return path;
}
public static Bitmap getAlbumArtScaledBitmap(final Bitmap bitmap, boolean keepAspectRatio) {
if (keepAspectRatio) {
double aspectRatio = (double) bitmap.getHeight() / (double) bitmap.getWidth();
int targetWidth = albumArtSize;
int targetHeight = (int) (targetWidth * aspectRatio);
return Bitmap.createScaledBitmap(bitmap, targetWidth, targetHeight, false);
} else {
return getScaledBitmap(bitmap);
}
}
private static Bitmap getScaledBitmap(final Bitmap bitmap) {
return Bitmap.createScaledBitmap(bitmap, albumArtSize, albumArtSize, false);
}

View file

@ -6,17 +6,11 @@ import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.widget.RemoteViews;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
/**
* Implementation of App Widget functionality.
@ -83,22 +77,6 @@ public class MusicPlayerWidget extends AppWidgetProvider {
}
return null;
}
public void performUpdate(final MusicService service, final Song song){
final RemoteViews views = new RemoteViews(service.getPackageName(), R.layout.music_player_widget);
linkButtons(service, views);
loadAlbumArt(views, MusicUtil.getAlbumArtUri(song.albumId).toString());
views.setTextViewText(R.id.song_title, song.title);
}
private static void loadAlbumArt(RemoteViews widgetView, String albumArtUri) {
Bitmap albumArtBitmap = ImageLoader.getInstance().loadImageSync(albumArtUri);
if (albumArtBitmap == null) {
widgetView.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
} else {
widgetView.setImageViewBitmap(R.id.album_art, albumArtBitmap);
}
}
}