diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 45b5654..88ea3aa 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,8 +1,5 @@ - - diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 169fd0d..5cd135a 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,8 +1,10 @@ + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..eb2873e --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0274953..4a6df77 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ configurations.all { } android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" + compileSdkVersion 30 + buildToolsVersion "30.0.0" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -28,7 +28,7 @@ android { defaultConfig { applicationId "fr.forum_thalie.tsumugi" minSdkVersion 16 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 115 versionName "1.1.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt b/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt index 91fd2c7..c325d77 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt @@ -117,7 +117,7 @@ class MainActivity : BaseActivity() { } } - override fun onRestoreInstanceState(savedInstanceState: Bundle?) { + override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState ?: Bundle()) // Now that BottomNavigationBar has restored its instance state // and its selectedItemId, we can proceed with setting up the diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/alarm/RadioAlarmExtensions.kt b/app/src/main/java/fr/forum_thalie/tsumugi/alarm/RadioAlarmExtensions.kt new file mode 100644 index 0000000..23131df --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/alarm/RadioAlarmExtensions.kt @@ -0,0 +1,33 @@ +package fr.forum_thalie.tsumugi.alarm + +import android.content.Context +import android.content.Intent +import fr.forum_thalie.tsumugi.Actions +import fr.forum_thalie.tsumugi.RadioService + + +fun playOnFallback(c: Context) { + val a = Actions.PLAY_OR_FALLBACK + val i = Intent(c, RadioService::class.java) + i.putExtra("action", a.name) + c.startService(i) +} + +fun resume(c: Context) +{ + +} + +fun resumeStop(c: Context) { + val a = Actions.PLAY + val i = Intent(c, RadioService::class.java) + i.putExtra("action", a.name) + c.startService(i) +} + +fun resumePlay(c: Context) { + val a = Actions.PLAY + val i = Intent(c, RadioService::class.java) + i.putExtra("action", a.name) + c.startService(i) +} \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt index 4b07606..cfd55cc 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt @@ -2,15 +2,29 @@ package fr.forum_thalie.tsumugi.preferences import android.app.TimePickerDialog import android.content.Context +import android.content.Intent +import android.media.AudioManager import android.os.Bundle import android.util.Log +import android.view.KeyEvent +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.content.edit import androidx.preference.* import fr.forum_thalie.tsumugi.* import fr.forum_thalie.tsumugi.R import fr.forum_thalie.tsumugi.alarm.RadioAlarm +import fr.forum_thalie.tsumugi.playerstore.PlayerStore +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.GlobalScope.coroutineContext +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.util.* +import kotlin.coroutines.CoroutineContext +import kotlin.math.max +import kotlin.math.min + class AlarmFragment : PreferenceFragmentCompat() { @@ -130,11 +144,87 @@ class AlarmFragment : PreferenceFragmentCompat() { } + val testAlarmVolume: Preference? = findPreference("testAlarmVolume") + testAlarmVolume!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { + + // get previous state: if it's playing, we'll resume playing as multimedia; if it was stopped, we'll stop + val isPlayingMultimedia: Boolean = PlayerStore.instance.isPlaying.value ?: false + + val builder1 = AlertDialog.Builder(requireContext()) + builder1.setTitle(R.string.test_alarm_volume) + builder1.setMessage(R.string.popupTestAlarmVolume) + builder1.setCancelable(false) + builder1.setPositiveButton( + getString(R.string.finished) + ) { dialog, _ -> + // put the radio back to media sound, or off if it was off. + if (isPlayingMultimedia) + { + actionOnService(Actions.PLAY) + } else { + actionOnService(Actions.STOP) + } + dialog.cancel() + } + + val adjustAlarmVolume: (Int) -> Unit = debounce(50, coroutineContext) { + val keyCode = it + + val audioManager = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager + val currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM) + val minVolume = 0 // audioManager.getStreamMinVolume(AudioManager.STREAM_ALARM) <- require API28+ + val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM) + Log.d(tag, "current, max = $currentVolume, $maxVolume") + if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { + audioManager.setStreamVolume(AudioManager.STREAM_ALARM, max(currentVolume - 1, minVolume), AudioManager.FLAG_SHOW_UI) + + } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){ + audioManager.setStreamVolume(AudioManager.STREAM_ALARM, min(currentVolume + 1, maxVolume), AudioManager.FLAG_SHOW_UI) + } + + } + + builder1.setOnKeyListener { dialogInterface, i, event -> + adjustAlarmVolume(i) + true + } + + val alert11 = builder1.create() + + // start as alarm + actionOnService(Actions.PLAY_OR_FALLBACK) + + alert11.show() + + true + } + alarmDays?.isEnabled = isWakingUp?.isChecked ?: false timeSet?.isEnabled = isWakingUp?.isChecked ?: false snoozeDuration?.isEnabled = isWakingUp?.isChecked ?: false } + private fun actionOnService (a: Actions) { + // start as alarm + val i = Intent(requireContext(), RadioService::class.java) + i.putExtra("action", a.name) + requireContext().startService(i) + } + + private fun debounce(delayMs: Long = 500L, + coroutineContext: CoroutineContext, + f: (T) -> Unit): (T) -> Unit { + var debounceJob: Job? = null + return { param: T -> + if (debounceJob?.isCompleted != false) { + debounceJob = CoroutineScope(coroutineContext).launch { + delay(delayMs) + f(param) + } + } + } + } + } \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c2e04af..9e99285 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -56,5 +56,9 @@ Raffraîchir les données \"Play\" au branchement de la prise casque Paramètres + Tester et ajuster le volume de l\'alarme + Touchez pour écouter et régler le volume + La radio est à présent lancée en mode alarme. Ajustez le volume avec les boutons de volume de votre appareil. + Terminé diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3847fed..ee12429 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,5 +76,9 @@ Refresh data Auto play when plugging headphones Settings + Test and change alarm volume + Touch this to listen to the alarm volume and set it up + The radio stream is now started in alarm mode. Adjust the volume with the volume buttons on your device. + Done diff --git a/app/src/main/res/xml/alarm_preferences.xml b/app/src/main/res/xml/alarm_preferences.xml index 625ee4c..75c5abf 100644 --- a/app/src/main/res/xml/alarm_preferences.xml +++ b/app/src/main/res/xml/alarm_preferences.xml @@ -37,4 +37,10 @@ android:summary="%s" /> + + \ No newline at end of file