PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt

210 lines
8.3 KiB
Kotlin
Raw Normal View History

2019-03-03 09:20:15 +00:00
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
2018-12-06 08:52:57 +00:00
package code.name.monkey.retromusic.dialogs
import android.app.AlarmManager
2019-05-15 18:45:42 +00:00
import android.app.Dialog
2018-12-06 08:52:57 +00:00
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.CountDownTimer
import android.os.SystemClock
2019-05-15 18:45:42 +00:00
import android.widget.CheckBox
2018-12-06 08:52:57 +00:00
import android.widget.SeekBar
2019-05-15 18:45:42 +00:00
import android.widget.TextView
2018-12-06 08:52:57 +00:00
import android.widget.Toast
2019-05-15 18:45:42 +00:00
import androidx.fragment.app.DialogFragment
2018-12-06 08:52:57 +00:00
import code.name.monkey.appthemehelper.ThemeStore
2019-11-28 14:16:54 +00:00
import code.name.monkey.appthemehelper.util.TintHelper
2018-12-06 08:52:57 +00:00
import code.name.monkey.retromusic.R
2019-05-15 18:45:42 +00:00
import code.name.monkey.retromusic.helper.MusicPlayerRemote
2018-12-06 08:52:57 +00:00
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.ACTION_PENDING_QUIT
import code.name.monkey.retromusic.service.MusicService.ACTION_QUIT
2018-12-06 08:52:57 +00:00
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
2019-02-17 17:01:35 +00:00
import code.name.monkey.retromusic.util.ViewUtil
2019-09-17 19:36:13 +00:00
import com.afollestad.materialdialogs.LayoutMode
2019-05-15 18:45:42 +00:00
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
2018-12-06 08:52:57 +00:00
2019-05-15 18:45:42 +00:00
class SleepTimerDialog : DialogFragment() {
2018-12-06 08:52:57 +00:00
private var seekArcProgress: Int = 0
private lateinit var timerUpdater: TimerUpdater
2019-05-15 18:45:42 +00:00
private lateinit var materialDialog: MaterialDialog
private lateinit var shouldFinishLastSong: CheckBox
private lateinit var seekBar: SeekBar
private lateinit var timerDisplay: TextView
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
timerUpdater = TimerUpdater()
2019-09-17 19:36:13 +00:00
materialDialog = MaterialDialog(requireContext(), BottomSheet(LayoutMode.WRAP_CONTENT))
2020-02-01 17:53:26 +00:00
.title(R.string.action_sleep_timer)
.cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner)
.positiveButton(R.string.action_set) {
PreferenceUtil.getInstance(requireContext()).sleepTimerFinishMusic =
shouldFinishLastSong.isChecked
2020-02-01 17:53:26 +00:00
val minutes = seekArcProgress
val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT)
val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000
PreferenceUtil.getInstance(requireContext())
.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) {
2019-05-15 18:45:42 +00:00
val am = activity!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
2020-02-01 17:53:26 +00:00
am.cancel(previous)
previous.cancel()
Toast.makeText(
activity,
activity!!.resources.getString(R.string.sleep_timer_canceled),
Toast.LENGTH_SHORT
).show()
2019-05-15 18:45:42 +00:00
}
2020-02-01 17:53:26 +00:00
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()
2019-05-15 18:45:42 +00:00
}
2020-02-01 17:53:26 +00:00
}
.customView(R.layout.dialog_sleep_timer, scrollable = false)
.show {
onShow {
if (makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) != null) {
timerUpdater.start()
2019-05-15 18:45:42 +00:00
}
}
2020-02-01 17:53:26 +00:00
}
2019-05-15 18:45:42 +00:00
if (activity == null || materialDialog.getCustomView() == null) {
return materialDialog
}
shouldFinishLastSong =
materialDialog.getCustomView().findViewById(R.id.shouldFinishLastSong)
2019-05-15 18:45:42 +00:00
seekBar = materialDialog.getCustomView().findViewById(R.id.seekBar)
timerDisplay = materialDialog.getCustomView().findViewById(R.id.timerDisplay)
TintHelper.setTintAuto(
shouldFinishLastSong,
ThemeStore.accentColor(requireContext()),
false
)
2019-05-15 18:45:42 +00:00
val finishMusic = PreferenceUtil.getInstance(requireContext()).sleepTimerFinishMusic
2019-05-15 18:45:42 +00:00
shouldFinishLastSong.isChecked = finishMusic
seekArcProgress = PreferenceUtil.getInstance(requireContext()).lastSleepTimerValue
2019-05-15 18:45:42 +00:00
updateTimeDisplayTime()
seekBar.progress = seekArcProgress
2019-11-28 14:16:54 +00:00
setProgressBarColor(ThemeStore.accentColor(requireContext()))
2019-05-15 18:45:42 +00:00
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(requireContext()).lastSleepTimerValue = seekArcProgress
2019-05-15 18:45:42 +00:00
}
})
return materialDialog
}
private fun updateTimeDisplayTime() {
timerDisplay.text = "$seekArcProgress min"
}
private fun makeTimerPendingIntent(flag: Int): PendingIntent? {
2019-05-15 18:45:42 +00:00
return PendingIntent.getService(activity, 0, makeTimerIntent(), flag)
2018-12-06 08:52:57 +00:00
}
2019-05-15 18:45:42 +00:00
private fun makeTimerIntent(): Intent {
val intent = Intent(activity, MusicService::class.java)
return if (shouldFinishLastSong.isChecked) {
intent.setAction(ACTION_PENDING_QUIT)
} else intent.setAction(ACTION_QUIT)
2019-05-15 18:45:42 +00:00
}
private fun updateCancelButton() {
val musicService = MusicPlayerRemote.musicService
if (musicService != null && musicService.pendingQuit) {
2020-02-01 17:53:26 +00:00
materialDialog.getActionButton(WhichButton.NEGATIVE).text =
materialDialog.context.getString(R.string.cancel_current_timer)
2019-05-15 18:45:42 +00:00
} else {
materialDialog.getActionButton(WhichButton.NEGATIVE).text = null
2018-12-06 08:52:57 +00:00
}
}
2020-02-01 17:53:26 +00:00
private inner class TimerUpdater internal constructor() : CountDownTimer(
PreferenceUtil.getInstance(requireContext()).nextSleepTimerElapsedRealTime - SystemClock.elapsedRealtime(),
1000
) {
2019-05-15 18:45:42 +00:00
override fun onTick(millisUntilFinished: Long) {
materialDialog.getActionButton(WhichButton.NEGATIVE).text =
2020-02-01 17:53:26 +00:00
String.format(
"%s %s", materialDialog.context.getString(R.string.cancel_current_timer),
" (" + MusicUtil.getReadableDurationString(millisUntilFinished) + ")"
)
2019-05-15 18:45:42 +00:00
}
override fun onFinish() {
updateCancelButton()
}
2018-12-06 08:52:57 +00:00
}
2019-11-28 14:16:54 +00:00
2018-12-06 08:52:57 +00:00
private fun setProgressBarColor(dark: Int) {
2019-02-17 17:01:35 +00:00
ViewUtil.setProgressDrawable(progressSlider = seekBar, newColor = dark)
2018-12-06 08:52:57 +00:00
}
}