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