设置页面(1)

This commit is contained in:
2026-05-09 15:21:25 +08:00
parent d1a72da001
commit 9440687b30
27 changed files with 1407 additions and 7 deletions

View File

@@ -25,14 +25,23 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DefenseApplication">
<activity
android:name=".liveVideo.AutoModeActivity"
android:exported="false" />
<activity
android:name=".liveVideo.WaterGunSettingsActivity"
android:exported="false" />
<activity
android:name=".liveVideo.WarningVoiceContentActivity"
android:exported="false" />
<activity
android:name=".liveVideo.VoiceSettingsActivity"
android:exported="false" />
<activity
android:name=".liveVideo.AlarmLogActivity"
android:exported="false" />
<activity
android:name=".liveVideo.SettingsActivity"
android:exported="false" />
<activity
android:name=".liveVideo.LiveVideoActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -40,6 +49,9 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".liveVideo.LiveVideoActivity"
android:exported="false" />
<activity
android:name=".home.ScanActivity"
android:exported="false" />

View File

@@ -0,0 +1,74 @@
package com.example.defenseapplication.liveVideo
import TimePickerFragment
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.databinding.AutoModeActivityBinding
import com.example.defenseapplication.view.AutoModeNoticeDialog
import com.gyf.immersionbar.ImmersionBar
import java.util.Calendar
class AutoModeActivity : AppCompatActivity() {
private lateinit var binding: AutoModeActivityBinding
private lateinit var calendar: Calendar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = AutoModeActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initListener()
showAutoModeNoticeDialog()
}
private fun initListener() {
binding.ivBack.setOnClickListener {
finish()
}
binding.rbAutoMode.setOnClickListener {
binding.rbSemiAutoMode.isChecked = false
showAutoModeNoticeDialog()
}
binding.rbSemiAutoMode.setOnClickListener {
binding.rbAutoMode.isChecked = false
}
// 起始时间选择
binding.itemStartTime.setOnClickListener {
showTimePicker { hour, minute ->
val startTimeStr = String.format("%02d:%02d", hour, minute)
binding.tvStartTime.text = startTimeStr
}
}
// 结束时间选择
binding.itemEndTime.setOnClickListener {
showTimePicker { hour, minute ->
val endTimeStr = String.format("%02d:%02d", hour, minute)
binding.tvEndTime.text = endTimeStr
}
}
}
/**
* 显示时间选择器对话框
* @param onTimeSelected 时间选择回调,参数为小时和分钟
*/
private fun showTimePicker(onTimeSelected: (hour: Int, minute: Int) -> Unit) {
val timePickerFragment = TimePickerFragment { hour, minute ->
onTimeSelected(hour, minute)
}
timePickerFragment.show(supportFragmentManager, "timePicker")
}
private fun showAutoModeNoticeDialog() {
val dialog = AutoModeNoticeDialog(this)
dialog.setOnConfirmListener {
}
dialog.show()
}
}

View File

@@ -1,5 +1,6 @@
package com.example.defenseapplication.liveVideo
import android.content.Intent
import android.os.Bundle
import com.example.defenseapplication.R
import com.example.defenseapplication.base.BaseActivity
@@ -23,6 +24,10 @@ class SettingsActivity : BaseActivity() {
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.itemVoiceSetting.setOnClickListener {
val intent = Intent(this, VoiceSettingsActivity::class.java)
startActivity(intent)
}
binding.ivBack.setOnClickListener {
finish()
}
@@ -57,6 +62,14 @@ class SettingsActivity : BaseActivity() {
}
dialog.show(supportFragmentManager, "CustomDialogFragment")
}
binding.itemWaterGunSetting.setOnClickListener {
val intent = Intent(this, WaterGunSettingsActivity::class.java)
startActivity(intent)
}
binding.itemAutoMode.setOnClickListener {
val intent = Intent(this, AutoModeActivity::class.java)
startActivity(intent)
}
}

View File

@@ -0,0 +1,51 @@
package com.example.defenseapplication.liveVideo
import android.content.Intent
import android.os.Bundle
import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.SettingsActivityBinding
import com.example.defenseapplication.databinding.VoiceSettingsActivityBinding
import com.gyf.immersionbar.ImmersionBar
class VoiceSettingsActivity : AppCompatActivity() {
private lateinit var binding: VoiceSettingsActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = VoiceSettingsActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
// ImmersionBar核心调用,沉浸式
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.swWarningVoice.setOnCheckedChangeListener { _, isChecked ->
when(isChecked) {
true -> {
// 打开开关业务逻辑
}
false -> {
// 关闭开关业务逻辑
}
}
}
binding.rlWarningContent.setOnClickListener {
val intent= Intent(this, WarningVoiceContentActivity::class.java)
startActivity(intent)
}
binding.ivBack.setOnClickListener {
finish()
}
}
}

View File

@@ -0,0 +1,47 @@
package com.example.defenseapplication.liveVideo
import android.graphics.Color
import android.os.Bundle
import android.text.Editable
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.doAfterTextChanged
import com.example.defenseapplication.databinding.WarningVoiceContentActivityBinding
import com.gyf.immersionbar.ImmersionBar
class WarningVoiceContentActivity : AppCompatActivity() {
private lateinit var binding: WarningVoiceContentActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = WarningVoiceContentActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
// ImmersionBar核心调用,沉浸式
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
// 初始化计数显示
val initialLength = binding.etWarningContent.text.length
updateWordCount(initialLength)
// 添加文本变化监听
binding.etWarningContent.doAfterTextChanged { text ->
val length = text?.length ?: 0
updateWordCount(length)
}
binding.btnBack.setOnClickListener {
finish()
}
binding.btnSave.setOnClickListener {
//保存的逻辑
finish()
}
}
private fun updateWordCount(current: Int) {
binding.tvWordCount.text = "$current/100"
//字数达到上限时改变颜色
val color = if (current >= 100) Color.RED else Color.GRAY
binding.tvWordCount.setTextColor(color)
}
}

View File

@@ -0,0 +1,63 @@
package com.example.defenseapplication.liveVideo
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import com.example.defenseapplication.R
import com.example.defenseapplication.base.BaseActivity
import com.example.defenseapplication.databinding.WaterGunSettingsActivityBinding
import com.example.defenseapplication.view.ContainerSelectDialog
import com.example.defenseapplication.view.CustomDialogFragmentText
import com.gyf.immersionbar.ImmersionBar
class WaterGunSettingsActivity : BaseActivity() {
private lateinit var binding: WaterGunSettingsActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = WaterGunSettingsActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initListeners()
}
private fun initListeners() {
binding.ivBack.setOnClickListener {
finish()
}
binding.itemDistance.setOnClickListener {
val dialog = CustomDialogFragmentText()
.setTitle(getString(R.string.strike_distance))
.setInputText(binding.tvDistance.text.toString().replace("m", ""))
dialog.setOnConfirmListener { distance ->
binding.tvDistance.text = "${distance}m"
}
dialog.show(supportFragmentManager, "DistanceDialog")
}
binding.itemInterval.setOnClickListener {
val dialog = CustomDialogFragmentText()
.setTitle(getString(R.string.strike_interval))
.setInputText(binding.tvInterval.text.toString().replace("s", ""))
dialog.setOnConfirmListener { interval ->
binding.tvInterval.text = "${interval}s"
}
dialog.show(supportFragmentManager, "IntervalDialog")
}
binding.itemContainer.setOnClickListener {
val dialog = ContainerSelectDialog(this)
dialog.setSelectedContainer(binding.tvContainer.text.toString())
dialog.setOnConfirmListener { container ->
binding.tvContainer.text = container
}
dialog.show()
}
}
}

View File

@@ -0,0 +1,40 @@
package com.example.defenseapplication.view
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.Gravity
import android.view.WindowManager
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.DialogAutoModeNoticeBinding
class AutoModeNoticeDialog(context: Context) : Dialog(context) {
private lateinit var binding: DialogAutoModeNoticeBinding
private var onConfirmListener: (() -> Unit)? = null
fun setOnConfirmListener(listener: () -> Unit) {
this.onConfirmListener = listener
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DialogAutoModeNoticeBinding.inflate(layoutInflater)
setContentView(binding.root)
val window = window
window?.let {
val params = it.attributes
params.gravity = Gravity.BOTTOM
params.width = WindowManager.LayoutParams.MATCH_PARENT
params.height = WindowManager.LayoutParams.WRAP_CONTENT
it.attributes = params
it.setBackgroundDrawableResource(R.drawable.round_bg)
}
binding.btnConfirm.setOnClickListener {
onConfirmListener?.invoke()
dismiss()
}
}
}

