AlarmAdjustVolumeFragment.kt 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package fr.riff_app.riff.preferences
  2. import android.content.Context
  3. import android.content.Intent
  4. import android.media.AudioManager
  5. import android.os.Bundle
  6. import android.view.KeyEvent
  7. import android.view.LayoutInflater
  8. import android.view.View
  9. import android.view.ViewGroup
  10. import androidx.appcompat.app.AlertDialog
  11. import androidx.appcompat.app.AppCompatActivity
  12. import androidx.preference.PreferenceFragmentCompat
  13. import androidx.preference.PreferenceManager
  14. import androidx.preference.SeekBarPreference
  15. import androidx.preference.SwitchPreferenceCompat
  16. import fr.riff_app.riff.Actions
  17. import fr.riff_app.riff.R
  18. import fr.riff_app.riff.RadioService
  19. import fr.riff_app.riff.playerstore.PlayerStore
  20. import kotlinx.coroutines.*
  21. import kotlin.coroutines.CoroutineContext
  22. import kotlin.math.max
  23. import kotlin.math.min
  24. class AlarmAdjustVolumeFragment : PreferenceFragmentCompat() {
  25. override fun onAttach(context: Context) {
  26. (activity as AppCompatActivity).supportActionBar?.title = context.getString(R.string.test_alarm_volume)
  27. super.onAttach(context)
  28. }
  29. // get previous state: if it's playing, we'll resume playing as multimedia; if it was stopped, we'll stop
  30. private var isPlayingMultimedia: Boolean = PlayerStore.instance.isPlaying.value ?: false
  31. override fun onStop() {
  32. if (isPlayingMultimedia)
  33. {
  34. actionOnService(Actions.PLAY)
  35. } else {
  36. actionOnService(Actions.PAUSE)
  37. }
  38. PlayerStore.instance.volume.value = PreferenceManager.getDefaultSharedPreferences(requireContext()).getInt("volume", 100)
  39. super.onStop()
  40. }
  41. override fun onResume() {
  42. isPlayingMultimedia = PlayerStore.instance.isPlaying.value ?: false
  43. // start as alarm
  44. actionOnService(Actions.PLAY_OR_FALLBACK)
  45. super.onResume()
  46. }
  47. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  48. super.onViewCreated(view, savedInstanceState)
  49. fun <T> debounce(delayMs: Long = 500L,
  50. coroutineContext: CoroutineContext,
  51. f: (T) -> Unit): (T) -> Unit {
  52. var debounceJob: Job? = null
  53. return { param: T ->
  54. if (debounceJob?.isCompleted != false) {
  55. debounceJob = CoroutineScope(coroutineContext).launch {
  56. delay(delayMs)
  57. f(param)
  58. }
  59. }
  60. }
  61. }
  62. val adjustAlarmVolume: (Int) -> Unit = debounce<Int>(50, GlobalScope.coroutineContext) {
  63. android.util.Log.d(tag, "button $it pushed")
  64. val keyCode = it
  65. val audioManager = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager
  66. audioManager.apply {
  67. val currentVolume = this.getStreamVolume(AudioManager.STREAM_ALARM)
  68. val minVolume = 0 // audioManager.getStreamMinVolume(AudioManager.STREAM_ALARM) <- require API28+
  69. val maxVolume = this.getStreamMaxVolume(AudioManager.STREAM_ALARM)
  70. if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
  71. this.setStreamVolume(AudioManager.STREAM_ALARM, max(currentVolume - 1, minVolume), AudioManager.FLAG_SHOW_UI)
  72. } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){
  73. this.setStreamVolume(AudioManager.STREAM_ALARM, min(currentVolume + 1, maxVolume), AudioManager.FLAG_SHOW_UI)
  74. } else {
  75. }
  76. }
  77. }
  78. view.isFocusableInTouchMode = true;
  79. view.requestFocus();
  80. view.setOnKeyListener { _, i, event ->
  81. if (i == KeyEvent.KEYCODE_VOLUME_DOWN || i == KeyEvent.KEYCODE_VOLUME_UP) {
  82. adjustAlarmVolume(i)
  83. true
  84. } else {
  85. false
  86. }
  87. }
  88. }
  89. override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
  90. setPreferencesFromResource(R.xml.alarm_adjust_volume_preferences, rootKey)
  91. val alarmVolumeSeekBar = findPreference<SeekBarPreference>("alarmVolume")
  92. alarmVolumeSeekBar?.apply {
  93. min = 0
  94. max = 100
  95. updatesContinuously = true
  96. setOnPreferenceChangeListener { _, newValue ->
  97. actionOnService(Actions.VOLUME, newValue as Int)
  98. true
  99. }
  100. }
  101. }
  102. private fun actionOnService(a: Actions, v: Int = 0)
  103. {
  104. val i = Intent(requireContext(), RadioService::class.java)
  105. i.putExtra("action", a.name)
  106. i.putExtra("value", v)
  107. //[REMOVE LOG CALLS]Log.d(tag, "Sending intent ${a.name}")
  108. requireContext().startService(i)
  109. }
  110. }