新增:自动任务-快捷指令-警报提醒动作添加振动提醒的功能 #554 #482

This commit is contained in:
pppscn 2024-11-15 15:37:21 +08:00
parent f029048d09
commit 7c33566696
9 changed files with 43 additions and 47 deletions

View File

@ -5,9 +5,9 @@ import java.io.Serializable
data class AlarmSetting( data class AlarmSetting(
var description: String = "", //描述 var description: String = "", //描述
var action: String = "stop", //动作: start=启动警报, stop=停止警报 var action: String = "stop", //动作: start=启动警报, stop=停止警报
var volume: Int = 80, //播放音量0=禁用 var volume: Int = 80, //播放音量0-100
var playTimes: Int = 1, //播放次数0=无限循环 var playTimes: Int = 1, //播放次数0=无限循环-1=禁用
var music: String = "", //音乐文件 var music: String = "", //音乐文件
var repeatTimes: Int = 5, //振动重复次数0=禁用 var repeatTimes: Int = 5, //振动重复次数0=无限循环,-1=禁用
var vibrate: String = "---___===___", //振动律动:=强振动, -弱震动, _不振动, 时长都是100ms var vibrate: String = "---___===___", //振动律动:=强振动, -弱震动, _不振动, 时长都是100ms
) : Serializable ) : Serializable

View File

