New FAB and track number fix
This commit is contained in:
parent
6a2c3e565d
commit
3153299592
16 changed files with 60 additions and 40 deletions
|
|
@ -52,8 +52,10 @@ public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.View
|
|||
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||
final Song song = dataSet.get(position);
|
||||
|
||||
final int trackNumber = MusicUtil.getFixedTrackNumber(song.trackNumber);
|
||||
final String trackNumberString = trackNumber > 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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@
|
|||
android:layout_margin="16dp"
|
||||
android:background="?attr/music_controller_container_color">
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_centerInParent="true"
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@
|
|||
android:background="@android:color/transparent"/>
|
||||
</LinearLayout>
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="right"
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@
|
|||
android:layout_alignParentTop="true"
|
||||
android:background="#00000000"/>
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="bottom|right"
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@
|
|||
android:background="@android:color/transparent"/>
|
||||
</LinearLayout>
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="right"
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@
|
|||
android:layout_gravity="right|bottom"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_margin="16dp"
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@
|
|||
android:scaleType="fitCenter"
|
||||
android:src="@drawable/ic_shuffle_grey600_48dp"/>
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_centerInParent="true"/>
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
android:layout_gravity="right|bottom"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_margin="16dp"
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@
|
|||
android:layout_alignParentTop="true"
|
||||
android:background="#00000000"/>
|
||||
|
||||
<com.melnykov.fab.FloatingActionButton
|
||||
<com.github.clans.fab.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="bottom|right"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||
|
||||
<dimen name="default_item_margin">16dp</dimen>
|
||||
<dimen name="list_top_margin">8dp</dimen>
|
||||
|
||||
<!-- Per the design guidelines, navigation drawers should be between 240dp and 320dp:
|
||||
https://developer.android.com/design/patterns/navigation-drawer.html -->
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@
|
|||
<item name="elevation">8dp</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="fab_shadow">true</item>
|
||||
</style>
|
||||
|
||||
<style name="NotificationButtonParent">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue