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 04bc36b..5e95b3c 100644 Binary files a/app/src/main/res/drawable/open.png and b/app/src/main/res/drawable/open.png differ 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 @@ + + + + + + + + + + + + + + + + + + + +