Replaced UIL with Picasso
Huge replacement Hopefully better performance
This commit is contained in:
parent
f3c629e1c6
commit
cfce92535b
27 changed files with 398 additions and 457 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue