From a3115b6b86c9af3fbef77cb00027961cf9cc1090 Mon Sep 17 00:00:00 2001 From: maxinyu Date: Wed, 6 May 2026 10:34:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E6=97=B6=E8=A7=86=E9=A2=91UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deviceManager.xml | 13 + .kotlin/errors/errors-1778028479135.log | 48 +++ .kotlin/errors/errors-1778028479894.log | 48 +++ .kotlin/errors/errors-1778028480507.log | 48 +++ .kotlin/errors/errors-1778033946759.log | 48 +++ app/build.gradle.kts | 2 + app/src/main/AndroidManifest.xml | 6 + .../home/HomeMenuFragment.kt | 2 +- .../defenseapplication/home/ScanActivity.kt | 291 +++++++++++++++ .../liveVideo/LiveVideoActivity.kt | 133 +++++++ app/src/main/res/drawable/album.png | Bin 0 -> 3403 bytes app/src/main/res/drawable/back2.png | Bin 0 -> 2331 bytes .../main/res/drawable/bg_button_circle.xml | 5 + app/src/main/res/drawable/bg_scan_frame.xml | 7 + app/src/main/res/drawable/copy.png | Bin 0 -> 1195 bytes .../main/res/drawable/corner_bottom_left.xml | 11 + .../main/res/drawable/corner_bottom_right.xml | 11 + app/src/main/res/drawable/corner_top_left.xml | 11 + .../main/res/drawable/corner_top_right.xml | 11 + app/src/main/res/drawable/flashlight.png | Bin 0 -> 2525 bytes app/src/main/res/drawable/light_on.png | Bin 0 -> 641 bytes app/src/main/res/drawable/settings.png | Bin 0 -> 661 bytes app/src/main/res/drawable/voice.png | Bin 0 -> 740 bytes .../main/res/layout/live_video_activity.xml | 342 ++++++++++++++++++ app/src/main/res/layout/scan_activity.xml | 176 +++++++++ 25 files changed, 1212 insertions(+), 1 deletion(-) create mode 100644 .idea/deviceManager.xml create mode 100644 .kotlin/errors/errors-1778028479135.log create mode 100644 .kotlin/errors/errors-1778028479894.log create mode 100644 .kotlin/errors/errors-1778028480507.log create mode 100644 .kotlin/errors/errors-1778033946759.log create mode 100644 app/src/main/java/com/example/defenseapplication/home/ScanActivity.kt create mode 100644 app/src/main/java/com/example/defenseapplication/liveVideo/LiveVideoActivity.kt create mode 100644 app/src/main/res/drawable/album.png create mode 100644 app/src/main/res/drawable/back2.png create mode 100644 app/src/main/res/drawable/bg_button_circle.xml create mode 100644 app/src/main/res/drawable/bg_scan_frame.xml create mode 100644 app/src/main/res/drawable/copy.png create mode 100644 app/src/main/res/drawable/corner_bottom_left.xml create mode 100644 app/src/main/res/drawable/corner_bottom_right.xml create mode 100644 app/src/main/res/drawable/corner_top_left.xml create mode 100644 app/src/main/res/drawable/corner_top_right.xml create mode 100644 app/src/main/res/drawable/flashlight.png create mode 100644 app/src/main/res/drawable/light_on.png create mode 100644 app/src/main/res/drawable/settings.png create mode 100644 app/src/main/res/drawable/voice.png create mode 100644 app/src/main/res/layout/live_video_activity.xml create mode 100644 app/src/main/res/layout/scan_activity.xml diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..91f9558 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.kotlin/errors/errors-1778028479135.log b/.kotlin/errors/errors-1778028479135.log new file mode 100644 index 0000000..e99c6ac --- /dev/null +++ b/.kotlin/errors/errors-1778028479135.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-tsmarker2497125691510638864.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-1778028479894.log b/.kotlin/errors/errors-1778028479894.log new file mode 100644 index 0000000..d644ecc --- /dev/null +++ b/.kotlin/errors/errors-1778028479894.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-tsmarker13401715878096134783.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-1778028480507.log b/.kotlin/errors/errors-1778028480507.log new file mode 100644 index 0000000..bccd24f --- /dev/null +++ b/.kotlin/errors/errors-1778028480507.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-tsmarker15696211365864685003.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-1778033946759.log b/.kotlin/errors/errors-1778033946759.log new file mode 100644 index 0000000..2a87f3f --- /dev/null +++ b/.kotlin/errors/errors-1778033946759.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-tsmarker8173295206901294308.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 fa6f916..751c58f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -74,4 +74,6 @@ dependencies { implementation("com.github.bumptech.glide:glide:4.15.1") //Glide 依赖 implementation("com.github.bumptech.glide:glide:4.16.0") + // ZXing 二维码扫描库 + implementation("com.google.zxing:core:3.5.2") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ff1d529..a0a16f1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,12 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.DefenseApplication"> + + diff --git a/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt b/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt index c3a001c..f7b7287 100644 --- a/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt +++ b/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt @@ -75,7 +75,7 @@ class HomeMenuFragment : Fragment() { startActivity(intent) } binding.addFamily.setOnClickListener { - val intent = Intent(requireContext(), AddFamilyActivity::class.java) + val intent = Intent(requireContext(), ScanActivity::class.java) startActivity(intent) } } diff --git a/app/src/main/java/com/example/defenseapplication/home/ScanActivity.kt b/app/src/main/java/com/example/defenseapplication/home/ScanActivity.kt new file mode 100644 index 0000000..f505c09 --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/home/ScanActivity.kt @@ -0,0 +1,291 @@ +package com.example.defenseapplication.home + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.ImageFormat +import android.graphics.Matrix +import android.graphics.RectF +import android.graphics.SurfaceTexture +import android.hardware.Camera +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.provider.MediaStore +import android.view.SurfaceHolder +import android.view.SurfaceView +import android.view.View +import android.view.animation.Animation +import android.view.animation.LinearInterpolator +import android.view.animation.TranslateAnimation +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import com.example.defenseapplication.R +import com.example.defenseapplication.databinding.ScanActivityBinding +import com.google.zxing.* +import com.google.zxing.common.HybridBinarizer +import java.util.* + +class ScanActivity : AppCompatActivity(), SurfaceHolder.Callback { + + private lateinit var binding: ScanActivityBinding + private var camera: Camera? = null + private var isFlashlightOn = false + private var scanHandler: Handler? = null + private var scanRunnable: Runnable? = null + private val REQUEST_CODE_CAMERA = 100 + private val REQUEST_CODE_ALBUM = 101 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ScanActivityBinding.inflate(layoutInflater) + setContentView(binding.root) + + initView() + initListener() + startScanLineAnimation() + } + + private fun initView() { + binding.surfaceView.holder.addCallback(this) + } + + private fun initListener() { + binding.btnBack.setOnClickListener { + finish() + } + + binding.llAlbum.setOnClickListener { + openAlbum() + } + + binding.llFlashlight.setOnClickListener { + toggleFlashlight() + } + } + + private fun startScanLineAnimation() { + val animation = TranslateAnimation( + Animation.RELATIVE_TO_PARENT, 0f, + Animation.RELATIVE_TO_PARENT, 0f, + Animation.RELATIVE_TO_PARENT, 0f, + Animation.RELATIVE_TO_PARENT, 1f + ) + animation.duration = 2000 + animation.repeatCount = Animation.INFINITE + animation.interpolator = LinearInterpolator() + binding.scanLine.startAnimation(animation) + } + + private fun openAlbum() { + val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(intent, REQUEST_CODE_ALBUM) + } + + private fun toggleFlashlight() { + if (camera == null) { + Toast.makeText(this, "相机未准备好", Toast.LENGTH_SHORT).show() + return + } + + isFlashlightOn = !isFlashlightOn + val params = camera?.parameters + + if (isFlashlightOn) { + params?.flashMode = Camera.Parameters.FLASH_MODE_TORCH + binding.ivFlashlight.setColorFilter(ContextCompat.getColor(this, R.color.green)) + } else { + params?.flashMode = Camera.Parameters.FLASH_MODE_OFF + binding.ivFlashlight.clearColorFilter() + } + + camera?.parameters = params + } + + private fun checkCameraPermission(): Boolean { + return ContextCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + } + + private fun requestCameraPermission() { + ActivityCompat.requestPermissions( + this, + arrayOf(Manifest.permission.CAMERA), + REQUEST_CODE_CAMERA + ) + } + + private fun openCamera() { + if (!checkCameraPermission()) { + requestCameraPermission() + return + } + + try { + camera = Camera.open() + camera?.setDisplayOrientation(90) + + val params = camera?.parameters + params?.previewFormat = ImageFormat.NV21 + + val sizes = params?.supportedPreviewSizes + val optimalSize = getOptimalPreviewSize(sizes, binding.surfaceView.width, binding.surfaceView.height) + if (optimalSize != null) { + params?.setPreviewSize(optimalSize.width, optimalSize.height) + } + + camera?.parameters = params + camera?.setPreviewDisplay(binding.surfaceView.holder) + camera?.startPreview() + + startScanDecode() + } catch (e: Exception) { + Toast.makeText(this, "无法打开相机", Toast.LENGTH_SHORT).show() + } + } + + private fun getOptimalPreviewSize(sizes: List?, w: Int, h: Int): Camera.Size? { + if (sizes == null) return null + + var optimalSize: Camera.Size? = null + val targetRatio = h.toDouble() / w.toDouble() + + for (size in sizes) { + val ratio = size.width.toDouble() / size.height.toDouble() + if (Math.abs(ratio - targetRatio) < 0.01) { + optimalSize = size + break + } + } + + if (optimalSize == null) { + var minDiff = Int.MAX_VALUE + for (size in sizes) { + val diff = Math.abs(size.width - w) + Math.abs(size.height - h) + if (diff < minDiff) { + optimalSize = size + minDiff = diff + } + } + } + + return optimalSize + } + + private fun startScanDecode() { + scanHandler = Handler(Looper.getMainLooper()) + scanRunnable = object : Runnable { + override fun run() { + decodeQRCode() + scanHandler?.postDelayed(this, 100) + } + } + scanHandler?.post(scanRunnable!!) + } + + private fun decodeQRCode() { + if (camera == null) return + + try { + val parameters = camera?.parameters + val size = parameters?.previewSize + if (size == null) return + + val data = ByteArray(size.width * size.height * 3 / 2) + camera?.setOneShotPreviewCallback { bytes, _ -> + val source = PlanarYUVLuminanceSource( + bytes, size.width, size.height, 0, 0, + size.width, size.height, false + ) + val binarizer = HybridBinarizer(source) + val bitmap = BinaryBitmap(binarizer) + + val reader = MultiFormatReader() + val hints = Hashtable() + hints[DecodeHintType.CHARACTER_SET] = "UTF-8" + reader.setHints(hints) + + try { + val result = reader.decode(bitmap) + handleScanResult(result.text) + } catch (e: Exception) { + } + } + } catch (e: Exception) { + } + } + + private fun handleScanResult(result: String) { + stopScanDecode() + camera?.stopPreview() + + Toast.makeText(this, "扫描结果: $result", Toast.LENGTH_SHORT).show() + + val intent = Intent(this, AddFamilyActivity::class.java) + intent.putExtra("device_code", result) + startActivity(intent) + finish() + } + + private fun stopScanDecode() { + scanRunnable?.let { scanHandler?.removeCallbacks(it) } + scanHandler = null + scanRunnable = null + } + + override fun surfaceCreated(holder: SurfaceHolder) { + openCamera() + } + + override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { + if (camera != null) { + camera?.stopPreview() + try { + camera?.setPreviewDisplay(holder) + camera?.startPreview() + } catch (e: Exception) { + } + } + } + + override fun surfaceDestroyed(holder: SurfaceHolder) { + stopScanDecode() + camera?.stopPreview() + camera?.release() + camera = null + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_CODE_CAMERA) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + openCamera() + } else { + Toast.makeText(this, "需要相机权限", Toast.LENGTH_SHORT).show() + finish() + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_CODE_ALBUM && resultCode == RESULT_OK && data != null) { + val uri = data.data + uri?.let { + Toast.makeText(this, "已选择图片", Toast.LENGTH_SHORT).show() + } + } + } + + override fun onDestroy() { + super.onDestroy() + stopScanDecode() + camera?.stopPreview() + camera?.release() + camera = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/liveVideo/LiveVideoActivity.kt b/app/src/main/java/com/example/defenseapplication/liveVideo/LiveVideoActivity.kt new file mode 100644 index 0000000..958b1b7 --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/liveVideo/LiveVideoActivity.kt @@ -0,0 +1,133 @@ +package com.example.defenseapplication.liveVideo + +import android.content.Context +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.View +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.example.defenseapplication.databinding.LiveVideoActivityBinding + +class LiveVideoActivity : AppCompatActivity() { + private lateinit var binding: LiveVideoActivityBinding + + private var isVoiceEnabled = false + private var isLightOn = false + private var isRecording = false + private var recordTime = 0 + private var recordHandler: Handler? = null + private var recordRunnable: Runnable? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = LiveVideoActivityBinding.inflate(layoutInflater) + setContentView(binding.root) + + initListener() + } + + private fun initListener() { + // 返回按钮 + binding.btnBack.setOnClickListener { + finish() + } + + // 菜单按钮 + binding.ivMenu.setOnClickListener { + Toast.makeText(this, "菜单", Toast.LENGTH_SHORT).show() + } + + // 全屏按钮 + binding.ivFullscreen.setOnClickListener { + Toast.makeText(this, "全屏", Toast.LENGTH_SHORT).show() + } + + // 语音按钮 + binding.llVoice.setOnClickListener { + toggleVoice() + } + + // 灯光按钮 + binding.llLight.setOnClickListener { + toggleLight() + } + + // 录像按钮 + binding.llRecord.setOnClickListener { + toggleRecording() + } + + // 告警日志区域 + binding.llAlarmLog.setOnClickListener { + Toast.makeText(this, "查看告警日志", Toast.LENGTH_SHORT).show() + } + } + + private fun toggleVoice() { + isVoiceEnabled = !isVoiceEnabled + + if (isVoiceEnabled) { + binding.vVoiceActive.visibility = View.VISIBLE + binding.ivVoice.setColorFilter(resources.getColor(com.example.defenseapplication.R.color.green)) + Toast.makeText(this, "语音已开启", Toast.LENGTH_SHORT).show() + } else { + binding.vVoiceActive.visibility = View.INVISIBLE + binding.ivVoice.clearColorFilter() + Toast.makeText(this, "语音已关闭", Toast.LENGTH_SHORT).show() + } + } + + private fun toggleLight() { + isLightOn = !isLightOn + + if (isLightOn) { + binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.light_on) + binding.ivLight.setColorFilter(resources.getColor(com.example.defenseapplication.R.color.green)) + Toast.makeText(this, "灯光已开启", Toast.LENGTH_SHORT).show() + } else { + binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.low_light) + binding.ivLight.clearColorFilter() + Toast.makeText(this, "灯光已关闭", Toast.LENGTH_SHORT).show() + } + } + + private fun toggleRecording() { + isRecording = !isRecording + + if (isRecording) { + recordTime = 0 + binding.tvRecordTime.text = "00" + startRecordTimer() + binding.ivRecord.setColorFilter(resources.getColor(com.example.defenseapplication.R.color.red)) + Toast.makeText(this, "开始录像", Toast.LENGTH_SHORT).show() + } else { + stopRecordTimer() + binding.ivRecord.clearColorFilter() + Toast.makeText(this, "停止录像,共录制 ${recordTime} 秒", Toast.LENGTH_SHORT).show() + } + } + + private fun startRecordTimer() { + recordHandler = Handler(Looper.getMainLooper()) + recordRunnable = object : Runnable { + override fun run() { + recordTime++ + binding.tvRecordTime.text = String.format("%02d", recordTime) + recordHandler?.postDelayed(this, 1000) + } + } + recordHandler?.post(recordRunnable!!) + } + + private fun stopRecordTimer() { + recordRunnable?.let { recordHandler?.removeCallbacks(it) } + recordHandler = null + recordRunnable = null + } + + override fun onDestroy() { + super.onDestroy() + stopRecordTimer() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/album.png b/app/src/main/res/drawable/album.png new file mode 100644 index 0000000000000000000000000000000000000000..303b58c9d95108e5291d83d85999784b17087017 GIT binary patch literal 3403 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 DP{YcN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/back2.png b/app/src/main/res/drawable/back2.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4c014e3c0f0edb2abbd5d9ce20d376abfeefce GIT binary patch literal 2331 zcmZuzdpuNY7v3{%({^pom?D&IjJx_26_IAUWX3IoCh8>RmeMrUq)x|~*}`CGnnSL~ ztrF#a?@&h_LM4}^2yvp)mA;~Ms`Hk<|Gq!=-fO>mJ#9ty^-Ey1euUDq?8Wqr=Fy5n_74X(3jSG0Lbfx7m|72yL~dM0bjzXXIzr5x*8r2? z{DqjAeO>`(Ud@*$;|Ru<+Ew1Rh0$}1js`2+K{!EA2$})ezciSKqvTa`^5nFj8wNsb zI-E^eERV4r8B!nkP)v$)5nFF5Hq^TrqzOk6;+Zf0wT^C>T>!RLaequcV)zpED>|8&~>6p ziYd6Xi_d5?Km>oHEc7pt7DcpQ);vXEZF_d|-u~9y4WbaWibi$-7e90B;OXIM;!Db{ zotKg=WUu1ru$An{!PdjEs<4%@V9WLVI2vq46YwTdVyR%|s8{b;9NJQ<#mO?>;x{RW zC%e8Hv`yJz+-ML@*N;(MtLwL5Q@AyyXxcd3UzdV`rL&v8E zEObk6mSXLzyfo)J?*Uz7^}DW@y}S|A2(}ne!aU`pGwO_v7kTZb46~Y(u=dLQ1RK93 zp&~9l>-WpjNL|ruAnk_2+eja>3tU_WjTgn95h+ri>9cXGk)+ndq*<0$)vAW-LBa4J zNMKS)%Oi!LvdX9j+?I&6q-$C46aMaa{xB$frC6^dcBP(^TBz$_ig0dXV6M=m%R;TC z`^)}o6j3ew+Ld-i=e}+IQA_0?&Hvzf3AAU% z;?+3K6KkS9TPbeF;tkQ|@(rj%fYgDG9Ds)qh8ep`m2#a*+DeEOWn%JJjL;f~DI5pU z6s!3>Mvi6{u-@s9`l6z5EXQfQ72jD>kQ)s#!k_UJI>7WqvygdAs2e7k$J8)U=Xs1D z6*2gZu}o-jkv9@Q7XivXee?(AUK%n_iPj<~)xHZ8YrtOLgfSF8798Ca22{kS(Omlg z!yl3J=vw?t^6PiD%!7XFakn(Q(0e4%f`(1t5Pxq*x~^HxJkxfDS<`&vO63`}_c8pl z?PW_+9(Rf`gEjUtRduZ>Ftrvb?bK$!Z6(eQtKj;7?t8U>LBP95;N0CgnJ)O8q zLL|)g=X|QtMR9~48`-;-#ry`~Ubv$41FLJW(7aY)j z+WR1=E)=+*N2@E+LC|9&k1wU*P2PX^uD5)Y3K54}yT(W4G4ZTI<<&BfW)h`83%sOh ztN8s9;AK0eXMfKgCm<3{+Ck=`@ws^x%Z zT~oNhe+ay?t|_C_Tohlc(+<<|2LM-eWsT9{WMIH-Vgsy?U_TP_Qn0q^ z2lm)v63p>&ml?T1xU*_dlQ$^gW5p@70QTmVGVMhLQjABKsuJM8ChE8LyFmY6iCG + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_scan_frame.xml b/app/src/main/res/drawable/bg_scan_frame.xml new file mode 100644 index 0000000..f7b2f09 --- /dev/null +++ b/app/src/main/res/drawable/bg_scan_frame.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/copy.png b/app/src/main/res/drawable/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..b91a1e4eea7bed74bffdab7be153c19f7d9e66fc GIT binary patch literal 1195 zcmV;c1XTNpP)gw{s;cz`XP*YPgh>VKS-@rGjtE(GiqS5GMA|8ep z#^dpKlarH|k!65f4Y1Y7t&E#kA4XpQ;Dfc&YZv2f8bA1yom;m6bI>h87cLm}_6z z(a~`s5{bkZ+r$-brX))30gv9^-fxy=odfI|hRW_@eB4y&Fg7MvK(n*658-(!{FT5P z$lO!(DFR?VhiGM@xuT-t59Aa9_6a4io_)H7VoK-W)S`i63{-C}Aa=_q!Hz1h^dxS@ zMgafhP|Zne0UeC>1Bv-P@|n=n3S*#SV`JM1vH*|6=(9j5o2{v>kH9I36ZHeGnEJJCIjsI(1MDA8xpCT}F;IfpJrk+MZMz__ULak4 zi#_p!2LM|w%PP~04 zwzjqrJYIkU1UXY#Svjk<(7*-a1M45Lo7J+y;qWpJdYm=+xR~&%VOll@Do>$M=rmF- zX&xEAt-y?@NLgjD1EBTE+0?-Rsq&eR%`*;l3TaHPfHpNXMfqad2#~i#C?N1X!0uDs zF}4YS5p@K6z(e&+-R|Lw=^;a1`CELHB>%gymXcfnm8Y(*t~a~{Ytf&<^8tI758_t< zzFb>dTSn$qAy+ZpLW94Qo16O@yYtxT>;Ad+$_I0<$Td)TS0Fx!R}l0x+5N(tvfGG$ zjgq*JybrKG8vIV=BGx~{Cn=rf+KcX*JONb{T^(0^2w;T()=MV)P;8O}K$; zFQO!lsC1b3M4o{<(e&m5xCJ1a;3YKokQluPSpv7p# + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/corner_bottom_right.xml b/app/src/main/res/drawable/corner_bottom_right.xml new file mode 100644 index 0000000..662202c --- /dev/null +++ b/app/src/main/res/drawable/corner_bottom_right.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/corner_top_left.xml b/app/src/main/res/drawable/corner_top_left.xml new file mode 100644 index 0000000..6bff040 --- /dev/null +++ b/app/src/main/res/drawable/corner_top_left.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/corner_top_right.xml b/app/src/main/res/drawable/corner_top_right.xml new file mode 100644 index 0000000..698b660 --- /dev/null +++ b/app/src/main/res/drawable/corner_top_right.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/flashlight.png b/app/src/main/res/drawable/flashlight.png new file mode 100644 index 0000000000000000000000000000000000000000..530b282ec59cfe5e67d7b407ff35ece6e4e70d3a GIT binary patch literal 2525 zcmZ`*eLPfY8$L6R97$$|kk7-6L5M=s?s(^9h8dqJsnill*w`pL8(GsyHH5}U3QLPV zwnRoGAE7klt4$$7ihQN0QBzvk$L{;j`@Z}BanAYO&wYN+b6?l}JlFLkZt`$eUaGYe zf*@rshqW1en-?Es33y-MUYrX-iXtux^Zto2^~ zCRn_$N22ndiv1pi@q#@Zly;O1oVVWKXCWNPQ}rkD>)nY+l&Z1~qlw%F%s0JDI@u#B%D5 z+!kO`W4!W%3n&3LMKUkVt1?LowzOk7Oe#coWqtI7u+?GBboc~J3gR4-kt$I>s=<7k zP%nh=WuY^AL=BiULPWAjniQtcAVoYKI$%J6Be&aZbV!A8ou;f@9SW0ll1&{M24zMT zO+5H3ee<=jcS{n4pD}c;HUJd~){0oBpwJ}qHz&Xf1}z-QMKEkC_Ud!bRlsR=1WtSw zgu6*!ghUY$(H~3D`A{OVw*6$m14WecUi(7uoZg%hNoA{{Bn(up6|>=toFME+N3J6oOw@Q)^f&?_{VQEx zj*`o0#>jpeAJuM%+_4-iT+k78JB?|NRTanHcxC3=Ly_wmc`S*&Ik`6gUSr^$U|jII z>1>|)<+GYs=$<|WB|aM4N*v`)*^>JBTNPX3%)HI&v1fZ8-tmceA8jchWU8Hx5U7q9 zbWJrVEs^1xTdCg=}qA?f^T2h31i+i z>WCWXDf>oeh#C>0TojFXB|x}ZgG+%IVD5~I$e9cnI+dZiR+TAi>oS(@SPTXK6lQf@ zo*o78rAA3BhXw`)%1*W!BJX?TLIRIC*B{qOvd7W74CIsw5dzZ-kes$J_QF4eL7a)3l?K0Vl6>-%e^G7V_ysyF;7J zOFNyHUw*%f1P&P~oc5i5{j9Uw|5{r0TmqTJ!&fjLRunt@s>Z|F(&Z^LZ#OF&aXkGW zR%*G=x%()SHo0pdd*YB6aH$t7>I&*xVtjYSLAYBl{$^ICZr44<{K*gUk+Pa=Pmft- z@y1Jg!hH?oy=>hmD^7T^tR~GP#&jKb1;|gNKWQX!V>A^?X3xbQ$o#_7@Fi)pX`q@f z&+QIcRORxPr7KwoD7M_$EB94ysVDC_tJ3yOs^S56%NO$GWIsv@y)Ver8EvfDBQQRW z#@%gmjv>i!GZ@u%bO>E6jfzOq0zSy%^n(Z2G>V)^M&TkWeX?LabCWdHAlDl=dH44m zpX~|y($tj0msAVK8jlnzl-^s_U$du~b`f2d6aoi0tgTV4s8v}%t(ng;6+q``ZO(Au zmwaclHT{G5F|)@@^ZRB+AvTZbtx?3lOHEH+ZL?=sm!om*-XSY$o(Gll`FEn%$(I@7 z=0mS!YT9h?kWp%@tLD#xYglQ1qy{VQtazns7sTzM!<&~X1=PVCpcfXqlLaA5n=N2ck*11%ii%9W3@hS6p~H) z_7(`}h3Chp0SijilhubXq2gvbxBIhTR96c#9v`t++a{c!yu9x~3jIs@)1O^iZqJ*j z2uN5k`pm>|{h@myjDtT4?oEv8-dknZER>|k=!swZ?Cu>&INWrfu_#v&;aRk-(=0vq zIbO1wKIU}6ZK|_ztBAF0R&#w?Oot;P&VRcuX?)Aa!EPBrgW*(sA#KHA3d9nipey8mKo9(%fqfQ7>&K{^p_ih* zCPlQlY314d*z?=l#c_SP;QU+jSLt-Cocx_191xIoYYqgLvUJNYM_kleJo2+)p9WWA2PT zBvPu;`*cl;&fMqi`co%bdq6jBZ?@!_ac7@h({mGKIlUWtDh!nq8HQ01%IdOBF1JNfbEX1jC2YF zmQ(qu@Sj6T3^AaXDYUvsOQQhKgSYlAbA+(FXGAO)uq?$p)Or~KR@~BJo~V;;jO(;! z59W}Wqt2QTq`a za)YoA+IGj?z+(RW!$-*BZFpKuYS}tGs9yWSxBW3M=2akQVWD)a#~NJHmMq@Rr>){|TetIH>>t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/light_on.png b/app/src/main/res/drawable/light_on.png new file mode 100644 index 0000000000000000000000000000000000000000..f3441099d4ff6aba0eb7080bf69be7ba7262f3e8 GIT binary patch literal 641 zcmV-{0)G98P)ijgdqD`A zQdCGMW;gLn6PC?B?~H{o%N%CrKF*xnxf@m)_$QAPD*B>iMP)@rS3oqM>`_@!o(dF; z#jLLDYk&!S0#>0=_`+;rUI&JG_*pJ@k3!6fWm%0xB5?rZfKea`@+{^Y=KXHB`>JW$ zGS=k5B@~D6L5u;61Sw#CMNy9NqjrPhf_!A55V?xOw}QysJ_z1M8)$BOls!qPs;XlU zS&njmI|gk~X8CS=*q$Ubl}fRy426+<`BBwOI-S$Jpr-y;X;cZ{6R;za&?obn1C}XbGYF7}j$<`6DQK?ieBgA=za0z9M=+{Gty#`D_ zAnpczd4!ofxP_u$ZCvL(FzW|YGEeDC=da=x%E(Hk(m1~IC;Y(tERF|4gtpu56Z{K2 z`+@m+M6z5VLeZOVjLZ*Ve!o1YU5HS8MDIY%1Bg3-b97+8XMU%VvKAr~FG~|I(lq8I zkZ>Rg`waF?ia2ME5TQ=OzgkP7qAM#aDl00w0;2h3kBYA7F8}}l|NnW=oxlJ900v1! bK~w_(`^E%hT$FHs00000NkvXXu0mjfs7n@o literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/settings.png b/app/src/main/res/drawable/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..77a6f3b38afa119c50068d14e62d196010ffb263 GIT binary patch literal 661 zcmV;G0&4wtG)c3n@O{7H8)M7_uFKj!z~;iaQ^;#MhL|#O@juOTkt5h3T&wV3*Wk8~~2xZJUpNXgUKM7iE z;ARyzFgnb?`*0cB!E@jz;3NJX*ae@#m~-Zs>&I?{c#%pq$S1VmT!2R~4zFPd+`voh z1Uv+DV&A564OpA;jqpe11OtC$`~WWE`;&PL`v=UylvYxM{HjSDe`F3~55PN^hD4=p vkXR@#VFdsH|NpHwnq>e000v1!K~w_(wi;?NQ3l_c00000NkvXXu0mjfp-m}! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/voice.png b/app/src/main/res/drawable/voice.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d1394bd75b0596f5975ba0c9668715872f540b GIT binary patch literal 740 zcmVYT`r9$rN$*cQc4+=F8h(I4F-dKt_33` zb%1X3>ci29d)0X5b%1*H(2@^9wT$tXO}6$#`4PX!KhL~;V4mpj;@w2eH_7L6xzp&9 z#C{cMqCCYHXmkUO0r672oA}XxEqQ8hqVp2_RZ!5U!0ydtGKZ?wYKx|?&~FW}7o}3^ zVLF{YBKJ`A9Qn3Dpfq2WPO(_*D&A&dbF6iUHyCU0sgWaM{Ix0ENbe?IRqW*2C)47lLZKHy2*tpqj_JB#T_!Zp( zwvbFFUi#9FVuETVtAMTCLU(V&4`BRJw3B+cZ82#7A_NwN;>&(PeqE z@p3#?o!lpCPslyg1+u`P(v8N?`u+YC5O?Jos0DP5_&R<8A7S!$y4~)S)N&ozlt86x ztycR2#A2`4+XK`zG968`wwq&cuF+_GmRc1lgASY5>vapLCrr{3Ni1u_ysFm*stV$D zzcMHf&J1d!cOn{2iX?XQ20z1^k|~4IUBC|FhZ-jq4X+PyEj75{rVLsxmse06MgAbk ztprD0zf&1>eVf1k9)jwgaX8U%qPi!bd%y6E>YnIN00030|NNF=tpET321!IgR09Cq Wz7%9}QOrRA0000 + + + + + +