View File

@@ -0,0 +1,101 @@
package com.example.defenseapplication.view
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.DialogContainerSelectBinding
class ContainerSelectDialog(context: Context) {
private val dialog: Dialog = Dialog(context)
private val binding: DialogContainerSelectBinding
private var selectedContainer: String = "容器4"
private var onConfirmListener: ((String) -> Unit)? = null
init {
binding = DialogContainerSelectBinding.inflate(LayoutInflater.from(context))
dialog.setContentView(binding.root)
dialog.window?.apply {
setGravity(Gravity.BOTTOM)
setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
}
initListeners()
}
private fun initListeners() {
binding.btnCancel.setOnClickListener {
dialog.dismiss()
}
binding.btnConfirm.setOnClickListener {
onConfirmListener?.invoke(selectedContainer)
dialog.dismiss()
}
binding.itemContainer1.setOnClickListener {
selectContainer("容器1")
}
binding.itemContainer2.setOnClickListener {
selectContainer("容器2")
}
binding.itemContainer3.setOnClickListener {
selectContainer("容器3")
}
binding.itemContainer4.setOnClickListener {
selectContainer("容器4")
}
}
private fun selectContainer(container: String) {
selectedContainer = container
updateSelectedStyle()
}
private fun updateSelectedStyle() {
val bgSelected = R.drawable.bg_bottom_sheet_rounded
val bgNormal = android.R.color.transparent
binding.itemContainer1.setBackgroundResource(if (selectedContainer == "容器1") bgSelected else bgNormal)
binding.itemContainer2.setBackgroundResource(if (selectedContainer == "容器2") bgSelected else bgNormal)
binding.itemContainer3.setBackgroundResource(if (selectedContainer == "容器3") bgSelected else bgNormal)
binding.itemContainer4.setBackgroundResource(if (selectedContainer == "容器4") bgSelected else bgNormal)
val textViews = listOf(binding.itemContainer1.getChildAt(0) as android.widget.TextView,
binding.itemContainer2.getChildAt(0) as android.widget.TextView,
binding.itemContainer3.getChildAt(0) as android.widget.TextView,
binding.itemContainer4.getChildAt(0) as android.widget.TextView)
textViews.forEach { tv ->
tv.setTextColor(if (tv.text == selectedContainer) dialog.context.getColor(R.color.black) else dialog.context.getColor(R.color.gray))
}
}
fun setSelectedContainer(container: String) {
selectedContainer = container
updateSelectedStyle()
}
fun setOnConfirmListener(listener: (String) -> Unit) {
this.onConfirmListener = listener
}
fun show() {
updateSelectedStyle()
dialog.show()
}
fun dismiss() {
dialog.dismiss()
}
}

View File

@@ -0,0 +1,33 @@
import android.app.Dialog
import android.app.TimePickerDialog
import android.os.Bundle
import android.text.format.DateFormat
import android.widget.TimePicker
import androidx.fragment.app.DialogFragment
import java.util.Calendar
class TimePickerFragment(private val onTimeSelected: (hour: Int, minute: Int) -> Unit) :
DialogFragment(), TimePickerDialog.OnTimeSetListener {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
// 使用当前时间作为默认值
val c = Calendar.getInstance()
val hour = c.get(Calendar.HOUR_OF_DAY)
val minute = c.get(Calendar.MINUTE)
// 创建并返回 TimePickerDialog 实例
// activity 参数需要可空性处理this是OnTimeSetListener最后一个是是否24小时制
return TimePickerDialog(
requireActivity(),
this,
hour,
minute,
DateFormat.is24HourFormat(activity)
)
}
override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
// 当用户设置时间时,通过回调将结果传回
onTimeSelected(hourOfDay, minute)
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/check_ellipse"/>
<item android:drawable="@drawable/ellipse"/>
</selector>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- 圆圈纯白色 -->
<solid android:color="#FFFFFF" />
<size android:width="20dp" android:height="20dp"/>
</shape>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/track_switch_on"/>
<item android:drawable="@drawable/track_switch_off"/>
</selector>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 关闭:灰色背景 圆角 -->
<solid android:color="#999999" />
<corners android:radius="20dp" />
</shape>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 开启:蓝色背景 -->
<solid android:color="@color/green" />
<corners android:radius="20dp" />
</shape>

