From 9440687b30adcb4691a14b3f1949df6388a697a0 Mon Sep 17 00:00:00 2001 From: maxinyu Date: Sat, 9 May 2026 15:21:25 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=A1=B5=E9=9D=A2=EF=BC=881?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .kotlin/errors/errors-1778294749862.log | 48 ++++ .kotlin/errors/errors-1778294750185.log | 48 ++++ .kotlin/errors/errors-1778295979891.log | 48 ++++ app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 18 +- .../liveVideo/AutoModeActivity.kt | 74 +++++++ .../liveVideo/SettingsActivity.kt | 13 ++ .../liveVideo/VoiceSettingsActivity.kt | 51 +++++ .../liveVideo/WarningVoiceContentActivity.kt | 47 ++++ .../liveVideo/WaterGunSettingsActivity.kt | 63 ++++++ .../view/AutoModeNoticeDialog.kt | 40 ++++ .../view/ContainerSelectDialog.kt | 101 +++++++++ .../view/TimePickerFragment.kt | 33 +++ app/src/main/res/drawable/open.png | Bin 3631 -> 1594 bytes .../res/drawable/radio_button_selector.xml | 5 + .../main/res/drawable/thumb_switch_white.xml | 7 + app/src/main/res/drawable/track_selector.xml | 5 + .../main/res/drawable/track_switch_off.xml | 7 + app/src/main/res/drawable/track_switch_on.xml | 7 + .../main/res/layout/auto_mode_activity.xml | 204 +++++++++++++++++ .../res/layout/dialog_auto_mode_notice.xml | 69 ++++++ .../res/layout/dialog_container_select.xml | 104 +++++++++ .../res/layout/voice_settings_activity.xml | 81 +++++++ .../layout/warning_voice_content_activity.xml | 86 ++++++++ .../layout/water_gun_settings_activity.xml | 207 ++++++++++++++++++ app/src/main/res/values-zh/strings.xml | 22 +- app/src/main/res/values/strings.xml | 25 ++- 27 files changed, 1407 insertions(+), 7 deletions(-) create mode 100644 .kotlin/errors/errors-1778294749862.log create mode 100644 .kotlin/errors/errors-1778294750185.log create mode 100644 .kotlin/errors/errors-1778295979891.log create mode 100644 app/src/main/java/com/example/defenseapplication/liveVideo/AutoModeActivity.kt create mode 100644 app/src/main/java/com/example/defenseapplication/liveVideo/VoiceSettingsActivity.kt create mode 100644 app/src/main/java/com/example/defenseapplication/liveVideo/WarningVoiceContentActivity.kt create mode 100644 app/src/main/java/com/example/defenseapplication/liveVideo/WaterGunSettingsActivity.kt create mode 100644 app/src/main/java/com/example/defenseapplication/view/AutoModeNoticeDialog.kt create mode 100644 app/src/main/java/com/example/defenseapplication/view/ContainerSelectDialog.kt create mode 100644 app/src/main/java/com/example/defenseapplication/view/TimePickerFragment.kt create mode 100644 app/src/main/res/drawable/radio_button_selector.xml create mode 100644 app/src/main/res/drawable/thumb_switch_white.xml create mode 100644 app/src/main/res/drawable/track_selector.xml create mode 100644 app/src/main/res/drawable/track_switch_off.xml create mode 100644 app/src/main/res/drawable/track_switch_on.xml create mode 100644 app/src/main/res/layout/auto_mode_activity.xml create mode 100644 app/src/main/res/layout/dialog_auto_mode_notice.xml create mode 100644 app/src/main/res/layout/dialog_container_select.xml create mode 100644 app/src/main/res/layout/voice_settings_activity.xml create mode 100644 app/src/main/res/layout/warning_voice_content_activity.xml create mode 100644 app/src/main/res/layout/water_gun_settings_activity.xml diff --git a/.kotlin/errors/errors-1778294749862.log b/.kotlin/errors/errors-1778294749862.log new file mode 100644 index 0000000..0e5ac83 --- /dev/null +++ b/.kotlin/errors/errors-1778294749862.log @@ -0,0 +1,48 @@ +kotlin version: 2.2.10 +error message: java.nio.file.AccessDeniedException: C:\Users\Administrator\AppData\Local\kotlin\daemon\kotlin-daemon-client-tsmarker16543104433488102214.tmp + +error message: Daemon compilation failed: Could not connect to Kotlin compile daemon +java.lang.RuntimeException: Could not connect to Kotlin compile daemon + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:214) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:74) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:68) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:64) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:61) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:102) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:61) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:58) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:176) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) + at org.gradle.internal.Factories$1.create(Factories.java:30) + at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withLocksAcquired$0(DefaultWorkerLeaseService.java:269) + at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:42) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocksAcquired(DefaultWorkerLeaseService.java:267) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:259) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) + + diff --git a/.kotlin/errors/errors-1778294750185.log b/.kotlin/errors/errors-1778294750185.log new file mode 100644 index 0000000..6cbb514 --- /dev/null +++ b/.kotlin/errors/errors-1778294750185.log @@ -0,0 +1,48 @@ +kotlin version: 2.2.10 +error message: java.nio.file.AccessDeniedException: C:\Users\Administrator\AppData\Local\kotlin\daemon\kotlin-daemon-client-tsmarker6714344133500540120.tmp + +error message: Daemon compilation failed: Could not connect to Kotlin compile daemon +java.lang.RuntimeException: Could not connect to Kotlin compile daemon + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:214) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:74) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:68) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:64) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:61) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:102) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:61) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:58) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:176) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) + at org.gradle.internal.Factories$1.create(Factories.java:30) + at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withLocksAcquired$0(DefaultWorkerLeaseService.java:269) + at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:42) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocksAcquired(DefaultWorkerLeaseService.java:267) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:259) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) + + diff --git a/.kotlin/errors/errors-1778295979891.log b/.kotlin/errors/errors-1778295979891.log new file mode 100644 index 0000000..05d8c38 --- /dev/null +++ b/.kotlin/errors/errors-1778295979891.log @@ -0,0 +1,48 @@ +kotlin version: 2.2.10 +error message: java.nio.file.AccessDeniedException: C:\Users\Administrator\AppData\Local\kotlin\daemon\kotlin-daemon-client-tsmarker13255880383921005426.tmp + +error message: Daemon compilation failed: Could not connect to Kotlin compile daemon +java.lang.RuntimeException: Could not connect to Kotlin compile daemon + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:214) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:74) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:68) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:64) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:61) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:102) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:61) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:58) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:176) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) + at org.gradle.internal.Factories$1.create(Factories.java:30) + at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withLocksAcquired$0(DefaultWorkerLeaseService.java:269) + at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:42) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocksAcquired(DefaultWorkerLeaseService.java:267) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:259) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) + + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b9baecc..462b3ff 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -87,5 +87,6 @@ dependencies { // kotlin扩展(可选) implementation("com.geyifeng.immersionbar:immersionbar-ktx:3.2.2") implementation("com.wdullaer:materialdatetimepicker:4.2.3") // 经典稳定 + implementation("androidx.core:core-ktx:1.12.0") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cde424..9e65800 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,14 +25,23 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.DefenseApplication"> + + + + - @@ -40,6 +49,9 @@ + diff --git a/app/src/main/java/com/example/defenseapplication/liveVideo/AutoModeActivity.kt b/app/src/main/java/com/example/defenseapplication/liveVideo/AutoModeActivity.kt new file mode 100644 index 0000000..c48ed3b --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/liveVideo/AutoModeActivity.kt @@ -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() + } +} diff --git a/app/src/main/java/com/example/defenseapplication/liveVideo/SettingsActivity.kt b/app/src/main/java/com/example/defenseapplication/liveVideo/SettingsActivity.kt index 639096b..51c9fb2 100644 --- a/app/src/main/java/com/example/defenseapplication/liveVideo/SettingsActivity.kt +++ b/app/src/main/java/com/example/defenseapplication/liveVideo/SettingsActivity.kt @@ -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) + } } diff --git a/app/src/main/java/com/example/defenseapplication/liveVideo/VoiceSettingsActivity.kt b/app/src/main/java/com/example/defenseapplication/liveVideo/VoiceSettingsActivity.kt new file mode 100644 index 0000000..4a8315b --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/liveVideo/VoiceSettingsActivity.kt @@ -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() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/liveVideo/WarningVoiceContentActivity.kt b/app/src/main/java/com/example/defenseapplication/liveVideo/WarningVoiceContentActivity.kt new file mode 100644 index 0000000..ac786b1 --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/liveVideo/WarningVoiceContentActivity.kt @@ -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) + } +} diff --git a/app/src/main/java/com/example/defenseapplication/liveVideo/WaterGunSettingsActivity.kt b/app/src/main/java/com/example/defenseapplication/liveVideo/WaterGunSettingsActivity.kt new file mode 100644 index 0000000..1eb3e2b --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/liveVideo/WaterGunSettingsActivity.kt @@ -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() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/view/AutoModeNoticeDialog.kt b/app/src/main/java/com/example/defenseapplication/view/AutoModeNoticeDialog.kt new file mode 100644 index 0000000..e52ec06 --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/view/AutoModeNoticeDialog.kt @@ -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() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/view/ContainerSelectDialog.kt b/app/src/main/java/com/example/defenseapplication/view/ContainerSelectDialog.kt new file mode 100644 index 0000000..25c4a9d --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/view/ContainerSelectDialog.kt @@ -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() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/view/TimePickerFragment.kt b/app/src/main/java/com/example/defenseapplication/view/TimePickerFragment.kt new file mode 100644 index 0000000..7f91ff4 --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/view/TimePickerFragment.kt @@ -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) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/open.png b/app/src/main/res/drawable/open.png index 04bc36b167eac182d3513e1d423698e6a4d4caa7..5e95b3c2812ad9b193d9b8966e33753bc5cb3640 100644 GIT binary patch literal 1594 zcmV-A2F3Y_P)Px)^hrcPR9Hvtm|JWVRT#(r-|Vv80=g|=%gsjA5JICdkQS+6xD`Q)7|TWC1Bx-~ zgJ_IC-~*ONOnguz8md9j0Ko?z3}9`c?v?_fR4^7HqAdj>Etj_RvO7DMbIjS@S*Fw3 z-I;CCkTBWJ?B&ckzwbZ)@0)WD;VwPsF6G8O@c;VG-D$m;xdJv%zE^uA@IC}K!U8wqAvjpHs z{lVZ34f(k|x*MR1l#vgDHo=PDIp6_M@jwAq7feKHAb?4}954Wv%ZsYu+FcW;lj6tIRn{?hoMe8O4}6_P(@tJk;HVH_x}A zEfNv@9eOxiu2j76ha31f_`!oY{xQB^i0DaI&pSv^A|vR*Q)5B0)LFQ-M4jm{kIwLug~1E>*$2 zlgDvUmPI$a}4ElHcw?}Sse0sjD9A)+y^)n*(y1pGR8KBnc4c3KbywL5b21}aWB zffF&-)%S$5cCBF<1KJjzavJJ3Nt`~(sCKd&7Ox;N#Tj0iJQX`;K9&`W=;p9PnsKjkIMi%sAu zRVRO_?h1h>I|gS7#TkQ#b6j8a4E!EZ1hYR{`g&1%{3y6b;&SZ|`PjCzKa=W0ag_*O zN8m!`ghhnfh2BwUTUeewapKAwN)$!)wSeS7ZJ z@yv>0TjlrOTPSS|0$#5wZ{CuJ=4QnS_#Oh*I|4WPTflQwMa`TtJUyXcSgKdI{f$lM zS^&v=N?u+u4}hL2LCF`Yd(i{hn=SapNmH<6R>`oy7l)4ESbra&saxb#Yd&%Wj{W<6 z{)yu*5U6O#=ozdc6wgrx>$WA-HY!Sb@YsAM zSob9ny_!~aOF4wjz!e2NDr5DO2l3UMGUPa{>D|#No(t8Zsizz8dV}T5c?JWR= zJw*94?2%Dz(OvpgepQv^TQpCsh^9-r9uP9c7&Mi@I6+kj8Y3``xS~jiL_8P>dzqqm zIMXF)JlQ{KNUYOEp3b?^?zG1y7niSPj|9EdT%j07*qoM6N<$f--3E8~^|S literal 3631 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 B3}OHP diff --git a/app/src/main/res/drawable/radio_button_selector.xml b/app/src/main/res/drawable/radio_button_selector.xml new file mode 100644 index 0000000..3b67b1e --- /dev/null +++ b/app/src/main/res/drawable/radio_button_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/thumb_switch_white.xml b/app/src/main/res/drawable/thumb_switch_white.xml new file mode 100644 index 0000000..2e15ed1 --- /dev/null +++ b/app/src/main/res/drawable/thumb_switch_white.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/track_selector.xml b/app/src/main/res/drawable/track_selector.xml new file mode 100644 index 0000000..d7f7c34 --- /dev/null +++ b/app/src/main/res/drawable/track_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/track_switch_off.xml b/app/src/main/res/drawable/track_switch_off.xml new file mode 100644 index 0000000..a521aa9 --- /dev/null +++ b/app/src/main/res/drawable/track_switch_off.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/track_switch_on.xml b/app/src/main/res/drawable/track_switch_on.xml new file mode 100644 index 0000000..2176b16 --- /dev/null +++ b/app/src/main/res/drawable/track_switch_on.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/auto_mode_activity.xml b/app/src/main/res/layout/auto_mode_activity.xml new file mode 100644 index 0000000..4017459 --- /dev/null +++ b/app/src/main/res/layout/auto_mode_activity.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_auto_mode_notice.xml b/app/src/main/res/layout/dialog_auto_mode_notice.xml new file mode 100644 index 0000000..0640840 --- /dev/null +++ b/app/src/main/res/layout/dialog_auto_mode_notice.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_container_select.xml b/app/src/main/res/layout/dialog_container_select.xml new file mode 100644 index 0000000..717cd5b --- /dev/null +++ b/app/src/main/res/layout/dialog_container_select.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/voice_settings_activity.xml b/app/src/main/res/layout/voice_settings_activity.xml new file mode 100644 index 0000000..a3b59a8 --- /dev/null +++ b/app/src/main/res/layout/voice_settings_activity.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/warning_voice_content_activity.xml b/app/src/main/res/layout/warning_voice_content_activity.xml new file mode 100644 index 0000000..2ea3b6d --- /dev/null +++ b/app/src/main/res/layout/warning_voice_content_activity.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + +