diff --git a/app/build.gradle b/app/build.gradle index 00799021..437665c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,7 +50,7 @@ dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.2.1@aar') { transitive = true; } - compile 'com.afollestad:material-dialogs:0.7.2.1' + compile 'com.afollestad:material-dialogs:0.7.2.2' compile 'com.android.support:appcompat-v7:22.0.0' compile 'com.android.support:recyclerview-v7:22.0.0' compile 'com.android.support:gridlayout-v7:22.0.0' @@ -64,11 +64,11 @@ dependencies { compile 'com.melnykov:floatingactionbutton:1.3.0' compile 'com.github.ksoichiro:android-observablescrollview:1.5.0' compile 'com.mcxiaoke.volley:library:1.0.15' - compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.squareup:otto:1.3.6' compile 'com.squareup.okhttp:okhttp:2.2.0' compile 'asia.ivity.android:drag-sort-listview:1.0' compile 'de.hdodenhof:circleimageview:1.2.2' compile 'com.jpardogo.materialtabstrip:library:1.0.9' compile 'com.android.support:support-v4:22.0.0' + compile 'com.koushikdutta.ion:ion:2.1.3' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2858ff7..e86f7391 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" - android:theme="@style/Theme.MaterialMusic" > + android:theme="@style/Theme.MaterialMusic.Light" > diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java index bcc5d74d..87627884 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java @@ -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 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() { + @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 } @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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java index 1e40bd59..4763c717 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java @@ -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() { + @Override + public void onCompleted(Exception e, Bitmap result) { + if (result != null) + holder.artistImage.setImageBitmap(result); + else { + holder.artistImage.setImageResource(R.drawable.default_artist_image); + } + } + }); } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java index 9816b63c..3c890a15 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java @@ -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 { 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() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java index c1cadf60..05a62cad 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java @@ -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 { 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()); diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java b/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java index 1c273797..23dd91e3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java @@ -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() { + @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); - } } 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 ab2dc5d1..d1ed3061 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java @@ -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() { + @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); 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 f8cbeee4..73930474 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -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); + } + }); } } 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 e8f79208..dc2a9580 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,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); + } + }); } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java b/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java index d589289e..0a6d576b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java @@ -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; } 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 939640a6..c98186b9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -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() { + @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 { 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 e494d92c..a695c8f8 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,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() { + @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; } 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 f0ab157c..ae3fba41 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 @@ -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() { + @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; } 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 6b0579dd..26ef114e 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 @@ -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; } 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 2b74f663..9ff2afb0 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 @@ -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() { + @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; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 0453237a..2c4f2e9d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -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; } }); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java index 739659c2..a8354e2a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java @@ -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; } 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 686cce05..fdf4b8d3 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 @@ -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(); 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 537225e4..746f4354 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,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() { @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() { @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(); + } } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java index ef378a8a..4869c42d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java @@ -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; diff --git a/app/src/main/res/layout/activity_album_tag_editor.xml b/app/src/main/res/layout/activity_album_tag_editor.xml index 928b37bb..c2d4980c 100644 --- a/app/src/main/res/layout/activity_album_tag_editor.xml +++ b/app/src/main/res/layout/activity_album_tag_editor.xml @@ -31,20 +31,19 @@ android:paddingBottom="8dp" android:paddingLeft="16dp" android:paddingRight="16dp" - android:paddingTop="8dp"> + android:paddingTop="8dp" + android:gravity="center_vertical"> + android:textColor="@color/white" + /> @@ -53,6 +52,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/header" + android:background="?android:attr/colorBackground" android:orientation="vertical" android:padding="16dp"> diff --git a/app/src/main/res/layout/activity_song_tag_editor.xml b/app/src/main/res/layout/activity_song_tag_editor.xml index eca27e7f..d282cc95 100644 --- a/app/src/main/res/layout/activity_song_tag_editor.xml +++ b/app/src/main/res/layout/activity_song_tag_editor.xml @@ -1,6 +1,5 @@ + android:paddingTop="8dp" + android:gravity="center_vertical"> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml new file mode 100644 index 00000000..eb6e6872 --- /dev/null +++ b/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,28 @@ + + + الإعدادات + عنّا + يتم تشغيل + قائمة الانتظار + بحث + استمع لاحقاً + أضف إلى قائمة الانتظار + أزل من قائمة الانتظار + أضف إلى قائمة تشغيل + تعديل معلومات الموسيقى + حذف + التفاصيل + اذهب إلى... + الألبومات + الفنانون + الأنواع + الأغاني + قوائم التشغيل + فنان غير معروف + ألبوم غير معروف + أغنية بدون عنوان + لا شيء قيد الاستماع + عذراً، حصل خطأ أثناء محاولة تشغيل الأغنية + عذراً، لم يتم العثور على سيرة ذاتية مطابقة للفنان + سيرة ذاتية + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml new file mode 100644 index 00000000..96b6cca8 --- /dev/null +++ b/app/src/main/res/values-el/strings.xml @@ -0,0 +1,79 @@ + + + "Ρυθμίσεις " + Για εμάς + Παίζει τώρα + Σειρά τραγουδιών + Αναζήτηση + Παίζει στη συνέχεια + Προσθήκη στη σειρά τραγουδιών + Διαγραφή από την σειρά τραγουδιών + Προσθήκη στην λίστα + Επεξεργασία ετικετών + Διαγραφή απο τον δίσκο + Πληροφορίες + Πήγαινε στο + Λευκώματα + Καλλιτέχνες + Είδη + Τραγούδια + Λίστες + Άγνωστος καλλιτέχνης + Άγνωστο λεύκωμα + Τραγουδι χωρίς τίτλο + Δεν παίζει τίποτα + Συγνώμη - Υπήρξε σφάλμα όταν έπαιξε το τραγούδι + Συγνώμη, δεν μπορούμε βιογραφία που να ταιριάζει με αυτόν τον καλλιτέχνη + Βιογραφία + Δεν μπορούμε να πάρουμε συγκέντρωση του ήχου + Επεξεργασία ετικετών + Τραγούδι + Λεύκωμα + Καλλιτέχνης + Είδος + Καλλιτέχνης λευκώματος + Έτος + Κομάτι + I don\'t know this + Το πεδιο τιτλος του άλμπουμ ή ο καλλιτέχνης του άλμπουμ είναι άδειο + Φ + Ι + Η + Ξ + Ξ + Ν + Ε + Ρ + Ρ + Ε + Ένταξη + Ι + Θ + Υ + Ε + Γ + Ρ + Τ + Φ + Γ + Υ + Η + Ρ + Φ + Φ + Η + Τ + \u0397 + Σ + \u03a1 + \u03a1 + Ε + Δ + Ζ + Σ + \u0395 + \u03c2 + " \u03a1" + \u03a6 + \u0395 + diff --git a/app/src/main/res/values-es-r419/strings.xml b/app/src/main/res/values-es-r419/strings.xml index 471601fc..314f8e07 100644 --- a/app/src/main/res/values-es-r419/strings.xml +++ b/app/src/main/res/values-es-r419/strings.xml @@ -8,11 +8,11 @@ "Siguiente " Agregar a reproducción actual Eliminar de reproducción actual - "Añadir a lista de reproducción " + Añadir a lista de reproducción... Editor de etiquetas Borrar del disco Detalles - Ir a + Ir a... Álbumes Artistas Géneros @@ -23,9 +23,9 @@ Canción sin título Nada se está reproduciendo Disculpe, un error ha ocurrido intentando reproducir esta canción - "Lo sentimos. No encontramos una biografía correspondiente a éste artista " + Lo sentimos, no encontramos una biografía correspondiente a éste artista Biografía - "No podemos encontrar el foco de audio " + No podemos encontrar el foco de audio Editor de etiquetas Canción Álbum @@ -34,7 +34,7 @@ Artista del álbum Año Canción - "Pista () " + Pista (2 for track 2 or 3004 for CD3 track 4) El campo título del álbum o el artista del álbum está vacío Escribiendo archivo Guardando cambios... @@ -52,7 +52,9 @@ Reproducción actual Cerrar Guardar como lista de reproducción - Buscar Actividad + Icono por + Gramophone es un reproductor de música gratuito con diseño material por + Buscar más Sin resultados Actualizar imagen del artista @@ -63,8 +65,8 @@ Añadido t\u00edtulos a la reproducci\u00f3n actual Borrar de la lista de reproducción - Insertado - t\u00edtulos a lista de reproducci\u00f3n + A\u00f1adido + t\u00edtulos a lista de reproducci\u00f3n. Nueva lista de reproducción Columnas de la cuadrícula Columnas de la cuadrícula (apaisado) @@ -98,4 +100,5 @@ Sin id de audio, toca algo e intenta nuevamente Abrir cajón de navegación "Cerrar la barra de navegación " + Borrar diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 0aacd0f3..bd12a603 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -39,7 +39,7 @@ " El campo del título del álbum o del artista del álbum está vacío Escribiendo archivo - Guardando cambios + Guardando cambios... Editor de las etiquetas del álbum activo Detalles Nombre de archivo @@ -80,7 +80,7 @@ Borrar Canciones? "Advertencia: Esta operación es irreversible." - Mezclar todas + Aleatorio Abierto recientemente Página de inicio Claro diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4a92b6e4..e7a50d57 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -52,6 +52,8 @@ File de lecture Fermer Sauvegarder en tant que playlist + Logo fourni par + Gramophone est un lecteur de musique matériel et entièrement gratuit créé par Dernières recherches Plus Aucun résultat diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 63e36eda..a8e1b284 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -40,7 +40,7 @@ Sto salvando le modifiche AttivitàModificaTagAlbum Dettagli - Nome file + Nome del file Dimensione Formato Lunghezza @@ -52,7 +52,7 @@ Riproduci coda Chiudi Salva come playlist - AttivitàCerca + Cerca Altro Nessun risultato Aggiorna immagine artista diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 9b372a0c..4dd00a78 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,32 +1,32 @@ Instellingen - Omtrent + Over Momenteel spelend - Afspeellijst - Zoek - Speel volgende af - Voeg toe aan afspeellijst\" - Verwijder van afspeellijst - Voeg toe aan afspeellijst...\" - Label Bewerker\" - Verwijder van schijf\" + Afspeelwachtrij + Zoeken + Speel af als volgende + Toevoegen aan wachtrij + Verwijderen uit wachtrij + Toevoegen aan afspeellijst... + Label bewerker + Verwijderen van apparaat Details Ga naar... Albums Artiesten Genres Nummers - Afspeellijst - Onbekende artiest + Afspeellijsten + Onbekende Artiest Onbekend Album Ongetiteld Nummer - Er wordt niets afgespeeld. - Sorry - er is een probleem ontstaan tijdens het afspelen van dit nummer - Sorry, het is ons niet gelukt om een passende biografie voor deze artiest te vinden. + Niets wordt afgespeeld + Sorry - er is een probleem ontstaan tijdens het afspelen van dit nummer. + Sorry, het is ons niet gelukt om een passende biografie te vinden voor deze artiest. Biografie Het is niet gelukt om audio focus te krijgen. - Label Bewerker + Label bewerker Nummer Album Artiest @@ -34,7 +34,7 @@ Album artiest Jaar Nummer - Nummer (2 voor nummer 2 of 3004 voor CD3 nummer 4) + Nummer (2 voor nummer 2, of 3004 voor CD3 nummer 4) Album titel of album artiest tekstveld is leeg. Bestand wegschrijven Wijzigingen opslaan... @@ -49,55 +49,56 @@ Oké Ga naar artiest Ga naar album - Afspeellijst - Sluit + Afspeelwachtrij + Sluiten Sla op als afspeellijst Icoon door Gramophone is een volledig gratis muziekspeler in material design door - ZoekActiviteit + Zoeken meer Geen resultaten - Vernieuw artiest afbeelding - Artiest afbeelding gewijzigd - Wijzigen... + Artiest afbeelding bijwerken + Artiest afbeelding bijgewerkt + Bijwerken... Laden... - 1 titel toegevoegd aan de afspeellijst. + 1 titel toegevoegd aan de afspeelwachtrij. Toegevoegd - " titels naar de afspeellijst" - Verwijder van afspeellijst - "Ingevoegd " - " titels naar de afspeellijst " + " titels naar de afspeelwachtrij" + Verwijderen van afspeellijst + "Toegevoegd " + " titels naar de afspeellijst." Nieuwe afspeellijst Rasterkolommen Rasterkolommen (Land) - Annuleer + Annuleren "Afspeellijst aangemaakt " "Afspeellijst verwijderd " - "Kan afspeellijst niet verwijderen " + "Kan afspeellijst niet aanmaken " "Verwijder afspeellijst " "Hernoem afspeellijst " "Verwijder " " nummers? " - "Waarschuwing: Deze actie kan niet ongedaan worden gemaakt. " - Shuffle allemaal + "Waarschuwing: Deze handeling kan niet ongedaan gemaakt worden." + Shuffle alles Laatst geopend - Start pagina + Startpagina Licht Donker Equalizer - UI + Uiterlijk Standaard thema Audio Algemeen - Stel in als start pagina + Instellen als startpagina Instellingen - Semi-transparante toolbaar + Semi-transparante toolbar Afspeelknoppen kaart Gekleurde navigatiebalk artiesten weergave Gekleurde navigatiebalk album weergave Gekleurde album footers Geen equalizer gevonden - Geen audio id, speel wat af en probeer het opnieuw + Geen audio ID, speel iets af en probeer het nogmaals. Open navigatiebalk Sluit navigatiebalk + verwijder diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a80d254a..236abd8d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -6,11 +6,11 @@ Kolejka odtwarzania Szukaj Odtwarzaj następny - Dodaj do kolejki odtwarzania\'\' + Dodaj do kolejki odtwarzania Usuń z kolejki odtwarzania - Dodaj do listy odtwarzania...\'\' - Edytor Tagów\'\' - Usuń z urządzenia\'\' + Dodaj do listy odtwarzania... + Edytor Tagów + Usuń z urządzenia Szczegóły Przejdź do... Albumy @@ -18,12 +18,12 @@ Gatunki Utwory Listy odtwarzania - Nieznany Wykonawca - Nieznany Album + Nieznany wykonawca + Nieznany album Utwór bez nazwy Nic nie gra - Niestety - wystąpił błąd przy próbie odtworzenia tej piosenki - Niestety nie byliśmy w stanie znaleźć biografii dla tego wykonawcy. + Niestety - wystąpił błąd przy próbie zagrania tej piosenki + Niestety nie byliśmy w stanie znaleźć pasującej biografii dla tego wykonawcy. Biografia We were not able to gain audio focus. TagEditorActivity @@ -49,12 +49,14 @@ Bitrate Częstotliwość próbkowania Ok - Przejdź do Wykonawcy + Przejdź do wykonawcy Przejdź do albumu Kolejka odtwarzania Zamknij Zapisz jako listę odtwarzania - SearchActivity + Ikona + Gramophone to całkowicie darmowy odtwarzacz muzyczny, utrzymany w stylistyce Material Design, zaprojektowany przez + Szukaj więcej Brak wyników Zaktualizuj zdjęcie wykonawcy @@ -62,11 +64,11 @@ Aktualizowanie... Ładowanie... Dodano 1 tytuł do kolejki odtwarzania - Dodane - " tytu\u0142\u00f3w do kolejki odtwarzania." + "Dodano " + " tytu\u0142y do kolejki odtwarzania." Usuń z listy odtwarzania - "Inserted " - " tytu\u0142\u00f3w do listy odtwarzania " + "Dodano " + " tytu\u0142y do listy odtwarzania." Nowa lista odtwarzania Siatka kolumn Siatka kolumn (poziomo) @@ -78,7 +80,7 @@ "Zmie\u0144 nazw\u0119 listy odtwarzania " "Usu\u0144 " " utwor\u00f3w?" - "Ostrzeżenie: Ta operacja może być cofnięta." + "Ostrzeżenie: Ta operacja nie może być cofnięta." Wszystkie losowo Ostatnio otwarte Strona startowa @@ -86,13 +88,13 @@ Ciemny Korektor Wygląd - General theme - Audio - General + Główny motyw + Dźwięk + Ogólne Ustaw domyślną stronę startową Ustawienia Półprzeźroczysty pasek narzędzi - Playback controller card + Karta kontrolera odtwarzania Kolorowy pasek nawigacyjny wykonawcy Kolorowy pasek nawigacyjny albumu Kolorowe stopki albumu @@ -100,4 +102,5 @@ Brak ID dźwięku, puść coś i spróbuj ponownie. Otwórz pasek nawigacji Zamknij pasek nawigacji + usuń diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 91c99045..6bca5df5 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -52,7 +52,9 @@ Reproduzindo lista Fechar Salvar como uma playlist - Buscar atividade + Ícone por + Gramophone é um player de música completamente grátis com Material Design feito por + Pesquisar mais Nenhum resultado Atualizar imagem do artista @@ -60,11 +62,11 @@ Atualizando... Carregando... Adicionada uma música para a fila atual de músicas. - Adicionado + "Adicionado " " m\u00fasicas para a fila atual." Apagar da playlist - Inserido - " m\u00fasicas para playlist " + "Inserido " + " m\u00fasicas para playlist." Nova playlist Colunas da grade Colunas da grade (Paisagem) @@ -98,4 +100,5 @@ Nenhuma identificação de áudio, reproduza algo e tente novamente. Abrir área de navegação Fechar área de navegação + excluir diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 586ec97e..418eeaa6 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -52,6 +52,8 @@ Lista de redare Închide Salvează ca și playlist + Iconița de + Gramophone este o aplicație complet gratuită bazată pe Material Design făcută de ActivitateaDeCăutare mai mult Niciun rezultat @@ -98,4 +100,5 @@ Nicio identificare audio, redă ceva şi încearcă din nou. Deschide sertarul de navigație Închide sertarul de navigație + șterge diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e0ac2de4..3b699387 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -21,15 +21,19 @@ Неизвестный исполнитель Неизвестный исполнитель Неизвестная песня + Ничего нет для воспроизведения Произошла ошибка при попытке проиграть эту песню + Извините, биография для этого исполнителя не найдена. Биография Редактор тэгов Песня Альбом Исполнитель Жанр + Альбом исполнителя Год Трек + Поля название альбома или альбом исполнителя пусты Запись файла Сохранение изменений... Подробнее @@ -39,35 +43,52 @@ Формат Длина Битрейт + Частота выборки Перейти к исполнителю Перейти к альбому Очередь воспроизведения Закрыть Сохранить как список воспроизведения + Поиск ещё Нет результатов Обновить изображение исполнителя + Обновлено изображение исполнителя для Обновление... Загрузка... + Добавлена 1 композиция в очередь воспроизведения Добавлено + " \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f" Удалить из списка воспроизведения "\u0412\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e " + " \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f" Новый список воспроизведения Столбцы сетки Столбцы сетки (ландшафт) Отмена + "\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d " + "\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0451\u043d " "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f " "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f " "\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f " "\u0423\u0434\u0430\u043b\u0438\u0442\u044c " " \u043f\u0435\u0441\u043d\u0438?" + "Внимание ! Эта операция необратима." + Перемешать всё + Последнее открытое Начальная страница Светлая Тёмная Эквалайзер + Пользовательский интерфейс + Общая тема Аудио + Общая Установить начальную страницу Настройки Полупрозрачная панель инструментов Эквалайзер не найден + Открыть панель навигации + Закрыть панель навигации + удалить diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 00000000..83e6de7e --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,5 @@ + + + Ayarlar + Hakkında + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 204ef3ac..fba902dd 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -6,13 +6,13 @@ 播放队列 搜索 下一首 - 加入播放队列“ + 加入播放队列 从播放队列移除 - 加入播放列表...\" + 加入播放列表 音乐标签编辑器 从储存中删除 详情 - 打开... + 打开 专辑 艺术家 流派 @@ -22,22 +22,22 @@ 未知专辑 未命名歌曲 没有正在播放的曲目 - 抱歉-尝试播放该曲目时发生错误 - 抱歉,不能找到与该艺术家匹配的档案。 + 抱歉 - 尝试播放该曲目时发生错误 + 抱歉,不能找到与该艺术家匹配的个人简介。 歌手简介 无法获取音频焦点。 - 音频信息编辑器 - 曲目 + 音频标签编辑器 + 歌曲 专辑 艺术家 流派 专辑创作者 年份 音轨 - 音轨 + 音轨(用2表示第2首歌或用3004表示CD3的第4首歌) 专辑名称或专辑创作者栏为空 - 写作目录 - 保存更改 + 正在写入文档 + 正在保存更改 详情 文件名 文件路径 @@ -47,8 +47,8 @@ 比特率 采样率 完成 - 艺术家 - 专辑 + 打开艺术家 + 打开专辑 播放队列 关闭 保存为播放列表 @@ -58,9 +58,47 @@ 更多 没有找到结果 更新歌手图片 - 为更新歌手图片 - 更新中…… - 加载中…… + 更新歌手图片 + 正在更新… + 加载中… + 该曲目已加入播放队列 + 已添加 + \u66f2\u76ee\u5230\u64ad\u653e\u961f\u5217 + 从播放列表中删除 + \u5df2\u6dfb\u52a0 + \u66f2\u76ee\u5230\u64ad\u653e\u5217\u8868 + 新建播放列表 + 专辑列数 + 专辑列数(横屏) + 取消 + \u64ad\u653e\u5217\u8868\u5df2\u521b\u5efa + \u64ad\u653e\u5217\u8868\u5df2\u5220\u9664 + \u65e0\u6cd5\u521b\u5efa\u64ad\u653e\u5217\u8868 + \u5220\u9664\u64ad\u653e\u5217\u8868 + \u91cd\u547d\u540d\u64ad\u653e\u5217\u8868 + \u5220\u9664 + \u66f2\u76ee\uff1f + "警告:该操作无法撤销。" + 随机播放全部曲目 + 最后打开 + 起始页 + Light + Dark + 均衡器 + 界面 + 全局主题 + 声音 + 通用 + 设置默认起始页 + 设置 + 半透明工具栏 + 卡片式播放控制面板 + 在艺术家界面使用变色导航栏 + 在专辑详情界面使用变色导航栏 + 使用变色的专辑标签 + 没有找到均衡器 + 没有音频ID,请播放曲目并重试。 弹出导航抽屉 关闭导航抽屉 + 删除 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 00000000..f4b35d9b --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,37 @@ + + + 設定 + 關於 + 現在播放 + 播放列表 + 搜尋 + 下一首 + 加入播放列表 + 從播放列表移除 + 加入音樂清單… + 編輯音樂標籤 + 從硬碟刪除 + 詳細資訊 + 打開… + 專輯 + 歌手 + 音樂類型 + 歌曲 + 音樂清單 + 未知的歌手 + 未知的專輯 + 無標題歌曲 + 沒有正在播放的歌曲 + 對不起,嘗試播放歌曲時發生錯誤 + 對不起,無法找到與這位歌手相符的個人簡介 + 個人簡介 + 無法獲得音訊焦點 + 編輯音樂標籤 + 歌曲 + 專輯 + 歌手 + 音樂類型 + 專輯歌手 + 年代 + 曲目 +