View File

@@ -0,0 +1,204 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/face"
android:orientation="vertical"
tools:context=".liveVideo.AutoModeActivity">
<LinearLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:paddingHorizontal="16dp">
<ImageView
android:id="@+id/ivBack"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/auto_mode_title"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
<View
android:layout_width="24dp"
android:layout_height="24dp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@color/face" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="horizontal"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/auto_mode_title"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:id="@+id/itemAutoMode"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:background="@drawable/bg_bottom_sheet_rounded"
android:gravity="center"
android:orientation="horizontal">
<android.widget.RadioButton
android:id="@+id/rbAutoMode"
android:layout_width="18dp"
android:layout_height="18dp"
android:button="@drawable/radio_button_selector"
android:checked="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/full_auto_mode"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/itemSemiAutoMode"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/bg_bottom_sheet_rounded"
android:gravity="center"
android:orientation="horizontal">
<android.widget.RadioButton
android:id="@+id/rbSemiAutoMode"
android:layout_width="18dp"
android:layout_height="18dp"
android:button="@drawable/radio_button_selector" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/semi_auto_mode"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@color/face" />
<LinearLayout
android:id="@+id/itemStartTime"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/auto_defense_start_time"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tvStartTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="21:30"
android:textColor="@color/gray"
android:textSize="14sp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="8dp"
android:src="@drawable/right_back" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginStart="16dp"
android:background="@color/face" />
<LinearLayout
android:id="@+id/itemEndTime"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/auto_defense_end_time"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tvEndTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="08:30"
android:textColor="@color/gray"
android:textSize="14sp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="8dp"
android:src="@drawable/right_back" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/round_bg"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/auto_mode_notice"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="400dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/auto_mode_notice_content"
android:textColor="@color/black"
android:textSize="14sp"
android:lineSpacingExtra="4dp" />
</LinearLayout>
</ScrollView>
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@color/face" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:padding="16dp">
<android.widget.Button
android:layout_marginBottom="4dp"
android:id="@+id/btnConfirm"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@drawable/rounded_blue_bg"
android:text="@string/know_and_agree"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_bottom_sheet_rounded"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center_vertical"
android:paddingHorizontal="16dp">
<TextView
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cancel"
android:textColor="@color/black"
android:textSize="16dp" />
<TextView
android:id="@+id/btnConfirm"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:text="@string/confirm"
android:textColor="@color/green"
android:textSize="16dp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/dialog_view" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/itemContainer1"
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/container_1"
android:textColor="@color/gray"
android:textSize="16dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/itemContainer2"
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/container_2"
android:textColor="@color/gray"
android:textSize="16dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/itemContainer3"
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/container_3"
android:textColor="@color/gray"
android:textSize="16dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/itemContainer4"
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/container_4"
android:textColor="@color/gray"
android:textSize="16dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,81 @@
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white"
tools:context=".liveVideo.VoiceSettingsActivity">
<!-- 标题栏 -->
<LinearLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center_vertical"
android:paddingHorizontal="16dp">
<ImageView
android:id="@+id/ivBack"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/voice_settings"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
</LinearLayout>
<!-- 警告语音播放 -->
<RelativeLayout
android:id="@+id/rlWarningPlayback"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/warning_voice_playback"
android:textSize="14dp"/>
<!-- 原生Switch开关 -->
<Switch
android:id="@+id/swWarningVoice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:layout_alignParentEnd="true"
android:thumb="@drawable/thumb_switch_white"
android:track="@drawable/track_selector" />
</RelativeLayout>
<!-- 警告语音内容 -->
<RelativeLayout
android:id="@+id/rlWarningContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/warning_voice_content"
android:textSize="14dp"/>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentEnd="true"
android:src="@drawable/right_back"/>
</RelativeLayout>
</LinearLayout>

View File

