Switched from Picasso to Ion

Much better performance.
Not well tested yet but it should work.
This commit is contained in:
Karim Abou Zeid 2015-04-17 00:56:55 +02:00
commit a11535c8a3
39 changed files with 733 additions and 419 deletions

View file

@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.adapter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v4.util.Pair;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.RecyclerView;
@ -17,16 +16,19 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.ImageViewBitmapInfo;
import com.koushikdutta.ion.Ion;
import com.koushikdutta.ion.bitmap.BitmapInfo;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -45,36 +47,51 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
return new ViewHolder(view);
}
@Override
public void onViewRecycled(ViewHolder holder) {
super.onViewRecycled(holder);
Object tag = holder.image.getTag();
if (tag instanceof Future) {
((Future) tag).cancel();
}
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final Album album = dataSet.get(position);
resetColors(holder.title, holder.artist, holder.footer);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id))
.placeholder(R.drawable.default_album_art)
.into(holder.image, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
super.onSuccess();
if (usePalette) {
final Bitmap bitmap = ((BitmapDrawable) holder.image.getDrawable()).getBitmap();
if (bitmap != null)
applyPalette(bitmap, holder.title, holder.artist, holder.footer);
}
}
@Override
public void onError() {
super.onError();
if (usePalette) {
paletteBlackAndWhite(holder.title, holder.artist, holder.footer);
}
}
});
holder.title.setText(album.title);
holder.artist.setText(album.artistName);
holder.image.setTag(
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id).toString())
.withBitmap()
.resize(holder.image.getWidth(), holder.image.getHeight())
.centerCrop()
.intoImageView(holder.image)
.withBitmapInfo()
.setCallback(new FutureCallback<ImageViewBitmapInfo>() {
@Override
public void onCompleted(Exception e, ImageViewBitmapInfo result) {
if(result != null){
BitmapInfo info = result.getBitmapInfo();
if(info != null){
Bitmap bitmap = info.bitmap;
if (bitmap != null) {
if (usePalette)
applyPalette(bitmap, holder.title, holder.artist, holder.footer);
return;
}
}
}
holder.image.setImageResource(R.drawable.default_album_art);
if (usePalette)
paletteBlackAndWhite(holder.title, holder.artist, holder.footer);
}
})
);
}
@Override
@ -173,9 +190,9 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
}
@Subscribe
public void onUIChangeEvent(UIPreferenceChangedEvent event) {
public void onUIChangeEvent(UiPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED:
case UiPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED:
usePalette = (boolean) event.getValue();
notifyDataSetChanged();
break;

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.adapter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.support.v4.util.Pair;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@ -17,8 +18,9 @@ import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -54,12 +56,20 @@ public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(activity, artist.name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
@Override
public void onArtistThumbnailUrlLoaded(String url) {
Picasso.with(activity)
public void onArtistThumbnailUrlLoaded(final String url) {
Ion.with(activity)
.load(url)
.noFade()
.placeholder(R.drawable.default_artist_image)
.into(holder.artistImage);
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null)
holder.artistImage.setImageBitmap(result);
else {
holder.artistImage.setImageResource(R.drawable.default_artist_image);
}
}
});
}
});
}

View file

@ -14,7 +14,7 @@ import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
import java.util.List;
@ -48,10 +48,13 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
public void onBindViewHolder(final ViewHolder holder, int position) {
final Album album = dataSet.get(position);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id))
.placeholder(R.drawable.default_album_art)
.into(holder.image);
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(album.id).toString())
.withBitmap()
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(holder.albumArt);
holder.title.setText(album.title);
holder.year.setText(String.valueOf(album.year));
@ -72,13 +75,13 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView image;
ImageView albumArt;
TextView title;
TextView year;
public ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.album_art);
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
title = (TextView) itemView.findViewById(R.id.album_title);
year = (TextView) itemView.findViewById(R.id.album_year);
itemView.setOnClickListener(this);
@ -87,12 +90,12 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
@Override
public void onClick(View v) {
Pair[] albumPairs = new Pair[]{
Pair.create(image,
Pair.create(albumArt,
activity.getResources().getString(R.string.transition_album_cover)
)};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getPosition()).id, albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).id, albumPairs);
}
}

View file

