mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 01:17:41 +08:00
parent
f029048d09
commit
7c33566696
@ -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
|
||||
|
@ -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> {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user