@@ -0,0 +1,86 @@
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".liveVideo.WarningVoiceContentActivity">
<!-- 标题栏 -->
<LinearLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center_vertical"
android:paddingHorizontal="16dp">
<ImageView
android:id="@+id/btnBack"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/warning_voice_content"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:background="@color/white"
android:padding="10dp"
android:minHeight="148dp"
android:orientation="vertical">
<EditText
android:id="@+id/etWarningContent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:minLines="3"
android:maxLines="6"
android:gravity="top"
android:hint="@string/enter_warning_voice_content_system_will_generate_voice_automatically"
android:textSize="14dp"
android:inputType="textMultiLine"
android:background="@null"
android:maxLength="100"/>
<TextView
android:id="@+id/tvWordCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0/100"
android:textAlignment="textEnd"
android:textSize="14dp"
android:textColor="@android:color/darker_gray"
android:layout_marginTop="4dp" />
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
android:id="@+id/btnSave"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/save"
android:layout_marginEnd="20dp"
android:layout_marginStart="20dp"
android:layout_marginBottom="90dp"
android:backgroundTint="@color/green" />
</LinearLayout>

View File

@@ -0,0 +1,207 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical"
tools:context=".liveVideo.WaterGunSettingsActivity">
<LinearLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center_vertical"
android:paddingHorizontal="16dp">
<ImageView
android:id="@+id/ivBack"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/water_gun_settings"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
<View
android:layout_width="24dp"
android:layout_height="24dp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@color/face" />
<LinearLayout
android:id="@+id/itemDistance"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/strike_distance"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tvDistance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="7m"
android:textColor="@color/gray"
android:textSize="14sp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="8dp"
android:src="@drawable/right_back" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginStart="16dp"
android:background="@color/face" />
<LinearLayout
android:id="@+id/itemInterval"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/strike_interval"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tvInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2.5s"
android:textColor="@color/gray"
android:textSize="14sp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="8dp"
android:src="@drawable/right_back" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginStart="16dp"
android:background="@color/face" />
<LinearLayout
android:id="@+id/itemContainer"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/switch_container"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tvContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/container_4"
android:textColor="@color/gray"
android:textSize="14sp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="8dp"
android:src="@drawable/right_back" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginStart="16dp"
android:background="@color/face" />
<LinearLayout
android:id="@+id/itemPosition"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/strike_position"
android:textColor="@color/black"
android:textSize="16dp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/right_back" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginStart="16dp"
android:background="@color/face" />
</LinearLayout>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App Name -->
<string name="app_name">防御器</string>
@@ -166,7 +167,7 @@
<string name="function_settings">功能设置</string>
<string name="voice_settings">语音设置</string>
<string name="water_gun_settings">水枪设置</string>
<string name="detection_settings">侦测设置</string>
<string name="detection_settings">自动模式</string>
<string name="notification_settings">通知设置</string>
<string name="language_settings">语言</string>
<string name="chinese">中文</string>
@@ -175,6 +176,25 @@
<string name="version">版本</string>
<string name="logout">退出登录</string>
<string name="logout_confirm">确定要退出登录吗?</string>
<string name="warning_voice_playback">警告语音播放</string>
<string name="warning_voice_content">警告语音内容</string>
<string name="enter_warning_voice_content_system_will_generate_voice_automatically">请输入警告语音内容,系统将自动生成语音</string>
<string name="strike_interval">打击间隔</string>
<string name="switch_container">切换容器</string>
<string name="strike_position">打击位置</string>
<string name="container_1">容器1</string>
<string name="container_2">容器2</string>
<string name="container_3">容器3</string>
<string name="container_4">容器4</string>
<string name="auto_mode_title">自动模式</string>
<string name="full_auto_mode">全自动模式</string>
<string name="semi_auto_mode">半自动模式</string>
<string name="auto_defense_start_time">自动布防开始时间</string>
<string name="auto_defense_end_time">自动布防结束时间</string>
<string name="auto_mode_notice">自动模式须知</string>
<string name="know_and_agree">知晓并同意</string>
<string name="auto_mode_notice_content">开启全自动模式后,设备/系统将自主运行、自动执行预设流程,无需人工手动干预操作。运行期间请勿随意断电、强制重启、遮挡感应部件或私自拆解设备,避免程序异常、运行中断。全自动模式仅适用于标准常规场景,特殊工况、异常环境、临时特殊需求下,请手动切换至人工模式操作。系统会自动识别常规状态并自适应调节,若出现报警、卡顿、异常提示等故障,需立即暂停全自动模式,排查问题后再重启使用。严禁在全自动运行范围内放置杂物、危险品,保持作业区域整洁通畅,防止设备碰撞、卡滞、安全事故发生。全自动模式运行数据、执行记录将自动留存,请勿随意删除或篡改系统配置参数,避免运行逻辑错乱。日常需定期检查设备状态、电量、电量、网络及硬件损耗,保障全自动模式稳定长效运行。未成年人、无关人员禁止触碰操作全自动模式开关及设置面板,无关人员禁止触碰操作全自动模式开关及设置面板,防止误操作引发故障与风险。</string>
<!-- Personal Profile -->
<string name="personal_info">个人信息</string>