@ -86,29 +86,11 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
}) })
binding!!.sbEnableMusic.setOnCheckedChangeListener { _, isChecked -> binding!!.sbEnableMusic.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) { binding!!.layoutAlarmSettingsContent.visibility = if (isChecked) View.VISIBLE else View.GONE
binding!!.layoutAlarmSettingsContent.visibility = View.VISIBLE
val volume = binding!!.xsbVolume.selectedNumber
if (volume == 0) {
binding!!.xsbVolume.setDefaultValue(80)
}
} else {
binding!!.layoutAlarmSettingsContent.visibility = View.GONE
binding!!.xsbVolume.setDefaultValue(0)
}
checkSetting(true) checkSetting(true)
} }
binding!!.sbEnableVibrate.setOnCheckedChangeListener { _, isChecked -> binding!!.sbEnableVibrate.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) { binding!!.layoutVibrateSettingsContent.visibility = if (isChecked) View.VISIBLE else View.GONE
binding!!.layoutVibrateSettingsContent.visibility = View.VISIBLE
val repeatTimes = binding!!.xsbRepeatTimes.selectedNumber
if (repeatTimes == 0) {
binding!!.xsbRepeatTimes.setDefaultValue(5)
}
} else {
binding!!.layoutVibrateSettingsContent.visibility = View.GONE
binding!!.xsbRepeatTimes.setDefaultValue(0)
}
checkSetting(true) checkSetting(true)
} }
@ -128,12 +110,12 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
} }
} }
binding!!.xsbVolume.setDefaultValue(settingVo.volume) binding!!.xsbVolume.setDefaultValue(settingVo.volume)
binding!!.xsbLoopTimes.setDefaultValue(settingVo.playTimes) binding!!.xsbPlayTimes.setDefaultValue(if (settingVo.playTimes >= 0) settingVo.playTimes else 0)
binding!!.etMusicPath.setText(settingVo.music) binding!!.etMusicPath.setText(settingVo.music)
binding!!.xsbRepeatTimes.setDefaultValue(settingVo.repeatTimes) binding!!.xsbRepeatTimes.setDefaultValue(if (settingVo.repeatTimes >= 0) settingVo.repeatTimes else 0)
binding!!.etVibrationEffect.setText(settingVo.vibrate) binding!!.etVibrationEffect.setText(settingVo.vibrate)
binding!!.sbEnableMusic.isChecked = settingVo.volume > 0 binding!!.sbEnableMusic.isChecked = settingVo.playTimes >= 0
binding!!.sbEnableVibrate.isChecked = settingVo.repeatTimes > 0 binding!!.sbEnableVibrate.isChecked = settingVo.repeatTimes >= 0
} }
override fun onDestroyView() { override fun onDestroyView() {
@ -150,7 +132,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
binding!!.xsbVolume.setOnSeekBarListener { _, _ -> binding!!.xsbVolume.setOnSeekBarListener { _, _ ->
checkSetting(true) checkSetting(true)
} }
binding!!.xsbLoopTimes.setOnSeekBarListener { _, _ -> binding!!.xsbPlayTimes.setOnSeekBarListener { _, _ ->
checkSetting(true) checkSetting(true)
} }
binding!!.rgAlarmState.setOnCheckedChangeListener { _, checkedId -> binding!!.rgAlarmState.setOnCheckedChangeListener { _, checkedId ->
@ -222,7 +204,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
try { try {
val settingVo = checkSetting() val settingVo = checkSetting()
Log.d(TAG, settingVo.toString()) Log.d(TAG, settingVo.toString())
if (settingVo.volume == 0 && settingVo.repeatTimes == 0) { if (settingVo.playTimes < 0 && settingVo.repeatTimes < 0) {
XToastUtils.error(getString(R.string.alarm_settings_error)) XToastUtils.error(getString(R.string.alarm_settings_error))
return return
} }
@ -265,7 +247,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onGranted(permissions: List<String>, all: Boolean) { override fun onGranted(permissions: List<String>, all: Boolean) {
val settingVo = checkSetting() val settingVo = checkSetting()
if (settingVo.volume == 0 && settingVo.repeatTimes == 0) { if (settingVo.playTimes < 0 && settingVo.repeatTimes < 0) {
XToastUtils.error(getString(R.string.alarm_settings_error)) XToastUtils.error(getString(R.string.alarm_settings_error))
return return
} }
@ -304,24 +286,28 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
val enableMusic = binding!!.sbEnableMusic.isChecked val enableMusic = binding!!.sbEnableMusic.isChecked
val enableVibrate = binding!!.sbEnableVibrate.isChecked val enableVibrate = binding!!.sbEnableVibrate.isChecked
val volume = binding!!.xsbVolume.selectedNumber val volume = binding!!.xsbVolume.selectedNumber
val loopTimes = binding!!.xsbLoopTimes.selectedNumber var playTimes = binding!!.xsbPlayTimes.selectedNumber
val music = binding!!.etMusicPath.text.toString().trim() val music = binding!!.etMusicPath.text.toString().trim()
val repeatTimes = binding!!.xsbRepeatTimes.selectedNumber var repeatTimes = binding!!.xsbRepeatTimes.selectedNumber
val vibrationEffect = binding!!.etVibrationEffect.text.toString().trim() val vibrationEffect = binding!!.etVibrationEffect.text.toString().trim()
val description = StringBuilder() val description = StringBuilder()
val action = if (binding!!.rgAlarmState.checkedRadioButtonId == R.id.rb_start_alarm) { val action = if (binding!!.rgAlarmState.checkedRadioButtonId == R.id.rb_start_alarm) {
description.append(getString(R.string.start_alarm)) description.append(getString(R.string.start_alarm))
if (enableMusic) { if (enableMusic) {
description.append(", ").append(getString(R.string.alarm_volume)).append(":").append(volume).append("%") description.append(", ").append(getString(R.string.alarm_volume)).append(":").append(volume).append("%")
description.append(", ").append(getString(R.string.alarm_play_times)).append(":").append(loopTimes) description.append(", ").append(getString(R.string.alarm_play_times)).append(":").append(playTimes)
if (music.isNotEmpty()) { if (music.isNotEmpty()) {
description.append(", ").append(getString(R.string.alarm_music)).append(":").append(music) description.append(", ").append(getString(R.string.alarm_music)).append(":").append(music)
} }
} else {
playTimes = -1
} }
if (enableVibrate) { if (enableVibrate) {
vibrationEffect.ifEmpty { "---___===___".also { binding!!.etVibrationEffect.setText(it) } } vibrationEffect.ifEmpty { "---___===___".also { binding!!.etVibrationEffect.setText(it) } }
description.append(", ").append(getString(R.string.alarm_vibration_effect)).append(":").append(vibrationEffect) description.append(", ").append(getString(R.string.alarm_vibration_effect)).append(":").append(vibrationEffect)
description.append(", ").append(getString(R.string.alarm_repeat_times)).append(":").append(repeatTimes) description.append(", ").append(getString(R.string.alarm_repeat_times)).append(":").append(repeatTimes)
} else {
repeatTimes = -1
} }
"start" "start"
} else { } else {
@ -333,7 +319,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
binding!!.tvDescription.text = description.toString() binding!!.tvDescription.text = description.toString()
} }
return AlarmSetting(description.toString(), action, volume, loopTimes, music, repeatTimes, vibrationEffect) return AlarmSetting(description.toString(), action, volume, playTimes, music, repeatTimes, vibrationEffect)
} }
private fun findAudioFiles(directoryPath: String): List<String> { private fun findAudioFiles(directoryPath: String): List<String> {

View File

@ -111,7 +111,7 @@ class ForegroundService : Service() {
alarmPlayer = null alarmPlayer = null
if (alarm.action == "start") { if (alarm.action == "start") {
//播放音乐 //播放音乐
if (alarm.volume > 0) { if (alarm.playTimes >= 0) {
//获取音量 //获取音量
val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
@ -178,10 +178,9 @@ class ForegroundService : Service() {
} }
} }
//振动提醒 //振动提醒
if (alarm.repeatTimes > 0) { if (alarm.repeatTimes >= 0) {
isVibrating = true isVibrating = true
val patternString = alarm.vibrate.repeat(alarm.repeatTimes) vibrationUtils.startVibration(alarm.vibrate, alarm.repeatTimes)
vibrationUtils.startVibration(patternString)
} }
} }
} }

View File

@ -12,13 +12,15 @@ class VibrationUtils(context: Context) {
private val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator private val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
private var currentRepeat = 0
var isVibrating = false var isVibrating = false
private set private set
fun startVibration(patternString: String) { fun startVibration(patternString: String, repeatTimes: Int) {
isVibrating = true isVibrating = true
currentRepeat = 0
val parsedPattern = parsePattern(patternString) val parsedPattern = parsePattern(patternString)
vibratePattern(parsedPattern, 0) vibratePattern(parsedPattern, 0, repeatTimes)
} }
fun stopVibration() { fun stopVibration() {
@ -55,7 +57,7 @@ class VibrationUtils(context: Context) {
return Triple(duration, intensity > 0, intensity) return Triple(duration, intensity > 0, intensity)
} }
private fun vibratePattern(parsedPattern: List<Triple<Long, Boolean, Int>>, index: Int) { private fun vibratePattern(parsedPattern: List<Triple<Long, Boolean, Int>>, index: Int, repeatTimes: Int) {
if (isVibrating && index < parsedPattern.size) { if (isVibrating && index < parsedPattern.size) {
val (duration, shouldVibrate, intensity) = parsedPattern[index] val (duration, shouldVibrate, intensity) = parsedPattern[index]
if (shouldVibrate) { if (shouldVibrate) {
@ -69,7 +71,16 @@ class VibrationUtils(context: Context) {
handler.postDelayed({ handler.postDelayed({
if (isVibrating) { if (isVibrating) {
vibrator.cancel() vibrator.cancel()
vibratePattern(parsedPattern, index + 1) if (index + 1 < parsedPattern.size) {
vibratePattern(parsedPattern, index + 1, repeatTimes)
} else {
currentRepeat++
if (repeatTimes == 0 || currentRepeat < repeatTimes) {
vibratePattern(parsedPattern, 0, repeatTimes) // Restart pattern
} else {
stopVibration()
}
}
} }
}, duration) }, duration)
} }

View File

@ -155,7 +155,7 @@
android:textStyle="bold" /> android:textStyle="bold" />
<com.xuexiang.xui.widget.picker.XSeekBar <com.xuexiang.xui.widget.picker.XSeekBar
android:id="@+id/xsb_loop_times" android:id="@+id/xsb_play_times"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="5dp" android:layout_marginStart="5dp"

View File

@ -1131,7 +1131,7 @@
<string name="alarm_volume">Alarm Volume</string> <string name="alarm_volume">Alarm Volume</string>
<string name="alarm_play_times">Play Times(0=Infinite)</string> <string name="alarm_play_times">Play Times(0=Infinite)</string>
<string name="alarm_vibrate_settings">Vibrate Phone</string> <string name="alarm_vibrate_settings">Vibrate Phone</string>
<string name="alarm_repeat_times">Repeat Times</string> <string name="alarm_repeat_times">Repeat Times(0=Infinite)</string>
<string name="alarm_vibration_effect">Vibration Effect</string> <string name="alarm_vibration_effect">Vibration Effect</string>
<string name="alarm_vibration_effect_tips">Syntax: =[strong], -[weak], _[no], 100ms each</string> <string name="alarm_vibration_effect_tips">Syntax: =[strong], -[weak], _[no], 100ms each</string>
<string name="alarm_vibration_effect_1">Strong vibration</string> <string name="alarm_vibration_effect_1">Strong vibration</string>

View File

@ -1132,7 +1132,7 @@
<string name="alarm_volume">播放音量</string> <string name="alarm_volume">播放音量</string>
<string name="alarm_play_times">播放次数(0=无限)</string> <string name="alarm_play_times">播放次数(0=无限)</string>
<string name="alarm_vibrate_settings">振动手机</string> <string name="alarm_vibrate_settings">振动手机</string>
<string name="alarm_repeat_times">重复次数</string> <string name="alarm_repeat_times">重复次数(0=无限)</string>
<string name="alarm_vibration_effect">振动效果</string> <string name="alarm_vibration_effect">振动效果</string>
<string name="alarm_vibration_effect_tips">语法:=[强振动], -[弱震动], _[不振动], 每次100ms</string> <string name="alarm_vibration_effect_tips">语法:=[强振动], -[弱震动], _[不振动], 每次100ms</string>
<string name="alarm_vibration_effect_1">强振动 100ms</string> <string name="alarm_vibration_effect_1">强振动 100ms</string>

View File

@ -1125,7 +1125,7 @@
<string name="alarm_volume">播放音量</string> <string name="alarm_volume">播放音量</string>
<string name="alarm_play_times">播放次數(0=無限)</string> <string name="alarm_play_times">播放次數(0=無限)</string>
<string name="alarm_vibrate_settings">振動手機</string> <string name="alarm_vibrate_settings">振動手機</string>
<string name="alarm_repeat_times">重複次數</string> <string name="alarm_repeat_times">重複次數(0=無限)</string>
<string name="alarm_vibration_effect">振動效果</string> <string name="alarm_vibration_effect">振動效果</string>
<string name="alarm_vibration_effect_tips">語法:=[強振動], -[弱振動], _[不振動], 每次100ms</string> <string name="alarm_vibration_effect_tips">語法:=[強振動], -[弱振動], _[不振動], 每次100ms</string>
<string name="alarm_vibration_effect_1">強振動 100ms</string> <string name="alarm_vibration_effect_1">強振動 100ms</string>

View File

@ -1159,7 +1159,7 @@
<string name="alarm_volume">播放音量</string> <string name="alarm_volume">播放音量</string>
<string name="alarm_play_times">播放次数(0=无限)</string> <string name="alarm_play_times">播放次数(0=无限)</string>
<string name="alarm_vibrate_settings">振动手机</string> <string name="alarm_vibrate_settings">振动手机</string>
<string name="alarm_repeat_times">重复次数</string> <string name="alarm_repeat_times">重复次数(0=无限)</string>
<string name="alarm_vibration_effect">振动效果</string> <string name="alarm_vibration_effect">振动效果</string>
<string name="alarm_vibration_effect_tips">语法:=[强振动], -[弱震动], _[不振动], 每次100ms</string> <string name="alarm_vibration_effect_tips">语法:=[强振动], -[弱震动], _[不振动], 每次100ms</string>
<string name="alarm_vibration_effect_1">强振动 100ms</string> <string name="alarm_vibration_effect_1">强振动 100ms</string>