@ -1,7 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.util.Pair;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -11,24 +10,15 @@ import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
import java.io.File;
import java.util.List;
/**
@ -56,10 +46,13 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> {
songTitle.setText(song.title);
songInfo.setText(song.albumName);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(albumArt);
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(albumArt.getWidth(), albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(albumArt);
final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
overflowButton.setOnClickListener(new View.OnClickListener() {

View file

@ -20,7 +20,7 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
import java.util.List;
@ -43,6 +43,11 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
return new ViewHolder(view);
}
@Override
public void onViewRecycled(ViewHolder holder) {
super.onViewRecycled(holder);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final Song song = dataSet.get(position);
@ -50,10 +55,15 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(holder.albumArt);
holder.albumArt.setTag(
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(holder.albumArt)
);
}
@Override

View file

@ -1,7 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.support.v4.util.Pair;
import android.support.v7.widget.RecyclerView;
@ -15,25 +14,18 @@ import android.widget.TextView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util;
import com.koushikdutta.ion.Ion;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.List;
/**
@ -75,10 +67,13 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
Picasso.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.placeholder(R.drawable.default_album_art)
.into(holder.albumArt);
Ion.with(activity)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(holder.albumArt);
} else {
int accentColor = Util.resolveColor(activity, R.attr.colorAccent);
holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase());

View file

@ -6,7 +6,7 @@ import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.graphics.Bitmap;
import android.widget.RemoteViews;
import com.kabouzeid.gramophone.R;
@ -15,41 +15,73 @@ 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.kabouzeid.gramophone.util.Util;
import com.squareup.picasso.Picasso;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
/**
* Implementation of App Widget functionality.
*/
public class MusicPlayerWidget extends AppWidgetProvider {
private static RemoteViews widgetLayout;
private static Future albumArtTask;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
update(context, appWidgetManager, appWidgetIds);
updateWidgets(context, MusicPlayerRemote.getCurrentSong(), MusicPlayerRemote.isPlaying());
for (int widgetId : appWidgetIds) {
appWidgetManager.updateAppWidget(widgetId, widgetLayout);
}
}
public static void update(Context context, AppWidgetManager manager, int[] ids) {
final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.music_player_widget);
linkButtons(context, views);
final Song song = MusicPlayerRemote.getCurrentSong();
public static void updateWidgets(final Context context, final Song song, boolean isPlaying) {
widgetLayout = new RemoteViews(context.getPackageName(), R.layout.music_player_widget);
linkButtons(context, widgetLayout);
if (song.id != -1) {
views.setTextViewText(R.id.song_title, song.title);
widgetLayout.setTextViewText(R.id.song_title, song.title);
}
updateWidgetsPlayState(context, isPlaying);
loadAlbumArt(context, song);
}
Picasso.with(context)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.error(R.drawable.default_album_art)
.into(views, R.id.album_art, ids);
int playPauseRes = MusicPlayerRemote.isPlaying() ? R.drawable.ic_pause_black_36dp : R.drawable.ic_play_arrow_black_36dp;
views.setImageViewResource(R.id.button_toggle_play_pause, playPauseRes);
public static void updateWidgetsPlayState(final Context context, boolean isPlaying) {
if (widgetLayout == null)
widgetLayout = new RemoteViews(context.getPackageName(), R.layout.music_player_widget);
int playPauseRes = isPlaying ? R.drawable.ic_pause_black_36dp : R.drawable.ic_play_arrow_black_36dp;
widgetLayout.setImageViewResource(R.id.button_toggle_play_pause, playPauseRes);
updateWidgets(context);
}
private static void updateWidgets(final Context context) {
AppWidgetManager man = AppWidgetManager.getInstance(context);
int[] ids = man.getAppWidgetIds(
new ComponentName(context, MusicPlayerWidget.class));
for (int widgetId : ids) {
manager.updateAppWidget(widgetId, views);
man.updateAppWidget(widgetId, widgetLayout);
}
}
private static void loadAlbumArt(final Context context, final Song song) {
if (albumArtTask != null) albumArtTask.cancel();
albumArtTask = Ion.with(context)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null) setAlbumArt(context, result);
else resetAlbumArt(context);
}
});
}
private static void resetAlbumArt(final Context context) {
widgetLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
updateWidgets(context);
}
private static void setAlbumArt(final Context context, final Bitmap albumArt) {
widgetLayout.setImageViewBitmap(R.id.album_art, albumArt);
updateWidgets(context);
}
private static void linkButtons(final Context context, final RemoteViews views) {
views.setOnClickPendingIntent(R.id.album_art, retrievePlaybackActions(context, 0));
views.setOnClickPendingIntent(R.id.button_toggle_play_pause, retrievePlaybackActions(context, 1));
@ -84,13 +116,6 @@ public class MusicPlayerWidget extends AppWidgetProvider {
}
return null;
}
public static void updateWidgets(Context context) {
AppWidgetManager man = AppWidgetManager.getInstance(context);
int[] ids = man.getAppWidgetIds(
new ComponentName(context, MusicPlayerWidget.class));
update(context, man, ids);
}
}

