Finish current music when Sleep Timer stops (#629)

Implement #329.
This commit adds a CheckBox to dialog_sleep_timer, and a curresponding
option `TIMER_FINISH_MUSIC` in PreferenceUtil.

In MusicService, a new flag `pendingQuit` is to indicate if it should
stop after current music stops. A new action `ACTION_PENDING_QUIT` will
set that flag.

Canceling is a little tricky. I must bind MusicService in Dialog
activity to check if `pendingQuit` is set, and show the corresponding
canceling button.
This commit is contained in:
Peng Guanwen 2019-01-08 10:45:33 +08:00 committed by Eugene
commit 2111c41836
6 changed files with 94 additions and 25 deletions

View file

@ -11,6 +11,7 @@ import android.os.CountDownTimer;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
@ -20,6 +21,7 @@ import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.PurchaseActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
@ -37,6 +39,8 @@ public class SleepTimerDialog extends DialogFragment {
SeekArc seekArc;
@BindView(R.id.timer_display)
TextView timerDisplay;
@BindView(R.id.should_finish_last_song)
CheckBox shouldFinishLastSong;
private int seekArcProgress;
private MaterialDialog materialDialog;
@ -65,6 +69,8 @@ public class SleepTimerDialog extends DialogFragment {
return;
}
PreferenceUtil.getInstance(getActivity()).setSleepTimerFinishMusic(shouldFinishLastSong.isChecked());
final int minutes = seekArcProgress;
PendingIntent pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT);
@ -87,6 +93,12 @@ public class SleepTimerDialog extends DialogFragment {
previous.cancel();
Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.sleep_timer_canceled), Toast.LENGTH_SHORT).show();
}
MusicService musicService = MusicPlayerRemote.musicService;
if (musicService != null && musicService.pendingQuit) {
musicService.pendingQuit = false;
Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.sleep_timer_canceled), Toast.LENGTH_SHORT).show();
}
})
.showListener(dialog -> {
if (makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) != null) {
@ -102,6 +114,9 @@ public class SleepTimerDialog extends DialogFragment {
ButterKnife.bind(this, materialDialog.getCustomView());
boolean finishMusic = PreferenceUtil.getInstance(getActivity()).getSleepTimerFinishMusic();
shouldFinishLastSong.setChecked(finishMusic);
seekArc.setProgressColor(ThemeSingleton.get().positiveColor.getDefaultColor());
seekArc.setThumbColor(ThemeSingleton.get().positiveColor.getDefaultColor());
@ -153,8 +168,20 @@ public class SleepTimerDialog extends DialogFragment {
}
private Intent makeTimerIntent() {
return new Intent(getActivity(), MusicService.class)
.setAction(MusicService.ACTION_QUIT);
Intent intent = new Intent(getActivity(), MusicService.class);
if (shouldFinishLastSong.isChecked()) {
return intent.setAction(MusicService.ACTION_PENDING_QUIT);
}
return intent.setAction(MusicService.ACTION_QUIT);
}
private void updateCancelButton() {
MusicService musicService = MusicPlayerRemote.musicService;
if (musicService != null && musicService.pendingQuit) {
materialDialog.setActionButton(DialogAction.NEUTRAL, materialDialog.getContext().getString(R.string.cancel_current_timer));
} else {
materialDialog.setActionButton(DialogAction.NEUTRAL, null);
}
}
private class TimerUpdater extends CountDownTimer {
@ -169,7 +196,7 @@ public class SleepTimerDialog extends DialogFragment {
@Override
public void onFinish() {
materialDialog.setActionButton(DialogAction.NEUTRAL, null);
updateCancelButton();
}
}
}
}