View File

@@ -157,7 +157,7 @@
<string name="function_settings">Function Settings</string>
<string name="voice_settings">Voice Settings</string>
<string name="water_gun_settings">Water Gun Settings</string>
<string name="detection_settings">Detection Settings</string>
<string name="detection_settings">Auto Mode</string>
<string name="notification_settings">Notification Settings</string>
<string name="language_settings">Language</string>
<string name="chinese">Chinese</string>
@@ -166,7 +166,9 @@
<string name="version">Version</string>
<string name="logout">Logout</string>
<string name="logout_confirm">Are you sure you want to logout?</string>
<string name="warning_voice_playback">Warning Voice Playback</string>
<string name="warning_voice_content">Warning Voice Content</string>
<string name="enter_warning_voice_content_system_will_generate_voice_automatically">Enter warning voice content, system will generate voice automatically.</string>
<!-- Personal Profile -->
<string name="avatar">Avatar</string>
<string name="gender">Gender</string>
@@ -320,10 +322,27 @@
<string name="go_check">Go check</string>
<string name="notice">Notice</string>
<string name="got_it">Got it</string>
<string name="strike_distance">Strike distance</string>
<string name="strike_distance">Strike Distance</string>
<string name="enter_strike_distance">Enter strike distance</string>
<string name="strike_interval">Strike Interval</string>
<string name="switch_container">Switch Container</string>
<string name="strike_position">Strike Position</string>
<string name="container_1">Container 1</string>
<string name="container_2">Container 2</string>
<string name="container_3">Container 3</string>
<string name="container_4">Container 4</string>
<string name="face_detection_failed">Face detection failed</string>
<string name="nickname_default">My nickname</string>
<!-- Auto Mode -->
<string name="auto_mode_title">Auto Mode</string>
<string name="full_auto_mode">Full Auto Mode</string>
<string name="semi_auto_mode">Semi-Auto Mode</string>
<string name="auto_defense_start_time">Auto Arm Start Time</string>
<string name="auto_defense_end_time">Auto Arm End Time</string>
<string name="auto_mode_notice">Auto Mode Instructions</string>
<string name="know_and_agree">I have read and agree</string>
<string name="auto_mode_notice_content">After enabling Full Auto Mode, the device/system will operate independently and automatically execute preset procedures without manual intervention.During operation, do not arbitrarily power off, force a restart, block sensor components or disassemble the device privately, so as to avoid program abnormalities and operation interruption. Full Auto Mode is only applicable to standard and conventional scenarios. Under special working conditions, abnormal environments or temporary special requirements, please manually switch to manual mode.The system will automatically identify normal status and make adaptive adjustments. In case of faults such as alarms, stuttering or abnormal prompts, immediately pause Full Auto Mode, troubleshoot the problem before restarting.Do not place sundries or dangerous goods within the automatic operation range. Keep the working area clean and unobstructed to prevent equipment collision, jamming and safety accidents.Operation data and execution records of Full Auto Mode will be automatically saved. Do not arbitrarily delete or tamper with system configuration parameters to avoid operational logic disorder.Check the device status, power level, network connection and hardware loss regularly on a daily basis to ensure stable and long-term operation of Full Auto Mode. Minors and irrelevant personnel are prohibited from touching or operating the Full Auto Mode switch and setting panel to prevent malfunctions and risks caused by misoperation.</string>
<string name="device_running_days">Device has been running for %d days, please maintain in time</string>
<string name="device_offline_message">Device is offline, please check the WiFi and power connection</string>
<string name="countdown_retry">%ds retry</string>