View file

@ -11,6 +11,7 @@ import android.app.TaskStackBuilder;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v4.app.NotificationCompat;
import android.widget.RemoteViews;
@ -19,7 +20,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.squareup.picasso.Picasso;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
public class PlayingNotificationHelper {
public static final String TAG = PlayingNotificationHelper.class.getSimpleName();
@ -33,6 +36,8 @@ public class PlayingNotificationHelper {
private RemoteViews notificationLayout;
private RemoteViews notificationLayoutExpanded;
private Future albumArtTask;
public PlayingNotificationHelper(final MusicService service) {
this.service = service;
notificationManager = (NotificationManager) service
@ -146,15 +151,17 @@ public class PlayingNotificationHelper {
}
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);
if (albumArtTask != null) albumArtTask.cancel();
albumArtTask = Ion.with(service)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null) setAlbumArt(result);
else resetAlbumArt();
}
});
}
private void resetAlbumArt() {
@ -163,7 +170,11 @@ public class PlayingNotificationHelper {
notificationManager.notify(NOTIFICATION_ID, notification);
}
;
private void setAlbumArt(Bitmap albumArt) {
notificationLayout.setImageViewBitmap(R.id.album_art, albumArt);
notificationLayoutExpanded.setImageViewBitmap(R.id.album_art, albumArt);
notificationManager.notify(NOTIFICATION_ID, notification);
}
public void killNotification() {
service.stopForeground(true);

View file

@ -5,7 +5,7 @@ import android.widget.ImageView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
/**
* Created by karim on 22.11.14.
@ -48,11 +48,19 @@ public class Album implements SearchEntry {
}
@Override
public void loadImage(Context context, ImageView imageView) {
public void loadImage(final Context context, final ImageView imageView) {
imageView.setImageResource(R.drawable.default_album_art);
Picasso.with(context)
.load(MusicUtil.getAlbumArtUri(id))
.placeholder(R.drawable.default_album_art)
.into(imageView);
imageView.post(new Runnable() {
@Override
public void run() {
Ion.with(context)
.load(MusicUtil.getAlbumArtUri(id).toString())
.withBitmap()
.resize(imageView.getWidth(), imageView.getHeight())
.centerCrop()
.error(R.drawable.default_album_art)
.intoImageView(imageView);
}
});
}
}

View file

@ -5,7 +5,7 @@ import android.widget.ImageView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailUrlLoader;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
/**
* Created by karim on 29.12.14.
@ -45,10 +45,19 @@ public class Artist implements SearchEntry {
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);
public void onArtistThumbnailUrlLoaded(final String url) {
imageView.post(new Runnable() {
@Override
public void run() {
Ion.with(context)
.load(url)
.withBitmap()
.resize(imageView.getWidth(), imageView.getHeight())
.centerCrop()
.error(R.drawable.default_artist_image)
.intoImageView(imageView);
}
});
}
});
}

View file

@ -3,7 +3,7 @@ package com.kabouzeid.gramophone.model;
/**
* Created by karim on 28.03.15.
*/
public class UIPreferenceChangedEvent {
public class UiPreferenceChangedEvent {
public static final int THEME_CHANGED = 0;
public static final int ALBUM_OVERVIEW_PALETTE_CHANGED = 1;
public static final int COLORED_NAVIGATION_BAR_ARTIST_CHANGED = 2;
@ -14,7 +14,7 @@ public class UIPreferenceChangedEvent {
private int action;
private Object value;
public UIPreferenceChangedEvent(int action, Object value) {
public UiPreferenceChangedEvent(int action, Object value) {
this.action = action;
this.value = value;
}

View file

@ -9,7 +9,6 @@ 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;
@ -33,8 +32,9 @@ 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.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import java.io.IOException;
import java.util.ArrayList;
@ -80,6 +80,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
private PlayingNotificationHelper playingNotificationHelper;
private AudioManager audioManager;
private RemoteControlClient remoteControlClient;
private Future remoteControlClientAlbumArtTask;
public MusicService() {
}
@ -215,7 +216,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
player = null;
}
playingNotificationHelper.updatePlayState(isPlaying());
MusicPlayerWidget.updateWidgets(this);
MusicPlayerWidget.updateWidgetsPlayState(this, isPlaying());
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
}
@ -265,7 +266,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
if (isLastTrack() && getRepeatMode() == REPEAT_MODE_NONE) {
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.QUEUE_COMPLETED);
playingNotificationHelper.updatePlayState(isPlaying());
MusicPlayerWidget.updateWidgets(this);
MusicPlayerWidget.updateWidgetsPlayState(this, isPlaying());
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
} else {
@ -293,10 +294,6 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
try {
Uri trackUri = getCurrentPositionTrackUri();
player.setDataSource(getApplicationContext(), trackUri);
currentSongId = playingQueue.get(getPosition()).id;
updateNotification();
MusicPlayerWidget.updateWidgets(this);
updateRemoteControlClient();
player.prepareAsync();
} catch (Exception e) {
Log.e("MUSIC SERVICE", "Error setting data source", e);
@ -305,14 +302,16 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
Toast.makeText(getApplicationContext(), getResources().getString(R.string.unplayable_file), Toast.LENGTH_SHORT).show();
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
playingNotificationHelper.updatePlayState(false);
MusicPlayerWidget.updateWidgets(this);
MusicPlayerWidget.updateWidgetsPlayState(this, false);
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED);
try {
updateNotification();
updateRemoteControlClient();
} catch (Exception ignored) {
}
updateNotification();
updateRemoteControlClient();
return;
}
currentSongId = playingQueue.get(getPosition()).id;
updateNotification();
updateWidgets();
updateRemoteControlClient();
}
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.TRACK_CHANGED);
}
@ -348,29 +347,19 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, song.title)
.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, song.duration)
.apply();
Picasso.with(this)
.cancelRequest(remoteAlbumArt);
Picasso.with(this)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.into(remoteAlbumArt);
if (remoteControlClientAlbumArtTask != null) remoteControlClientAlbumArtTask.cancel();
remoteControlClientAlbumArtTask = Ion.with(this)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
updateRemoteControlClientBitmap(result);
}
});
}
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)
@ -395,6 +384,10 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
playingNotificationHelper.buildNotification(playingQueue.get(position), isPlaying());
}
private void updateWidgets(){
MusicPlayerWidget.updateWidgets(this, playingQueue.get(position), isPlaying());
}
private Uri getCurrentPositionTrackUri() {
return ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, playingQueue.get(position).id);
}
@ -469,7 +462,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
isPlayerPrepared = true;
openAudioEffectSession();
playingNotificationHelper.updatePlayState(isPlaying());
MusicPlayerWidget.updateWidgets(this);
MusicPlayerWidget.updateWidgetsPlayState(this, isPlaying());
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.PLAY);
savePosition();
@ -632,7 +625,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
if (isPlaying()) {
player.pause();
playingNotificationHelper.updatePlayState(isPlaying());
MusicPlayerWidget.updateWidgets(this);
MusicPlayerWidget.updateWidgetsPlayState(this, isPlaying());
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.PAUSE);
}
@ -644,7 +637,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
if (isPlayerPrepared) {
player.start();
playingNotificationHelper.updatePlayState(isPlaying());
MusicPlayerWidget.updateWidgets(this);
MusicPlayerWidget.updateWidgetsPlayState(this, isPlaying());
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.RESUME);
} else {

View file

@ -4,7 +4,6 @@ import android.annotation.TargetApi;
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.support.v4.util.Pair;
@ -16,7 +15,6 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
import com.kabouzeid.gramophone.App;
@ -30,7 +28,7 @@ import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
@ -38,10 +36,10 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.nineoldandroids.view.ViewHelper;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -112,7 +110,8 @@ public class AlbumDetailActivity extends AbsFabActivity {
App.bus.register(this);
if (Util.hasLollipopSDK()) postponeEnterTransition();
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarAlbumEnabled()) getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarAlbumEnabled())
getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
Bundle intentExtras = getIntent().getExtras();
int albumId = -1;
@ -128,8 +127,6 @@ public class AlbumDetailActivity extends AbsFabActivity {
setUpObservableListViewParams();
setUpToolBar();
setUpViews();
if (Util.hasLollipopSDK()) startPostponedEnterTransition();
}
@Override
@ -157,28 +154,37 @@ public class AlbumDetailActivity extends AbsFabActivity {
private void setUpViews() {
albumTitleView.setText(album.title);
ViewUtil.addOnGlobalLayoutListener(albumArtImageView, new Runnable() {
@Override
public void run() {
setUpAlbumArtAndApplyPalette();
}
});
setUpListView();
setUpSongsAdapter();
setUpAlbumArtAndApplyPalette();
}
private void setUpAlbumArtAndApplyPalette() {
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);
}
});
albumArtImageView.post(new Runnable() {
@Override
public void run() {
Ion.with(AlbumDetailActivity.this)
.load(MusicUtil.getAlbumArtUri(album.id).toString())
.noCache()
.withBitmap()
.resize(albumArtImageView.getWidth(), albumArtImageView.getHeight())
.centerCrop()
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null) {
albumArtImageView.setImageBitmap(result);
applyPalette(result);
} else {
albumArtImageView.setImageResource(R.drawable.default_album_art);
}
if (Util.hasLollipopSDK()) startPostponedEnterTransition();
}
});
}
});
}
private void applyPalette(Bitmap bitmap) {
@ -199,8 +205,8 @@ public class AlbumDetailActivity extends AbsFabActivity {
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setNavigationBarColored(boolean colored){
if (colored){
private void setNavigationBarColored(boolean colored) {
if (colored) {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(toolbarColor);
} else {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(Color.BLACK);
@ -216,8 +222,8 @@ public class AlbumDetailActivity extends AbsFabActivity {
public void run() {
songsBackgroundView.getLayoutParams().height = contentView.getHeight();
observableScrollViewCallbacks.onScrollChanged(-(albumArtViewHeight + titleViewHeight), false, false);
recyclerView.scrollBy(0,1);
recyclerView.scrollBy(0,-1);
recyclerView.scrollBy(0, 1);
recyclerView.scrollBy(0, -1);
}
});
}
@ -291,9 +297,10 @@ public class AlbumDetailActivity extends AbsFabActivity {
return super.onOptionsItemSelected(item);
}
@Subscribe public void onUIPreferenceChanged(UIPreferenceChangedEvent event){
switch (event.getAction()){
case UIPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ALBUM_CHANGED:
@Subscribe
public void onUIPreferenceChanged(UiPreferenceChangedEvent event) {
switch (event.getAction()) {
case UiPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ALBUM_CHANGED:
setNavigationBarColored((boolean) event.getValue());
break;
}

View file

@ -3,7 +3,6 @@ package com.kabouzeid.gramophone.ui.activities;
import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.graphics.Palette;
@ -39,16 +38,16 @@ import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.nineoldandroids.view.ViewHelper;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -70,7 +69,7 @@ public class ArtistDetailActivity extends AbsFabActivity {
private ObservableListView songListView;
private View statusBar;
private ImageView artistIv;
private ImageView artistImage;
private View songsBackgroundView;
private TextView artistNameTv;
private Toolbar toolbar;
@ -93,7 +92,7 @@ public class ArtistDetailActivity extends AbsFabActivity {
float flexibleRange = artistImageViewHeight - headerOffset;
// Translate album cover
ViewHelper.setTranslationY(artistIv, Math.max(-artistImageViewHeight, -scrollY / 2));
ViewHelper.setTranslationY(artistImage, Math.max(-artistImageViewHeight, -scrollY / 2));
// Translate list background
ViewHelper.setTranslationY(songsBackgroundView, Math.max(0, -scrollY + artistImageViewHeight));
@ -127,7 +126,8 @@ public class ArtistDetailActivity extends AbsFabActivity {
App.bus.register(this);
if (Util.hasLollipopSDK()) postponeEnterTransition();
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled()) getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled())
getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
getIntentExtras();
initViews();
@ -140,7 +140,7 @@ public class ArtistDetailActivity extends AbsFabActivity {
}
private void initViews() {
artistIv = (ImageView) findViewById(R.id.artist_image);
artistImage = (ImageView) findViewById(R.id.artist_image);
toolbar = (Toolbar) findViewById(R.id.toolbar);
songListView = (ObservableListView) findViewById(R.id.list);
artistNameTv = (TextView) findViewById(R.id.artist_name);
@ -168,7 +168,7 @@ public class ArtistDetailActivity extends AbsFabActivity {
private void setUpViews() {
artistNameTv.setText(artist.name);
ViewUtil.addOnGlobalLayoutListener(artistIv, new Runnable() {
ViewUtil.addOnGlobalLayoutListener(artistImage, new Runnable() {
@Override
public void run() {
setUpArtistImageAndApplyPalette(false);
@ -180,8 +180,8 @@ public class ArtistDetailActivity extends AbsFabActivity {
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setNavigationBarColored(boolean colored){
if (colored){
private void setNavigationBarColored(boolean colored) {
if (colored) {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(toolbarColor);
} else {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(Color.BLACK);
@ -248,18 +248,30 @@ public class ArtistDetailActivity extends AbsFabActivity {
private void setUpArtistImageAndApplyPalette(final boolean forceDownload) {
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, artist.name, forceDownload, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
@Override
public void onArtistImageUrlLoaded(String url) {
Picasso.with(ArtistDetailActivity.this)
.load(url)
.placeholder(R.drawable.default_artist_image)
.into(artistIv, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
super.onSuccess();
final Bitmap bitmap = ((BitmapDrawable) artistIv.getDrawable()).getBitmap();
if (bitmap != null) applyPalette(bitmap);
}
});
public void onArtistImageUrlLoaded(final String url) {
artistImage.post(new Runnable() {
@Override
public void run() {
Ion.with(ArtistDetailActivity.this)
.load(url)
.withBitmap()
.resize(artistImage.getWidth(), artistImage.getHeight())
.centerCrop()
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null) {
artistImage.setImageBitmap(result);
applyPalette(result);
} else {
artistImage.setImageResource(R.drawable.default_artist_image);
resetColors();
}
}
});
}
});
}
});
}
@ -277,14 +289,14 @@ public class ArtistDetailActivity extends AbsFabActivity {
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(ArtistDetailActivity.this).coloredNavigationBarArtistEnabled())
getWindow().setNavigationBarColor(swatch.getRgb());
} else {
setStandardColors();
resetColors();
}
}
});
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setStandardColors() {
private void resetColors() {
int titleTextColor = Util.resolveColor(this, R.attr.title_text_color);
int defaultBarColor = Util.resolveColor(this, R.attr.default_bar_color);
@ -292,7 +304,8 @@ public class ArtistDetailActivity extends AbsFabActivity {
artistNameTv.setBackgroundColor(defaultBarColor);
artistNameTv.setTextColor(titleTextColor);
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled()) getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled())
getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
}
private void setUpToolBar() {
@ -398,9 +411,9 @@ public class ArtistDetailActivity extends AbsFabActivity {
}
@Subscribe
public void onUIPreferenceChanged(UIPreferenceChangedEvent event){
switch (event.getAction()){
case UIPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ARTIST_CHANGED:
public void onUIPreferenceChanged(UiPreferenceChangedEvent event) {
switch (event.getAction()) {
case UiPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ARTIST_CHANGED:
setNavigationBarColored((boolean) event.getValue());
break;
}

View file

@ -29,7 +29,7 @@ import com.kabouzeid.gramophone.loader.ArtistSongLoader;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.model.MusicRemoteEvent;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.fragments.NavigationDrawerFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
@ -42,7 +42,7 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.squareup.picasso.Picasso;
import com.koushikdutta.ion.Ion;
import java.util.List;
@ -174,11 +174,12 @@ public class MainActivity extends AbsFabActivity
if (navigationDrawerFragment != null) {
Song song = MusicPlayerRemote.getCurrentSong();
if (song.id != -1) {
Picasso.with(this)
.load(MusicUtil.getAlbumArtUri(song.albumId))
.error(R.drawable.default_album_art)
.placeholder(R.drawable.default_album_art)
.into(navigationDrawerFragment.getAlbumArtImageView());
Ion.with(this)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(navigationDrawerFragment.getAlbumArtImageView().getWidth(), navigationDrawerFragment.getAlbumArtImageView().getHeight())
.centerCrop()
.intoImageView(navigationDrawerFragment.getAlbumArtImageView());
navigationDrawerFragment.getSongTitle().setText(song.title);
navigationDrawerFragment.getSongArtist().setText(song.artistName);
}
@ -295,10 +296,10 @@ public class MainActivity extends AbsFabActivity
}
@Override
public void onUIPreferenceChangedEvent(UIPreferenceChangedEvent event) {
public void onUIPreferenceChangedEvent(UiPreferenceChangedEvent event) {
super.onUIPreferenceChangedEvent(event);
switch (event.getAction()) {
case UIPreferenceChangedEvent.TOOLBAR_TRANSPARENT_CHANGED:
case UiPreferenceChangedEvent.TOOLBAR_TRANSPARENT_CHANGED:
setToolBarTransparent((boolean) event.getValue());
break;
}

View file

@ -3,12 +3,11 @@ package com.kabouzeid.gramophone.ui.activities;
import android.annotation.TargetApi;
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.support.v7.graphics.Palette;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@ -30,7 +29,7 @@ import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.MusicRemoteEvent;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
@ -39,10 +38,10 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.nineoldandroids.view.ViewPropertyAnimator;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.io.File;
@ -71,6 +70,7 @@ public class MusicControllerActivity extends AbsFabActivity {
private boolean killThreads = false;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
setUpTranslucence(true, false);
@ -258,23 +258,30 @@ public class MusicControllerActivity extends AbsFabActivity {
}
private void setUpAlbumArtAndApplyPalette() {
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);
}
@Override
public void onError() {
super.onError();
setStandardColors();
}
});
albumArt.post(new Runnable() {
@Override
public void run() {
Ion.with(MusicControllerActivity.this)
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
.withBitmap()
.resize(albumArt.getWidth(), albumArt.getHeight())
.centerCrop()
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null) {
albumArt.setImageBitmap(result);
applyPalette(result);
} else {
albumArt.setImageResource(R.drawable.default_album_art);
resetColors();
}
}
});
}
});
}
private void applyPalette(Bitmap bitmap) {
@ -287,13 +294,13 @@ public class MusicControllerActivity extends AbsFabActivity {
songTitle.setTextColor(swatch.getTitleTextColor());
songArtist.setTextColor(swatch.getBodyTextColor());
} else {
setStandardColors();
resetColors();
}
}
});
}
private void setStandardColors() {
private void resetColors() {
int songTitleTextColor = Util.resolveColor(this, R.attr.title_text_color);
int artistNameTextColor = Util.resolveColor(this, R.attr.caption_text_color);
int defaultBarColor = Util.resolveColor(this, R.attr.default_bar_color);
@ -322,11 +329,9 @@ public class MusicControllerActivity extends AbsFabActivity {
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, song.artistName, false, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
@Override
public void onArtistImageUrlLoaded(String url) {
Picasso.with(MusicControllerActivity.this)
.load(url)
.placeholder(R.drawable.default_artist_image)
Ion.with(artistArt)
.error(R.drawable.default_artist_image)
.into(artistArt);
.load(url);
}
});
}
@ -467,9 +472,9 @@ public class MusicControllerActivity extends AbsFabActivity {
}
@Subscribe
public void onUIPrefsChanged(UIPreferenceChangedEvent event) {
public void onUIPrefsChanged(UiPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.PLAYBACK_CONTROLLER_CARD_CHANGED:
case UiPreferenceChangedEvent.PLAYBACK_CONTROLLER_CARD_CHANGED:
setUpBox((boolean) event.getValue());
break;
}

View file

@ -14,7 +14,7 @@ import android.view.MenuItem;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
@ -57,7 +57,7 @@ public class SettingsActivity extends AbsBaseActivity {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
setSummary(generalTheme, o);
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.THEME_CHANGED, o));
App.bus.post(new UiPreferenceChangedEvent(UiPreferenceChangedEvent.THEME_CHANGED, o));
return true;
}
});
@ -65,7 +65,7 @@ public class SettingsActivity extends AbsBaseActivity {
findPreference("transparent_toolbar").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.TOOLBAR_TRANSPARENT_CHANGED, o));
App.bus.post(new UiPreferenceChangedEvent(UiPreferenceChangedEvent.TOOLBAR_TRANSPARENT_CHANGED, o));
return true;
}
});
@ -73,7 +73,7 @@ public class SettingsActivity extends AbsBaseActivity {
findPreference("colored_album_footers").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED, o));
App.bus.post(new UiPreferenceChangedEvent(UiPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED, o));
return true;
}
});
@ -81,7 +81,7 @@ public class SettingsActivity extends AbsBaseActivity {
findPreference("colored_navigation_bar_artist").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ARTIST_CHANGED, o));
App.bus.post(new UiPreferenceChangedEvent(UiPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ARTIST_CHANGED, o));
return true;
}
});
@ -89,7 +89,7 @@ public class SettingsActivity extends AbsBaseActivity {
findPreference("colored_navigation_bar_album").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ALBUM_CHANGED, o));
App.bus.post(new UiPreferenceChangedEvent(UiPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ALBUM_CHANGED, o));
return true;
}
});
@ -97,7 +97,7 @@ public class SettingsActivity extends AbsBaseActivity {
findPreference("playback_controller_card").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.PLAYBACK_CONTROLLER_CARD_CHANGED, o));
App.bus.post(new UiPreferenceChangedEvent(UiPreferenceChangedEvent.PLAYBACK_CONTROLLER_CARD_CHANGED, o));
return true;
}
});

