diff --git a/app/build.gradle b/app/build.gradle index f9ad4824..130f7203 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { compile 'com.melnykov:floatingactionbutton:1.2.0' compile 'com.github.ksoichiro:android-observablescrollview:1.3.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.crashlytics.sdk.android:crashlytics:2.2.1@aar') { transitive = true; diff --git a/app/src/main/java/com/kabouzeid/gramophone/App.java b/app/src/main/java/com/kabouzeid/gramophone/App.java index ac23aafc..7f516126 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/App.java +++ b/app/src/main/java/com/kabouzeid/gramophone/App.java @@ -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() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumViewGridAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumViewGridAdapter.java index 4853a5a5..1f292756 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumViewGridAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumViewGridAdapter.java @@ -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 { @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 { 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; + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistViewListAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistViewListAdapter.java index 2e1931d3..df614b1d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistViewListAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistViewListAdapter.java @@ -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 { 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); } }); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongViewListAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongViewListAdapter.java index 086a6a5b..05312f34 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongViewListAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongViewListAdapter.java @@ -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; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java index 7d2bc664..0f865c2f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageLoader.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageLoader.java deleted file mode 100644 index 71dbfb88..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageLoader.java +++ /dev/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() { - @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); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageUrlLoader.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageUrlLoader.java new file mode 100644 index 00000000..8c576a3f --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageUrlLoader.java @@ -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() { + @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(); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java index 2a2a8b40..4d1d9105 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java @@ -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 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() { + @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()); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java index 9038dc05..4750fab5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java @@ -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 callback) { + App app = (App) context.getApplicationContext(); + String artistUrl = LastFMArtistInfoUtil.getArtistUrl(artist); + JsonObjectRequest artistInfoJSONRequest = new JsonObjectRequest(0, artistUrl, null, new Response.Listener() { + @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); + } + } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java index 01a8a3f5..f9a2d149 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java b/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java index 2d7562ab..1202247b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java @@ -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); } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java index 1b3b5442..10f03d2c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 443805a2..1c9c906d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -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(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index d7c5af05..14c6fd3e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 7820a98b..dfeb2664 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -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(); + } + } + }); } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index b69e58c3..7142b622 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -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); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index c7a94f91..72dbabaf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -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); } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index 0a855ef9..e26f2b46 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -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(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java index 88528363..c13d07e8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ImageLoaderUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ImageLoaderUtil.java deleted file mode 100644 index cb4b3fe1..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ImageLoaderUtil.java +++ /dev/null @@ -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); - } - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java index f1400874..5ea0773b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java @@ -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); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/widget/MusicPlayerWidget.java b/app/src/main/java/com/kabouzeid/gramophone/widget/MusicPlayerWidget.java index f4782176..6a6aef18 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/widget/MusicPlayerWidget.java +++ b/app/src/main/java/com/kabouzeid/gramophone/widget/MusicPlayerWidget.java @@ -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); - } - } } diff --git a/app/src/main/res/layout-v21/notification_playing.xml b/app/src/main/res/layout-v21/notification_playing.xml index 2d725ca4..41219157 100644 --- a/app/src/main/res/layout-v21/notification_playing.xml +++ b/app/src/main/res/layout-v21/notification_playing.xml @@ -91,7 +91,7 @@ android:id="@+id/button_quit" style="@style/NotificationButton" android:padding="8dp" - android:src="@drawable/ic_close_black_24dp"/> + android:src="@drawable/ic_close_white_24dp"/> diff --git a/app/src/main/res/layout-v21/notification_playing_expanded.xml b/app/src/main/res/layout-v21/notification_playing_expanded.xml index f8d9cdc4..dff05784 100644 --- a/app/src/main/res/layout-v21/notification_playing_expanded.xml +++ b/app/src/main/res/layout-v21/notification_playing_expanded.xml @@ -31,6 +31,7 @@ + android:src="@drawable/ic_close_white_24dp"/> + android:src="@drawable/ic_close_white_24dp"/> diff --git a/app/src/main/res/layout/notification_playing_expanded.xml b/app/src/main/res/layout/notification_playing_expanded.xml index 48e448fd..87c1b0a4 100644 --- a/app/src/main/res/layout/notification_playing_expanded.xml +++ b/app/src/main/res/layout/notification_playing_expanded.xml @@ -31,6 +31,7 @@ + android:src="@drawable/ic_close_white_24dp"/>