Added last song play in sleep timer

This commit is contained in:
h4h13 2019-05-16 00:15:42 +05:30
parent 2837147d36
commit b94e94a636
10 changed files with 217 additions and 119 deletions

View file

@ -24,6 +24,7 @@ import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.R
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.list.listItems
import java.io.File
import java.util.*
@ -95,9 +96,9 @@ class BlacklistFolderChooserDialog : DialogFragment() {
checkIfCanGoUp()
parentContents = listFiles()
return MaterialDialog(activity!!).show {
return MaterialDialog(activity!!, BottomSheet()).show {
title(text = parentFolder!!.absolutePath)
listItems(items = contentsArray(), waitForPositiveButton = false) { dialog, index, text ->
listItems(items = contentsArray(), waitForPositiveButton = false) { _, index, _ ->
onSelection(index)
}
noAutoDismiss()
@ -138,7 +139,7 @@ class BlacklistFolderChooserDialog : DialogFragment() {
dialog?.apply {
setTitle(parentFolder!!.absolutePath)
listItems(items = contentsArray()) { dialog, index, text ->
listItems(items = contentsArray()) { _, index, _ ->
onSelection(index)
}
}

View file

@ -15,6 +15,7 @@
package code.name.monkey.retromusic.dialogs
import android.app.AlarmManager
import android.app.Dialog
import android.app.PendingIntent
import android.content.Context
import android.content.DialogInterface
@ -22,50 +23,172 @@ import android.content.Intent
import android.os.Bundle
import android.os.CountDownTimer
import android.os.SystemClock
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.SeekBar
import android.widget.TextView
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.fragment.app.DialogFragment
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.MaterialUtil
import code.name.monkey.retromusic.Constants.ACTION_QUIT
import code.name.monkey.retromusic.Constants
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ViewUtil
import code.name.monkey.retromusic.views.RoundedBottomSheetDialogFragment
import kotlinx.android.synthetic.main.dialog_sleep_timer.*
import java.util.*
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.WhichButton
import com.afollestad.materialdialogs.actions.getActionButton
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.callbacks.onShow
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView
class SleepTimerDialog : RoundedBottomSheetDialogFragment() {
class SleepTimerDialog : DialogFragment() {
private var seekArcProgress: Int = 0
private lateinit var timerUpdater: TimerUpdater
private lateinit var materialDialog: MaterialDialog
private lateinit var shouldFinishLastSong: CheckBox
private lateinit var seekBar: SeekBar
private lateinit var timerDisplay: TextView
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
timerUpdater.cancel()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
timerUpdater = TimerUpdater()
materialDialog = MaterialDialog(activity!!, BottomSheet())
.title(R.string.action_sleep_timer)
.positiveButton(R.string.action_set) {
PreferenceUtil.getInstance().sleepTimerFinishMusic = shouldFinishLastSong.isChecked
val minutes = seekArcProgress
val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT)
val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000
PreferenceUtil.getInstance().setNextSleepTimerElapsedRealtime(nextSleepTimerElapsedTime)
val am = activity!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi)
Toast.makeText(activity, activity!!.resources.getString(R.string.sleep_timer_set, minutes), Toast.LENGTH_SHORT).show()
}
.negativeButton(android.R.string.cancel) {
if (activity == null) {
return@negativeButton
}
val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE)
if (previous != null) {
val am = activity!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
am.cancel(previous)
previous.cancel()
Toast.makeText(activity, activity!!.resources.getString(R.string.sleep_timer_canceled), Toast.LENGTH_SHORT).show()
}
val musicService = MusicPlayerRemote.musicService
if (musicService != null && musicService.pendingQuit) {
musicService.pendingQuit = false
Toast.makeText(activity, activity!!.resources.getString(R.string.sleep_timer_canceled), Toast.LENGTH_SHORT).show()
}
}
.customView(R.layout.dialog_sleep_timer, scrollable = false)
.show {
onShow {
if (makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) != null) {
timerUpdater.start()
}
}
}
if (activity == null || materialDialog.getCustomView() == null) {
return materialDialog
}
shouldFinishLastSong = materialDialog.getCustomView().findViewById(R.id.shouldFinishLastSong)
seekBar = materialDialog.getCustomView().findViewById(R.id.seekBar)
timerDisplay = materialDialog.getCustomView().findViewById(R.id.timerDisplay)
val finishMusic = PreferenceUtil.getInstance().sleepTimerFinishMusic
shouldFinishLastSong.isChecked = finishMusic
seekArcProgress = PreferenceUtil.getInstance().lastSleepTimerValue
updateTimeDisplayTime()
seekBar.progress = seekArcProgress
setProgressBarColor(ThemeStore.accentColor(context!!))
seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
if (i < 1) {
seekBar.progress = 1
return
}
seekArcProgress = i
updateTimeDisplayTime()
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
PreferenceUtil.getInstance().lastSleepTimerValue = seekArcProgress
}
})
return materialDialog
}
override fun onResume() {
super.onResume()
if (makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) != null) {
timerUpdater.start()
private fun updateTimeDisplayTime() {
timerDisplay.text = "$seekArcProgress min"
}
private fun makeTimerPendingIntent(flag: Int): PendingIntent {
return PendingIntent.getService(activity, 0, makeTimerIntent(), flag)
}
private fun makeTimerIntent(): Intent {
val intent = Intent(activity, MusicService::class.java)
return if (shouldFinishLastSong.isChecked) {
intent.setAction(Constants.ACTION_PENDING_QUIT)
} else intent.setAction(Constants.ACTION_QUIT)
}
private fun updateCancelButton() {
val musicService = MusicPlayerRemote.musicService
if (musicService != null && musicService.pendingQuit) {
materialDialog.getActionButton(WhichButton.NEGATIVE).text = materialDialog.context.getString(R.string.cancel_current_timer)
} else {
materialDialog.getActionButton(WhichButton.NEGATIVE).text = null
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.dialog_sleep_timer, container, false)
private inner class TimerUpdater internal constructor() : CountDownTimer(PreferenceUtil.getInstance().nextSleepTimerElapsedRealTime - SystemClock.elapsedRealtime(), 1000) {
override fun onTick(millisUntilFinished: Long) {
materialDialog.getActionButton(WhichButton.NEGATIVE).text =
String.format("%s %s", materialDialog.context.getString(R.string.cancel_current_timer),
" (" + MusicUtil.getReadableDurationString(millisUntilFinished) + ")")
}
override fun onFinish() {
updateCancelButton()
}
}
/* override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.dialog_sleep_timer, container, false)
}*/
private fun setProgressBarColor(dark: Int) {
ViewUtil.setProgressDrawable(progressSlider = seekBar, newColor = dark)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
/*override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
MaterialUtil.setTint(actionCancel, false)
@ -127,30 +250,7 @@ class SleepTimerDialog : RoundedBottomSheetDialogFragment() {
dismiss()
}
}
}
}*/
private fun updateTimeDisplayTime() {
timerDisplay!!.text = String.format(Locale.getDefault(), "%d min", seekArcProgress)
}
private fun makeTimerPendingIntent(flag: Int): PendingIntent? {
return PendingIntent.getService(activity, 0, makeTimerIntent(), flag)
}
private fun makeTimerIntent(): Intent {
return Intent(activity, MusicService::class.java)
.setAction(ACTION_QUIT)
}
private inner class TimerUpdater internal constructor() : CountDownTimer(PreferenceUtil.getInstance().nextSleepTimerElapsedRealTime - SystemClock.elapsedRealtime(), 1000) {
override fun onTick(millisUntilFinished: Long) {
actionCancel.text = String.format("%s (%s)", getString(R.string.cancel_current_timer), MusicUtil.getReadableDurationString(millisUntilFinished))
}
override fun onFinish() {
actionCancel.text = null
actionCancel.visibility = View.GONE
}
}
}