新增:自动任务·快捷指令 —— 执行动作:播放警报 #385
parent
b6c98e7f33
commit
9aeca6f3f6
@ -0,0 +1,288 @@
|
||||
package com.idormy.sms.forwarder.fragment.action
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Intent
|
||||
import android.os.Environment
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.work.Data
|
||||
import androidx.work.OneTimeWorkRequestBuilder
|
||||
import androidx.work.WorkManager
|
||||
import com.google.gson.Gson
|
||||
import com.hjq.permissions.OnPermissionCallback
|
||||
import com.hjq.permissions.Permission
|
||||
import com.hjq.permissions.XXPermissions
|
||||
import com.idormy.sms.forwarder.App
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.core.BaseFragment
|
||||
import com.idormy.sms.forwarder.databinding.FragmentTasksActionAlarmBinding
|
||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||
import com.idormy.sms.forwarder.entity.action.AlarmSetting
|
||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
|
||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION
|
||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
|
||||
import com.idormy.sms.forwarder.utils.Log
|
||||
import com.idormy.sms.forwarder.utils.TASK_ACTION_ALARM
|
||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||
import com.idormy.sms.forwarder.utils.XToastUtils
|
||||
import com.idormy.sms.forwarder.workers.ActionWorker
|
||||
import com.xuexiang.xaop.annotation.SingleClick
|
||||
import com.xuexiang.xpage.annotation.Page
|
||||
import com.xuexiang.xrouter.annotation.AutoWired
|
||||
import com.xuexiang.xrouter.launcher.XRouter
|
||||
import com.xuexiang.xui.utils.CountDownButtonHelper
|
||||
import com.xuexiang.xui.widget.actionbar.TitleBar
|
||||
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
|
||||
import java.io.File
|
||||
import java.util.Date
|
||||
|
||||
@Page(name = "Alarm")
|
||||
@Suppress("PrivatePropertyName", "DEPRECATION")
|
||||
class AlarmFragment : BaseFragment<FragmentTasksActionAlarmBinding?>(), View.OnClickListener {
|
||||
|
||||
private val TAG: String = AlarmFragment::class.java.simpleName
|
||||
private var titleBar: TitleBar? = null
|
||||
private var mCountDownHelper: CountDownButtonHelper? = null
|
||||
private var appContext: App? = null
|
||||
|
||||
@JvmField
|
||||
@AutoWired(name = KEY_EVENT_DATA_ACTION)
|
||||
var eventData: String? = null
|
||||
|
||||
override fun initArgs() {
|
||||
XRouter.getInstance().inject(this)
|
||||
}
|
||||
|
||||
override fun viewBindingInflate(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup,
|
||||
): FragmentTasksActionAlarmBinding {
|
||||
return FragmentTasksActionAlarmBinding.inflate(inflater, container, false)
|
||||
}
|
||||
|
||||
override fun initTitle(): TitleBar? {
|
||||
titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_alarm)
|
||||
return titleBar
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化控件
|
||||
*/
|
||||
override fun initViews() {
|
||||
appContext = requireActivity().application as App
|
||||
//测试按钮增加倒计时,避免重复点击
|
||||
mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 2)
|
||||
mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener {
|
||||
override fun onCountDown(time: Int) {
|
||||
binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time)
|
||||
}
|
||||
|
||||
override fun onFinished() {
|
||||
binding!!.btnTest.text = getString(R.string.test)
|
||||
}
|
||||
})
|
||||
|
||||
Log.d(TAG, "initViews eventData:$eventData")
|
||||
if (eventData != null) {
|
||||
val settingVo = Gson().fromJson(eventData, AlarmSetting::class.java)
|
||||
Log.d(TAG, "initViews settingVo:$settingVo")
|
||||
if (settingVo.action == "start") {
|
||||
binding!!.rgAlarmState.check(R.id.rb_start_alarm)
|
||||
binding!!.layoutAlarmSettings.visibility = View.VISIBLE
|
||||
} else {
|
||||
binding!!.rgAlarmState.check(R.id.rb_stop_alarm)
|
||||
binding!!.layoutAlarmSettings.visibility = View.GONE
|
||||
}
|
||||
binding!!.xsbVolume.setDefaultValue(settingVo.volume)
|
||||
binding!!.xsbLoopTimes.setDefaultValue(settingVo.loopTimes)
|
||||
binding!!.etMusicPath.setText(settingVo.music)
|
||||
} else {
|
||||
binding!!.xsbVolume.setDefaultValue(100)
|
||||
binding!!.xsbLoopTimes.setDefaultValue(5)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
if (mCountDownHelper != null) mCountDownHelper!!.recycle()
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun initListeners() {
|
||||
binding!!.btnTest.setOnClickListener(this)
|
||||
binding!!.btnDel.setOnClickListener(this)
|
||||
binding!!.btnSave.setOnClickListener(this)
|
||||
binding!!.btnFilePicker.setOnClickListener(this)
|
||||
binding!!.xsbVolume.setOnSeekBarListener { _, _ ->
|
||||
checkSetting(true)
|
||||
}
|
||||
binding!!.xsbLoopTimes.setOnSeekBarListener { _, _ ->
|
||||
checkSetting(true)
|
||||
}
|
||||
binding!!.rgAlarmState.setOnCheckedChangeListener { _, checkedId ->
|
||||
binding!!.layoutAlarmSettings.visibility = if (checkedId == R.id.rb_start_alarm) View.VISIBLE else View.GONE
|
||||
checkSetting(true)
|
||||
}
|
||||
}
|
||||
|
||||
@SingleClick
|
||||
override fun onClick(v: View) {
|
||||
try {
|
||||
when (v.id) {
|
||||
|
||||
R.id.btn_file_picker -> {
|
||||
// 申请储存权限
|
||||
XXPermissions.with(this).permission(Permission.MANAGE_EXTERNAL_STORAGE).request(object : OnPermissionCallback {
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onGranted(permissions: List<String>, all: Boolean) {
|
||||
val downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path
|
||||
val fileList = findAudioFiles(downloadPath)
|
||||
if (fileList.isEmpty()) {
|
||||
XToastUtils.error(String.format(getString(R.string.download_music_first), downloadPath))
|
||||
return
|
||||
}
|
||||
MaterialDialog.Builder(requireContext()).title(getString(R.string.alarm_music)).content(String.format(getString(R.string.root_directory), downloadPath)).items(fileList).itemsCallbackSingleChoice(0) { _: MaterialDialog?, _: View?, _: Int, text: CharSequence ->
|
||||
val webPath = "$downloadPath/$text"
|
||||
binding!!.etMusicPath.setText(webPath)
|
||||
checkSetting(true)
|
||||
true // allow selection
|
||||
}.positiveText(R.string.select).negativeText(R.string.cancel).show()
|
||||
}
|
||||
|
||||
override fun onDenied(permissions: List<String>, never: Boolean) {
|
||||
if (never) {
|
||||
XToastUtils.error(R.string.toast_denied_never)
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
||||
} else {
|
||||
XToastUtils.error(R.string.toast_denied)
|
||||
}
|
||||
binding!!.etMusicPath.setText(getString(R.string.storage_permission_tips))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
R.id.btn_test -> {
|
||||
// 申请修改系统设置权限
|
||||
XXPermissions.with(this).permission(Permission.WRITE_SETTINGS).request(object : OnPermissionCallback {
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onGranted(permissions: List<String>, all: Boolean) {
|
||||
mCountDownHelper?.start()
|
||||
try {
|
||||
val settingVo = checkSetting()
|
||||
Log.d(TAG, settingVo.toString())
|
||||
val taskAction = TaskSetting(TASK_ACTION_ALARM, getString(R.string.task_alarm), settingVo.description, Gson().toJson(settingVo), requestCode)
|
||||
val taskActionsJson = Gson().toJson(arrayListOf(taskAction))
|
||||
val msgInfo = MsgInfo("task", getString(R.string.task_alarm), settingVo.description, Date(), getString(R.string.task_alarm))
|
||||
val actionData = Data.Builder().putLong(TaskWorker.taskId, 0).putString(TaskWorker.taskActions, taskActionsJson).putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)).build()
|
||||
val actionRequest = OneTimeWorkRequestBuilder<ActionWorker>().setInputData(actionData).build()
|
||||
WorkManager.getInstance().enqueue(actionRequest)
|
||||
} catch (e: Exception) {
|
||||
mCountDownHelper?.finish()
|
||||
e.printStackTrace()
|
||||
Log.e(TAG, "onClick error: ${e.message}")
|
||||
XToastUtils.error(e.message.toString(), 30000)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDenied(permissions: List<String>, never: Boolean) {
|
||||
if (never) {
|
||||
XToastUtils.error(R.string.toast_denied_never)
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
||||
} else {
|
||||
XToastUtils.error(R.string.toast_denied)
|
||||
}
|
||||
binding!!.tvDescription.text = getString(R.string.write_settings_permission_tips)
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
R.id.btn_del -> {
|
||||
popToBack()
|
||||
return
|
||||
}
|
||||
|
||||
R.id.btn_save -> {
|
||||
// 申请修改系统设置权限
|
||||
XXPermissions.with(this).permission(Permission.WRITE_SETTINGS).request(object : OnPermissionCallback {
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onGranted(permissions: List<String>, all: Boolean) {
|
||||
val settingVo = checkSetting()
|
||||
val intent = Intent()
|
||||
intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description)
|
||||
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
|
||||
setFragmentResult(TASK_ACTION_ALARM, intent)
|
||||
popToBack()
|
||||
}
|
||||
|
||||
override fun onDenied(permissions: List<String>, never: Boolean) {
|
||||
if (never) {
|
||||
XToastUtils.error(R.string.toast_denied_never)
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
||||
} else {
|
||||
XToastUtils.error(R.string.toast_denied)
|
||||
}
|
||||
binding!!.tvDescription.text = getString(R.string.write_settings_permission_tips)
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
XToastUtils.error(e.message.toString(), 30000)
|
||||
e.printStackTrace()
|
||||
Log.e(TAG, "onClick error: ${e.message}")
|
||||
}
|
||||
}
|
||||
|
||||
//检查设置
|
||||
@SuppressLint("SetTextI18n")
|
||||
private fun checkSetting(updateView: Boolean = false): AlarmSetting {
|
||||
val volume = binding!!.xsbVolume.selectedNumber
|
||||
val loopTimes = binding!!.xsbLoopTimes.selectedNumber
|
||||
val music = binding!!.etMusicPath.text.toString().trim()
|
||||
val description = StringBuilder()
|
||||
val action = if (binding!!.rgAlarmState.checkedRadioButtonId == R.id.rb_start_alarm) {
|
||||
description.append(getString(R.string.start_alarm))
|
||||
description.append(", ").append(getString(R.string.alarm_volume)).append(":").append(volume).append("%")
|
||||
description.append(", ").append(getString(R.string.alarm_loop_times)).append(":").append(loopTimes)
|
||||
if (music.isNotEmpty()) {
|
||||
description.append(", ").append(getString(R.string.alarm_music)).append(":").append(music)
|
||||
}
|
||||
"start"
|
||||
} else {
|
||||
description.append(getString(R.string.stop_alarm))
|
||||
"stop"
|
||||
}
|
||||
|
||||
if (updateView) {
|
||||
binding!!.tvDescription.text = description.toString()
|
||||
}
|
||||
|
||||
return AlarmSetting(description.toString(), action, volume, loopTimes, music)
|
||||
}
|
||||
|
||||
private fun findAudioFiles(directoryPath: String): List<String> {
|
||||
val audioFiles = mutableListOf<String>()
|
||||
val directory = File(directoryPath)
|
||||
|
||||
if (directory.exists() && directory.isDirectory) {
|
||||
directory.listFiles()?.let { files ->
|
||||
// 筛选出支持的音频文件
|
||||
files.filter { it.isFile && isSupportedAudioFile(it) }.forEach { audioFiles.add(it.name) }
|
||||
}
|
||||
}
|
||||
|
||||
return audioFiles
|
||||
}
|
||||
|
||||
private fun isSupportedAudioFile(file: File): Boolean {
|
||||
val supportedExtensions = listOf("mp3", "ogg", "wav")
|
||||
return supportedExtensions.any { it.equals(file.extension, ignoreCase = true) }
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="25.0dip"
|
||||
android:height="25.0dip"
|
||||
android:autoMirrored="true"
|
||||
android:viewportWidth="25.0"
|
||||
android:viewportHeight="25.0">
|
||||
<path
|
||||
android:fillColor="#ffff8514"
|
||||
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
|
||||
<group
|
||||
android:scaleX="0.014"
|
||||
android:scaleY="0.014"
|
||||
android:translateX="3.7"
|
||||
android:translateY="5.5">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="M704,129.9a289.9,289.9 0,0 1,256 287.9v262.2a64,64 0,0 0,20.1 46.6l23.8,22.4a64,64 0,0 1,20.1 46.6L1024,832a64,64 0,0 1,-64 64h-160c-21.3,85.3 -74.7,128 -160,128s-138.7,-42.7 -160,-128L320,896a64,64 0,0 1,-64 -64v-37.5a64,64 0,0 1,18.8 -45.2l26.5,-26.5A64,64 0,0 0,320 677.5L320,416a288,288 0,0 1,256 -286.3L576,64a64,64 0,1 1,128 0v65.9zM270.5,141.6a32,32 0,0 1,35.1 53.6c-27,17.7 -48.1,44.5 -63.6,81.5 -15.6,37.4 -21.2,85.8 -16.2,145a32,32 0,0 1,-63.8 5.4c-5.8,-68.8 1,-127.2 20.9,-175 20.1,-48.3 49.3,-85.4 87.6,-110.5zM1009.5,141.6c38.2,25 67.5,62.1 87.6,110.5 20,47.9 26.7,106.2 20.9,175a32,32 0,0 1,-63.8 -5.4c5,-59.3 -0.6,-107.5 -16.2,-145 -15.4,-37 -36.5,-63.9 -63.6,-81.5a32,32 0,1 1,35.1 -53.6zM137.3,17.8a32,32 0,1 1,45.3 45.2c-39,39 -68.5,88.1 -88.3,147.5C74.2,271 64,342.4 64,424.4a32,32 0,0 1,-64 0c0,-88.6 11.1,-166.7 33.7,-234.1C56.5,121.7 91.1,64 137.3,17.8zM1142.7,17.8c46.3,46.3 80.8,103.9 103.7,172.5 22.5,67.5 33.7,145.5 33.7,234.1a32,32 0,1 1,-64 0c0,-82.1 -10.2,-153.4 -30.3,-213.9 -19.8,-59.5 -49.3,-108.5 -88.3,-147.5a32,32 0,0 1,45.3 -45.2z" />
|
||||
</group>
|
||||
</vector>
|
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="25.0dip"
|
||||
android:height="25.0dip"
|
||||
android:autoMirrored="true"
|
||||
android:viewportWidth="25.0"
|
||||
android:viewportHeight="25.0">
|
||||
<path
|
||||
android:fillColor="#ffe6e6e6"
|
||||
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
|
||||
<group
|
||||
android:scaleX="0.014"
|
||||
android:scaleY="0.014"
|
||||
android:translateX="3.7"
|
||||
android:translateY="5.5">
|
||||
<path
|
||||
android:fillColor="#ffffffff"
|
||||
android:pathData="M704,129.9a289.9,289.9 0,0 1,256 287.9v262.2a64,64 0,0 0,20.1 46.6l23.8,22.4a64,64 0,0 1,20.1 46.6L1024,832a64,64 0,0 1,-64 64h-160c-21.3,85.3 -74.7,128 -160,128s-138.7,-42.7 -160,-128L320,896a64,64 0,0 1,-64 -64v-37.5a64,64 0,0 1,18.8 -45.2l26.5,-26.5A64,64 0,0 0,320 677.5L320,416a288,288 0,0 1,256 -286.3L576,64a64,64 0,1 1,128 0v65.9zM270.5,141.6a32,32 0,0 1,35.1 53.6c-27,17.7 -48.1,44.5 -63.6,81.5 -15.6,37.4 -21.2,85.8 -16.2,145a32,32 0,0 1,-63.8 5.4c-5.8,-68.8 1,-127.2 20.9,-175 20.1,-48.3 49.3,-85.4 87.6,-110.5zM1009.5,141.6c38.2,25 67.5,62.1 87.6,110.5 20,47.9 26.7,106.2 20.9,175a32,32 0,0 1,-63.8 -5.4c5,-59.3 -0.6,-107.5 -16.2,-145 -15.4,-37 -36.5,-63.9 -63.6,-81.5a32,32 0,1 1,35.1 -53.6zM137.3,17.8a32,32 0,1 1,45.3 45.2c-39,39 -68.5,88.1 -88.3,147.5C74.2,271 64,342.4 64,424.4a32,32 0,0 1,-64 0c0,-88.6 11.1,-166.7 33.7,-234.1C56.5,121.7 91.1,64 137.3,17.8zM1142.7,17.8c46.3,46.3 80.8,103.9 103.7,172.5 22.5,67.5 33.7,145.5 33.7,234.1a32,32 0,1 1,-64 0c0,-82.1 -10.2,-153.4 -30.3,-213.9 -19.8,-59.5 -49.3,-108.5 -88.3,-147.5a32,32 0,0 1,45.3 -45.2z" />
|
||||
</group>
|
||||
</vector>
|
@ -0,0 +1,223 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/xui_config_color_background"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:overScrollMode="never">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:layout_width="120dp"
|
||||
android:layout_height="120dp"
|
||||
android:layout_margin="10dp"
|
||||
android:contentDescription="@string/task_alarm"
|
||||
app:srcCompat="@drawable/auto_task_icon_alarm"
|
||||
tools:ignore="ImageContrastCheck" />
|
||||
|
||||
<LinearLayout
|
||||
style="@style/BarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/task_alarm"
|
||||
android:textSize="@dimen/text_size_big"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/task_alarm_tips"
|
||||
android:textSize="@dimen/text_size_mini"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:background="?attr/xui_config_color_separator_light" />
|
||||
|
||||
<RadioGroup
|
||||
android:id="@+id/rg_alarm_state"
|
||||
style="@style/rg_style"
|
||||
android:orientation="horizontal"
|
||||
android:paddingBottom="@dimen/config_padding_5dp">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_start_alarm"
|
||||
style="@style/rg_rb_style"
|
||||
android:checked="true"
|
||||
android:text="@string/start_alarm"
|
||||
tools:ignore="TouchTargetSizeCheck" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_stop_alarm"
|
||||
style="@style/rg_rb_style"
|
||||
android:text="@string/stop_alarm"
|
||||
tools:ignore="TouchTargetSizeCheck" />
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_alarm_settings"
|
||||
style="@style/BarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/alarm_play_settings"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="RelativeOverlap" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="?attr/xui_config_color_separator_light" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/alarm_volume"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<com.xuexiang.xui.widget.picker.XSeekBar
|
||||
android:id="@+id/xsb_volume"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
android:padding="0dp"
|
||||
app:xsb_max="100"
|
||||
app:xsb_min="1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/alarm_loop_times"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<com.xuexiang.xui.widget.picker.XSeekBar
|
||||
android:id="@+id/xsb_loop_times"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
android:padding="0dp"
|
||||
app:xsb_max="30"
|
||||
app:xsb_min="0" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/alarm_music"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<com.xuexiang.xui.widget.edittext.ClearEditText
|
||||
android:id="@+id/et_music_path"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
android:hint="@string/alarm_music_tips"
|
||||
android:textSize="@dimen/text_size_mini"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<com.xuexiang.xui.widget.button.shadowbutton.RippleShadowShadowButton
|
||||
android:id="@+id/btn_file_picker"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center"
|
||||
android:padding="5dp"
|
||||
android:text="@string/select_file"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_mini"
|
||||
app:sb_color_unpressed="@color/colorPrimary"
|
||||
app:sb_ripple_color="@color/white"
|
||||
app:sb_ripple_duration="500"
|
||||
app:sb_shape_type="rectangle"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:padding="10dp">
|
||||
|
||||
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
|
||||
android:id="@+id/btn_del"
|
||||
style="@style/SuperButton.Gray.Icon.Spacing"
|
||||
android:drawableStart="@drawable/ic_delete"
|
||||
android:text="@string/discard"
|
||||
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
|
||||
|
||||
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
|
||||
android:id="@+id/btn_save"
|
||||
style="@style/SuperButton.Blue.Icon.Spacing"
|
||||
android:drawableStart="@drawable/ic_save"
|
||||
android:text="@string/submit"
|
||||
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
|
||||
|
||||
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
|
||||
android:id="@+id/btn_test"
|
||||
style="@style/SuperButton.Green.Icon.Spacing"
|
||||
android:drawableStart="@drawable/ic_test"
|
||||
android:text="@string/test"
|
||||
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
Binary file not shown.
Loading…
Reference in New Issue