Merge branch 'sleep-timer' into 'develop'

#1270 add sleep timer

See merge request ultrasonic/ultrasonic!1177
This commit is contained in:
Alex Doe 2025-04-03 06:53:59 +00:00
commit 1089e82489
6 changed files with 122 additions and 0 deletions

View File

@ -0,0 +1,40 @@
package org.moire.ultrasonic.dialog
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.widget.Button
import android.widget.NumberPicker
import org.moire.ultrasonic.R
class SleepTimePickerDialog(context: Context, private val onTimeSetListener: OnTimeSetListener) :
Dialog(context) {
private val minMinutes: Int = 1
private val maxxMinutes: Int = 90
private val presetMinutes: Int = 30
private lateinit var minutePicker: NumberPicker
interface OnTimeSetListener {
fun onTimeSet(minutes: Int)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.sleep_minutes_picker)
minutePicker = findViewById(R.id.minutePicker)
val setButton = findViewById<Button>(R.id.setButton)
minutePicker.minValue = minMinutes
minutePicker.maxValue = maxxMinutes
minutePicker.value = presetMinutes
setButton.setOnClickListener {
onTimeSetListener.onTimeSet(minutePicker.value)
dismiss()
}
}
}

View File

@ -71,6 +71,7 @@ import kotlin.math.min
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.koin.androidx.scope.ScopeFragment
@ -84,6 +85,7 @@ import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline
import org.moire.ultrasonic.data.ActiveServerProvider.Companion.shouldUseId3Tags
import org.moire.ultrasonic.data.RatingUpdate
import org.moire.ultrasonic.databinding.CurrentPlayingBinding
import org.moire.ultrasonic.dialog.SleepTimePickerDialog
import org.moire.ultrasonic.domain.Identifiable
import org.moire.ultrasonic.domain.MusicDirectory
import org.moire.ultrasonic.domain.Track
@ -713,6 +715,24 @@ class PlayerFragment :
toggleFullScreenAlbumArt()
return true
}
R.id.menu_item_sleep -> {
val timePickerDialog = SleepTimePickerDialog(
requireContext(),
object : SleepTimePickerDialog.OnTimeSetListener {
override fun onTimeSet(minutes: Int) {
CoroutineScope(Dispatchers.Main).launch {
delay(minutes * 60 * 1000L)
launch(CommunicationError.getHandler(context)) {
mediaPlayerManager.pause()
}
}
}
}
)
timePickerDialog.show()
return true
}
R.id.menu_item_clear_playlist -> {
mediaPlayerManager.isShufflePlayEnabled = false
mediaPlayerManager.clear()

View File

@ -0,0 +1,31 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="14dp"
android:viewportWidth="14"
android:viewportHeight="14">
<group>
<clip-path
android:pathData="m0,0h14v14h-14z"/>
<path
android:strokeWidth="1"
android:pathData="m13.5,7c0,1.286 -0.381,2.542 -1.095,3.611 -0.714,1.069 -1.729,1.902 -2.917,2.394 -1.188,0.492 -2.495,0.621 -3.756,0.37 -1.261,-0.251 -2.419,-0.87 -3.328,-1.779s-1.528,-2.067 -1.779,-3.328c-0.251,-1.261 -0.122,-2.568 0.37,-3.756 0.492,-1.188 1.325,-2.203 2.394,-2.917 1.069,-0.714 2.326,-1.095 3.611,-1.095"
android:strokeLineJoin="round"
android:fillColor="#00000000"
android:strokeColor="#000001"
android:strokeLineCap="round"/>
<path
android:strokeWidth="1"
android:pathData="m7,4.5v2.5l-2.54,2.96"
android:strokeLineJoin="round"
android:fillColor="#00000000"
android:strokeColor="#000001"
android:strokeLineCap="round"/>
<path
android:strokeWidth="1"
android:pathData="m10,0.5h3.5l-3.5,4h3.5"
android:strokeLineJoin="round"
android:fillColor="#00000000"
android:strokeColor="#000001"
android:strokeLineCap="round"/>
</group>
</vector>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp">
<NumberPicker
android:id="@+id/minutePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
/>
<Button
android:id="@+id/setButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/minutePicker"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"
android:text="@string/set_minutes_until_sleep" />
</RelativeLayout>

View File

@ -4,6 +4,11 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<item
a:id="@+id/menu_item_sleep"
a:icon="@drawable/time_sleep"
app:showAsAction="ifRoom"
a:title="@string/set_sleep_timer"/>
<item
a:id="@+id/menu_item_toggle_list"
a:icon="@drawable/media_toggle_list"

View File

@ -458,6 +458,8 @@
to the controller</string>
<string name="shortcut_play_random_songs_short">Random songs</string>
<string name="shortcut_play_random_songs_long">Play random songs</string>
<string name="set_sleep_timer">set sleep timer</string>
<string name="set_minutes_until_sleep">Set minutes until sleep</string>
</resources>