新增:自动任务-快捷指令-警报提醒动作添加振动提醒的功能 #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(
var description: String = "", //描述
var action: String = "stop", //动作: start=启动警报, stop=停止警报
var volume: Int = 80, //播放音量0=禁用
var playTimes: Int = 1, //播放次数0=无限循环
var volume: Int = 80, //播放音量0-100
var playTimes: Int = 1, //播放次数0=无限循环-1=禁用
var music: String = "", //音乐文件
var repeatTimes: Int = 5, //振动重复次数0=禁用
var repeatTimes: Int = 5, //振动重复次数0=无限循环,-1=禁用
var vibrate: String = "---___===___", //振动律动:=强振动, -弱震动, _不振动, 时长都是100ms
) : Serializable

View File

@ -86,29 +86,11 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
})
binding!!.sbEnableMusic.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
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)
}
binding!!.layoutAlarmSettingsContent.visibility = if (isChecked) View.VISIBLE else View.GONE
checkSetting(true)
}
binding!!.sbEnableVibrate.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
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)
}
binding!!.layoutVibrateSettingsContent.visibility = if (isChecked) View.VISIBLE else View.GONE
checkSetting(true)
}
@ -128,12 +110,12 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
}
}
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!!.xsbRepeatTimes.setDefaultValue(settingVo.repeatTimes)
binding!!.xsbRepeatTimes.setDefaultValue(if (settingVo.repeatTimes >= 0) settingVo.repeatTimes else 0)
binding!!.etVibrationEffect.setText(settingVo.vibrate)
binding!!.sbEnableMusic.isChecked = settingVo.volume > 0
binding!!.sbEnableVibrate.isChecked = settingVo.repeatTimes > 0
binding!!.sbEnableMusic.isChecked = settingVo.playTimes >= 0
binding!!.sbEnableVibrate.isChecked = settingVo.repeatTimes >= 0
}
override fun onDestroyView() {
@ -150,7 +132,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
binding!!.xsbVolume.setOnSeekBarListener { _, _ ->
checkSetting(true)
}
binding!!.xsbLoopTimes.setOnSeekBarListener { _, _ ->
binding!!.xsbPlayTimes.setOnSeekBarListener { _, _ ->
checkSetting(true)
}
binding!!.rgAlarmState.setOnCheckedChangeListener { _, checkedId ->
@ -222,7 +204,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
try {
val settingVo = checkSetting()
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))
return
}
@ -265,7 +247,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
@SuppressLint("SetTextI18n")
override fun onGranted(permissions: List<String>, all: Boolean) {
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))
return
}
@ -304,24 +286,28 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
val enableMusic = binding!!.sbEnableMusic.isChecked
val enableVibrate = binding!!.sbEnableVibrate.isChecked
val volume = binding!!.xsbVolume.selectedNumber
val loopTimes = binding!!.xsbLoopTimes.selectedNumber
var playTimes = binding!!.xsbPlayTimes.selectedNumber
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 description = StringBuilder()
val action = if (binding!!.rgAlarmState.checkedRadioButtonId == R.id.rb_start_alarm) {
description.append(getString(R.string.start_alarm))
if (enableMusic) {
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()) {
description.append(", ").append(getString(R.string.alarm_music)).append(":").append(music)
}
} else {
playTimes = -1
}
if (enableVibrate) {
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_repeat_times)).append(":").append(repeatTimes)
} else {
repeatTimes = -1
}
"start"
} else {
@ -333,7 +319,7 @@ class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnC
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> {

View File

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

View File

@ -12,13 +12,15 @@ class VibrationUtils(context: Context) {
private val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
private val handler = Handler(Looper.getMainLooper())
private var currentRepeat = 0
var isVibrating = false
private set
fun startVibration(patternString: String) {
fun startVibration(patternString: String, repeatTimes: Int) {
isVibrating = true
currentRepeat = 0
val parsedPattern = parsePattern(patternString)
vibratePattern(parsedPattern, 0)
vibratePattern(parsedPattern, 0, repeatTimes)
}
fun stopVibration() {
@ -55,7 +57,7 @@ class VibrationUtils(context: Context) {
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) {
val (duration, shouldVibrate, intensity) = parsedPattern[index]
if (shouldVibrate) {
@ -69,7 +71,16 @@ class VibrationUtils(context: Context) {
handler.postDelayed({
if (isVibrating) {
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)
}

View File

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

View File

@ -1131,7 +1131,7 @@
<string name="alarm_volume">Alarm Volume</string>
<string name="alarm_play_times">Play Times(0=Infinite)</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_tips">Syntax: =[strong], -[weak], _[no], 100ms each</string>
<string name="alarm_vibration_effect_1">Strong vibration</string>

View File

@ -1132,7 +1132,7 @@
<string name="alarm_volume">播放音量</string>
<string name="alarm_play_times">播放次数(0=无限)</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_tips">语法:=[强振动], -[弱震动], _[不振动], 每次100ms</string>
<string name="alarm_vibration_effect_1">强振动 100ms</string>

View File

@ -1125,7 +1125,7 @@
<string name="alarm_volume">播放音量</string>
<string name="alarm_play_times">播放次數(0=無限)</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_tips">語法:=[強振動], -[弱振動], _[不振動], 每次100ms</string>
<string name="alarm_vibration_effect_1">強振動 100ms</string>

View File

@ -1159,7 +1159,7 @@
<string name="alarm_volume">播放音量</string>
<string name="alarm_play_times">播放次数(0=无限)</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_tips">语法:=[强振动], -[弱震动], _[不振动], 每次100ms</string>
<string name="alarm_vibration_effect_1">强振动 100ms</string>