diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/SleepTimerDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/SleepTimerDialog.java index b7d452c5..fff4fbbb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/SleepTimerDialog.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/SleepTimerDialog.java @@ -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(); } } -} \ No newline at end of file +} 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 30279b48..e860f086 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -83,6 +83,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP public static final String ACTION_SKIP = PHONOGRAPH_PACKAGE_NAME + ".skip"; public static final String ACTION_REWIND = PHONOGRAPH_PACKAGE_NAME + ".rewind"; public static final String ACTION_QUIT = PHONOGRAPH_PACKAGE_NAME + ".quitservice"; + public static final String ACTION_PENDING_QUIT = PHONOGRAPH_PACKAGE_NAME + ".pendingquitservice"; public static final String INTENT_EXTRA_PLAYLIST = PHONOGRAPH_PACKAGE_NAME + "intentextra.playlist"; public static final String INTENT_EXTRA_SHUFFLE_MODE = PHONOGRAPH_PACKAGE_NAME + ".intentextra.shufflemode"; @@ -125,6 +126,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP private final IBinder musicBind = new MusicBinder(); + public boolean pendingQuit = false; + private AppWidgetBig appWidgetBig = AppWidgetBig.getInstance(); private AppWidgetClassic appWidgetClassic = AppWidgetClassic.getInstance(); private AppWidgetSmall appWidgetSmall = AppWidgetSmall.getInstance(); @@ -335,8 +338,12 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP break; case ACTION_STOP: case ACTION_QUIT: + pendingQuit = false; quit(); break; + case ACTION_PENDING_QUIT: + pendingQuit = true; + break; } } } @@ -1193,9 +1200,16 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP break; case TRACK_ENDED: - if (service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) { + // if there is a timer finished, don't continue + if (service.pendingQuit || + service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) { service.notifyChange(PLAY_STATE_CHANGED); service.seek(0); + if (service.pendingQuit) { + service.pendingQuit = false; + service.quit(); + break; + } } else { service.playNextSong(false); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java index 01d8d711..36282055 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java @@ -68,6 +68,7 @@ public final class PreferenceUtil { public static final String LAST_SLEEP_TIMER_VALUE = "last_sleep_timer_value"; public static final String NEXT_SLEEP_TIMER_ELAPSED_REALTIME = "next_sleep_timer_elapsed_real_time"; + public static final String SLEEP_TIMER_FINISH_SONG = "sleep_timer_finish_music"; public static final String IGNORE_MEDIA_STORE_ARTWORK = "ignore_media_store_artwork"; @@ -363,6 +364,16 @@ public final class PreferenceUtil { editor.apply(); } + public boolean getSleepTimerFinishMusic() { + return mPreferences.getBoolean(SLEEP_TIMER_FINISH_SONG, false); + } + + public void setSleepTimerFinishMusic(final boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean(SLEEP_TIMER_FINISH_SONG, value); + editor.apply(); + } + public void setAlbumGridSize(final int gridSize) { final SharedPreferences.Editor editor = mPreferences.edit(); editor.putInt(ALBUM_GRID_SIZE, gridSize); diff --git a/app/src/main/res/layout/dialog_sleep_timer.xml b/app/src/main/res/layout/dialog_sleep_timer.xml index cf096858..3fae7bb0 100644 --- a/app/src/main/res/layout/dialog_sleep_timer.xml +++ b/app/src/main/res/layout/dialog_sleep_timer.xml @@ -1,28 +1,43 @@ - + android:layout_height="wrap_content" + android:orientation="vertical"> - - - + android:layout_height="wrap_content"> - + + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c04edf65..99f278b0 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -294,4 +294,5 @@ 艺术家 专辑 年份 + 播完当前音乐 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 52996cc9..476cf3b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -312,4 +312,5 @@ Artist Album Year + Finish last song