diff --git a/app/build.gradle b/app/build.gradle index fbc11ef5..39fdaa7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "com.kabouzeid.gramophone" minSdkVersion 16 targetSdkVersion 22 - versionCode 8 - versionName "0.9.4.1b" + versionCode 9 + versionName "0.9.5b" } compileOptions { @@ -57,7 +57,7 @@ dependencies { compile 'com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar' compile 'com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar' compile 'com.nineoldandroids:library:2.4.0' - compile 'com.melnykov:floatingactionbutton:1.2.0' + compile 'com.github.clans:fab:1.2.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.0' diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java index 52619467..2e38631b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java @@ -52,8 +52,10 @@ public class AlbumSongAdapter extends RecyclerView.Adapter 0 ? String.valueOf(trackNumber) : "-"; + holder.trackNumber.setText(trackNumberString); holder.songTitle.setText(song.title); - holder.trackNumber.setText(String.valueOf(MusicUtil.getFixedTrackNumber(song.trackNumber))); holder.artistName.setText(MusicUtil.getReadableDurationString(song.duration)); } 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 af861192..1c273797 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java @@ -6,51 +6,58 @@ import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.support.annotation.NonNull; import android.widget.RemoteViews; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +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; /** * Implementation of App Widget functionality. */ public class MusicPlayerWidget extends AppWidgetProvider { - private static MusicPlayerWidget instance; - - public static synchronized MusicPlayerWidget getInstance() { - if (instance == null) { - instance = new MusicPlayerWidget(); - } - return instance; - } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.music_player_widget); - - appWidgetManager.updateAppWidget(appWidgetIds, views); + update(context, appWidgetManager, appWidgetIds); } + 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(); - @Override - public void onEnabled(Context context) { - // Enter relevant functionality for when the first widget is created + if (song.id != -1) { + views.setTextViewText(R.id.song_title, song.title); + } + + 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); + + for (int widgetId : ids) { + manager.updateAppWidget(widgetId, views); + } } - @Override - public void onDisabled(Context context) { - // Enter relevant functionality for when the last widget is disabled - } - - private void linkButtons(final Context context, final RemoteViews views) { + 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)); views.setOnClickPendingIntent(R.id.button_next, retrievePlaybackActions(context, 2)); views.setOnClickPendingIntent(R.id.button_prev, retrievePlaybackActions(context, 3)); } - private PendingIntent retrievePlaybackActions(final Context context, final int which) { + private static PendingIntent retrievePlaybackActions(final Context context, final int which) { Intent action; PendingIntent pendingIntent; final ComponentName serviceName = new ComponentName(context, MusicService.class); @@ -77,6 +84,13 @@ 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/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index d31746ed..642e3cc3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -2,6 +2,7 @@ package com.kabouzeid.gramophone.service; import android.app.PendingIntent; import android.app.Service; +import android.appwidget.AppWidgetManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentUris; @@ -24,6 +25,7 @@ import android.widget.Toast; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appwidget.MusicPlayerWidget; import com.kabouzeid.gramophone.helper.PlayingNotificationHelper; import com.kabouzeid.gramophone.helper.ShuffleHelper; import com.kabouzeid.gramophone.misc.AppKeys; @@ -211,6 +213,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe player = null; } playingNotificationHelper.updatePlayState(isPlaying()); + MusicPlayerWidget.updateWidgets(this); remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP); } @@ -260,6 +263,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); remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP); } else { @@ -288,6 +292,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe player.setDataSource(getApplicationContext(), trackUri); currentSongId = getPlayingQueue().get(getPosition()).id; updateNotification(); + MusicPlayerWidget.updateWidgets(this); updateRemoteControlClient(); player.prepareAsync(); } catch (Exception e) { @@ -296,6 +301,7 @@ 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); remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); try { updateNotification(); @@ -434,6 +440,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe player.start(); isPlayerPrepared = true; playingNotificationHelper.updatePlayState(isPlaying()); + MusicPlayerWidget.updateWidgets(this); remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.PLAY); savePosition(); @@ -596,6 +603,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe if (isPlaying()) { player.pause(); playingNotificationHelper.updatePlayState(isPlaying()); + MusicPlayerWidget.updateWidgets(this); remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.PAUSE); } @@ -607,6 +615,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe if (isPlayerPrepared) { player.start(); playingNotificationHelper.updatePlayState(isPlaying()); + MusicPlayerWidget.updateWidgets(this); remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.RESUME); } else { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java index 1c2a5db2..b22f6a36 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java @@ -8,13 +8,13 @@ import android.view.MotionEvent; import android.view.View; import android.widget.Toast; +import com.github.clans.fab.FloatingActionButton; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.misc.SmallOnGestureListener; import com.kabouzeid.gramophone.model.MusicRemoteEvent; import com.kabouzeid.gramophone.util.NavigationUtil; -import com.melnykov.fab.FloatingActionButton; import com.squareup.otto.Subscribe; /** 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 1108c70e..c177727b 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 @@ -19,6 +19,7 @@ import android.view.animation.OvershootInterpolator; import android.widget.ImageView; import com.afollestad.materialdialogs.MaterialDialog; +import com.github.clans.fab.FloatingActionButton; import com.github.ksoichiro.android.observablescrollview.ObservableScrollView; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; @@ -29,7 +30,6 @@ 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.melnykov.fab.FloatingActionButton; import com.nineoldandroids.view.ViewHelper; import com.nineoldandroids.view.ViewPropertyAnimator; @@ -56,7 +56,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { public static final String TAG = AbsTagEditorActivity.class.getSimpleName(); private static final int REQUEST_CODE_SELECT_IMAGE = 1337; - private App app; private int id; private int headerVariableSpace; private int paletteColorPrimary; @@ -398,10 +397,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { protected abstract void loadImageFromFile(Uri selectedFile); - protected App getApp() { - return app; - } - protected String getSongTitle() { try { return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.TITLE); diff --git a/app/src/main/res/layout-land/activity_music_controller.xml b/app/src/main/res/layout-land/activity_music_controller.xml index 76747329..2714ce8e 100644 --- a/app/src/main/res/layout-land/activity_music_controller.xml +++ b/app/src/main/res/layout-land/activity_music_controller.xml @@ -130,7 +130,7 @@ android:layout_margin="16dp" android:background="?attr/music_controller_container_color"> - - - - - - diff --git a/app/src/main/res/layout/activity_playlist_detail.xml b/app/src/main/res/layout/activity_playlist_detail.xml index eb3dc367..a066dcae 100644 --- a/app/src/main/res/layout/activity_playlist_detail.xml +++ b/app/src/main/res/layout/activity_playlist_detail.xml @@ -29,7 +29,7 @@ android:layout_gravity="right|bottom" android:fitsSystemWindows="true"> - - 16dp 16dp + 8dp diff --git a/app/src/main/res/values/styles_parents.xml b/app/src/main/res/values/styles_parents.xml index 3be38f3f..62fcad29 100644 --- a/app/src/main/res/values/styles_parents.xml +++ b/app/src/main/res/values/styles_parents.xml @@ -70,7 +70,6 @@ 8dp wrap_content wrap_content - true