View file

@ -9,7 +9,7 @@ import com.crashlytics.android.Crashlytics;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.model.UiPreferenceChangedEvent;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.squareup.otto.Subscribe;
@ -22,7 +22,7 @@ public abstract class AbsBaseActivity extends ActionBarActivity implements KabVi
private boolean areViewsEnabled;
private Object uiPreferenceChangeListener = new Object() {
@Subscribe
public void onUIPreferenceChangedEvent(UIPreferenceChangedEvent event) {
public void onUIPreferenceChangedEvent(UiPreferenceChangedEvent event) {
AbsBaseActivity.this.onUIPreferenceChangedEvent(event);
}
};
@ -54,9 +54,9 @@ public abstract class AbsBaseActivity extends ActionBarActivity implements KabVi
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void onUIPreferenceChangedEvent(UIPreferenceChangedEvent event) {
public void onUIPreferenceChangedEvent(UiPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.THEME_CHANGED:
case UiPreferenceChangedEvent.THEME_CHANGED:
recreate();
break;
}

View file

@ -27,6 +27,7 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.koushikdutta.ion.Ion;
import com.melnykov.fab.FloatingActionButton;
import com.nineoldandroids.view.ViewHelper;
import com.nineoldandroids.view.ViewPropertyAnimator;
@ -335,6 +336,11 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
}
if (deleteArtwork) {
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
Ion.getDefault(AbsTagEditorActivity.this).getBitmapCache().clear();
Ion.getDefault(AbsTagEditorActivity.this).getCache().clear();
} else if (artwork != null){
Ion.getDefault(AbsTagEditorActivity.this).getBitmapCache().clear();
Ion.getDefault(AbsTagEditorActivity.this).getCache().clear();
}
progressDialog.dismiss();
rescanMedia();

View file

@ -1,7 +1,6 @@
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;
@ -16,8 +15,8 @@ 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.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.images.Artwork;
@ -96,36 +95,30 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
LastFMAlbumImageUrlLoader.loadAlbumImageUrl(this, albumTitleStr, albumArtistNameStr, new LastFMAlbumImageUrlLoader.AlbumImageUrlLoaderCallback() {
@Override
public void onAlbumImageUrlLoaded(String url) {
Picasso.with(AlbumTagEditorActivity.this)
Ion.with(AlbumTagEditorActivity.this)
.load(url)
.withBitmap()
.resize(500, 500)
.centerCrop()
.onlyScaleDown()
.into(new Target() {
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@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) {
public void onCompleted(Exception e, Bitmap result) {
if(result != null) {
albumArtBitmap = result;
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
} else {
//TODO Toast failed message
}
}
});
}
@Override
public void onError() {
Toast.makeText(AlbumTagEditorActivity.this, "Failed.", Toast.LENGTH_SHORT).show();
//TODO Toast failed message
}
}
);
@ -192,28 +185,21 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override
protected void loadImageFromFile(final Uri selectedFileUri) {
Picasso.with(this)
.load(selectedFileUri)
Ion.with(this)
.load(selectedFileUri.toString())
.withBitmap()
.resize(500, 500)
.centerCrop()
.onlyScaleDown()
.into(new Target() {
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
albumArtBitmap = bitmap;
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
//TODO Toast could not read file
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
public void onCompleted(Exception e, Bitmap result) {
if (result != null) {
albumArtBitmap = result;
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
}
}
});
}

View file

@ -45,7 +45,7 @@ public final class PreferenceUtils {
}
public int getGeneralTheme() {
int value = Integer.parseInt(mPreferences.getString(GENERAL_THEME, "1"));
int value = Integer.parseInt(mPreferences.getString(GENERAL_THEME, "0"));
switch (value) {
case 0:
return R.style.Theme_MaterialMusic_Light;