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
|
|
@ -54,7 +54,7 @@ dependencies {
|
||||||
compile 'com.melnykov:floatingactionbutton:1.2.0'
|
compile 'com.melnykov:floatingactionbutton:1.2.0'
|
||||||
compile 'com.github.ksoichiro:android-observablescrollview:1.3.0'
|
compile 'com.github.ksoichiro:android-observablescrollview:1.3.0'
|
||||||
compile 'com.mcxiaoke.volley:library:1.0.+'
|
compile 'com.mcxiaoke.volley:library:1.0.+'
|
||||||
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
|
compile 'com.squareup.picasso:picasso:2.5.0'
|
||||||
compile 'com.afollestad:material-dialogs:0.6.3.4'
|
compile 'com.afollestad:material-dialogs:0.6.3.4'
|
||||||
compile('com.crashlytics.sdk.android:crashlytics:2.2.1@aar') {
|
compile('com.crashlytics.sdk.android:crashlytics:2.2.1@aar') {
|
||||||
transitive = true;
|
transitive = true;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import com.android.volley.toolbox.Volley;
|
||||||
import com.crashlytics.android.Crashlytics;
|
import com.crashlytics.android.Crashlytics;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.misc.AppKeys;
|
import com.kabouzeid.gramophone.misc.AppKeys;
|
||||||
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
|
|
||||||
|
|
||||||
import io.fabric.sdk.android.Fabric;
|
import io.fabric.sdk.android.Fabric;
|
||||||
|
|
||||||
|
|
@ -30,7 +29,6 @@ public class App extends Application {
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
Fabric.with(this, new Crashlytics());
|
Fabric.with(this, new Crashlytics());
|
||||||
ImageLoaderUtil.initImageLoader(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MusicPlayerRemote getMusicPlayerRemote() {
|
public MusicPlayerRemote getMusicPlayerRemote() {
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,13 @@ package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.support.v7.graphics.Palette;
|
import android.support.v7.graphics.Palette;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
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.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.kabouzeid.gramophone.view.SquareImageView;
|
import com.kabouzeid.gramophone.view.SquareImageView;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.squareup.picasso.Callback;
|
||||||
import com.nostra13.universalimageloader.core.assist.FailReason;
|
import com.squareup.picasso.Picasso;
|
||||||
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -38,42 +39,47 @@ public class AlbumViewGridAdapter extends ArrayAdapter<Album> {
|
||||||
@Override
|
@Override
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
final Album album = getItem(position);
|
final Album album = getItem(position);
|
||||||
|
final ViewHolder viewHolder;
|
||||||
|
|
||||||
if (convertView == null) {
|
if (convertView == null) {
|
||||||
convertView = LayoutInflater.from(context).inflate(R.layout.album_tile, parent, false);
|
convertView = LayoutInflater.from(context).inflate(R.layout.album_tile, parent, false);
|
||||||
}
|
|
||||||
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);
|
viewHolder = new ViewHolder();
|
||||||
artist.setText(album.artistName);
|
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);
|
||||||
|
|
||||||
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(album.id).toString(), albumArt, new ImageLoadingListener() {
|
convertView.setTag(viewHolder);
|
||||||
@Override
|
} else {
|
||||||
public void onLoadingStarted(String imageUri, View view) {
|
viewHolder = (ViewHolder) convertView.getTag();
|
||||||
albumArt.setImageDrawable(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (usePalette) resetColors(viewHolder.title, viewHolder.artist, viewHolder.footer);
|
||||||
|
viewHolder.title.setText(album.title);
|
||||||
|
viewHolder.artist.setText(album.artistName);
|
||||||
|
|
||||||
|
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
|
@Override
|
||||||
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
|
public void onSuccess() {
|
||||||
|
super.onSuccess();
|
||||||
if(usePalette) {
|
if(usePalette) {
|
||||||
paletteBugFixBlackAndWhite(title, artist, footer);
|
final Bitmap bitmap = ((BitmapDrawable) viewHolder.image.getDrawable()).getBitmap();
|
||||||
|
if (bitmap != null) applyPalette(bitmap, viewHolder.title, viewHolder.artist, viewHolder.footer);
|
||||||
}
|
}
|
||||||
albumArt.setImageResource(R.drawable.default_album_art);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
|
public void onError() {
|
||||||
|
super.onError();
|
||||||
if(usePalette) {
|
if(usePalette) {
|
||||||
applyPalette(loadedImage, title, artist, footer);
|
paletteBlackAndWhite(viewHolder.title, viewHolder.artist, viewHolder.footer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onLoadingCancelled(String imageUri, View view) {
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return convertView;
|
return convertView;
|
||||||
|
|
@ -87,19 +93,32 @@ public class AlbumViewGridAdapter extends ArrayAdapter<Album> {
|
||||||
if (vibrantSwatch != null) {
|
if (vibrantSwatch != null) {
|
||||||
title.setTextColor(vibrantSwatch.getTitleTextColor());
|
title.setTextColor(vibrantSwatch.getTitleTextColor());
|
||||||
artist.setTextColor(vibrantSwatch.getTitleTextColor());
|
artist.setTextColor(vibrantSwatch.getTitleTextColor());
|
||||||
ViewUtil.animateViewColor(footer, getContext().getResources().getColor(R.color.materialmusic_default_bar_color),
|
ViewUtil.animateViewColor(footer, getContext().getResources().getColor(R.color.materialmusic_default_bar_color),vibrantSwatch.getRgb());
|
||||||
vibrantSwatch.getRgb());
|
|
||||||
} else {
|
} 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));
|
title.setTextColor(Util.resolveColor(context, R.attr.title_text_color));
|
||||||
artist.setTextColor(Util.resolveColor(context, R.attr.caption_text_color));
|
artist.setTextColor(Util.resolveColor(context, R.attr.caption_text_color));
|
||||||
int defaultBarColor = getContext().getResources().getColor(R.color.materialmusic_default_bar_color);
|
int defaultBarColor = getContext().getResources().getColor(R.color.materialmusic_default_bar_color);
|
||||||
ViewUtil.animateViewColor(footer, defaultBarColor, defaultBarColor);
|
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 android.widget.TextView;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
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.kabouzeid.gramophone.model.Artist;
|
||||||
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -39,19 +40,13 @@ public class ArtistViewListAdapter extends ArrayAdapter<Artist> {
|
||||||
artistName.setText(artist.name);
|
artistName.setText(artist.name);
|
||||||
artistArt.setImageResource(R.drawable.default_artist_image);
|
artistArt.setImageResource(R.drawable.default_artist_image);
|
||||||
|
|
||||||
final Object tag = artist.name;
|
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(context, artist.name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
|
||||||
artistArt.setTag(tag);
|
|
||||||
|
|
||||||
LastFMArtistThumbnailLoader.loadArtistThumbnail(context, artist.name, new LastFMArtistThumbnailLoader.ArtistThumbnailLoaderCallback() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onArtistThumbnailLoaded(Bitmap thumbnail) {
|
public void onArtistThumbnailUrlLoaded(String url) {
|
||||||
if (artistArt.getTag().equals(tag)) {
|
Picasso.with(getContext())
|
||||||
if (thumbnail != null) {
|
.load(url)
|
||||||
artistArt.setImageBitmap(thumbnail);
|
.placeholder(R.drawable.default_artist_image)
|
||||||
} else {
|
.into(artistArt);
|
||||||
artistArt.setImageResource(R.drawable.default_artist_image);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,8 @@ import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
||||||
import com.kabouzeid.gramophone.misc.AppKeys;
|
import com.kabouzeid.gramophone.misc.AppKeys;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
||||||
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
|
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -81,7 +80,10 @@ public class SongViewListAdapter extends SongAdapter {
|
||||||
});
|
});
|
||||||
|
|
||||||
songTitle.setText(song.title);
|
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;
|
return convertView;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
|
|
||||||
|
|
@ -20,7 +21,9 @@ import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
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 class PlayingNotificationHelper {
|
||||||
public static final String TAG = PlayingNotificationHelper.class.getSimpleName();
|
public static final String TAG = PlayingNotificationHelper.class.getSimpleName();
|
||||||
|
|
@ -40,17 +43,12 @@ public class PlayingNotificationHelper {
|
||||||
.getSystemService(Context.NOTIFICATION_SERVICE);
|
.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(),
|
notificationLayout = new RemoteViews(service.getPackageName(),
|
||||||
R.layout.notification_playing);
|
R.layout.notification_playing);
|
||||||
notificationLayoutExpanded = new RemoteViews(service.getPackageName(),
|
notificationLayoutExpanded = new RemoteViews(service.getPackageName(),
|
||||||
R.layout.notification_playing_expanded);
|
R.layout.notification_playing_expanded);
|
||||||
|
|
||||||
setUpCollapsedLayout(song);
|
|
||||||
setUpExpandedLayout(song);
|
|
||||||
setUpPlaybackActions(isPlaying);
|
|
||||||
setUpExpandedPlaybackActions(isPlaying);
|
|
||||||
|
|
||||||
notification = new NotificationCompat.Builder(service)
|
notification = new NotificationCompat.Builder(service)
|
||||||
.setSmallIcon(R.drawable.notification_icon)
|
.setSmallIcon(R.drawable.notification_icon)
|
||||||
.setContentIntent(getOpenMusicControllerPendingIntent())
|
.setContentIntent(getOpenMusicControllerPendingIntent())
|
||||||
|
|
@ -61,6 +59,12 @@ public class PlayingNotificationHelper {
|
||||||
.build();
|
.build();
|
||||||
notification.bigContentView = notificationLayoutExpanded;
|
notification.bigContentView = notificationLayoutExpanded;
|
||||||
|
|
||||||
|
setUpCollapsedLayout(song);
|
||||||
|
setUpExpandedLayout(song);
|
||||||
|
loadAlbumArt(song);
|
||||||
|
setUpPlaybackActions(isPlaying);
|
||||||
|
setUpExpandedPlaybackActions(isPlaying);
|
||||||
|
|
||||||
service.startForeground(NOTIFICATION_ID, notification);
|
service.startForeground(NOTIFICATION_ID, notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -134,28 +138,35 @@ public class PlayingNotificationHelper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpCollapsedLayout(Song song) {
|
private void setUpCollapsedLayout(final Song song) {
|
||||||
loadAlbumArt(notificationLayout, MusicUtil.getAlbumArtUri(song.albumId).toString());
|
|
||||||
notificationLayout.setTextViewText(R.id.song_title, song.title);
|
notificationLayout.setTextViewText(R.id.song_title, song.title);
|
||||||
notificationLayout.setTextViewText(R.id.song_artist, song.title);
|
notificationLayout.setTextViewText(R.id.song_artist, song.title);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void loadAlbumArt(RemoteViews notificationView, String albumArtUri) {
|
private void setUpExpandedLayout(final Song song) {
|
||||||
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());
|
|
||||||
notificationLayoutExpanded.setTextViewText(R.id.song_title, song.title);
|
notificationLayoutExpanded.setTextViewText(R.id.song_title, song.title);
|
||||||
notificationLayoutExpanded.setTextViewText(R.id.song_artist, song.artistName);
|
notificationLayoutExpanded.setTextViewText(R.id.song_artist, song.artistName);
|
||||||
notificationLayoutExpanded.setTextViewText(R.id.album_title, song.albumName);
|
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() {
|
public void killNotification() {
|
||||||
service.stopForeground(true);
|
service.stopForeground(true);
|
||||||
notification = null;
|
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.net.Uri;
|
||||||
import android.util.Log;
|
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.lastfm.LastFMUtil;
|
||||||
import com.kabouzeid.gramophone.provider.AlbumJSONStore;
|
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) {
|
public static void saveAlbumJSONDataToCacheAndDisk(Context context, String album, String artist, JSONObject jsonObject) {
|
||||||
AlbumJSONStore.getInstance(context).addAlbumJSON(album + artist, jsonObject.toString());
|
AlbumJSONStore.getInstance(context).addAlbumJSON(album + artist, jsonObject.toString());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,14 @@
|
||||||
package com.kabouzeid.gramophone.lastfm.artist;
|
package com.kabouzeid.gramophone.lastfm.artist;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.util.Log;
|
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.lastfm.LastFMUtil;
|
||||||
import com.kabouzeid.gramophone.provider.ArtistJSONStore;
|
import com.kabouzeid.gramophone.provider.ArtistJSONStore;
|
||||||
|
|
||||||
|
|
@ -92,4 +97,23 @@ public class LastFMArtistInfoUtil {
|
||||||
ArtistJSONStore.getInstance(context).removeItem(artist);
|
ArtistJSONStore.getInstance(context).removeItem(artist);
|
||||||
ArtistJSONStore.getInstance(context).addArtistJSON(artist, jsonObject.toString());
|
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.content.Context;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by karim on 22.11.14.
|
* Created by karim on 22.11.14.
|
||||||
|
|
@ -49,6 +49,9 @@ public class Album implements SearchEntry {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadImage(Context context, ImageView imageView) {
|
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 android.widget.ImageView;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
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.
|
* Created by karim on 29.12.14.
|
||||||
|
|
@ -41,18 +42,14 @@ public class Artist implements SearchEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadImage(Context context, final ImageView imageView) {
|
public void loadImage(final Context context, final ImageView imageView) {
|
||||||
imageView.setTag(name);
|
|
||||||
LastFMArtistThumbnailLoader.loadArtistThumbnail(context, name, new LastFMArtistThumbnailLoader.ArtistThumbnailLoaderCallback() {
|
|
||||||
@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);
|
imageView.setImageResource(R.drawable.default_artist_image);
|
||||||
}
|
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(context, name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
|
||||||
}
|
@Override
|
||||||
|
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.content.Context;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.util.ImageLoaderUtil;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|
@ -57,6 +57,9 @@ public class Song implements Serializable, SearchEntry {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadImage(Context context, ImageView imageView) {
|
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.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.media.MediaMetadataRetriever;
|
import android.media.MediaMetadataRetriever;
|
||||||
import android.media.MediaPlayer;
|
import android.media.MediaPlayer;
|
||||||
|
|
@ -30,7 +31,8 @@ import com.kabouzeid.gramophone.model.MusicRemoteEvent;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.InternalStorageUtil;
|
import com.kabouzeid.gramophone.util.InternalStorageUtil;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
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.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -294,6 +296,8 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
|
||||||
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
|
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
|
||||||
playingNotificationHelper.updatePlayState(false);
|
playingNotificationHelper.updatePlayState(false);
|
||||||
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
|
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
|
||||||
|
updateNotification();
|
||||||
|
updateRemoteControlClient();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.TRACK_CHANGED);
|
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.TRACK_CHANGED);
|
||||||
|
|
@ -307,14 +311,40 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRemoteControlClient() {
|
private void updateRemoteControlClient() {
|
||||||
Song song = getPlayingQueue().get(getPosition());
|
final Song song = getPlayingQueue().get(getPosition());
|
||||||
Bitmap loadedImage = ImageLoader.getInstance().loadImageSync(MusicUtil.getAlbumArtUri(song.albumId).toString());
|
|
||||||
remoteControlClient
|
remoteControlClient
|
||||||
.editMetadata(false)
|
.editMetadata(false)
|
||||||
.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, song.artistName)
|
.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, song.artistName)
|
||||||
.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, song.title)
|
.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, song.title)
|
||||||
.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, song.duration)
|
.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();
|
.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
|
@ -40,9 +41,8 @@ import com.nhaarman.listviewanimations.appearance.AnimationAdapter;
|
||||||
import com.nhaarman.listviewanimations.appearance.simple.ScaleInAnimationAdapter;
|
import com.nhaarman.listviewanimations.appearance.simple.ScaleInAnimationAdapter;
|
||||||
import com.nineoldandroids.view.ViewHelper;
|
import com.nineoldandroids.view.ViewHelper;
|
||||||
import com.nineoldandroids.view.ViewPropertyAnimator;
|
import com.nineoldandroids.view.ViewPropertyAnimator;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.squareup.picasso.Callback;
|
||||||
import com.nostra13.universalimageloader.core.assist.FailReason;
|
import com.squareup.picasso.Picasso;
|
||||||
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -131,7 +131,6 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
if (Util.hasLollipopSDK()) postponeEnterTransition();
|
|
||||||
app = (App) getApplicationContext();
|
app = (App) getApplicationContext();
|
||||||
setTheme(app.getAppTheme());
|
setTheme(app.getAppTheme());
|
||||||
setUpTranslucence();
|
setUpTranslucence();
|
||||||
|
|
@ -153,7 +152,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
|
||||||
setUpObservableListViewParams();
|
setUpObservableListViewParams();
|
||||||
setUpToolBar();
|
setUpToolBar();
|
||||||
setUpViews();
|
setUpViews();
|
||||||
if (!Util.hasLollipopSDK()) animateEnterActivity();
|
animateEnterActivity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -203,36 +202,14 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
private void setUpAlbumArtAndApplyPalette() {
|
private void setUpAlbumArtAndApplyPalette() {
|
||||||
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(album.id).toString(), albumArtImageView, new ImageLoadingListener() {
|
Picasso.with(this).load(MusicUtil.getAlbumArtUri(album.id))
|
||||||
|
.placeholder(R.drawable.default_album_art)
|
||||||
|
.into(albumArtImageView, new Callback.EmptyCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onLoadingStarted(String imageUri, View view) {
|
public void onSuccess() {
|
||||||
}
|
super.onSuccess();
|
||||||
|
final Bitmap bitmap = ((BitmapDrawable) albumArtImageView.getDrawable()).getBitmap();
|
||||||
@Override
|
if (bitmap != null) applyPalette(bitmap);
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import android.app.Fragment;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v13.app.FragmentPagerAdapter;
|
import android.support.v13.app.FragmentPagerAdapter;
|
||||||
import android.support.v4.view.ViewPager;
|
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.R;
|
||||||
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
|
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
|
||||||
import com.kabouzeid.gramophone.interfaces.OnMusicRemoteEventListener;
|
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.loader.ArtistLoader;
|
||||||
import com.kabouzeid.gramophone.misc.AppKeys;
|
import com.kabouzeid.gramophone.misc.AppKeys;
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
|
|
@ -42,6 +43,8 @@ import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.nineoldandroids.animation.Animator;
|
import com.nineoldandroids.animation.Animator;
|
||||||
import com.nineoldandroids.view.ViewHelper;
|
import com.nineoldandroids.view.ViewHelper;
|
||||||
import com.nineoldandroids.view.ViewPropertyAnimator;
|
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() {
|
private void setUpObservableListViewParams() {
|
||||||
artistImageViewHeight = getResources().getDimensionPixelSize(R.dimen.header_image_height);
|
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);
|
toolbarHeight = Util.getActionBarSize(this);
|
||||||
titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height);
|
titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height);
|
||||||
headerOffset = toolbarHeight;
|
headerOffset = toolbarHeight;
|
||||||
|
|
@ -314,20 +317,26 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpArtistImageAndApplyPalette(final boolean forceDownload) {
|
private void setUpArtistImageAndApplyPalette(final boolean forceDownload) {
|
||||||
LastFMArtistImageLoader.loadArtistImage(this, artist.name, forceDownload, new LastFMArtistImageLoader.ArtistImageLoaderCallback() {
|
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, artist.name, forceDownload, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
|
||||||
@SuppressLint("NewApi")
|
|
||||||
@Override
|
@Override
|
||||||
public void onArtistImageLoaded(Bitmap artistImage) {
|
public void onArtistImageUrlLoaded(String url) {
|
||||||
if (artistImage != null) {
|
Picasso.with(ArtistDetailActivity.this)
|
||||||
artistImageView.setImageBitmap(artistImage);
|
.load(url)
|
||||||
applyPalette(artistImage);
|
.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) {
|
if (forceDownload) {
|
||||||
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updated_artist_image_for) + " " + artist.name, Toast.LENGTH_SHORT).show();
|
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updated_artist_image_for) + " " + artist.name, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void applyPalette(Bitmap bitmap) {
|
private void applyPalette(Bitmap bitmap) {
|
||||||
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
|
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
|
||||||
|
|
|
||||||
|
|
@ -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.ArtistViewFragment;
|
||||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.MainActivityFragment;
|
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.MainActivityFragment;
|
||||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.SongViewFragment;
|
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.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
|
|
||||||
public class MainActivity extends AbsFabActivity
|
public class MainActivity extends AbsFabActivity
|
||||||
|
|
@ -152,7 +151,11 @@ public class MainActivity extends AbsFabActivity
|
||||||
if (navigationDrawerFragment != null) {
|
if (navigationDrawerFragment != null) {
|
||||||
Song song = getApp().getMusicPlayerRemote().getCurrentSong();
|
Song song = getApp().getMusicPlayerRemote().getCurrentSong();
|
||||||
if (song.id != -1) {
|
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.getSongTitle().setText(song.title);
|
||||||
navigationDrawerFragment.getSongArtist().setText(song.artistName);
|
navigationDrawerFragment.getSongArtist().setText(song.artistName);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ package com.kabouzeid.gramophone.ui.activities;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.util.Pair;
|
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.PlayingQueueDialogHelper;
|
||||||
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
|
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
|
||||||
import com.kabouzeid.gramophone.interfaces.OnMusicRemoteEventListener;
|
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.loader.SongFilePathLoader;
|
||||||
import com.kabouzeid.gramophone.misc.AppKeys;
|
import com.kabouzeid.gramophone.misc.AppKeys;
|
||||||
import com.kabouzeid.gramophone.model.MusicRemoteEvent;
|
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.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.nineoldandroids.view.ViewPropertyAnimator;
|
import com.nineoldandroids.view.ViewPropertyAnimator;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.squareup.picasso.Callback;
|
||||||
import com.nostra13.universalimageloader.core.assist.FailReason;
|
import com.squareup.picasso.Picasso;
|
||||||
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
|
import com.squareup.picasso.Target;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
|
|
@ -229,27 +231,16 @@ public class MusicControllerActivity extends AbsFabActivity implements OnMusicRe
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpAlbumArtAndApplyPalette() {
|
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();
|
setStandardColors();
|
||||||
}
|
Picasso.with(this)
|
||||||
|
.load(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
|
.placeholder(R.drawable.default_album_art)
|
||||||
|
.into(albumArt, new Callback.EmptyCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onLoadingComplete(String imageUri, final View view, Bitmap loadedImage) {
|
public void onSuccess() {
|
||||||
applyPalette(loadedImage);
|
super.onSuccess();
|
||||||
}
|
final Bitmap bitmap = ((BitmapDrawable) albumArt.getDrawable()).getBitmap();
|
||||||
|
if (bitmap != null) applyPalette(bitmap);
|
||||||
@Override
|
|
||||||
public void onLoadingCancelled(String imageUri, View view) {
|
|
||||||
albumArt.setImageResource(R.drawable.default_album_art);
|
|
||||||
setStandardColors();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -296,10 +287,14 @@ public class MusicControllerActivity extends AbsFabActivity implements OnMusicRe
|
||||||
private void setUpArtistArt() {
|
private void setUpArtistArt() {
|
||||||
if (artistArt != null) {
|
if (artistArt != null) {
|
||||||
artistArt.setImageResource(R.drawable.default_artist_image);
|
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
|
@Override
|
||||||
public void onArtistImageLoaded(Bitmap artistImage) {
|
public void onArtistImageUrlLoaded(String url) {
|
||||||
artistArt.setImageBitmap(artistImage);
|
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.melnykov.fab.FloatingActionButton;
|
||||||
import com.nineoldandroids.view.ViewHelper;
|
import com.nineoldandroids.view.ViewHelper;
|
||||||
import com.nineoldandroids.view.ViewPropertyAnimator;
|
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.AudioFile;
|
||||||
import org.jaudiotagger.audio.AudioFileIO;
|
import org.jaudiotagger.audio.AudioFileIO;
|
||||||
|
|
@ -356,13 +354,11 @@ public abstract class AbsTagEditorActivity extends ActionBarActivity {
|
||||||
}
|
}
|
||||||
if (deleteArtwork) {
|
if (deleteArtwork) {
|
||||||
String imagePath = MusicUtil.getAlbumArtUri(getId()).toString();
|
String imagePath = MusicUtil.getAlbumArtUri(getId()).toString();
|
||||||
ImageLoader.getInstance().getDiskCache().remove(imagePath);
|
//TODO delete from picasso cache
|
||||||
MemoryCacheUtils.removeFromCache(imagePath, ImageLoader.getInstance().getMemoryCache());
|
|
||||||
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
|
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
|
||||||
} else if (artwork != null) {
|
} else if (artwork != null) {
|
||||||
String imagePath = MusicUtil.getAlbumArtUri(getId()).toString();
|
String imagePath = MusicUtil.getAlbumArtUri(getId()).toString();
|
||||||
MemoryCacheUtils.removeFromCache(imagePath, ImageLoader.getInstance().getMemoryCache());
|
//TODO delete from Picasso cache
|
||||||
ImageLoader.getInstance().getDiskCache().remove(imagePath);
|
|
||||||
}
|
}
|
||||||
progressDialog.dismiss();
|
progressDialog.dismiss();
|
||||||
rescanMedia();
|
rescanMedia();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.kabouzeid.gramophone.ui.activities.tageditor;
|
package com.kabouzeid.gramophone.ui.activities.tageditor;
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
|
|
@ -10,15 +11,13 @@ import android.widget.EditText;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
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.AlbumSongLoader;
|
||||||
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.squareup.picasso.Picasso;
|
||||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
import com.squareup.picasso.Target;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
|
||||||
import com.nostra13.universalimageloader.core.process.BitmapProcessor;
|
|
||||||
|
|
||||||
import org.jaudiotagger.tag.FieldKey;
|
import org.jaudiotagger.tag.FieldKey;
|
||||||
import org.jaudiotagger.tag.images.Artwork;
|
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();
|
Toast.makeText(this, getResources().getString(R.string.album_or_artist_empty), Toast.LENGTH_SHORT).show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LastFMAlbumImageLoader.loadAlbumImage(this, albumTitleStr, albumArtistNameStr, new LastFMAlbumImageLoader.AlbumImageLoaderCallback() {
|
LastFMAlbumImageUrlLoader.loadAlbumImageUrl(this, albumTitleStr, albumArtistNameStr, new LastFMAlbumImageUrlLoader.AlbumImageUrlLoaderCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onAlbumImageLoaded(Bitmap albumImage, String uri) {
|
public void onAlbumImageUrlLoaded(String url) {
|
||||||
if (albumImage != null) {
|
Picasso.with(AlbumTagEditorActivity.this)
|
||||||
setImageBitmap(albumImage);
|
.load(url)
|
||||||
albumArtBitmap = albumImage;
|
.resize(500, 500)
|
||||||
|
.centerCrop()
|
||||||
|
.onlyScaleDown()
|
||||||
|
.into(new Target() {
|
||||||
|
@Override
|
||||||
|
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
|
||||||
|
albumArtBitmap = bitmap;
|
||||||
|
setImageBitmap(albumArtBitmap);
|
||||||
deleteAlbumArt = false;
|
deleteAlbumArt = false;
|
||||||
dataChanged();
|
dataChanged();
|
||||||
Toast.makeText(AlbumTagEditorActivity.this, "Success.", Toast.LENGTH_SHORT).show();
|
Toast.makeText(AlbumTagEditorActivity.this, "Success.", Toast.LENGTH_SHORT).show();
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
@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();
|
Toast.makeText(AlbumTagEditorActivity.this, "Failed.", Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -166,24 +187,30 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void loadImageFromFile(final Uri selectedFileUri) {
|
protected void loadImageFromFile(final Uri selectedFileUri) {
|
||||||
DisplayImageOptions options = new DisplayImageOptions.Builder()
|
Picasso.with(this)
|
||||||
.cacheInMemory(true)
|
.load(selectedFileUri)
|
||||||
.cacheOnDisk(false)
|
.resize(500, 500)
|
||||||
.postProcessor(new BitmapProcessor() {
|
.centerCrop()
|
||||||
|
.onlyScaleDown()
|
||||||
|
.into(new Target() {
|
||||||
@Override
|
@Override
|
||||||
public Bitmap process(Bitmap bmp) {
|
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
|
||||||
Bitmap scaledBitmap = Util.getAlbumArtScaledBitmap(bmp, true);
|
albumArtBitmap = bitmap;
|
||||||
bmp.recycle();
|
|
||||||
return scaledBitmap;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.build();
|
|
||||||
albumArtBitmap = ImageLoader.getInstance().loadImageSync(selectedFileUri.toString(), options);
|
|
||||||
if (albumArtBitmap != null) {
|
|
||||||
setImageBitmap(albumArtBitmap);
|
setImageBitmap(albumArtBitmap);
|
||||||
deleteAlbumArt = false;
|
deleteAlbumArt = false;
|
||||||
dataChanged();
|
dataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBitmapFailed(Drawable errorDrawable) {
|
||||||
|
//TODO Toast could not read file
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPrepareLoad(Drawable placeHolderDrawable) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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;
|
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) {
|
private static Bitmap getScaledBitmap(final Bitmap bitmap) {
|
||||||
return Bitmap.createScaledBitmap(bitmap, albumArtSize, albumArtSize, false);
|
return Bitmap.createScaledBitmap(bitmap, albumArtSize, albumArtSize, false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,17 +6,11 @@ import android.appwidget.AppWidgetProvider;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.App;
|
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of App Widget functionality.
|
* Implementation of App Widget functionality.
|
||||||
|
|
@ -83,22 +77,6 @@ public class MusicPlayerWidget extends AppWidgetProvider {
|
||||||
}
|
}
|
||||||
return null;
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@
|
||||||
android:id="@+id/button_quit"
|
android:id="@+id/button_quit"
|
||||||
style="@style/NotificationButton"
|
style="@style/NotificationButton"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:src="@drawable/ic_close_black_24dp"/>
|
android:src="@drawable/ic_close_white_24dp"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/button_quit"
|
android:id="@+id/button_quit"
|
||||||
|
style="@style/NotificationButton"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
|
|
@ -38,8 +39,7 @@
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:background="@drawable/notification_selector"
|
android:background="@drawable/notification_selector"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:src="@drawable/ic_close_black_24dp"
|
android:src="@drawable/ic_close_white_24dp"/>
|
||||||
android:tint="@color/notification_buttons_tint"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@
|
||||||
android:id="@+id/button_quit"
|
android:id="@+id/button_quit"
|
||||||
style="@style/NotificationButton"
|
style="@style/NotificationButton"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:src="@drawable/ic_close_black_24dp"/>
|
android:src="@drawable/ic_close_white_24dp"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/button_quit"
|
android:id="@+id/button_quit"
|
||||||
|
style="@style/NotificationButton"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
|
|
@ -38,7 +39,7 @@
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:background="?android:selectableItemBackground"
|
android:background="?android:selectableItemBackground"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
android:src="@drawable/ic_close_black_24dp"/>
|
android:src="@drawable/ic_close_white_24dp"/>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue