Compare commits

...

18 Commits

Author SHA1 Message Date
60ecdf140b 视频组件自定义 2026-06-03 17:17:44 +08:00
b1aa844ff6 二维码海报文本修复 2026-06-02 17:55:48 +08:00
5822e562de 操作密码弹窗修改2 2026-06-02 16:45:31 +08:00
a1b9acb2a6 操作密码弹窗修改 2026-06-02 11:59:36 +08:00
a1ff4d100a 打击位置 2026-06-02 10:09:11 +08:00
c4fd35bfe4 人脸识别优化 2026-06-01 11:38:32 +08:00
5cda6d959e 视频组件优化 2026-05-30 17:36:10 +08:00
ed9d05cb42 控制台 2026-05-29 17:46:13 +08:00
08449d8abb 设备告警日志功能逻辑 2026-05-29 17:04:26 +08:00
9186cd00aa 告警日志 2026-05-29 11:50:26 +08:00
b2d3046560 视频组件优化 2026-05-28 16:08:54 +08:00
bb0d3278d9 视频播放2 2026-05-28 10:22:45 +08:00
c5043e4b94 消息列表 2026-05-27 17:44:37 +08:00
97a0cdc14f 视频播放1 2026-05-27 11:58:26 +08:00
ac906c901b 语言切换 2026-05-27 09:36:56 +08:00
298b06d456 关联用户增加判断限制 2026-05-26 15:50:47 +08:00
c073c88e10 修改头像 2026-05-26 11:50:01 +08:00
5b7d20d38c 优化时间弹窗 2026-05-26 11:07:14 +08:00
111 changed files with 4606 additions and 1477 deletions

View File

@@ -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-tsmarker1897998583941030835.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)

View File

@@ -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-tsmarker4280023666426713710.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)

View File

@@ -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-tsmarker6807434421098950563.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)

View File

@@ -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-tsmarker18298092490044811834.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)

View File

@@ -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-tsmarker675493756856786103.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)

View File

@@ -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-tsmarker363153033999884612.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)

View File

@@ -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-tsmarker7266068786923921618.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)

View File

@@ -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-tsmarker6060836606557425682.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)

View File

@@ -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-tsmarker6135465445400501887.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)

View File

@@ -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-tsmarker6832357712229129302.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)

View File

@@ -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-tsmarker5649452800895938430.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)

View File

@@ -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-tsmarker10125279422631968769.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)

View File

@@ -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-tsmarker7269833412828133188.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)

View File

@@ -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-tsmarker17907910050607765785.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)

View File

@@ -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-tsmarker17199317018793355222.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)

View File

@@ -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-tsmarker8271334189253964048.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)

View File

@@ -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-tsmarker17519709458999463610.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)

View File

@@ -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-tsmarker8459139837582729201.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)

View File

@@ -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-tsmarker15417398723823102730.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)

View File

@@ -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-tsmarker9939269725558436971.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)

View File

@@ -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-tsmarker8049621108352680097.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)

View File

@@ -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-tsmarker4815358130057473133.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)

View File

@@ -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-tsmarker3301789471641137523.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)

View File

@@ -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-tsmarker13521342049877521529.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)

View File

@@ -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-tsmarker7858488327127427935.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)

View File

@@ -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-tsmarker4123933203426760146.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)

View File

@@ -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-tsmarker7296770195837935349.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)

View File

@@ -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-tsmarker14985441017732479130.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)

View File

@@ -81,18 +81,14 @@ dependencies {
implementation("com.github.bumptech.glide:glide:4.16.0") implementation("com.github.bumptech.glide:glide:4.16.0")
// ZXing 二维码扫描库 // ZXing 二维码扫描库
implementation("com.google.zxing:core:3.5.2") implementation("com.google.zxing:core:3.5.2")
// ExoPlayer 核心库
implementation("androidx.media3:media3-exoplayer:1.9.0")
// ExoPlayer UI组件库提供PlayerView等
implementation("androidx.media3:media3-ui:1.9.0")
// ExoPlayer 通用库
implementation("androidx.media3:media3-common:1.9.0")
// 基础依赖包,必须要依赖 // 基础依赖包,必须要依赖
implementation("com.geyifeng.immersionbar:immersionbar:3.2.2") implementation("com.geyifeng.immersionbar:immersionbar:3.2.2")
// kotlin扩展可选 // kotlin扩展可选
implementation("com.geyifeng.immersionbar:immersionbar-ktx:3.2.2") implementation("com.geyifeng.immersionbar:immersionbar-ktx:3.2.2")
implementation("com.wdullaer:materialdatetimepicker:4.2.3") // 经典稳定 implementation("com.wdullaer:materialdatetimepicker:4.2.3") // 经典稳定
implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.core:core-ktx:1.12.0")
// Android-PickerView 时间选择器
implementation("com.contrarywind:Android-PickerView:4.1.9")
//二维码三方库 //二维码三方库
implementation("com.github.maning0303:MNMLKitScanner:V1.0.4") implementation("com.github.maning0303:MNMLKitScanner:V1.0.4")
implementation("com.google.mlkit:barcode-scanning:17.0.2") implementation("com.google.mlkit:barcode-scanning:17.0.2")
@@ -103,5 +99,10 @@ dependencies {
//上拉刷新下拉加载 //上拉刷新下拉加载
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("com.yanzhenjie.recyclerview:x:1.3.2") implementation("com.yanzhenjie.recyclerview:x:1.3.2")
//Android-PickerView-时间弹窗
implementation("com.contrarywind:Android-PickerView:4.1.9")
//基于exoPlayer 自定义播放器 JPlayer支持功能
implementation("com.ycjiang:VideoPlayModule-Lite:2.3.61")
} }

View File

@@ -27,6 +27,9 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.DefenseApplication"> android:theme="@style/Theme.DefenseApplication">
<activity
android:name=".personal.LoginPasswordActivity"
android:exported="false" />
<activity <activity
android:name=".personal.InvitationCodeActivity" android:name=".personal.InvitationCodeActivity"
android:exported="false" /> android:exported="false" />
@@ -43,7 +46,7 @@
android:name=".personal.RetrievePasswordActivity" android:name=".personal.RetrievePasswordActivity"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".personal.LoginPasswordActivity" android:name=".personal.ChangePasswordActivity"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".personal.PasswordManagementActivity" android:name=".personal.PasswordManagementActivity"
@@ -80,6 +83,7 @@
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".liveVideo.AlarmLogActivity" android:name=".liveVideo.AlarmLogActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".liveVideo.SettingsActivity" android:name=".liveVideo.SettingsActivity"
@@ -104,7 +108,7 @@
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".home.HomeActivity" android:name=".home.HomeActivity"
android:exported="false"/> android:exported="false" />
<activity <activity
android:name=".login.RegisterSuccessActivity" android:name=".login.RegisterSuccessActivity"
android:exported="false" /> android:exported="false" />

View File

@@ -6,7 +6,6 @@ import bean.LoginBean
import com.blankj.utilcode.util.Utils import com.blankj.utilcode.util.Utils
import com.example.defenseapplication.bean.BaseInfo import com.example.defenseapplication.bean.BaseInfo
import com.example.defenseapplication.utils.ApiConfig import com.example.defenseapplication.utils.ApiConfig
import com.example.defenseapplication.utils.LanguageHeaderManager
import com.example.defenseapplication.utils.LanguageUtil import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.utils.UserinfoUtil import com.example.defenseapplication.utils.UserinfoUtil
import com.google.gson.Gson import com.google.gson.Gson
@@ -21,7 +20,7 @@ class MyApplication : Application() {
if (token != null) { if (token != null) {
ApiConfig.authToken = token ApiConfig.authToken = token
}; };
LanguageHeaderManager.init(this) LanguageUtil.init(this)
} }
override fun attachBaseContext(base: Context) { override fun attachBaseContext(base: Context) {

View File

@@ -1,12 +1,15 @@
package com.example.defenseapplication.adapter package com.example.defenseapplication.adapter
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.example.defenseapplication.bean.DeviceAlarmBean
import com.example.defenseapplication.databinding.ItemAlarmLogBinding import com.example.defenseapplication.databinding.ItemAlarmLogBinding
class AlarmLogAdapter(private val items: List<String>) : RecyclerView.Adapter<AlarmLogAdapter.ViewHolder>() { class AlarmLogAdapter(
private val items: List<DeviceAlarmBean>,
private val onItemClick: (DeviceAlarmBean) -> Unit
) : RecyclerView.Adapter<AlarmLogAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemAlarmLogBinding.inflate( val binding = ItemAlarmLogBinding.inflate(
@@ -23,11 +26,14 @@ class AlarmLogAdapter(private val items: List<String>) : RecyclerView.Adapter<Al
override fun getItemCount(): Int = items.size override fun getItemCount(): Int = items.size
class ViewHolder(private val binding: ItemAlarmLogBinding) : RecyclerView.ViewHolder(binding.root) { inner class ViewHolder(private val binding: ItemAlarmLogBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: String) { fun bind(item: DeviceAlarmBean) {
val parts = item.split(" - ") binding.tvTitle.text = item.categoryName
binding.tvTitle.text = parts.firstOrNull() binding.tvTime.text = item.createTime
binding.tvTime.text = parts.getOrNull(1)
binding.root.setOnClickListener {
onItemClick(item)
}
} }
} }
} }

View File

@@ -0,0 +1,46 @@
package com.example.defenseapplication.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.defenseapplication.bean.DeviceAlarmBean
import com.example.defenseapplication.databinding.ItemAlarmLogHorizontalBinding
class AlarmLogHorizontalAdapter(
private val items: List<DeviceAlarmBean>,
private val onItemClick: (DeviceAlarmBean) -> Unit
) : RecyclerView.Adapter<AlarmLogHorizontalAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemAlarmLogHorizontalBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
inner class ViewHolder(private val binding: ItemAlarmLogHorizontalBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: DeviceAlarmBean) {
binding.tvTitle.text = item.categoryName
binding.tvTime.text = item.createTime
if (!item.image.isNullOrEmpty()) {
Glide.with(binding.root.context)
.load(item.image)
.into(binding.ivAlarmImage)
}
binding.root.setOnClickListener {
onItemClick(item)
}
}
}
}

View File

@@ -4,6 +4,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.ItemLinkedUserBinding import com.example.defenseapplication.databinding.ItemLinkedUserBinding
data class LinkedUser( data class LinkedUser(
@@ -54,10 +55,11 @@ class LinkedUserAdapter(
) : RecyclerView.ViewHolder(binding.root) { ) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: LinkedUser, position: Int) { fun bind(item: LinkedUser, position: Int) {
val context = binding.root.context
binding.tvUserName.text = item.name binding.tvUserName.text = item.name
binding.tvTime.text = item.time binding.tvTime.text = item.time
binding.tvPhone.text = "手机号码:${item.phone}" binding.tvPhone.text = context.getString(R.string.linked_user_phone_label, item.phone)
binding.tvIdCard.text = "身份证号:${item.idCard}" binding.tvIdCard.text = context.getString(R.string.linked_user_idcard_label, item.idCard)
binding.root.setOnClickListener { binding.root.setOnClickListener {
onItemClick(item, position) onItemClick(item, position)

View File

@@ -1,13 +1,20 @@
package com.example.defenseapplication.base package com.example.defenseapplication.base
import android.content.Context
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.utils.ActivityManager import com.example.defenseapplication.utils.ActivityManager
import com.example.defenseapplication.utils.LanguageUtil
open class BaseActivity : AppCompatActivity() { open class BaseActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(LanguageUtil.attachBaseContext(newBase))
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
LanguageUtil.init(this)
ActivityManager.addActivity(this) ActivityManager.addActivity(this)
} }

View File

@@ -0,0 +1,54 @@
package com.example.defenseapplication.bean
import android.os.Parcel
import android.os.Parcelable
data class DeviceAlarmBean(
val id: String,
val userId: String,
val deviceId: String,
val category: Int,
val categoryName: String,
val image: String?,
val imageUrl: String?,
val video: String?,
val createTime: String
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString() ?: "",
parcel.readString() ?: "",
parcel.readString() ?: "",
parcel.readInt(),
parcel.readString() ?: "",
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString() ?: ""
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(id)
parcel.writeString(userId)
parcel.writeString(deviceId)
parcel.writeInt(category)
parcel.writeString(categoryName)
parcel.writeString(image)
parcel.writeString(imageUrl)
parcel.writeString(video)
parcel.writeString(createTime)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<DeviceAlarmBean> {
override fun createFromParcel(parcel: Parcel): DeviceAlarmBean {
return DeviceAlarmBean(parcel)
}
override fun newArray(size: Int): Array<DeviceAlarmBean?> {
return arrayOfNulls(size)
}
}
}

View File

@@ -0,0 +1,6 @@
package com.example.defenseapplication.bean
data class DeviceAlarmResponse(
val total: Int,
val rows: List<DeviceAlarmBean>
)

View File

@@ -1,18 +1,54 @@
package com.example.defenseapplication.bean package com.example.defenseapplication.bean
data class MessageItem( import android.os.Parcel
val id: String, import android.os.Parcelable
val userId: String,
val deviceId: String, data class MessageBean(
val category: Int, val id: String?,
val categoryName: String, val userId: String?,
val deviceId: String?,
val category: Int?,
val categoryName: String?,
val image: String?, val image: String?,
val imageUrl: String?, val imageUrl: String?,
val video: String?, val video: String?,
val createTime: String val createTime: String?
) ) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString()
)
data class MessageGroup( override fun writeToParcel(parcel: Parcel, flags: Int) {
val time: String, parcel.writeString(id)
val list: List<MessageItem> parcel.writeString(userId)
) parcel.writeString(deviceId)
parcel.writeValue(category)
parcel.writeString(categoryName)
parcel.writeString(image)
parcel.writeString(imageUrl)
parcel.writeString(video)
parcel.writeString(createTime)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MessageBean> {
override fun createFromParcel(parcel: Parcel): MessageBean {
return MessageBean(parcel)
}
override fun newArray(size: Int): Array<MessageBean?> {
return arrayOfNulls(size)
}
}
}

View File

@@ -0,0 +1,6 @@
package com.example.defenseapplication.bean
data class MessageListResponse(
val total: Int,
val rows: List<MessageBean>
)

View File

@@ -0,0 +1,13 @@
package com.example.defenseapplication.bean
data class UploadResponse(
val code: Int,
val msg: String,
val data: UploadData?
)
data class UploadData(
val url: String,
val fileName: String?,
val ossId: String?
)

View File

@@ -28,7 +28,7 @@ import com.example.defenseapplication.adapter.WifiListAdapter
import com.example.defenseapplication.databinding.AddFamilyActivityBinding import com.example.defenseapplication.databinding.AddFamilyActivityBinding
import com.example.defenseapplication.databinding.DialogWifiListBinding import com.example.defenseapplication.databinding.DialogWifiListBinding
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
//选择Wi-Fi
class AddFamilyActivity : AppCompatActivity() { class AddFamilyActivity : AppCompatActivity() {
private lateinit var binding: AddFamilyActivityBinding private lateinit var binding: AddFamilyActivityBinding

View File

@@ -1,18 +1,17 @@
package com.example.defenseapplication.home package com.example.defenseapplication.home
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.base.BaseActivity
import com.example.defenseapplication.databinding.HomeActivityBinding import com.example.defenseapplication.databinding.HomeActivityBinding
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
class HomeActivity : AppCompatActivity() { class HomeActivity : BaseActivity() {
// ViewBinding 核心对象 // ViewBinding 核心对象
private lateinit var binding: HomeActivityBinding private lateinit var binding: HomeActivityBinding

View File

@@ -29,6 +29,7 @@ import com.example.defenseapplication.bean.DeviceBean
import com.example.defenseapplication.bean.FamilyBean import com.example.defenseapplication.bean.FamilyBean
import com.example.defenseapplication.bean.SwitchFamilyRequest import com.example.defenseapplication.bean.SwitchFamilyRequest
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
import com.example.defenseapplication.liveVideo.LiveVideoActivity
import com.example.defenseapplication.utils.DeviceIdEvent import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.DeviceUpdateEvent import com.example.defenseapplication.utils.DeviceUpdateEvent
import com.example.defenseapplication.utils.FamilySwitchEvent import com.example.defenseapplication.utils.FamilySwitchEvent
@@ -267,17 +268,7 @@ class HomeMenuFragment : Fragment() {
try { try {
val response = RetrofitNetwork.getNetworkService().getMessage() val response = RetrofitNetwork.getNetworkService().getMessage()
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val messageGroups = response.data as List<*>
var unreadCount = 0
messageGroups.forEach { group ->
if (group is Map<*, *>) {
val list = group["list"] as? List<*>
list?.let { unreadCount += it.size }
}
}
MessageStatusManager.setUnreadCount(unreadCount)
}
} }
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
@@ -471,7 +462,8 @@ class HomeMenuFragment : Fragment() {
private fun onDeviceClicked(device: DeviceUi) { private fun onDeviceClicked(device: DeviceUi) {
if (device.isOnline) { if (device.isOnline) {
DeviceIdEvent.setDeviceId(device.deviceId) DeviceIdEvent.setDeviceId(device.deviceId)
val intent = Intent(requireContext(), com.example.defenseapplication.liveVideo.LiveVideoActivity::class.java) val intent = Intent(requireContext(), LiveVideoActivity::class.java)
intent.putExtra("device_id", device.deviceId)
intent.putExtra("device_name", device.name) intent.putExtra("device_name", device.name)
startActivity(intent) startActivity(intent)
} else { } else {

View File

@@ -2,15 +2,11 @@ package com.example.defenseapplication.home
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.defenseapplication.adapter.MessageListAdapter import com.example.defenseapplication.adapter.MessageListAdapter
import com.example.defenseapplication.adapter.MessageListItem import com.example.defenseapplication.adapter.MessageListItem
import com.example.defenseapplication.bean.MessageGroup
import com.example.defenseapplication.bean.MessageItem
import com.example.defenseapplication.databinding.MessageActivityBinding import com.example.defenseapplication.databinding.MessageActivityBinding
import com.example.defenseapplication.utils.MessageStatusManager import com.example.defenseapplication.utils.MessageStatusManager
import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.utils.RetrofitNetwork
@@ -23,6 +19,13 @@ import kotlinx.coroutines.withContext
class MessageActivity : AppCompatActivity() { class MessageActivity : AppCompatActivity() {
private lateinit var binding: MessageActivityBinding private lateinit var binding: MessageActivityBinding
private val messageAdapter by lazy { MessageListAdapter() } private val messageAdapter by lazy { MessageListAdapter() }
private var currentPage = 1
private val pageSize = 10
private var isLoading = false
private var hasMoreData = true
private val allMessages = mutableListOf<com.example.defenseapplication.bean.MessageBean>()
private var lastLoadedCount = 0
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -41,58 +44,137 @@ class MessageActivity : AppCompatActivity() {
binding.ivBack.setOnClickListener { finish() } binding.ivBack.setOnClickListener { finish() }
binding.rvMessageList.layoutManager = LinearLayoutManager(this) binding.rvMessageList.layoutManager = LinearLayoutManager(this)
binding.rvMessageList.adapter = messageAdapter binding.rvMessageList.adapter = messageAdapter
binding.rvMessageList.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
val totalItemCount = layoutManager.itemCount
val lastVisibleItem = layoutManager.findLastVisibleItemPosition()
if (!isLoading && hasMoreData && lastVisibleItem >= totalItemCount - 3 && dy > 0) {
loadMoreData()
}
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE && !hasMoreData && !isLoading) {
showNoMoreDataHint()
}
}
})
} }
private fun loadMessageList() { private fun loadMessageList() {
if (isLoading) return
isLoading = true
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
try { try {
val response = RetrofitNetwork.getNetworkService().getMessage() val messageResponse = RetrofitNetwork.getNetworkService().getMessage(
if (response.code == 0 && response.data != null) { pageNum = currentPage,
val messageGroups = response.data as List<MessageGroup> pageSize = pageSize
val items = convertToMessageListItems(messageGroups) )
withContext(Dispatchers.Main) { println("total: ${messageResponse.total}")
if (items.isEmpty()) { println("rows size: ${messageResponse.rows.size}")
println("当前页:$currentPage, 加载条数:${messageResponse.rows.size}")
val newMessages = messageResponse.rows
val loadedCount = newMessages.size
if (loadedCount < pageSize) {
hasMoreData = false
}
if (newMessages.isEmpty()) {
if (currentPage == 1) {
withContext(Dispatchers.Main) {
showEmptyState() showEmptyState()
} else {
hideEmptyState()
messageAdapter.submitList(items)
} }
} }
} else { } else {
if (currentPage == 1) {
allMessages.clear()
}
allMessages.addAll(newMessages)
lastLoadedCount = loadedCount
val items = convertToMessageListItems(allMessages)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
hideEmptyState()
messageAdapter.submitList(items)
if (!hasMoreData) {
showNoMoreDataHint()
} else {
hideNoMoreDataHint()
}
}
}
withContext(Dispatchers.Main) {
if (allMessages.isEmpty()) {
println("items is empty, showing empty state")
showEmptyState() showEmptyState()
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
println("Exception: ${e.message}")
e.printStackTrace() e.printStackTrace()
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
showEmptyState() if (allMessages.isEmpty()) {
showEmptyState()
}
} }
} finally {
isLoading = false
} }
} }
} }
private fun loadMoreData() {
if (!hasMoreData || isLoading) return
currentPage++
loadMessageList()
}
private fun showEmptyState() { private fun showEmptyState() {
binding.contentLayout.visibility = View.GONE binding.rvMessageList.visibility = View.GONE
binding.emptyLayout.visibility = View.VISIBLE binding.emptyLayout.visibility = View.VISIBLE
binding.tvNoMoreData.visibility = View.GONE
} }
private fun hideEmptyState() { private fun hideEmptyState() {
binding.contentLayout.visibility = View.VISIBLE binding.rvMessageList.visibility = View.VISIBLE
binding.emptyLayout.visibility = View.GONE binding.emptyLayout.visibility = View.GONE
} }
private fun showNoMoreDataHint() {
binding.tvNoMoreData.visibility = View.VISIBLE
}
private fun hideNoMoreDataHint() {
binding.tvNoMoreData.visibility = View.GONE
}
private fun convertToMessageListItems(groups: List<MessageGroup>): List<MessageListItem> { private fun convertToMessageListItems(messages: List<com.example.defenseapplication.bean.MessageBean>): List<MessageListItem> {
val items = mutableListOf<MessageListItem>() val items = mutableListOf<MessageListItem>()
groups.forEach { group -> val groupedMessages = messages.groupBy { extractDate(it.createTime ?: "") }
val headerTitle = formatDate(group.time) groupedMessages.forEach { (date, messageList) ->
val headerTitle = formatDate(date)
messageList.forEachIndexed { index, message ->
println(" 消息${index + 1}: id=${message.id}, categoryName=${message.categoryName}, createTime=${message.createTime}")
}
items.add(MessageListItem.Header(headerTitle)) items.add(MessageListItem.Header(headerTitle))
group.list.forEach { message -> messageList.forEach { message ->
items.add( items.add(
MessageListItem.Message( MessageListItem.Message(
time = extractTime(message.createTime), time = extractTime(message.createTime ?: ""),
title = message.categoryName, title = message.categoryName ?: "未知消息",
dateTime = message.createTime, dateTime = message.createTime ?: "",
unread = false unread = false
) )
) )
@@ -101,9 +183,24 @@ class MessageActivity : AppCompatActivity() {
return items return items
} }
private fun extractDate(dateTime: String): String {
return if (dateTime.contains(" ")) {
dateTime.split(" ")[0]
} else {
dateTime
}
}
private fun formatDate(dateStr: String): String { private fun formatDate(dateStr: String): String {
return if (dateStr == "今天" || dateStr.contains("今天")) { return if (dateStr == "今天" || dateStr.contains("今天")) {
"今天" "今天"
} else if (dateStr.contains("-")) {
val parts = dateStr.split("-")
if (parts.size >= 3) {
"${parts[1]}-${parts[2]}"
} else {
dateStr
}
} else { } else {
dateStr dateStr
} }

View File

@@ -16,11 +16,14 @@ import com.example.defenseapplication.liveVideo.LinkedUserActivity
import com.example.defenseapplication.personal.FaceManagementActivity import com.example.defenseapplication.personal.FaceManagementActivity
import com.example.defenseapplication.personal.PasswordManagementActivity import com.example.defenseapplication.personal.PasswordManagementActivity
import com.example.defenseapplication.personal.PersonalProfileActivity import com.example.defenseapplication.personal.PersonalProfileActivity
import com.example.defenseapplication.utils.AppLanguage
import com.example.defenseapplication.utils.LanguageUtil import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.utils.UserinfoUtil import com.example.defenseapplication.utils.UserinfoUtil
import com.example.defenseapplication.utils.ActivityManager
import com.example.defenseapplication.view.FamilySwitchDialog import com.example.defenseapplication.view.FamilySwitchDialog
import com.example.defenseapplication.view.LanguageDialog import com.example.defenseapplication.view.LanguageDialog
import com.example.defenseapplication.home.HomeActivity
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -31,7 +34,10 @@ class PersonalFragment : Fragment() {
// ViewBinding // ViewBinding
private var _binding: PersonalFragmentBinding? = null private var _binding: PersonalFragmentBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
override fun onResume() {
super.onResume()
fetchUserInfo()
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@@ -152,18 +158,23 @@ class PersonalFragment : Fragment() {
* 更新当前语言显示 * 更新当前语言显示
*/ */
private fun updateCurrentLanguageDisplay() { private fun updateCurrentLanguageDisplay() {
val currentLang = LanguageUtil.getCurrentLanguage(requireContext()) binding.tvCurrentLanguage.text = LanguageUtil.currentLanguage.let {
binding.tvCurrentLanguage.text = LanguageUtil.getLanguageDisplayName(currentLang) if (it == AppLanguage.SIMPLIFIED_CHINESE) "中文" else "English"
}
} }
/** /**
* 显示语言选择对话框 * 显示语言选择对话框
*/ */
private fun showLanguageDialog() { private fun showLanguageDialog() {
val dialog = LanguageDialog(requireContext()) { language -> val dialog = LanguageDialog(requireContext()) { appLanguage ->
LanguageUtil.switchLanguage(requireContext(), language) LanguageUtil.switchLanguage(requireContext(), appLanguage)
// 刷新当前页面以应用新语言 // 关闭所有 Activity重启到首页
requireActivity().recreate() ActivityManager.finishAllActivities()
val intent = Intent(requireContext(), HomeActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent)
requireActivity().finish()
} }
dialog.show() dialog.show()
} }
@@ -206,10 +217,7 @@ class PersonalFragment : Fragment() {
} }
} }
override fun onResume() {
super.onResume()
fetchUserInfo()
}
private fun fetchUserInfo() { private fun fetchUserInfo() {
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {

View File

@@ -1,6 +1,8 @@
package com.example.defenseapplication.liveVideo package com.example.defenseapplication.liveVideo
import android.os.Bundle import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@@ -19,10 +21,11 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
//添加关联用户 //添加关联用户-删除和解除关联
class AddLinkedUserActivity : AppCompatActivity() { class AddLinkedUserActivity : AppCompatActivity() {
private lateinit var binding: AddLinkedUserActivityBinding private lateinit var binding: AddLinkedUserActivityBinding
private val selectedPhoneSet = mutableSetOf<String>() private val selectedPhoneSet = mutableSetOf<String>()
private val fullUserItemList = mutableListOf<UserItem>()
private val userItemList = mutableListOf<UserItem>() private val userItemList = mutableListOf<UserItem>()
private val selectedUserIdMap = mutableMapOf<String, String>() private val selectedUserIdMap = mutableMapOf<String, String>()
@@ -106,9 +109,9 @@ class AddLinkedUserActivity : AppCompatActivity() {
} }
private fun updateFamilyMemberList(familyMembersList: List<FamilyMembersBean>) { private fun updateFamilyMemberList(familyMembersList: List<FamilyMembersBean>) {
userItemList.clear() fullUserItemList.clear()
familyMembersList.forEach { member -> familyMembersList.forEach { member ->
userItemList.add( fullUserItemList.add(
UserItem( UserItem(
name = member.nickName ?: member.parentName ?: "未知用户", name = member.nickName ?: member.parentName ?: "未知用户",
phone = member.phonenumber ?: "", phone = member.phonenumber ?: "",
@@ -116,6 +119,20 @@ class AddLinkedUserActivity : AppCompatActivity() {
) )
) )
} }
filterUsers(binding.etSearch.text?.toString() ?: "")
}
private fun filterUsers(keyword: String) {
userItemList.clear()
if (keyword.isEmpty()) {
userItemList.addAll(fullUserItemList)
} else {
val lowerKeyword = keyword.lowercase()
fullUserItemList.filter {
it.name.lowercase().contains(lowerKeyword) ||
it.phone.contains(keyword)
}.forEach { userItemList.add(it) }
}
binding.rvAddLinkedUser.adapter?.notifyDataSetChanged() binding.rvAddLinkedUser.adapter?.notifyDataSetChanged()
} }
@@ -130,6 +147,14 @@ class AddLinkedUserActivity : AppCompatActivity() {
binding.ivBack.setOnClickListener { binding.ivBack.setOnClickListener {
finish() finish()
} }
binding.etSearch.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
filterUsers(s?.toString() ?: "")
}
})
} }
private fun addDeviceUser() { private fun addDeviceUser() {

View File

@@ -1,52 +1,325 @@
package com.example.defenseapplication.liveVideo package com.example.defenseapplication.liveVideo
import android.content.res.Configuration
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.os.LocaleList import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.LinearLayout
import android.widget.SeekBar
import android.widget.TextView
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.lifecycle.lifecycleScope
import chuangyuan.ycj.videolibrary.listener.VideoInfoListener
import chuangyuan.ycj.videolibrary.video.ExoUserPlayer
import chuangyuan.ycj.videolibrary.video.VideoPlayerManager
import com.google.android.exoplayer2.ui.PlayerView
import com.google.android.exoplayer2.SimpleExoPlayer
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.AlarmLogAdapter import com.example.defenseapplication.adapter.AlarmLogAdapter
import com.example.defenseapplication.bean.DeviceAlarmBean
import com.example.defenseapplication.bean.DeviceAlarmResponse
import com.example.defenseapplication.databinding.AlarmLogActivityBinding import com.example.defenseapplication.databinding.AlarmLogActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import com.google.android.material.datepicker.MaterialDatePicker import kotlinx.coroutines.launch
import android.os.Handler
import android.os.Looper
import java.text.SimpleDateFormat
import java.util.* import java.util.*
import com.bigkoo.pickerview.builder.TimePickerBuilder
import com.bigkoo.pickerview.listener.OnTimeSelectListener
//告警记录 //告警记录
class AlarmLogActivity : AppCompatActivity() { class AlarmLogActivity : AppCompatActivity() {
private lateinit var binding: AlarmLogActivityBinding private lateinit var binding: AlarmLogActivityBinding
private lateinit var calendar: Calendar private lateinit var calendar: Calendar
private var adapter: AlarmLogAdapter? = null private var adapter: AlarmLogAdapter? = null
private val alarmList = mutableListOf<String>() private val alarmList = mutableListOf<DeviceAlarmBean>()
private val originalAlarmList = mutableListOf<DeviceAlarmBean>()
private lateinit var exoPlayerManager: ExoUserPlayer
private var isMuted = false
private var isPlaying = false
private var deviceId: String? = null
private var isLoading = false
private var fromLiveVideo = false
private var isFullScreen = false
private var isControlsVisible = false
private val hideDelay = 5000L // 5秒自动隐藏
private val hideHandler = Handler(Looper.getMainLooper())
private val hideRunnable = Runnable {
hideControls()
}
private var passedVideoUrl: String? = null
private var passedSelectedId: String? = null
private var passedCreateTime: String? = null
private var totalDuration: Long = 0
private val progressHandler = Handler(Looper.getMainLooper())
private val progressRunnable = object : Runnable {
override fun run() {
updateProgress()
progressHandler.postDelayed(this, 1000)
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = AlarmLogActivityBinding.inflate(layoutInflater) binding = AlarmLogActivityBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true) window.setFlags(
.titleBar(binding.topBar) WindowManager.LayoutParams.FLAG_FULLSCREEN,
.init() WindowManager.LayoutParams.FLAG_FULLSCREEN
)
deviceId = intent.getStringExtra("device_id")
fromLiveVideo = intent.getBooleanExtra("from_live_video", false)
passedVideoUrl = intent.getStringExtra("video_url")
passedSelectedId = intent.getStringExtra("selected_id")
passedCreateTime = intent.getStringExtra("create_time")
calendar = Calendar.getInstance() calendar = Calendar.getInstance()
updateDateDisplay() updateDateDisplay()
initVideoPlayer()
initRecyclerView() initRecyclerView()
loadAlarmList() fetchAlarmList()
initListener() initListener()
// onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
// override fun handleOnBackPressed() {
// if (exoPlayerManager.onBackPressed()) {
// return
// }
// finish()
// }
// })
}
private fun dpToPx(dp: Int): Int {
val density = resources.displayMetrics.density
return (dp * density).toInt()
}
private fun initVideoPlayer() {
val videoPlayerView = binding.exoPlayContextId
val videoUri = if (fromLiveVideo && !passedVideoUrl.isNullOrEmpty()) {
passedVideoUrl!!
} else {
"https://media.w3.org/2010/05/sintel/trailer.mp4"
}
exoPlayerManager = VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_GESTURE, videoPlayerView)
.setPlayUri(videoUri)
.setPosition(0)
.addVideoInfoListener(object : VideoInfoListener {
override fun onPlayStart(p0: Long) {
Log.d("AlarmLogActivity", "视频开始播放")
startProgressUpdate()
showControls()
resetHideTimer()
}
override fun onLoadingChanged() {
}
override fun onPlayerError(p0: com.google.android.exoplayer2.ExoPlaybackException?) {
Toast.makeText(this@AlarmLogActivity, "播放失败", Toast.LENGTH_SHORT).show()
}
override fun onPlayEnd() {
Log.d("AlarmLogActivity", "播放结束")
stopProgressUpdate()
hideControls()
}
override fun isPlaying(p0: Boolean) {
isPlaying = p0
if (p0) {
startProgressUpdate()
// 视频开始播放时,如果控制栏可见,启动自动隐藏计时器
if (isControlsVisible) {
resetHideTimer()
}
} else {
stopProgressUpdate()
// 视频暂停时,取消自动隐藏计时器,保持控制栏显示
hideHandler.removeCallbacks(hideRunnable)
showControls()
}
}
fun onRepeatModeChanged(p0: Int) {
}
})
.create()
exoPlayerManager.startPlayer()
setupControllerVisibilityListener()
updateProgress()
}
private fun setupControllerVisibilityListener() {
// 移除原来的控制器监听器,改为自定义控制逻辑
}
private fun findPlayerView(view: View): PlayerView? {
if (view is PlayerView) {
return view
}
if (view is ViewGroup) {
for (i in 0 until view.childCount) {
val child = view.getChildAt(i)
val found = findPlayerView(child)
if (found != null) {
return found
}
}
}
return null
} }
private fun initRecyclerView() { private fun initRecyclerView() {
adapter = AlarmLogAdapter(alarmList) adapter = AlarmLogAdapter(alarmList) { item ->
if (!item.video.isNullOrEmpty()) {
playVideo(item.video!!)
} else {
Toast.makeText(this, "该告警记录没有视频", Toast.LENGTH_SHORT).show()
}
}
binding.alarmListRecyclerView.layoutManager = LinearLayoutManager(this) binding.alarmListRecyclerView.layoutManager = LinearLayoutManager(this)
binding.alarmListRecyclerView.adapter = adapter binding.alarmListRecyclerView.adapter = adapter
} }
private fun loadAlarmList() { private fun playVideo(videoUrl: String) {
exoPlayerManager.onDestroy()
exoPlayerManager = VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_GESTURE, binding.exoPlayContextId)
.setPlayUri(videoUrl)
.setPosition(0)
.addVideoInfoListener(object : VideoInfoListener {
override fun onPlayStart(p0: Long) {
Log.d("AlarmLogActivity", "视频开始播放")
startProgressUpdate()
showControls()
resetHideTimer()
}
override fun onLoadingChanged() {
}
override fun onPlayerError(p0: com.google.android.exoplayer2.ExoPlaybackException?) {
Toast.makeText(this@AlarmLogActivity, "播放失败", Toast.LENGTH_SHORT).show()
}
override fun onPlayEnd() {
Log.d("AlarmLogActivity", "播放结束")
stopProgressUpdate()
hideControls()
}
override fun isPlaying(p0: Boolean) {
isPlaying = p0
if (p0) {
startProgressUpdate()
// 视频开始播放时,如果控制栏可见,启动自动隐藏计时器
if (isControlsVisible) {
resetHideTimer()
}
} else {
stopProgressUpdate()
// 视频暂停时,取消自动隐藏计时器,保持控制栏显示
hideHandler.removeCallbacks(hideRunnable)
showControls()
}
}
fun onRepeatModeChanged(p0: Int) {
}
})
.create()
exoPlayerManager.startPlayer()
// 保持当前的静音状态
if (isMuted) {
try {
val method = exoPlayerManager.javaClass.getMethod("getPlayer")
val player = method.invoke(exoPlayerManager) as? SimpleExoPlayer
player?.volume = 0f
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun fetchAlarmList() {
val currentDeviceId = deviceId ?: return
Log.d("AlarmLogActivity", "=== 开始请求设备告警日志 ===")
Log.d("AlarmLogActivity", "请求参数 - deviceId: $currentDeviceId")
isLoading = true
lifecycleScope.launch {
try {
Log.d("AlarmLogActivity", "正在发送网络请求...")
val response = RetrofitNetwork.getNetworkService().getDeviceAlarmList(
deviceId = currentDeviceId,
pageNum = "1",
pageSize = "10"
)
Log.d("AlarmLogActivity", "请求完成")
Log.d("AlarmLogActivity", "总条数: ${response.total}, 当前页数据条数: ${response.rows.size}")
val newData = response.rows
originalAlarmList.clear()
originalAlarmList.addAll(newData)
filterAlarmListByDate(calendar)
Log.d("AlarmLogActivity", "已获取 ${newData.size} 条数据")
} catch (e: Exception) {
Log.e("AlarmLogActivity", "请求异常: ${e.message}", e)
} finally {
isLoading = false
Log.d("AlarmLogActivity", "请求结束")
}
}
}
private fun showEmptyView() {
binding.alarmListRecyclerView.visibility = View.GONE
binding.emptyLayout.visibility = View.VISIBLE
}
private fun hideEmptyView() {
binding.alarmListRecyclerView.visibility = View.VISIBLE
binding.emptyLayout.visibility = View.GONE
}
private fun filterAlarmListByDate(selectedDate: Calendar) {
val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
val selectedDateStr = dateFormat.format(selectedDate.time)
alarmList.clear() alarmList.clear()
alarmList.add("入侵告警 - 10:30") originalAlarmList.forEach { item ->
alarmList.add("入侵告警 - 09:15") val itemDateStr = item.createTime.substring(0, 10)
alarmList.add("入侵告警 - 08:45") if (itemDateStr == selectedDateStr) {
alarmList.add("入侵告警 - 07:20") alarmList.add(item)
alarmList.add("入侵告警 - 06:50") }
}
adapter?.notifyDataSetChanged() adapter?.notifyDataSetChanged()
Log.d("AlarmLogActivity", "日期筛选完成,筛选后条数: ${alarmList.size}")
if (alarmList.isEmpty()) {
showEmptyView()
} else {
hideEmptyView()
}
} }
private fun updateDateDisplay() { private fun updateDateDisplay() {
@@ -55,27 +328,244 @@ class AlarmLogActivity : AppCompatActivity() {
binding.tvDate.text = "${month}${day}" binding.tvDate.text = "${month}${day}"
} }
private fun initListener() { private fun showControls() {
binding.btnBack.setOnClickListener { isControlsVisible = true
finish() binding.functionBar.visibility = View.VISIBLE
} binding.muteBar.visibility = View.VISIBLE
binding.expandImg.setOnClickListener { binding.playBar.visibility = View.VISIBLE
showDatePicker() binding.progressBar.visibility = View.VISIBLE
// 只有在视频播放时才启动自动隐藏计时器
if (isPlaying) {
resetHideTimer()
} }
} }
private fun hideControls() {
isControlsVisible = false
binding.functionBar.visibility = View.GONE
binding.muteBar.visibility = View.GONE
binding.playBar.visibility = View.GONE
binding.progressBar.visibility = View.GONE
}
private fun toggleControls() {
if (isControlsVisible) {
hideControls()
} else {
showControls()
}
}
private fun resetHideTimer() {
hideHandler.removeCallbacks(hideRunnable)
// 只有在视频播放时才启动自动隐藏计时器
if (isPlaying) {
hideHandler.postDelayed(hideRunnable, hideDelay)
}
}
private fun initListener() {
// 点击视频区域切换控制栏显示/隐藏
binding.exoPlayContextId.setOnClickListener {
toggleControls()
}
// 控制栏上的按钮点击时重置隐藏计时器
binding.ivBack.setOnClickListener {
resetHideTimer()
finish()
}
binding.expandImg.setOnClickListener {
showDatePicker()
}
binding.ivMute.setOnClickListener {
resetHideTimer()
toggleMute()
}
binding.ivDownload.setOnClickListener {
resetHideTimer()
downloadVideo()
}
binding.ivDelete.setOnClickListener {
resetHideTimer()
deleteVideo()
}
binding.ivFullScreen.setOnClickListener {
resetHideTimer()
toggleFullScreen()
}
binding.ivPlay.setOnClickListener {
resetHideTimer()
togglePlay()
}
binding.seekBar.setOnSeekBarChangeListener(object : android.widget.SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: android.widget.SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) {
resetHideTimer()
exoPlayerManager.seekTo(progress.toLong() * 1000)
}
}
override fun onStartTrackingTouch(seekBar: android.widget.SeekBar?) {
resetHideTimer()
}
override fun onStopTrackingTouch(seekBar: android.widget.SeekBar?) {
}
})
}
private fun toggleMute() {
isMuted = !isMuted
try {
// 通过反射获取底层的 ExoPlayer 实例
val method = exoPlayerManager.javaClass.getMethod("getPlayer")
val player = method.invoke(exoPlayerManager) as? SimpleExoPlayer
if (isMuted) {
binding.ivMute.setImageResource(R.drawable.mute)
player?.volume = 0f
Toast.makeText(this, R.string.sound_off, Toast.LENGTH_SHORT).show()
} else {
binding.ivMute.setImageResource(R.drawable.un_mute)
player?.volume = 1f
Toast.makeText(this, R.string.sound_on, Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this, "音量控制失败", Toast.LENGTH_SHORT).show()
}
}
private fun downloadVideo() {
Toast.makeText(this, R.string.download, Toast.LENGTH_SHORT).show()
}
private fun deleteVideo() {
Toast.makeText(this, R.string.delete, Toast.LENGTH_SHORT).show()
}
private fun updateProgress() {
val currentPosition = exoPlayerManager.getCurrentPosition()
totalDuration = exoPlayerManager.getDuration()
binding.tvCurrentTime.text = formatTime(currentPosition)
binding.tvTotalTime.text = formatTime(totalDuration)
if (totalDuration > 0) {
val progress = (currentPosition * 100 / totalDuration).toInt()
binding.seekBar.progress = progress
}
}
private fun formatTime(milliseconds: Long): String {
val seconds = (milliseconds / 1000).toInt()
val hours = seconds / 3600
val minutes = (seconds % 3600) / 60
val secs = seconds % 60
return if (hours > 0) {
String.format("%02d:%02d:%02d", hours, minutes, secs)
} else {
String.format("%02d:%02d", minutes, secs)
}
}
private fun startProgressUpdate() {
stopProgressUpdate()
progressHandler.post(progressRunnable)
}
private fun stopProgressUpdate() {
progressHandler.removeCallbacks(progressRunnable)
}
private fun toggleFullScreen() {
isFullScreen = !isFullScreen
if (isFullScreen) {
binding.ivFullScreen.setImageResource(R.drawable.full_screen)
requestedOrientation = android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
} else {
binding.ivFullScreen.setImageResource(R.drawable.full_size)
requestedOrientation = android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
private fun togglePlay() {
isPlaying = !isPlaying
if (isPlaying) {
binding.ivPlay.setImageResource(R.drawable.zt)
exoPlayerManager.startPlayer()
} else {
binding.ivPlay.setImageResource(R.drawable.start)
exoPlayerManager.onPause()
}
}
override fun onResume() {
super.onResume()
exoPlayerManager.onResume()
}
override fun onPause() {
super.onPause()
exoPlayerManager.onPause()
}
override fun onDestroy() {
super.onDestroy()
exoPlayerManager.onDestroy()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 进入横屏(全屏)模式
binding.titleLayout.visibility = View.GONE
binding.alarmListRecyclerView.visibility = View.GONE
val params = binding.exoPlayContextId.layoutParams
params.width = LinearLayout.LayoutParams.MATCH_PARENT
params.height = LinearLayout.LayoutParams.MATCH_PARENT
binding.exoPlayContextId.layoutParams = params
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
// 进入竖屏(非全屏)模式
binding.titleLayout.visibility = View.VISIBLE
binding.alarmListRecyclerView.visibility = View.VISIBLE
val params = binding.exoPlayContextId.layoutParams
params.width = LinearLayout.LayoutParams.MATCH_PARENT
params.height = dpToPx(280)
binding.exoPlayContextId.layoutParams = params
}
exoPlayerManager.onConfigurationChanged(newConfig)
}
private fun showDatePicker() { private fun showDatePicker() {
val datePicker = android.app.DatePickerDialog( val timePicker = TimePickerBuilder(this, OnTimeSelectListener { date, _ ->
this, calendar.time = date
{ _, year, month, dayOfMonth -> updateDateDisplay()
calendar.set(year, month, dayOfMonth) filterAlarmListByDate(calendar)
updateDateDisplay() })
loadAlarmList() .setType(booleanArrayOf(true, true, true, false, false, false)) // 年月日
}, .setTitleText(getString(R.string.select_date))
calendar.get(Calendar.YEAR), .setSubmitColor(Color.parseColor("#09C2BD"))//确定按钮文字颜色
calendar.get(Calendar.MONTH), .setCancelColor(Color.parseColor("#09C2BD"))//取消按钮文字颜色
calendar.get(Calendar.DAY_OF_MONTH) .setSubCalSize(18)//确定和取消文字大小
) .setTextColorCenter(Color.parseColor("#09C2BD"))//选中颜色
datePicker.show() .setLineSpacingMultiplier(2.5f)//行间距倍数
.setItemVisibleCount(5)//可见项数量
.setDate(calendar) // 设置默认选中日期为tvDate显示的日期
.build()
timePicker.show()
} }
} }

View File

@@ -1,7 +1,10 @@
package com.example.defenseapplication.liveVideo package com.example.defenseapplication.liveVideo
import android.app.TimePickerDialog
import android.content.Intent import android.content.Intent
import android.graphics.Color
import com.bigkoo.pickerview.builder.TimePickerBuilder
import com.bigkoo.pickerview.listener.OnTimeSelectListener
import java.util.Calendar
import android.os.Bundle import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@@ -24,10 +27,10 @@ class AutoModeActivity : AppCompatActivity() {
private lateinit var binding: AutoModeActivityBinding private lateinit var binding: AutoModeActivityBinding
private var selectedMode = "0" private var selectedMode = "0"
private var selectedStartHour = 21 private var selectedStartHour = 8
private var selectedStartMinute = 30 private var selectedStartMinute = 0
private var selectedEndHour = 8 private var selectedEndHour = 10
private var selectedEndMinute = 30 private var selectedEndMinute = 0
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -130,15 +133,26 @@ class AutoModeActivity : AppCompatActivity() {
val currentHour = if (isStartTime) selectedStartHour else selectedEndHour val currentHour = if (isStartTime) selectedStartHour else selectedEndHour
val currentMinute = if (isStartTime) selectedStartMinute else selectedEndMinute val currentMinute = if (isStartTime) selectedStartMinute else selectedEndMinute
TimePickerDialog( val calendar = Calendar.getInstance()
this, calendar.set(Calendar.HOUR_OF_DAY, currentHour)
{ _, hour, minute -> calendar.set(Calendar.MINUTE, currentMinute)
onTimeSelected(hour, minute)
}, val timePicker = TimePickerBuilder(this, OnTimeSelectListener { date, _ ->
currentHour, val selectedCalendar = Calendar.getInstance()
currentMinute, selectedCalendar.time = date
true onTimeSelected(selectedCalendar.get(Calendar.HOUR_OF_DAY), selectedCalendar.get(Calendar.MINUTE))
).show() })
.setType(booleanArrayOf(false, false, false, true, true, false)) // 时分
.setTitleText(getString(R.string.select_time))
.setSubmitColor(Color.parseColor("#09C2BD"))//确定按钮文字颜色
.setCancelColor(Color.parseColor("#09C2BD"))//取消按钮文字颜色
.setSubCalSize(18)//确定和取消文字大小
.setTextColorCenter(Color.parseColor("#09C2BD"))//选中颜色
.setLineSpacingMultiplier(2.5f)//行间距倍数
.setItemVisibleCount(5)//可见项数量
.setDate(calendar)
.build()
timePicker.show()
} }
private fun showAutoModeNoticeDialog() { private fun showAutoModeNoticeDialog() {
@@ -180,7 +194,7 @@ class AutoModeActivity : AppCompatActivity() {
Toast.makeText(this@AutoModeActivity, "修改成功", Toast.LENGTH_SHORT).show() Toast.makeText(this@AutoModeActivity, "修改成功", Toast.LENGTH_SHORT).show()
DeviceUpdateEvent.notifyDeviceUpdated(deviceId) DeviceUpdateEvent.notifyDeviceUpdated(deviceId)
} else { } else {
Toast.makeText(this@AutoModeActivity, response.msg, Toast.LENGTH_SHORT).show() Toast.makeText(this@AutoModeActivity, "修改失败", Toast.LENGTH_SHORT).show()
} }
finish() finish()
} }

View File

@@ -17,7 +17,9 @@ import com.example.defenseapplication.adapter.LinkedUserAdapter
import com.example.defenseapplication.bean.DeleteDeviceUserRequest import com.example.defenseapplication.bean.DeleteDeviceUserRequest
import com.example.defenseapplication.bean.DeviceUserBean import com.example.defenseapplication.bean.DeviceUserBean
import com.example.defenseapplication.bean.FamilyMembersBean import com.example.defenseapplication.bean.FamilyMembersBean
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.databinding.LinkedUserActivityBinding import com.example.defenseapplication.databinding.LinkedUserActivityBinding
import com.example.defenseapplication.personal.PasswordInputDialog
import com.example.defenseapplication.utils.DeviceIdEvent import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.DeviceUserUpdateEvent import com.example.defenseapplication.utils.DeviceUserUpdateEvent
import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.utils.RetrofitNetwork
@@ -25,6 +27,7 @@ import com.example.defenseapplication.view.CustomDialogFragmentText
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import com.yanzhenjie.recyclerview.SwipeMenuItem import com.yanzhenjie.recyclerview.SwipeMenuItem
import com.yanzhenjie.recyclerview.SwipeRecyclerView import com.yanzhenjie.recyclerview.SwipeRecyclerView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -36,6 +39,8 @@ class LinkedUserActivity : AppCompatActivity() {
private val fullUserList = mutableListOf<LinkedUser>() private val fullUserList = mutableListOf<LinkedUser>()
private val userList = mutableListOf<LinkedUser>() private val userList = mutableListOf<LinkedUser>()
private var mode: Int = MODE_SETTINGS private var mode: Int = MODE_SETTINGS
private var isPasswordVerified: Boolean = false
private lateinit var passwordDialog: PasswordInputDialog
companion object { companion object {
const val EXTRA_MODE = "extra_mode" const val EXTRA_MODE = "extra_mode"
@@ -71,6 +76,9 @@ class LinkedUserActivity : AppCompatActivity() {
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
DeviceUserUpdateEvent.removeListener(deviceUserUpdateListener) DeviceUserUpdateEvent.removeListener(deviceUserUpdateListener)
if (::passwordDialog.isInitialized) {
passwordDialog.dismiss()
}
} }
private fun initView() { private fun initView() {
@@ -135,11 +143,55 @@ class LinkedUserActivity : AppCompatActivity() {
} }
dialog.setShowInput(false) dialog.setShowInput(false)
dialog.setOnConfirmListener { dialog.setOnConfirmListener {
deleteDeviceUser(user, position) if (!isPasswordVerified) {
showPasswordDialog {
isPasswordVerified = true
deleteDeviceUser(user, position)
}
} else {
deleteDeviceUser(user, position)
}
} }
dialog.show(supportFragmentManager, "DeleteDialog") dialog.show(supportFragmentManager, "DeleteDialog")
} }
private fun showPasswordDialog(onVerified: () -> Unit) {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(inputPassword))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dismiss()
onVerified()
} else {
Toast.makeText(
this@LinkedUserActivity,
response.msg ?: getString(R.string.password_error),
Toast.LENGTH_SHORT
).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@LinkedUserActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
}
}
setOnDismissListener {
// Dialog dismissed
}
}
passwordDialog.show()
}
private fun deleteDeviceUser(user: LinkedUser, position: Int) { private fun deleteDeviceUser(user: LinkedUser, position: Int) {
val deviceId = DeviceIdEvent.getDeviceId() val deviceId = DeviceIdEvent.getDeviceId()
if (deviceId.isNullOrEmpty() || user.userId.isEmpty()) { if (deviceId.isNullOrEmpty() || user.userId.isEmpty()) {
@@ -279,16 +331,32 @@ class LinkedUserActivity : AppCompatActivity() {
}) })
binding.btnAddLinkedUser.setOnClickListener { binding.btnAddLinkedUser.setOnClickListener {
val intent = Intent(this, AddLinkedUserActivity::class.java) if (checkUserLimit()) {
startActivity(intent) val intent = Intent(this, AddLinkedUserActivity::class.java)
startActivity(intent)
}
} }
binding.fabAdd.setOnClickListener { binding.fabAdd.setOnClickListener {
val intent = Intent(this, com.example.defenseapplication.personal.InvitationCodeActivity::class.java) if (checkUserLimit()) {
startActivity(intent) val intent = Intent(this, com.example.defenseapplication.personal.InvitationCodeActivity::class.java)
startActivity(intent)
}
} }
} }
private fun checkUserLimit(): Boolean {
if (fullUserList.size >= 11) {
val dialog = CustomDialogFragmentText()
dialog.setTitle(getString(R.string.notice))
dialog.setMessage(getString(R.string.max_add_11_users))
dialog.setShowInput(false)
dialog.show(supportFragmentManager, "UserLimitDialog")
return false
}
return true
}
private fun setupModeUI() { private fun setupModeUI() {
if (mode == MODE_SETTINGS) { if (mode == MODE_SETTINGS) {
binding.btnAddLinkedUser.visibility = View.VISIBLE binding.btnAddLinkedUser.visibility = View.VISIBLE

View File

@@ -2,54 +2,55 @@ package com.example.defenseapplication.liveVideo
import android.Manifest import android.Manifest
import android.content.Intent import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.media.AudioManager
import android.media.MediaPlayer
import android.media.MediaRecorder import android.media.MediaRecorder
import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.util.Log
import android.view.SurfaceHolder
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.view.animation.Animation
import android.view.animation.LinearInterpolator
import android.view.animation.ScaleAnimation import android.view.animation.ScaleAnimation
import android.widget.Toast import android.widget.Toast
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import chuangyuan.ycj.videolibrary.video.ExoUserPlayer
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.AlarmLogHorizontalAdapter
import com.example.defenseapplication.base.BaseActivity import com.example.defenseapplication.base.BaseActivity
import com.example.defenseapplication.bean.DeviceAlarmBean
import com.example.defenseapplication.bean.DeviceAlarmResponse
import com.example.defenseapplication.databinding.LiveVideoActivityBinding import com.example.defenseapplication.databinding.LiveVideoActivityBinding
import com.example.defenseapplication.utils.ActivityManager import com.example.defenseapplication.utils.ActivityManager
import com.example.defenseapplication.utils.DeviceIdEvent import com.example.defenseapplication.utils.RetrofitNetwork
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import com.gyf.immersionbar.ktx.destroyImmersionBar import kotlinx.coroutines.launch
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import android.content.res.Configuration
import androidx.activity.OnBackPressedCallback
import chuangyuan.ycj.videolibrary.listener.VideoInfoListener
import chuangyuan.ycj.videolibrary.video.VideoPlayerManager
import android.view.View
import com.bumptech.glide.Glide
private const val TAG = "LiveVideoActivity" class LiveVideoActivity : BaseActivity() {
//智能防御机A1
class LiveVideoActivity : BaseActivity(), SurfaceHolder.Callback {
private lateinit var binding: LiveVideoActivityBinding private lateinit var binding: LiveVideoActivityBinding
private var mediaPlayer: MediaPlayer? = null private lateinit var exoPlayerManager: ExoUserPlayer
private var isFullscreen = false
private var isPlaying = false
private var isVoiceEnabled = false private var isVoiceEnabled = false
private var isLightOn = false private var isLightOn = false
private var isRecording = false private var isRecording = false
private var mediaRecorder: MediaRecorder? = null private var mediaRecorder: MediaRecorder? = null
private var micPulseAnimation: ScaleAnimation? = null private var micPulseAnimation: ScaleAnimation? = null
private var deviceId: String? = null
private var videoWidth = 0 private var alarmList: MutableList<DeviceAlarmBean> = mutableListOf()
private var videoHeight = 0 private var alarmAdapter: AlarmLogHorizontalAdapter? = null
private var currentPage = 1
private val testVideoUrl = "https://vjs.zencdn.net/v/oceans.mp4" private var totalPage = 1
private val pageSize = 10
private var hasMore = true
private var isLoading = false
private var isFirstLoad = true
private val requestPermissionLauncher = registerForActivityResult( private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission() ActivityResultContracts.RequestPermission()
@@ -67,104 +68,99 @@ class LiveVideoActivity : BaseActivity(), SurfaceHolder.Callback {
binding = LiveVideoActivityBinding.inflate(layoutInflater) binding = LiveVideoActivityBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
// ImmersionBar核心调用,沉浸式
ImmersionBar.with(this) ImmersionBar.with(this)
.statusBarDarkFont(true) .statusBarDarkFont(true)
.titleBar(binding.topBar) .titleBar(binding.topBar)
.init() .init()
deviceId = intent.getStringExtra("device_id")
val deviceName = intent.getStringExtra("device_name") val deviceName = intent.getStringExtra("device_name")
if (!deviceName.isNullOrEmpty()) { if (!deviceName.isNullOrEmpty()) {
binding.tvTitle.text = deviceName binding.tvTitle.text = deviceName
} }
initSurfaceView() initVideoPlayer()
initAlarmRecyclerView()
initListener() initListener()
fetchAlarmList()
// onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
// override fun handleOnBackPressed() {
// if (exoPlayerManager.onBackPressed()) {
// return
// }
// finish()
// }
// })
} }
private fun initSurfaceView() { private fun initVideoPlayer() {
binding.surfaceView.holder.addCallback(this) val videoPlayerView = binding.exoPlayContextId
}
override fun surfaceCreated(holder: SurfaceHolder) { exoPlayerManager = VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_GESTURE, videoPlayerView)
initMediaPlayer(holder) .setPlayUri("https://media.w3.org/2010/05/sintel/trailer.mp4")
} .setPosition(0)
.addVideoInfoListener(object : VideoInfoListener {
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { override fun onPlayStart(p0: Long) {
adjustSurfaceViewSize() Log.d("LiveVideoActivity", "视频开始播放")
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
releaseMediaPlayer()
}
private fun initMediaPlayer(holder: SurfaceHolder) {
mediaPlayer = MediaPlayer().apply {
setDisplay(holder)
setAudioStreamType(AudioManager.STREAM_MUSIC)
try {
setDataSource(this@LiveVideoActivity, Uri.parse(testVideoUrl))
prepareAsync()
setOnPreparedListener { mp ->
this@LiveVideoActivity.videoWidth = mp.videoWidth
this@LiveVideoActivity.videoHeight = mp.videoHeight
adjustSurfaceViewSize()
mp.isLooping = true
mp.start()
this@LiveVideoActivity.isPlaying = true
Toast.makeText(this@LiveVideoActivity, R.string.video_ready, Toast.LENGTH_SHORT).show()
} }
setOnCompletionListener { override fun onLoadingChanged() {
this@LiveVideoActivity.isPlaying = false
Toast.makeText(this@LiveVideoActivity, R.string.playback_complete, Toast.LENGTH_SHORT).show()
} }
setOnErrorListener { _, what, extra -> override fun onPlayerError(p0: com.google.android.exoplayer2.ExoPlaybackException?) {
Toast.makeText(this@LiveVideoActivity, getString(R.string.video_error_format, what, extra), Toast.LENGTH_SHORT).show() Toast.makeText(this@LiveVideoActivity, "播放失败", Toast.LENGTH_SHORT).show()
releaseMediaPlayer()
true
} }
setOnBufferingUpdateListener { _, percent -> override fun onPlayEnd() {
if (percent < 100) { Log.d("LiveVideoActivity", "播放结束")
Toast.makeText(this@LiveVideoActivity, getString(R.string.buffering_format, percent), Toast.LENGTH_SHORT).show() }
override fun isPlaying(p0: Boolean) {
}
fun onRepeatModeChanged(p0: Int) {
}
})
.create()
exoPlayerManager.startPlayer()
}
private fun initAlarmRecyclerView() {
val layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
binding.alarmLogRecyclerView.layoutManager = layoutManager
alarmAdapter = AlarmLogHorizontalAdapter(alarmList) { messageBean ->
val intent = Intent(this, AlarmLogActivity::class.java)
intent.putExtra("device_id", deviceId)
intent.putExtra("selected_id", messageBean.id)
intent.putExtra("video_url", messageBean.video)
intent.putExtra("create_time", messageBean.createTime)
intent.putExtra("from_live_video", true)
startActivity(intent)
}
binding.alarmLogRecyclerView.adapter = alarmAdapter
binding.alarmLogRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (dx > 0 && !isLoading && hasMore) {
val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition()
if (lastVisibleItemPosition == alarmList.size - 1) {
loadMoreAlarms()
} }
} }
} catch (e: IOException) {
e.printStackTrace()
Toast.makeText(this@LiveVideoActivity, R.string.cannot_load_video, Toast.LENGTH_SHORT).show()
} }
} })
} }
private fun adjustSurfaceViewSize() { private fun loadMoreAlarms() {
if (videoWidth == 0 || videoHeight == 0) return if (!hasMore || isLoading) return
currentPage++
val screenWidth = resources.displayMetrics.widthPixels if (currentPage > totalPage) {
val screenHeight = resources.displayMetrics.heightPixels hasMore = false
val aspectRatio = videoWidth.toFloat() / videoHeight.toFloat() return
val params = binding.surfaceView.layoutParams
if (isFullscreen) {
if (screenWidth.toFloat() / screenHeight.toFloat() > aspectRatio) {
params.width = (screenHeight * aspectRatio).toInt()
params.height = screenHeight
} else {
params.width = screenWidth
params.height = (screenWidth / aspectRatio).toInt()
}
} else {
val containerHeight = binding.videoContainer.height
params.width = (containerHeight * aspectRatio).toInt()
params.height = containerHeight
} }
fetchAlarmList(currentPage)
binding.surfaceView.layoutParams = params
} }
private fun initListener() { private fun initListener() {
@@ -181,14 +177,6 @@ class LiveVideoActivity : BaseActivity(), SurfaceHolder.Callback {
startActivity(intent) startActivity(intent)
} }
binding.ivFullscreen.setOnClickListener {
toggleFullscreen()
}
binding.surfaceView.setOnClickListener {
togglePlayPause()
}
binding.llVoice.setOnClickListener { binding.llVoice.setOnClickListener {
toggleVoice() toggleVoice()
} }
@@ -205,99 +193,108 @@ class LiveVideoActivity : BaseActivity(), SurfaceHolder.Callback {
Toast.makeText(this, R.string.view_alarm_log, Toast.LENGTH_SHORT).show() Toast.makeText(this, R.string.view_alarm_log, Toast.LENGTH_SHORT).show()
} }
// 点击xq箭头跳转到AlarmLogActivity
binding.xq.setOnClickListener { binding.xq.setOnClickListener {
val intent = Intent(this, AlarmLogActivity::class.java) val intent = Intent(this, AlarmLogActivity::class.java)
intent.putExtra("device_id", deviceId)
intent.putExtra("from_live_video", true)
startActivity(intent) startActivity(intent)
} }
// 控制台方向按钮点击事件
binding.ivUp.setOnClickListener {
handleDirectionClick("up")
}
binding.ivDown.setOnClickListener {
handleDirectionClick("down")
}
binding.ivLeft.setOnClickListener {
handleDirectionClick("left")
}
binding.ivRight.setOnClickListener {
handleDirectionClick("right")
}
// 触摸反馈
setTouchFeedback(binding.ivUp)
setTouchFeedback(binding.ivDown)
setTouchFeedback(binding.ivLeft)
setTouchFeedback(binding.ivRight)
} }
private fun togglePlayPause() { private fun setTouchFeedback(view: View) {
mediaPlayer?.let { mp -> view.setOnTouchListener { v, event ->
if (mp.isPlaying) { when (event.action) {
mp.pause() android.view.MotionEvent.ACTION_DOWN -> {
isPlaying = false v.scaleX = 0.9f
Toast.makeText(this, R.string.paused, Toast.LENGTH_SHORT).show() v.scaleY = 0.9f
} else { }
mp.start() android.view.MotionEvent.ACTION_UP, android.view.MotionEvent.ACTION_CANCEL -> {
isPlaying = true v.scaleX = 1.0f
Toast.makeText(this, R.string.resume_playback, Toast.LENGTH_SHORT).show() v.scaleY = 1.0f
}
}
false
}
}
private fun handleDirectionClick(direction: String) {
val directionText = when (direction) {
"up" -> getString(R.string.direction_up)
"down" -> getString(R.string.direction_down)
"left" -> getString(R.string.direction_left)
"right" -> getString(R.string.direction_right)
else -> ""
}
}
private fun fetchAlarmList(page: Int = 1) {
val currentDeviceId = deviceId ?: return
isLoading = true
lifecycleScope.launch {
try {
val response = RetrofitNetwork.getNetworkService().getDeviceAlarmList(
deviceId = currentDeviceId,
pageNum = page.toString(),
pageSize = pageSize.toString()
)
Log.d("LiveVideoActivity", "总条数: ${response.total}, 当前页数据条数: ${response.rows.size}")
val newData = response.rows
if (newData.isEmpty()) {
} else {
newData.take(3).forEachIndexed { index, item ->
Log.d("LiveVideoActivity", "${index + 1}条 - id: ${item.id}, categoryName: ${item.categoryName}, createTime: ${item.createTime}")
}
}
totalPage = if (response.total % pageSize == 0) {
response.total / pageSize
} else {
response.total / pageSize + 1
}
isFirstLoad = false
if (page == 1) {
alarmList.clear()
hasMore = totalPage > 1
}
alarmList.addAll(newData)
alarmAdapter?.notifyDataSetChanged()
} catch (e: Exception) {
hasMore = false
} finally {
isLoading = false
} }
} }
} }
private fun toggleFullscreen() {
isFullscreen = !isFullscreen
if (isFullscreen) {
enterFullscreen()
} else {
exitFullscreen()
}
}
private fun enterFullscreen() {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
binding.topBar.visibility = View.GONE
binding.bitRateBar.visibility = View.GONE
binding.functionBar.visibility = View.GONE
val alarmLogParent = binding.llAlarmLog.parent.parent as View
alarmLogParent.visibility = View.GONE
val containerParams = binding.videoContainer.layoutParams
containerParams.width = ViewGroup.LayoutParams.MATCH_PARENT
containerParams.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.videoContainer.layoutParams = containerParams
val surfaceParams = binding.surfaceView.layoutParams
surfaceParams.width = resources.displayMetrics.widthPixels
surfaceParams.height = resources.displayMetrics.heightPixels
binding.surfaceView.layoutParams = surfaceParams
binding.ivFullscreen.setImageResource(com.example.defenseapplication.R.drawable.back)
Toast.makeText(this, R.string.entered_fullscreen, Toast.LENGTH_SHORT).show()
}
private fun exitFullscreen() {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
binding.topBar.visibility = View.VISIBLE
binding.bitRateBar.visibility = View.VISIBLE
binding.functionBar.visibility = View.VISIBLE
val alarmLogParent = binding.llAlarmLog.parent.parent as View
alarmLogParent.visibility = View.VISIBLE
val containerParams = binding.videoContainer.layoutParams
containerParams.width = ViewGroup.LayoutParams.MATCH_PARENT
containerParams.height = (220 * resources.displayMetrics.density).toInt()
binding.videoContainer.layoutParams = containerParams
adjustSurfaceViewSize()
binding.ivFullscreen.setImageResource(com.example.defenseapplication.R.drawable.full_screen)
Toast.makeText(this, R.string.exited_fullscreen, Toast.LENGTH_SHORT).show()
}
private fun toggleVoice() { private fun toggleVoice() {
isVoiceEnabled = !isVoiceEnabled isVoiceEnabled = !isVoiceEnabled
if (isVoiceEnabled) { if (isVoiceEnabled) {
mediaPlayer?.setVolume(1.0f, 1.0f) Glide.with(this).asGif().load(com.example.defenseapplication.R.drawable.voice_on_open).into(binding.ivVoice)
binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice_on_open)
Toast.makeText(this, R.string.sound_on, Toast.LENGTH_SHORT).show()
} else { } else {
mediaPlayer?.setVolume(0.0f, 0.0f)
binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice) binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice)
Toast.makeText(this, R.string.sound_off, Toast.LENGTH_SHORT).show()
} }
} }
@@ -306,10 +303,8 @@ class LiveVideoActivity : BaseActivity(), SurfaceHolder.Callback {
if (isLightOn) { if (isLightOn) {
binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.light_on_open) binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.light_on_open)
Toast.makeText(this, R.string.light_on, Toast.LENGTH_SHORT).show()
} else { } else {
binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.light_on) binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.light_on)
Toast.makeText(this, R.string.light_off, Toast.LENGTH_SHORT).show()
} }
} }
@@ -340,59 +335,29 @@ class LiveVideoActivity : BaseActivity(), SurfaceHolder.Callback {
isRecording = true isRecording = true
binding.ivRecord.setImageResource(com.example.defenseapplication.R.drawable.copy_open) binding.ivRecord.setImageResource(com.example.defenseapplication.R.drawable.copy_open)
// 隐藏告警日志区域,显示控制台区域
binding.llAlarmLog.visibility = View.GONE binding.llAlarmLog.visibility = View.GONE
binding.consoleBar.visibility = View.VISIBLE binding.consoleBar.visibility = View.VISIBLE
// 麦克风切换成开启状态 Glide.with(this).asGif().load(com.example.defenseapplication.R.drawable.voice_on_open).into(binding.ivVoice)
binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice_on_open)
isVoiceEnabled = true isVoiceEnabled = true
// 启动语音录制
startVoiceRecording() startVoiceRecording()
// 启动麦克风脉冲动画
//startMicPulseAnimation()
Toast.makeText(this, R.string.start_control_mode, Toast.LENGTH_SHORT).show()
} }
private fun stopRecordingMode() { private fun stopRecordingMode() {
isRecording = false isRecording = false
binding.ivRecord.setImageResource(com.example.defenseapplication.R.drawable.copy) binding.ivRecord.setImageResource(com.example.defenseapplication.R.drawable.copy)
// 显示告警日志区域,隐藏控制台区域
binding.llAlarmLog.visibility = View.VISIBLE binding.llAlarmLog.visibility = View.VISIBLE
binding.consoleBar.visibility = View.GONE binding.consoleBar.visibility = View.GONE
// 麦克风切换成关闭状态
binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice) binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice)
isVoiceEnabled = false isVoiceEnabled = false
// 停止语音录制
stopVoiceRecording() stopVoiceRecording()
// 停止麦克风脉冲动画
stopMicPulseAnimation() stopMicPulseAnimation()
Toast.makeText(this, R.string.stop_control_mode, Toast.LENGTH_SHORT).show()
} }
// private fun startMicPulseAnimation() {
// micPulseAnimation = ScaleAnimation(
// 1.0f, 1.3f,
// 1.0f, 1.3f,
// Animation.RELATIVE_TO_SELF, 0.5f,
// Animation.RELATIVE_TO_SELF, 0.5f
// ).apply {
// duration = 500
// repeatCount = Animation.INFINITE
// repeatMode = Animation.REVERSE
// interpolator = LinearInterpolator()
// }
// binding.ivVoice.startAnimation(micPulseAnimation)
// }
private fun stopMicPulseAnimation() { private fun stopMicPulseAnimation() {
micPulseAnimation?.let { micPulseAnimation?.let {
binding.ivVoice.clearAnimation() binding.ivVoice.clearAnimation()
@@ -435,31 +400,23 @@ class LiveVideoActivity : BaseActivity(), SurfaceHolder.Callback {
} }
} }
private fun releaseMediaPlayer() { override fun onResume() {
mediaPlayer?.let { super.onResume()
if (it.isPlaying) { exoPlayerManager.onResume()
it.stop()
}
it.release()
mediaPlayer = null
}
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
mediaPlayer?.pause() exoPlayerManager.onPause()
}
override fun onResume() {
super.onResume()
mediaPlayer?.start()
} }
override fun onDestroy() { override fun onDestroy() {
releaseMediaPlayer()
super.onDestroy() super.onDestroy()
exoPlayerManager.onDestroy()
} }
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
exoPlayerManager.onConfigurationChanged(newConfig)
}
} }

View File

@@ -7,14 +7,13 @@ import android.widget.Toast
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.base.BaseActivity import com.example.defenseapplication.base.BaseActivity
import com.example.defenseapplication.bean.DeviceUserBean
import com.example.defenseapplication.databinding.SettingsActivityBinding import com.example.defenseapplication.databinding.SettingsActivityBinding
import com.example.defenseapplication.utils.DeviceIdEvent import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.view.CustomDialogFragmentText import com.example.defenseapplication.view.CustomDialogFragmentText
import com.example.defenseapplication.view.LanguageDialog
import com.example.defenseapplication.view.RecognitionModeDialog import com.example.defenseapplication.view.RecognitionModeDialog
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.personal.PasswordInputDialog
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -24,8 +23,10 @@ import kotlinx.coroutines.withContext
class SettingsActivity : BaseActivity() { class SettingsActivity : BaseActivity() {
private lateinit var binding: SettingsActivityBinding private lateinit var binding: SettingsActivityBinding
private lateinit var passwordDialog: PasswordInputDialog
private var alertAudio: String? = null private var alertAudio: String? = null
private var audioContent: String? = null private var audioContent: String? = null
private var isPasswordVerified = false
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
@@ -51,11 +52,22 @@ class SettingsActivity : BaseActivity() {
} }
binding.itemRecognitionMode.setOnClickListener { binding.itemRecognitionMode.setOnClickListener {
val dialog = RecognitionModeDialog(this) if (isPasswordVerified) {
dialog.setOnConfirmListener { mode -> val dialog = RecognitionModeDialog(this)
updateRecognitionMode(mode) dialog.setOnConfirmListener { mode ->
updateRecognitionMode(mode)
}
dialog.show()
} else {
showPasswordDialog {
isPasswordVerified = true
val dialog = RecognitionModeDialog(this)
dialog.setOnConfirmListener { mode ->
updateRecognitionMode(mode)
}
dialog.show()
}
} }
dialog.show()
} }
binding.itemDeviceName.setOnClickListener { binding.itemDeviceName.setOnClickListener {
@@ -81,48 +93,26 @@ class SettingsActivity : BaseActivity() {
dialog.show(supportFragmentManager, "CustomDialogFragment") dialog.show(supportFragmentManager, "CustomDialogFragment")
} }
binding.itemWaterGunSetting.setOnClickListener { binding.itemWaterGunSetting.setOnClickListener {
val intent = Intent(this, WaterGunSettingsActivity::class.java) if (isPasswordVerified) {
// 传递水枪设置参数 navigateToWaterGunSettings()
val deviceId = DeviceIdEvent.getDeviceId()
if (!deviceId.isNullOrEmpty()) {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getDeviceInfo(deviceId)
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val device = response.data
intent.putExtra("strikeRange", device.strikeRange ?: "7")
intent.putExtra("strikeInterval", device.strikeInterval ?: "3")
intent.putExtra("container", device.container ?: "容器4")
startActivity(intent)
} else {
// 如果获取失败,使用默认值
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
}
} else { } else {
intent.putExtra("strikeRange", "7") showPasswordDialog {
intent.putExtra("strikeInterval", "3") isPasswordVerified = true
intent.putExtra("container", "容器4") navigateToWaterGunSettings()
startActivity(intent) }
} }
} }
binding.itemAutoMode.setOnClickListener { binding.itemAutoMode.setOnClickListener {
val intent = Intent(this, AutoModeActivity::class.java) if (isPasswordVerified) {
startActivity(intent) val intent = Intent(this, AutoModeActivity::class.java)
startActivity(intent)
} else {
showPasswordDialog {
isPasswordVerified = true
val intent = Intent(this, AutoModeActivity::class.java)
startActivity(intent)
}
}
} }
binding.itemDeviceInfo.setOnClickListener { binding.itemDeviceInfo.setOnClickListener {
val intent = Intent(this, DeviceInfoActivity::class.java) val intent = Intent(this, DeviceInfoActivity::class.java)
@@ -338,4 +328,87 @@ class SettingsActivity : BaseActivity() {
} }
} }
private fun showPasswordDialog(onVerified: () -> Unit) {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(inputPassword))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dismiss()
onVerified()
} else {
Toast.makeText(
this@SettingsActivity,
response.msg ?: getString(R.string.password_error),
Toast.LENGTH_SHORT
).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@SettingsActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
}
}
setOnDismissListener {
// Dialog dismissed
}
}
passwordDialog.show()
}
private fun navigateToWaterGunSettings() {
val intent = Intent(this, WaterGunSettingsActivity::class.java)
val deviceId = DeviceIdEvent.getDeviceId()
if (!deviceId.isNullOrEmpty()) {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getDeviceInfo(deviceId)
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val device = response.data
intent.putExtra("strikeRange", device.strikeRange ?: "7")
intent.putExtra("strikeInterval", device.strikeInterval ?: "3")
intent.putExtra("container", device.container ?: "容器4")
startActivity(intent)
} else {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
}
} else {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
override fun onDestroy() {
if (::passwordDialog.isInitialized) {
passwordDialog.dismiss()
}
super.onDestroy()
}
} }

View File

@@ -1,17 +1,54 @@
package com.example.defenseapplication.liveVideo package com.example.defenseapplication.liveVideo
import android.animation.ObjectAnimator
import android.os.Bundle import android.os.Bundle
import android.widget.RelativeLayout import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.bean.DeviceBean
import com.example.defenseapplication.databinding.StrikePositionActivityBinding import com.example.defenseapplication.databinding.StrikePositionActivityBinding
import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.view.CustomDialogFragment import com.example.defenseapplication.view.CustomDialogFragment
import com.example.defenseapplication.view.showDefenseDialog import com.example.defenseapplication.view.showDefenseDialog
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
//打击位置 import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.math.abs
import kotlin.math.min
import kotlin.math.max
class StrikePositionActivity : AppCompatActivity() { class StrikePositionActivity : AppCompatActivity() {
private lateinit var binding: StrikePositionActivityBinding private lateinit var binding: StrikePositionActivityBinding
private lateinit var markerLayoutParams: RelativeLayout.LayoutParams private var deviceId: String? = null
private var humanBodyWidth = 0
private var humanBodyHeight = 0
private var hasAppliedInitialPosition = false
private enum class Zone(val rawValue: Int, val normalizedX: Float, val normalizedY: Float) {
HEAD(1, 0.49f, 0.01f),
LEFT_SHOULDER(2, 0.20f, 0.475f),
CHEST(3, 0.5f, 0.475f),
RIGHT_SHOULDER(4, 0.80f, 0.475f);
companion object {
fun fromRawValue(raw: Int): Zone {
return values().minByOrNull { abs(it.rawValue - raw) } ?: CHEST
}
}
}
private var selectedZone: Zone = Zone.CHEST
// Touch tracking for ImageView (captured in onTouch, used in ACTION_UP for click detection)
private var lastTouchX = 0f
private var lastTouchY = 0f
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = StrikePositionActivityBinding.inflate(layoutInflater) binding = StrikePositionActivityBinding.inflate(layoutInflater)
@@ -22,35 +59,163 @@ class StrikePositionActivity : AppCompatActivity() {
.titleBar(binding.topBar) .titleBar(binding.topBar)
.init() .init()
binding.ivBack.setOnClickListener { deviceId = DeviceIdEvent.getDeviceId()
finish()
}
binding.btnSubmit.setOnClickListener { val initialPos = intent.getStringExtra("strikePosition")?.toIntOrNull() ?: Zone.CHEST.rawValue
showConfirmDialog() selectedZone = Zone.fromRawValue(initialPos)
}
// 获取准星的 LayoutParams并移除居中约束
markerLayoutParams = binding.ivStrikeMarker.layoutParams as RelativeLayout.LayoutParams
markerLayoutParams.removeRule(RelativeLayout.CENTER_HORIZONTAL)
markerLayoutParams.removeRule(RelativeLayout.CENTER_VERTICAL)
binding.ivStrikeMarker.layoutParams = markerLayoutParams
// 设置人体图片的点击监听 binding.ivBack.setOnClickListener { finish() }
binding.btnSubmit.setOnClickListener { showConfirmDialog() }
// Use OnTouchListener to track touch coordinates
binding.ivHumanBody.setOnTouchListener { _, event -> binding.ivHumanBody.setOnTouchListener { _, event ->
if (event.action == android.view.MotionEvent.ACTION_DOWN) { lastTouchX = event.x
moveMarkerTo(event.x, event.y) lastTouchY = event.y
// Return false so the touch event continues to be processed
// (e.g., scrolling / scaling if you add it later) while still
// letting us capture the coordinates.
false
}
// OnClick fires on ACTION_UP; coordinates captured from lastTouchX/Y
binding.ivHumanBody.setOnClickListener {
val imageView = it as ImageView
val (nx, ny) = resolveTapLocation(lastTouchX, lastTouchY, imageView)
val zone = zoneForLocation(nx, ny)
selectedZone = zone
updateMarkerPosition(zone, animated = true)
}
binding.ivHumanBody.viewTreeObserver.addOnPreDrawListener {
val w = binding.ivHumanBody.width
val h = binding.ivHumanBody.height
if (w > 0 && h > 0 && !hasAppliedInitialPosition) {
hasAppliedInitialPosition = true
humanBodyWidth = w
humanBodyHeight = h
updateMarkerPosition(selectedZone, animated = false)
} }
true true
} }
// 初始化准星位置人体头部假设在图片宽度的1/2高度的1/5处 }
binding.ivHumanBody.post {
val humanWidth = binding.ivHumanBody.width /**
val humanHeight = binding.ivHumanBody.height * Converts a screen coordinate (from onTouch) into a normalised [0..1] offset
if (humanWidth > 0 && humanHeight > 0) { * inside the drawable, accounting for:
val headX = humanWidth / 2f * - ImageView scaling (scaleType="fitCenter" adds letterboxing)
val headY = humanHeight / 5f * - Letterbox / pillarbox margins when image aspect ≠ view aspect
moveMarkerTo(headX, headY) */
} private fun resolveTapLocation(rawX: Float, rawY: Float, imageView: ImageView): Pair<Float, Float> {
val drawable = imageView.drawable ?: return Pair(0f, 0f)
val ivWidth = imageView.width.toFloat()
val ivHeight = imageView.height.toFloat()
if (ivWidth <= 0 || ivHeight <= 0) return Pair(0f, 0f)
val intrinsicWidth = drawable.intrinsicWidth.toFloat()
val intrinsicHeight = drawable.intrinsicHeight.toFloat()
// scale: the uniform factor the image is scaled by to fit the view
val scale = min(ivWidth / intrinsicWidth, ivHeight / intrinsicHeight)
// Physical pixel size of the drawable after scaling
val drawnW = intrinsicWidth * scale
val drawnH = intrinsicHeight * scale
// Letterbox offsets (top / left) when aspect ratios differ
val drawableLeft = (ivWidth - drawnW) / 2f
val drawableTop = (ivHeight - drawnH) / 2f
// Clamp touch to the actual drawable area
val clampedX = max(drawableLeft, min(rawX, drawableLeft + drawnW))
val clampedY = max(drawableTop, min(rawY, drawableTop + drawnH))
// Normalised offset [0..1] within the drawable
val normalizedX = (clampedX - drawableLeft) / drawnW
val normalizedY = (clampedY - drawableTop) / drawnH
return Pair(normalizedX, normalizedY)
}
/**
* Zones are divided by:
* - Horizontal boundary at ny = 0.5 → top = HEAD, bottom = shoulders
* - Vertical boundary 1 at nx = 1/3 → left = LEFT_SHOULDER
* - Vertical boundary 2 at nx = 2/3 → right = RIGHT_SHOULDER, middle = CHEST
*
* If the touch falls within ±tolerance of any boundary line, the nearest
* zone centre (Euclidean distance in normalised space) is used to avoid
* arbitrary assignments at boundary pixels.
*/
private fun zoneForLocation(nx: Float, ny: Float): Zone {
val hBoundary = 0.5f
val vBoundary1 = 1f / 3f
val vBoundary2 = 2f / 3f
val tolerance = 0.04f
val nearHBoundary = abs(ny - hBoundary) <= tolerance
val nearVBoundary = ny >= hBoundary &&
(abs(nx - vBoundary1) <= tolerance || abs(nx - vBoundary2) <= tolerance)
if (nearHBoundary || nearVBoundary) {
return nearestZone(nx, ny)
}
return when {
ny < hBoundary -> Zone.HEAD
nx < vBoundary1 -> Zone.LEFT_SHOULDER
nx < vBoundary2 -> Zone.CHEST
else -> Zone.RIGHT_SHOULDER
}
}
/** Returns the Zone whose normalised centre is closest (Euclidean) to (nx, ny). */
private fun nearestZone(nx: Float, ny: Float): Zone {
return Zone.values().minByOrNull { zone ->
val dx = nx - zone.normalizedX
val dy = ny - zone.normalizedY
dx * dx + dy * dy
} ?: Zone.CHEST
}
/**
* Positions the marker (ivStrikeMarker) at the zone's centre, clamped so the
* marker never goes out of the ivHumanBody bounds.
*
* Because the marker is a child of ivHumanBody and starts at its center
* (layout_gravity="center"), we compute the offset from that center point
* and apply it via translationX/Y so the marker's layout bounds stay intact.
*/
private fun updateMarkerPosition(zone: Zone, animated: Boolean) {
if (humanBodyWidth <= 0 || humanBodyHeight <= 0) return
val markerView = binding.ivStrikeMarker
val markerW = markerView.layoutParams.width.takeIf { it > 0 } ?: 200
val markerH = markerView.layoutParams.height.takeIf { it > 0 } ?: 200
val halfMarkerW = markerW / 2f
val halfMarkerH = markerH / 2f
val rawX = humanBodyWidth * zone.normalizedX
val rawY = humanBodyHeight * zone.normalizedY
// Clamp X so the marker never extends beyond the drawable edges.
// Y clamp only has an upper bound — HEAD at normalizedY=0 is allowed to go
// all the way to the top (translationY can be negative).
val clampedX = min(max(rawX, halfMarkerW), humanBodyWidth - halfMarkerW)
val clampedY = min(rawY, humanBodyHeight - halfMarkerH)
// Offset from ivHumanBody's center (where the marker starts by default)
val centerX = humanBodyWidth / 2f
val centerY = humanBodyHeight / 2f
val offsetX = clampedX - centerX
val offsetY = clampedY - centerY
if (animated) {
ObjectAnimator.ofFloat(markerView, "translationX", offsetX).apply { duration = 200; start() }
ObjectAnimator.ofFloat(markerView, "translationY", offsetY).apply { duration = 200; start() }
} else {
markerView.translationX = offsetX
markerView.translationY = offsetY
} }
} }
@@ -61,23 +226,34 @@ class StrikePositionActivity : AppCompatActivity() {
positiveText = getString(R.string.confirm), positiveText = getString(R.string.confirm),
negativeText = getString(R.string.cancel) negativeText = getString(R.string.cancel)
) )
showDefenseDialog(config, onPositiveClick = { showDefenseDialog(config, onPositiveClick = { submitStrikePosition() })
finish()
// if(){
// ToastUtils.showSuccess(this, getString(R.string.wifi_connection_success))
// }else{
// ToastUtils.showError(this, getString(R.string.wifi_connection_failed))
// }
})
} }
private fun moveMarkerTo(x: Float, y: Float) {
val marker = binding.ivStrikeMarker
// 让准星中心对准点击位置
val left = x - marker.width / 2f
val top = y - marker.height / 2f
markerLayoutParams.leftMargin = left.toInt() private fun submitStrikePosition() {
markerLayoutParams.topMargin = top.toInt() val id = deviceId
marker.layoutParams = markerLayoutParams if (id.isNullOrEmpty()) {
Toast.makeText(this, "设备ID为空", Toast.LENGTH_SHORT).show()
return
}
CoroutineScope(Dispatchers.IO).launch {
try {
val bean = DeviceBean(id = id, strikePosition = selectedZone.rawValue.toString())
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(bean)
withContext(Dispatchers.Main) {
//val body = response.body()
// if (response.isSuccessful && body?.code == 0) {
// Toast.makeText(this@StrikePositionActivity, R.string.submit_success, Toast.LENGTH_SHORT).show()
// finish()
// } else {
// Toast.makeText(this@StrikePositionActivity, R.string.submit_failed, Toast.LENGTH_SHORT).show()
// }
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@StrikePositionActivity, R.string.submit_failed, Toast.LENGTH_SHORT).show()
}
}
}
} }
} }

View File

@@ -8,6 +8,8 @@ import androidx.lifecycle.lifecycleScope
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.bean.DeleteDeviceUserRequest import com.example.defenseapplication.bean.DeleteDeviceUserRequest
import com.example.defenseapplication.bean.ObtainInviterInformationRequest import com.example.defenseapplication.bean.ObtainInviterInformationRequest
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.personal.PasswordInputDialog
import com.example.defenseapplication.utils.DeviceIdEvent import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.DeviceUserUpdateEvent import com.example.defenseapplication.utils.DeviceUserUpdateEvent
import com.example.defenseapplication.databinding.UserDetailsActivityBinding import com.example.defenseapplication.databinding.UserDetailsActivityBinding
@@ -23,6 +25,8 @@ class UserDetailsActivity : AppCompatActivity() {
private lateinit var binding: UserDetailsActivityBinding private lateinit var binding: UserDetailsActivityBinding
private var userId: String = "" private var userId: String = ""
private var isPasswordVerified: Boolean = false
private lateinit var passwordDialog: PasswordInputDialog
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -82,12 +86,11 @@ class UserDetailsActivity : AppCompatActivity() {
} }
binding.swUserStatus.setOnCheckedChangeListener { _, isChecked -> binding.swUserStatus.setOnCheckedChangeListener { _, isChecked ->
when (isChecked) { if (!isPasswordVerified) {
true -> { binding.swUserStatus.isChecked = !isChecked
// 打开开关业务逻辑 showPasswordDialog {
} isPasswordVerified = true
false -> { binding.swUserStatus.isChecked = isChecked
// 关闭开关业务逻辑
} }
} }
} }
@@ -97,6 +100,41 @@ class UserDetailsActivity : AppCompatActivity() {
} }
} }
private fun showPasswordDialog(onVerified: () -> Unit) {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
lifecycleScope.launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(inputPassword))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dismiss()
onVerified()
} else {
Toast.makeText(
this@UserDetailsActivity,
response.msg ?: getString(R.string.password_error),
Toast.LENGTH_SHORT
).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@UserDetailsActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
}
}
setOnDismissListener {}
}
passwordDialog.show()
}
private fun showDeleteDialog() { private fun showDeleteDialog() {
val dialog = CustomDialogFragmentText() val dialog = CustomDialogFragmentText()
@@ -106,7 +144,14 @@ class UserDetailsActivity : AppCompatActivity() {
dialog.setPositiveText(getString(R.string.confirm)) dialog.setPositiveText(getString(R.string.confirm))
dialog.setNegativeText(getString(R.string.cancel)) dialog.setNegativeText(getString(R.string.cancel))
dialog.setOnConfirmListener { dialog.setOnConfirmListener {
deleteDeviceUser() if (isPasswordVerified) {
deleteDeviceUser()
} else {
showPasswordDialog {
isPasswordVerified = true
deleteDeviceUser()
}
}
} }
dialog.show(supportFragmentManager, "DeleteUserDialog") dialog.show(supportFragmentManager, "DeleteUserDialog")
} }

View File

@@ -35,9 +35,6 @@ class FaceLoginActivity : AppCompatActivity() {
binding.btnStartVerification.setOnClickListener { binding.btnStartVerification.setOnClickListener {
val intent= Intent(this, FaceVerificationActivity::class.java) val intent= Intent(this, FaceVerificationActivity::class.java)
startActivity(intent) startActivity(intent)
Toast.makeText(this, R.string.redirect_face_recognition_page, Toast.LENGTH_SHORT).show()
} }
} }
} }

View File

@@ -0,0 +1,74 @@
package com.example.defenseapplication.personal
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.R
import com.example.defenseapplication.bean.UpdatePassword
import com.example.defenseapplication.databinding.ChangePasswordActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork
import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
//登录密码修改
class ChangePasswordActivity : AppCompatActivity() {
private lateinit var binding: ChangePasswordActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ChangePasswordActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.ivBack.setOnClickListener {
finish()
}
binding.btnConfirm.setOnClickListener {
val oldPassword = binding.etOldPassword.text.toString().trim()
val newPassword = binding.etNewPassword.text.toString().trim()
val confirmPassword = binding.etConfirmPassword.text.toString().trim()
if (oldPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_old_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_new_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword != confirmPassword) {
Toast.makeText(this, getString(R.string.password_not_match), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
CoroutineScope(Dispatchers.IO).launch {
try {
val result = RetrofitNetwork.getNetworkService().updatePassword(UpdatePassword(oldPassword, newPassword))
withContext(Dispatchers.Main) {
if (result.code == 200) {
Toast.makeText(this@ChangePasswordActivity, getString(R.string.password_reset_success), Toast.LENGTH_SHORT).show()
finish()
} else {
Toast.makeText(this@ChangePasswordActivity, result.msg ?: getString(R.string.password_reset_failed), Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@ChangePasswordActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
}
}
}
}
}
}

View File

@@ -2,14 +2,9 @@ package com.example.defenseapplication.personal
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity 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.FaceManagementActivityBinding import com.example.defenseapplication.databinding.FaceManagementActivityBinding
import com.example.defenseapplication.databinding.LoginPasswordActivityBinding import com.example.defenseapplication.login.FaceLoginActivity
import com.example.defenseapplication.login.FaceVerificationActivity
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
//人脸管理页面 //人脸管理页面
@@ -29,7 +24,7 @@ class FaceManagementActivity : AppCompatActivity() {
finish() finish()
} }
binding.faceManagement.setOnClickListener { binding.faceManagement.setOnClickListener {
startActivity(Intent(this, FaceVerificationActivity::class.java)) startActivity(Intent(this, FaceLoginActivity::class.java))
} }
} }
} }

View File

@@ -8,7 +8,6 @@ import android.graphics.Color
import android.graphics.Paint import android.graphics.Paint
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.text.TextPaint
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@@ -31,7 +30,7 @@ import kotlinx.coroutines.withContext
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.util.Hashtable import java.util.Hashtable
//邀请二维码
class InvitationCodeActivity : AppCompatActivity() { class InvitationCodeActivity : AppCompatActivity() {
private lateinit var binding: InvitationCodeActivityBinding private lateinit var binding: InvitationCodeActivityBinding
@@ -43,6 +42,7 @@ class InvitationCodeActivity : AppCompatActivity() {
private var lastClickTime: Long = 0 // 上次点击时间,用于防止多次点击 private var lastClickTime: Long = 0 // 上次点击时间,用于防止多次点击
private var expireTimeDialog: BottomSheetDialog? = null // 时效选择弹窗 private var expireTimeDialog: BottomSheetDialog? = null // 时效选择弹窗
private var isLoading = false // 是否正在加载 private var isLoading = false // 是否正在加载
private var hasGeneratedQrCode = false // 是否已经生成过二维码
companion object { companion object {
const val EXPIRE_24H = 24 * 60 * 60 * 1000L const val EXPIRE_24H = 24 * 60 * 60 * 1000L
@@ -60,13 +60,12 @@ class InvitationCodeActivity : AppCompatActivity() {
.init() .init()
initListener() initListener()
// 默认显示时效为24h // 默认显示时效为 24h
binding.tvExpireTime.text = getString(R.string.expire_24h) binding.tvExpireTime.text = getString(R.string.expire_24h)
// 默认显示灰色占位区域,二维码不可见 // 默认显示灰色占位区域,二维码不可见
hideQrCode() hideQrCode()
// 初始按钮文字为"生成二维码"
// 页面加载时查询推荐码状态 binding.btnRegenerate.text = getString(R.string.generate_invite_code)
queryRecommendationCodeStatus()
} }
private fun initListener() { private fun initListener() {
@@ -91,116 +90,30 @@ class InvitationCodeActivity : AppCompatActivity() {
// 撤销邀请按钮 // 撤销邀请按钮
binding.btnCancelInvite.setOnClickListener { binding.btnCancelInvite.setOnClickListener {
cancelInvitation() showPasswordDialog {
cancelInvitation()
}
} }
// 重新生成按钮 // 生成/重新生成按钮
binding.btnRegenerate.setOnClickListener { binding.btnRegenerate.setOnClickListener {
regenerateInvitation() showPasswordDialog {
} generateOrRegenerateInvitation()
}
/**
* 查询推荐码状态
*/
private fun queryRecommendationCodeStatus() {
isLoading = true
CoroutineScope(Dispatchers.IO).launch {
try {
// 注意接口需要传入code参数但我们可能不知道当前的推荐码
// 这里使用空字符串或默认值进行查询
val response = RetrofitNetwork.getNetworkService().selectRecommendationCode("")
withContext(Dispatchers.Main) {
isLoading = false
if (response.code == 200) {
// 有推荐码,解析返回的数据
handleRecommendationCodeResponse(response.data)
} else {
// 没有推荐码或查询失败生成默认24小时的推荐码
generateDefaultRecommendationCode()
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
isLoading = false
// 网络异常生成默认24小时的推荐码
generateDefaultRecommendationCode()
}
} }
} }
} }
/** /**
* 处理推荐码查询响应 * 生成或重新生成邀请码
*/ */
private fun handleRecommendationCodeResponse(data: Any?) { private fun generateOrRegenerateInvitation() {
// 解析返回的数据,获取推荐码和过期时间 // 根据当前选择的时效生成邀请码
// 这里需要根据实际接口返回格式进行解析
if (data is Map<*, *>) {
generatedInviteCode = data["code"]?.toString() ?: ""
expireTimestamp = data["expireTime"]?.toString()?.toLongOrNull() ?: 0L
// 检查推荐码是否过期
if (expireTimestamp > 0 && System.currentTimeMillis() < expireTimestamp) {
// 推荐码有效,显示二维码
qrCodeContent = "{\"type\":\"invite\",\"code\":\"$generatedInviteCode\",\"expire\":$expireTimestamp}"
showQrCode()
generateQRCode()
// 根据过期时间设置显示的时效
val remainingTime = expireTimestamp - System.currentTimeMillis()
if (remainingTime > EXPIRE_24H) {
// 超过24小时认为是7天的
expireTimeInMillis = EXPIRE_7D
selectedExpireOption = 1
binding.tvExpireTime.text = getString(R.string.expire_7d)
} else {
expireTimeInMillis = EXPIRE_24H
selectedExpireOption = 0
binding.tvExpireTime.text = getString(R.string.expire_24h)
}
} else {
// 推荐码已过期生成新的默认24小时推荐码
generateDefaultRecommendationCode()
}
} else {
// 数据格式不对,生成新的推荐码
generateDefaultRecommendationCode()
}
}
/**
* 生成默认24小时的推荐码
*/
private fun generateDefaultRecommendationCode() {
expireTimeInMillis = EXPIRE_24H
selectedExpireOption = 0
binding.tvExpireTime.text = getString(R.string.expire_24h)
// 生成推荐码本地生成实际应该调用API
generateQRCode() generateQRCode()
showQrCode() showQrCode()
} // 更新按钮文字为"重新生成"
binding.btnRegenerate.text = getString(R.string.regenerate)
/** hasGeneratedQrCode = true
* 处理生成推荐码成功 ToastUtils.showSuccess(this, getString(R.string.operation_success))
*/
private fun handleGenerateSuccess(data: Any?, expireDays: Int) {
// 解析返回的数据
if (data is Map<*, *>) {
generatedInviteCode = data["code"]?.toString() ?: ""
expireTimestamp = data["expireTime"]?.toString()?.toLongOrNull() ?: (System.currentTimeMillis() + expireTimeInMillis)
qrCodeContent = "{\"type\":\"invite\",\"code\":\"$generatedInviteCode\",\"expire\":$expireTimestamp}"
showQrCode()
generateQRCode()
} else {
// 如果接口没有返回推荐码,本地生成一个
generateInviteCode()
showQrCode()
generateQRCode()
}
} }
private fun showExpireTimeDialog() { private fun showExpireTimeDialog() {
@@ -260,7 +173,9 @@ class InvitationCodeActivity : AppCompatActivity() {
} }
private fun generateQRCode() { private fun generateQRCode() {
val content = if (qrCodeContent.isNotEmpty()) qrCodeContent else generateInviteCode() // 检查二维码是否过期,如果过期则生成新的邀请码
val isExpired = expireTimestamp > 0 && System.currentTimeMillis() > expireTimestamp
val content = if (qrCodeContent.isNotEmpty() && !isExpired) qrCodeContent else generateInviteCode()
val qrBitmap = createQRCodeWithLogo(content, 400, 400) val qrBitmap = createQRCodeWithLogo(content, 400, 400)
binding.ivQrCode.setImageBitmap(qrBitmap) binding.ivQrCode.setImageBitmap(qrBitmap)
} }
@@ -275,7 +190,13 @@ class InvitationCodeActivity : AppCompatActivity() {
android.util.Log.d("InvitationCode", "推荐码: $generatedInviteCode, 过期时间戳: $expireTimestamp") android.util.Log.d("InvitationCode", "推荐码: $generatedInviteCode, 过期时间戳: $expireTimestamp")
return qrCodeContent return qrCodeContent
} }
/*
* 这段代码生成带Logo的二维码
1. 使用ZXing库编码内容生成二维码矩阵
2. 遍历矩阵绘制黑白像素点
3. 在中心位置叠加应用Logo图标
4. 返回合成的Bitmap失败返回null
*/
private fun createQRCodeWithLogo(content: String, width: Int, height: Int): Bitmap? { private fun createQRCodeWithLogo(content: String, width: Int, height: Int): Bitmap? {
return try { return try {
val hints = Hashtable<EncodeHintType, Any>() val hints = Hashtable<EncodeHintType, Any>()
@@ -332,6 +253,13 @@ class InvitationCodeActivity : AppCompatActivity() {
} }
} }
/*
* 这段代码实现了分享到微信的功能:
1. 检查二维码是否过期
2. 生成分享海报图片
3. 保存图片到本地
4. 调用系统分享功能发送图片到微信
* */
private fun shareToWeChat() { private fun shareToWeChat() {
if (expireTimestamp == 0L || System.currentTimeMillis() > expireTimestamp) { if (expireTimestamp == 0L || System.currentTimeMillis() > expireTimestamp) {
ToastUtils.showError(this, getString(R.string.qr_code_expired)) ToastUtils.showError(this, getString(R.string.qr_code_expired))
@@ -352,7 +280,14 @@ class InvitationCodeActivity : AppCompatActivity() {
shareImage(imagePath) shareImage(imagePath)
} }
/*
这段代码生成分享海报图片:
1. 创建背景画布
2. 生成并绘制二维码到指定位置
3. 根据过期时间动态生成提示文字
4. 使用StaticLayout绘制多行文本居中对齐
5. 返回合成的Bitmap图片
*/
private fun generateSharePoster(): Bitmap? { private fun generateSharePoster(): Bitmap? {
return try { return try {
val posterBackground = ContextCompat.getDrawable(this, R.drawable.share_poster_empty) val posterBackground = ContextCompat.getDrawable(this, R.drawable.share_poster_empty)
@@ -387,28 +322,25 @@ class InvitationCodeActivity : AppCompatActivity() {
color = Color.parseColor("#0475F3") color = Color.parseColor("#0475F3")
textSize = 36f textSize = 36f
isAntiAlias = true isAntiAlias = true
textAlign = Paint.Align.CENTER
isFakeBoldText = false isFakeBoldText = false
} }
val horizontalPadding = (width * 0.12f).toInt() val horizontalPadding = (width * 0.20f).toInt()
val textWidth = width - horizontalPadding * 2 - (width * 0.08f).toInt() val textWidth = width - horizontalPadding * 2
val staticLayout = android.text.StaticLayout.Builder.obtain( val staticLayout = android.text.StaticLayout.Builder.obtain(
tipsText, 0, tipsText.length, tipsPaint, textWidth tipsText, 0, tipsText.length, tipsPaint, textWidth
) )
.setAlignment(android.text.Layout.Alignment.ALIGN_CENTER) .setAlignment(android.text.Layout.Alignment.ALIGN_NORMAL)
.setLineSpacing(0f, 1.4f) .setLineSpacing(0f, 1f)
.build() .build()
val qrBottom = qrY + qrSize val qrBottom = qrY + qrSize
val marginBelowQr = (height * 0.04f).toInt() val marginBelowQr = (height * 0.03f).toInt()
val textY = qrBottom + marginBelowQr val textY = qrBottom + marginBelowQr
val rightOffset = (width * 0.35f).toInt()
canvas.save() canvas.save()
canvas.translate((horizontalPadding + rightOffset).toFloat(), textY.toFloat()) canvas.translate(horizontalPadding.toFloat(), textY.toFloat())
staticLayout.draw(canvas) staticLayout.draw(canvas)
canvas.restore() canvas.restore()
@@ -418,7 +350,13 @@ class InvitationCodeActivity : AppCompatActivity() {
null null
} }
} }
/*
* 这段代码将Bitmap保存到文件
* 1. 获取应用外部图片存储目录
* 2. 创建以时间戳命名的PNG文件
* 3. 压缩并写入图片数据
* 4. 返回文件绝对路径,失败返回空字符串
*/
private fun saveBitmapToFile(bitmap: Bitmap): String { private fun saveBitmapToFile(bitmap: Bitmap): String {
return try { return try {
val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
@@ -435,7 +373,14 @@ class InvitationCodeActivity : AppCompatActivity() {
"" ""
} }
} }
/*
* 这段代码实现图片分享功能:
1. 检查图片文件是否存在
2. 通过FileProvider生成Content URI
3. 构建分享Intent设置图片和文本
4. 授予目标应用读取权限
5. 启动系统分享选择器
* */
private fun shareImage(imagePath: String) { private fun shareImage(imagePath: String) {
val file = File(imagePath) val file = File(imagePath)
if (!file.exists()) { if (!file.exists()) {
@@ -476,18 +421,48 @@ class InvitationCodeActivity : AppCompatActivity() {
generatedInviteCode = "" generatedInviteCode = ""
qrCodeContent = "" qrCodeContent = ""
expireTimestamp = 0 expireTimestamp = 0
hasGeneratedQrCode = false
// 恢复按钮文字为"生成邀请码"
binding.btnRegenerate.text = getString(R.string.generate_invite_code)
// 显示提示 // 显示提示
ToastUtils.showSuccess(this, getString(R.string.operation_success)) ToastUtils.showSuccess(this, getString(R.string.operation_success))
} }
/** /**
* 重新生成邀请码 * 显示密码输入对话框
* @param onSuccess 验证成功后的回调
*/ */
private fun regenerateInvitation() { private fun showPasswordDialog(onSuccess: () -> Unit) {
// 根据当前选择的时效重新生成邀请码 val dialog = PasswordInputDialog(this)
generateQRCode() dialog.setTitle(getString(R.string.input_op_pwd))
showQrCode() dialog.setOnConfirmListener { password ->
ToastUtils.showSuccess(this, getString(R.string.operation_success)) verifyPassword(password, dialog, onSuccess)
}
dialog.show()
}
/**
* 验证操作密码
*/
private fun verifyPassword(password: String, dialog: PasswordInputDialog, onSuccess: () -> Unit) {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(password))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dialog.dismiss()
onSuccess.invoke()
} else {
dialog.showError(getString(R.string.password_error))
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
dialog.showError(getString(R.string.network_error))
}
}
}
} }
override fun onDestroy() { override fun onDestroy() {

View File

@@ -1,24 +1,20 @@
package com.example.defenseapplication.personal package com.example.defenseapplication.personal
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.Toast import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import bean.LoginRequest import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.bean.UpdatePassword
import com.example.defenseapplication.bean.UserInfoBean
import com.example.defenseapplication.databinding.LoginPasswordActivityBinding import com.example.defenseapplication.databinding.LoginPasswordActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.databinding.PasswordManagementActivityBinding
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
//登录密码修改 //登录密码
class LoginPasswordActivity : AppCompatActivity() { class LoginPasswordActivity : AppCompatActivity() {
private lateinit var binding: LoginPasswordActivityBinding
private lateinit var binding: LoginPasswordActivityBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = LoginPasswordActivityBinding.inflate(layoutInflater) binding = LoginPasswordActivityBinding.inflate(layoutInflater)
@@ -33,44 +29,13 @@ class LoginPasswordActivity : AppCompatActivity() {
finish() finish()
} }
binding.btnConfirm.setOnClickListener { binding.changePassword.setOnClickListener {
val oldPassword = binding.etOldPassword.text.toString().trim() startActivity(Intent(this, ChangePasswordActivity::class.java))
val newPassword = binding.etNewPassword.text.toString().trim() }
val confirmPassword = binding.etConfirmPassword.text.toString().trim() binding.retrievePassword.setOnClickListener {
startActivity(Intent(this, RetrievePasswordActivity::class.java))
if (oldPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_old_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_new_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword != confirmPassword) {
Toast.makeText(this, getString(R.string.password_not_match), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
CoroutineScope(Dispatchers.IO).launch {
try {
val result = RetrofitNetwork.getNetworkService().updatePassword(UpdatePassword(oldPassword, newPassword))
withContext(Dispatchers.Main) {
if (result.code == 200) {
Toast.makeText(this@LoginPasswordActivity, getString(R.string.password_reset_success), Toast.LENGTH_SHORT).show()
finish()
} else {
Toast.makeText(this@LoginPasswordActivity, result.msg ?: getString(R.string.password_reset_failed), Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@LoginPasswordActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
}
}
}
} }
} }
} }

View File

@@ -1,15 +1,16 @@
package com.example.defenseapplication.personal package com.example.defenseapplication.personal
import android.os.Bundle import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.SPUtils
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.bean.UpdateUserInfo import com.example.defenseapplication.bean.UpdateUserInfo
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.databinding.OperationPasswordActivityBinding import com.example.defenseapplication.databinding.OperationPasswordActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.view.CustomDialogFragment
import com.example.defenseapplication.view.LoadingDialog
import com.example.defenseapplication.view.showDefenseDialog
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -20,6 +21,7 @@ import kotlinx.coroutines.withContext
class OperationPasswordActivity : AppCompatActivity() { class OperationPasswordActivity : AppCompatActivity() {
private lateinit var binding: OperationPasswordActivityBinding private lateinit var binding: OperationPasswordActivityBinding
private var isLoading = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -31,6 +33,7 @@ class OperationPasswordActivity : AppCompatActivity() {
.titleBar(binding.topBar) .titleBar(binding.topBar)
.init() .init()
getUserInfo()
initListener() initListener()
} }
@@ -39,104 +42,151 @@ class OperationPasswordActivity : AppCompatActivity() {
finish() finish()
} }
binding.swOperationPassword.setOnCheckedChangeListener { _, isChecked -> binding.changePassword.setOnClickListener {
when (isChecked) { showOldPasswordDialog()
true -> {
binding.etPassword.isEnabled = true
binding.etConfirmPassword.isEnabled = true
Toast.makeText(this, getString(R.string.operation_password_enabled), Toast.LENGTH_SHORT).show()
}
false -> {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().updateUserInfo(UpdateUserInfo(optionPassword = ""))
withContext(Dispatchers.Main) {
if (response.code == 200) {
binding.etPassword.isEnabled = false
binding.etConfirmPassword.isEnabled = false
SPUtils.getInstance().remove("operation_password")
Toast.makeText(this@OperationPasswordActivity, getString(R.string.operation_password_disabled), Toast.LENGTH_SHORT).show()
finish()
} else {
binding.swOperationPassword.isChecked = true
Toast.makeText(this@OperationPasswordActivity, response.msg ?: "操作失败", Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
binding.swOperationPassword.isChecked = true
Toast.makeText(this@OperationPasswordActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
}
}
}
}
}
} }
binding.etPassword.addTextChangedListener(object : TextWatcher { binding.swOperationPassword.setOnCheckedChangeListener { _, isChecked ->
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} if (!isLoading) {
updateOptionStatus(isChecked)
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
} }
}) }
}
binding.etConfirmPassword.addTextChangedListener(object : TextWatcher { private fun getUserInfo() {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} isLoading = true
CoroutineScope(Dispatchers.IO).launch {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} try {
val response = RetrofitNetwork.getNetworkService().getUserInfo()
override fun afterTextChanged(s: Editable?) { withContext(Dispatchers.Main) {
} isLoading = false
}) if (response.code == 200) {
response.data?.optionStatus?.let { status ->
binding.btnConfirmReset.setOnClickListener { binding.swOperationPassword.isChecked = status == "0"
val password = binding.etPassword.text.toString()
val confirmPassword = binding.etConfirmPassword.text.toString()
if (password.isEmpty()) {
Toast.makeText(this, getString(R.string.password_cannot_empty), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (password.length != 6) {
Toast.makeText(this, getString(R.string.password_must_be_6_digits), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (confirmPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.please_confirm_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (password != confirmPassword) {
Toast.makeText(this, getString(R.string.password_mismatch), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
binding.btnConfirmReset.isEnabled = false
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().updateUserInfo(UpdateUserInfo(optionPassword = password))
withContext(Dispatchers.Main) {
binding.btnConfirmReset.isEnabled = true
if (response.code == 200) {
SPUtils.getInstance().put("operation_password", password)
Toast.makeText(this@OperationPasswordActivity, getString(R.string.operation_success), Toast.LENGTH_SHORT).show()
finish()
} else {
Toast.makeText(this@OperationPasswordActivity, response.msg ?: "操作失败", Toast.LENGTH_SHORT).show()
} }
} else {
Toast.makeText(this@OperationPasswordActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
} }
} catch (e: Exception) { }
withContext(Dispatchers.Main) { } catch (e: Exception) {
binding.btnConfirmReset.isEnabled = true withContext(Dispatchers.Main) {
Toast.makeText(this@OperationPasswordActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show() isLoading = false
} Toast.makeText(this@OperationPasswordActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
} }
} }
} }
} }
private fun updateOptionStatus(isChecked: Boolean) {
isLoading = true
val status = if (isChecked) "0" else "1"
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.updateUserInfo(UpdateUserInfo(optionStatus = status))
withContext(Dispatchers.Main) {
isLoading = false
if (response.code != 200) {
binding.swOperationPassword.isChecked = !isChecked
Toast.makeText(this@OperationPasswordActivity, R.string.update_failed, Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
isLoading = false
binding.swOperationPassword.isChecked = !isChecked
Toast.makeText(this@OperationPasswordActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
}
}
}
}
private fun showOldPasswordDialog() {
val dialog = PasswordInputDialog(this)
dialog.setTitle(getString(R.string.input_op_pwd))
dialog.setOnConfirmListener { password ->
verifyOldPassword(password, dialog)
}
dialog.show()
}
private fun verifyOldPassword(password: String, dialog: PasswordInputDialog) {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(password))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dialog.dismiss()
showNewPasswordDialog()
} else {
dialog.showError(getString(R.string.password_error))
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
dialog.showError(getString(R.string.network_error))
}
}
}
}
private fun showNewPasswordDialog() {
val dialog = PasswordInputDialog(this)
dialog.setTitle(getString(R.string.input_new_op_pwd))
dialog.setOnConfirmListener { newPassword ->
updatePassword(newPassword, dialog)
}
dialog.show()
}
private fun updatePassword(newPassword: String, dialog: PasswordInputDialog) {
dialog.dismiss()
val loadingDialog = LoadingDialog(this)
loadingDialog.show()
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.updateUserInfo(UpdateUserInfo(optionPassword = newPassword))
withContext(Dispatchers.Main) {
loadingDialog.dismiss()
if (response.code == 200) {
Toast.makeText(
this@OperationPasswordActivity,
R.string.password_update_success,
Toast.LENGTH_SHORT
).show()
finish()
} else {
Toast.makeText(
this@OperationPasswordActivity,
R.string.password_update_failed,
Toast.LENGTH_SHORT
).show()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
loadingDialog.dismiss()
Toast.makeText(
this@OperationPasswordActivity,
R.string.network_error,
Toast.LENGTH_SHORT
).show()
}
}
}
}
private fun showSuccessDialog() {
val config = CustomDialogFragment.Config(
title = getString(R.string.tip),
message = getString(R.string.password_update_success),
positiveText = getString(R.string.confirm),
negativeText = null
)
showDefenseDialog(config, onPositiveClick = {
finish()
})
}
} }

View File

@@ -2,23 +2,13 @@ package com.example.defenseapplication.personal
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.R
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.databinding.PasswordManagementActivityBinding import com.example.defenseapplication.databinding.PasswordManagementActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
//密码管理 //密码管理
class PasswordManagementActivity : AppCompatActivity() { class PasswordManagementActivity : AppCompatActivity() {
private lateinit var binding: PasswordManagementActivityBinding private lateinit var binding: PasswordManagementActivityBinding
private lateinit var passwordDialog: PasswordInputDialog
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = PasswordManagementActivityBinding.inflate(layoutInflater) binding = PasswordManagementActivityBinding.inflate(layoutInflater)
@@ -37,51 +27,9 @@ class PasswordManagementActivity : AppCompatActivity() {
startActivity(Intent(this, LoginPasswordActivity::class.java)) startActivity(Intent(this, LoginPasswordActivity::class.java))
} }
binding.retrievePassword.setOnClickListener {
startActivity(Intent(this, RetrievePasswordActivity::class.java))
}
binding.operationPassword.setOnClickListener { binding.operationPassword.setOnClickListener {
showPasswordDialog() startActivity(Intent(this, OperationPasswordActivity::class.java))
} }
} }
private fun showPasswordDialog() {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().verifyOptionPassword(VerifyOptionPasswordRequest(inputPassword))
withContext(Dispatchers.Main) {
if (response.code == 200) {
startActivity(Intent(this@PasswordManagementActivity, OperationPasswordActivity::class.java))
dismiss()
} else {
Toast.makeText(this@PasswordManagementActivity, response.msg ?: "校验失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@PasswordManagementActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
}
}
setOnDismissListener {
// Dialog dismissed
}
}
passwordDialog.show()
}
override fun onDestroy() {
if (::passwordDialog.isInitialized) {
passwordDialog.dismiss()
}
super.onDestroy()
}
} }

View File

@@ -1,13 +1,23 @@
package com.example.defenseapplication.personal package com.example.defenseapplication.personal
import android.Manifest
import android.content.ContentResolver
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import android.widget.Toast
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.example.defenseapplication.R import com.example.defenseapplication.R
@@ -15,18 +25,93 @@ import com.example.defenseapplication.bean.UpdateUserInfo
import com.example.defenseapplication.bean.UserInfoBean import com.example.defenseapplication.bean.UserInfoBean
import com.example.defenseapplication.databinding.PersonalProfileActivityBinding import com.example.defenseapplication.databinding.PersonalProfileActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.view.AvatarSelectDialog
import com.example.defenseapplication.view.CustomDialogFragmentText import com.example.defenseapplication.view.CustomDialogFragmentText
import com.example.defenseapplication.view.LoadingDialog
import com.example.defenseapplication.view.PhoneModifyDialogFragment import com.example.defenseapplication.view.PhoneModifyDialogFragment
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
//个人资料 import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.RequestBody.Companion.asRequestBody
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
//个人资料页面
class PersonalProfileActivity : AppCompatActivity() { class PersonalProfileActivity : AppCompatActivity() {
private lateinit var binding: PersonalProfileActivityBinding private lateinit var binding: PersonalProfileActivityBinding
private var userInfo: UserInfoBean? = null private var userInfo: UserInfoBean? = null
// 拍照返回的文件
private var photoFile: File? = null
// 加载弹窗
private lateinit var loadingDialog: LoadingDialog
// 请求权限回调
private val requestPermissionsLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
val cameraGranted = permissions[Manifest.permission.CAMERA] ?: false
val storageGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissions[Manifest.permission.READ_MEDIA_IMAGES] ?: false
} else {
permissions[Manifest.permission.READ_EXTERNAL_STORAGE] ?: false
}
val writeStorageGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
true
} else {
permissions[Manifest.permission.WRITE_EXTERNAL_STORAGE] ?: false
}
if (!cameraGranted) {
Toast.makeText(this, getString(R.string.camera_permission_denied), Toast.LENGTH_SHORT).show()
}
if (!storageGranted) {
Toast.makeText(this, getString(R.string.storage_permission_denied), Toast.LENGTH_SHORT).show()
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && !writeStorageGranted) {
Toast.makeText(this, getString(R.string.write_storage_permission_denied), Toast.LENGTH_SHORT).show()
}
}
// 拍照结果回调
private val takePhotoLauncher = registerForActivityResult(
ActivityResultContracts.TakePicture()
) { success ->
if (success && photoFile != null) {
Log.d("PersonalProfile", "拍照成功,文件路径: ${photoFile?.absolutePath}")
uploadAvatar(photoFile!!.absolutePath)
} else {
Toast.makeText(this, getString(R.string.take_photo_failed), Toast.LENGTH_SHORT).show()
}
}
// 相册选择结果回调
private val selectAlbumLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK && result.data != null) {
val uri = result.data?.data
uri?.let {
val filePath = getFilePathFromUri(it)
if (filePath != null) {
Log.d("PersonalProfile", "相册选择成功,文件路径: $filePath")
uploadAvatar(filePath)
} else {
Toast.makeText(this, getString(R.string.get_file_failed), Toast.LENGTH_SHORT).show()
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = PersonalProfileActivityBinding.inflate(layoutInflater) binding = PersonalProfileActivityBinding.inflate(layoutInflater)
@@ -35,8 +120,12 @@ class PersonalProfileActivity : AppCompatActivity() {
.statusBarDarkFont(true) .statusBarDarkFont(true)
.titleBar(binding.topBar) .titleBar(binding.topBar)
.init() .init()
// 初始化加载弹窗
loadingDialog = LoadingDialog(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
userInfo = intent.getParcelableExtra("userInfo", UserInfoBean::class.java) userInfo = intent.getParcelableExtra("userInfo", UserInfoBean::class.java)
} else {
userInfo = intent.getParcelableExtra("userInfo")
} }
initView() initView()
} }
@@ -49,11 +138,11 @@ class PersonalProfileActivity : AppCompatActivity() {
userInfo?.let { info -> userInfo?.let { info ->
Log.d("头像", "头像 URL = ${info.avatar}") Log.d("头像", "头像 URL = ${info.avatar}")
val requestOptions = RequestOptions() val requestOptions = RequestOptions()
.placeholder(R.drawable.img) // 加载中显示 .placeholder(R.drawable.img)
.error(R.drawable.img) // 失败时显示 .error(R.drawable.img)
Glide.with(this) Glide.with(this)
.load(info.avatar) // 如果 avatar 为 nullGlide 会直接回调 error .load(info.avatar)
.apply(requestOptions) .apply(requestOptions)
.circleCrop() .circleCrop()
.into(binding.ivAvatar) .into(binding.ivAvatar)
@@ -61,6 +150,10 @@ class PersonalProfileActivity : AppCompatActivity() {
binding.tvPhone.text = info.phonenumber ?: "" binding.tvPhone.text = info.phonenumber ?: ""
} }
binding.ivAvatar.setOnClickListener {
showAvatarSelectDialog()
}
binding.itemNickname.setOnClickListener { binding.itemNickname.setOnClickListener {
showNicknameDialog() showNicknameDialog()
} }
@@ -151,4 +244,204 @@ class PersonalProfileActivity : AppCompatActivity() {
} }
} }
} }
}
private fun showAvatarSelectDialog() {
AvatarSelectDialog(this)
.setOnTakePhotoListener {
checkCameraPermission { granted ->
if (granted) {
takePhoto()
}
}
}
.setOnSelectAlbumListener {
checkStoragePermission { granted ->
if (granted) {
selectAlbum()
}
}
}
.show()
}
/**
* 检查相机权限
*/
private fun checkCameraPermission(callback: (Boolean) -> Unit) {
val permissions = mutableListOf(Manifest.permission.CAMERA)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
val allGranted = permissions.all {
ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
}
if (allGranted) {
callback(true)
} else {
requestPermissionsLauncher.launch(permissions.toTypedArray())
callback(false)
}
}
/**
* 检查存储权限
*/
private fun checkStoragePermission(callback: (Boolean) -> Unit) {
val permission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
Manifest.permission.READ_MEDIA_IMAGES
} else {
Manifest.permission.READ_EXTERNAL_STORAGE
}
if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) {
callback(true)
} else {
requestPermissionsLauncher.launch(arrayOf(permission))
callback(false)
}
}
/**
* 调用系统相机拍照
*/
private fun takePhoto() {
try {
photoFile = createImageFile()
val photoUri = FileProvider.getUriForFile(
this,
"$packageName.fileprovider",
photoFile!!
)
takePhotoLauncher.launch(photoUri)
} catch (e: IOException) {
e.printStackTrace()
Toast.makeText(this, getString(R.string.create_file_failed), Toast.LENGTH_SHORT).show()
}
}
/**
* 创建图片文件
*/
@Throws(IOException::class)
private fun createImageFile(): File {
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"JPEG_${timeStamp}_",
".jpg",
storageDir
).apply {
Log.d("PersonalProfile", "创建图片文件: $absolutePath")
}
}
/**
* 调用系统相册选择图片
*/
private fun selectAlbum() {
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
intent.type = "image/*"
selectAlbumLauncher.launch(intent)
}
/**
* 从 Uri 获取文件路径
*/
private fun getFilePathFromUri(uri: Uri): String? {
val contentResolver: ContentResolver = contentResolver
val inputStream: InputStream? = contentResolver.openInputStream(uri)
inputStream?.use {
try {
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
val file = File(storageDir, "JPEG_${timeStamp}_temp.jpg")
FileOutputStream(file).use { outputStream ->
val buffer = ByteArray(1024)
var bytesRead: Int
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
outputStream.write(buffer, 0, bytesRead)
}
}
return file.absolutePath
} catch (e: IOException) {
e.printStackTrace()
return null
}
}
return null
}
/**
* 上传头像到服务器并更新个人信息
*/
private fun uploadAvatar(filePath: String) {
// 显示加载弹窗
loadingDialog.show()
CoroutineScope(Dispatchers.IO).launch {
try {
val file = File(filePath)
val requestBody = file.asRequestBody("image/jpeg".toMediaTypeOrNull())
val part = MultipartBody.Part.createFormData("file", file.name, requestBody)
val uploadResponse = RetrofitNetwork.getNetworkService().uploadFile(part)
withContext(Dispatchers.Main) {
if (uploadResponse.code == 200 && uploadResponse.data?.url != null) {
Log.d("PersonalProfile", "文件上传成功URL: ${uploadResponse.data?.url}")
updateAvatar(uploadResponse.data!!.url)
} else {
loadingDialog.dismiss()
Toast.makeText(this@PersonalProfileActivity, getString(R.string.upload_failed), Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
loadingDialog.dismiss()
Toast.makeText(this@PersonalProfileActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
}
}
}
}
/**
* 调用修改个人信息接口更新头像
*/
private fun updateAvatar(avatarUrl: String) {
CoroutineScope(Dispatchers.IO).launch {
try {
val request = UpdateUserInfo(
userId = userInfo?.userId,
avatar = avatarUrl
)
val response = RetrofitNetwork.getNetworkService().updateUserInfo(request)
withContext(Dispatchers.Main) {
loadingDialog.dismiss()
if (response.code == 200) {
Glide.with(this@PersonalProfileActivity)
.load(avatarUrl)
.apply(RequestOptions()
.placeholder(R.drawable.img)
.error(R.drawable.img))
.circleCrop()
.into(binding.ivAvatar)
userInfo = userInfo?.copy(avatar = avatarUrl)
Toast.makeText(this@PersonalProfileActivity, getString(R.string.operation_success), Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@PersonalProfileActivity, getString(R.string.operation_failed), Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
loadingDialog.dismiss()
Toast.makeText(this@PersonalProfileActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
}
}
}
}
}

View File

@@ -162,11 +162,10 @@ object ApiConfig {
fun createHeadersInterceptor() = Interceptor { chain -> fun createHeadersInterceptor() = Interceptor { chain ->
val requestBuilder = chain.request().newBuilder() val requestBuilder = chain.request().newBuilder()
val token = authToken val token = authToken
val langHeader = LanguageHeaderManager.getLanguageHeaderValue()
// 添加必要的请求头 // 添加必要的请求头
requestBuilder.header("clientid", "428a8310cd442757ae699df5d894f051") requestBuilder.header("clientid", "428a8310cd442757ae699df5d894f051")
requestBuilder.header("content-language", langHeader) requestBuilder.header("content-language", LanguageUtil.getLanguageHeaderValue())
// 如果有 token添加 Authorization 头 // 如果有 token添加 Authorization 头
if (token.isNotBlank()) { if (token.isNotBlank()) {

View File

@@ -1,5 +1,6 @@
package com.example.defenseapplication.utils package com.example.defenseapplication.utils
import android.R
import bean.ForgotRequest import bean.ForgotRequest
import com.example.defenseapplication.bean.DeviceBean import com.example.defenseapplication.bean.DeviceBean
import com.example.defenseapplication.bean.DeviceUserBean import com.example.defenseapplication.bean.DeviceUserBean
@@ -12,17 +13,22 @@ import com.example.defenseapplication.bean.AddDeviceBean
import com.example.defenseapplication.bean.AddDeviceUserRequest import com.example.defenseapplication.bean.AddDeviceUserRequest
import com.example.defenseapplication.bean.DeleteBean import com.example.defenseapplication.bean.DeleteBean
import com.example.defenseapplication.bean.DeleteDeviceUserRequest import com.example.defenseapplication.bean.DeleteDeviceUserRequest
import com.example.defenseapplication.bean.DeviceAlarmResponse
import com.example.defenseapplication.bean.FamilyMembersBean import com.example.defenseapplication.bean.FamilyMembersBean
import com.example.defenseapplication.bean.MessageGroup import com.example.defenseapplication.bean.MessageBean
import com.example.defenseapplication.bean.MessageListResponse
import com.example.defenseapplication.bean.ObtainInviterInformationBean import com.example.defenseapplication.bean.ObtainInviterInformationBean
import com.example.defenseapplication.bean.ObtainInviterInformationRequest import com.example.defenseapplication.bean.ObtainInviterInformationRequest
import com.example.defenseapplication.bean.SwitchFamilyRequest import com.example.defenseapplication.bean.SwitchFamilyRequest
import com.example.defenseapplication.bean.UpdatePassword import com.example.defenseapplication.bean.UpdatePassword
import com.example.defenseapplication.bean.UpdateUserInfo import com.example.defenseapplication.bean.UpdateUserInfo
import com.example.defenseapplication.bean.UploadResponse
import com.example.defenseapplication.bean.UserInfoBean import com.example.defenseapplication.bean.UserInfoBean
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import okhttp3.MultipartBody
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Multipart
import retrofit2.http.POST import retrofit2.http.POST
import retrofit2.http.PUT import retrofit2.http.PUT
import retrofit2.http.Query import retrofit2.http.Query
@@ -72,7 +78,10 @@ interface ApiService {
* 查看消息列表 * 查看消息列表
*/ */
@GET("/app/appMessage/list") @GET("/app/appMessage/list")
suspend fun getMessage(): GetCodeBean<List<MessageGroup>> suspend fun getMessage(
@Query("pageNum") pageNum: Int = 1,
@Query("pageSize") pageSize: Int = 10
): MessageListResponse
/** /**
@@ -206,6 +215,30 @@ interface ApiService {
@POST("/app/revokeInvitation") @POST("/app/revokeInvitation")
suspend fun revokeInvitation(@Body request: VerifyOptionPasswordRequest): GetCodeBean<Any> suspend fun revokeInvitation(@Body request: VerifyOptionPasswordRequest): GetCodeBean<Any>
/**
* 上传文件接口
*/
@Multipart
@POST("/app/upload")
suspend fun uploadFile(@retrofit2.http.Part file: MultipartBody.Part): UploadResponse
/**
* 设备告警日志
*/
@GET("/app/appMessage/deviceMeslist")
suspend fun getDeviceAlarmList(
@Query("deviceId") deviceId: String,
@Query("pageNum") pageNum: String="1",
@Query("pageSize") pageSize: String="10",
): DeviceAlarmResponse
/**
* 查看告警消息
*/
//@GET("/app/appMessageInfo/{id}")
//suspend fun getMessageInfo(@retrofit2.http.Path("id") id: String): GetCodeBean<MessageBean>
/** /**
* 修改家庭用户状态 * 修改家庭用户状态

View File

@@ -1,37 +1,13 @@
package com.example.defenseapplication.utils package com.example.defenseapplication.utils
import android.content.Context import android.content.Context
import androidx.core.content.edit
enum class AppLanguage(val code: String) {
ENGLISH("en_US"),
SIMPLIFIED_CHINESE("zh_CN"),
TRADITIONAL_CHINESE("zh_TW")
}
/**
* HTTP 请求头的语言值管理,统一由 LanguageUtil 提供
* @deprecated Use LanguageUtil.getLanguageHeaderValue() directly
*/
object LanguageHeaderManager { object LanguageHeaderManager {
private const val PREF_NAME = "app_lang_pref"
private const val KEY_LANGUAGE = "selected_language"
private var currentLanguage: AppLanguage = AppLanguage.ENGLISH @Deprecated("Use LanguageUtil.getLanguageHeaderValue() instead", ReplaceWith("LanguageUtil.getLanguageHeaderValue()"))
fun getLanguageHeaderValue(): String = LanguageUtil.getLanguageHeaderValue()
fun init(context: Context) {
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
val langCode = prefs.getString(KEY_LANGUAGE, AppLanguage.ENGLISH.code)
currentLanguage = AppLanguage.values().find { it.code == langCode } ?: AppLanguage.ENGLISH
}
fun getCurrentLanguage(): AppLanguage = currentLanguage
fun switchLanguage(context: Context, language: AppLanguage) {
currentLanguage = language
// 持久化
context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE).edit {
putString(KEY_LANGUAGE, language.code)
apply()
}
// 可选:更新应用 Locale、重启 Activity 等
}
fun getLanguageHeaderValue(): String = currentLanguage.code
} }

View File

@@ -3,77 +3,128 @@ package com.example.defenseapplication.utils
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.res.Configuration import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build import android.os.Build
import android.os.LocaleList import android.os.LocaleList
import java.util.Locale import java.util.Locale
enum class AppLanguage(val code: String, val locale: Locale) {
ENGLISH("en_US", Locale.US),
SIMPLIFIED_CHINESE("zh_CN", Locale.SIMPLIFIED_CHINESE);
companion object {
fun fromCode(code: String): AppLanguage {
return values().find { it.code == code } ?: SIMPLIFIED_CHINESE
}
}
}
object LanguageUtil { object LanguageUtil {
private const val PREF_NAME = "language_pref" private const val PREF_NAME = "language_pref"
private const val KEY_LANGUAGE = "selected_language" private const val KEY_LANGUAGE = "selected_language"
const val LANGUAGE_CHINESE = "zh" @JvmStatic
const val LANGUAGE_ENGLISH = "en" var currentLanguage: AppLanguage = AppLanguage.SIMPLIFIED_CHINESE
private set
/** /**
* 切换语言 * 初始化语言,从持久化中恢复
* @param context 上下文 */
* @param language 语言代码: "zh" 中文, "en" 英文 fun init(context: Context) {
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
var code = prefs.getString(KEY_LANGUAGE, null)
if (code == null) {
// 兼容旧数据:尝试从 app_lang_pref 读取LanguageHeaderManager 旧存储路径)
val oldPrefs = context.getSharedPreferences("app_lang_pref", Context.MODE_PRIVATE)
code = oldPrefs.getString("selected_language", AppLanguage.SIMPLIFIED_CHINESE.code)
?: AppLanguage.SIMPLIFIED_CHINESE.code
// 迁移到新存储路径
prefs.edit().putString(KEY_LANGUAGE, code).apply()
}
currentLanguage = AppLanguage.fromCode(code)
}
/**
* 切换语言,同时更新 app locale 和 HTTP header
* @param language AppLanguage.ENGLISH 或 AppLanguage.SIMPLIFIED_CHINESE
*/
fun switchLanguage(context: Context, language: AppLanguage) {
currentLanguage = language
saveLanguage(context, language.code)
}
/**
* 兼容旧代码:使用字符串 "zh" / "en" 切换
*/ */
fun switchLanguage(context: Context, language: String) { fun switchLanguage(context: Context, language: String) {
saveLanguage(context, language) val appLang = when (language) {
"zh" -> AppLanguage.SIMPLIFIED_CHINESE
else -> AppLanguage.ENGLISH
}
switchLanguage(context, appLang)
} }
/** /**
* 获取当前设置的语言 * 获取当前设置的语言代码 "zh" / "en"
*/ */
fun getCurrentLanguage(context: Context): String { fun getCurrentLanguage(context: Context): String {
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) return currentLanguage.name.lowercase().let {
return prefs.getString(KEY_LANGUAGE, LANGUAGE_CHINESE) ?: LANGUAGE_CHINESE if (it.contains("chinese")) "zh" else "en"
}
} }
/**
* 获取 HTTP header 的语言值 "en_US" / "zh_CN"
*/
fun getLanguageHeaderValue(): String = currentLanguage.code
/** /**
* 保存语言设置 * 保存语言设置
*/ */
private fun saveLanguage(context: Context, language: String) { private fun saveLanguage(context: Context, languageCode: String) {
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
prefs.edit().putString(KEY_LANGUAGE, language).apply() prefs.edit().putString(KEY_LANGUAGE, languageCode).apply()
} }
/** /**
* 判断当前是否是中文 * 判断当前是否是中文
*/ */
fun isChinese(context: Context): Boolean { fun isChinese(context: Context): Boolean {
return getCurrentLanguage(context) == LANGUAGE_CHINESE return currentLanguage == AppLanguage.SIMPLIFIED_CHINESE
} }
/** /**
* 获取本地化的 Context用于在应用内切换语言 * 获取本地化的 Context在 attachBaseContext 中调用
* 在 attachBaseContext 中调用
*/ */
fun attachBaseContext(context: Context): Context { fun attachBaseContext(context: Context): Context {
val language = getCurrentLanguage(context) val locale = getSavedLocale(context)
return createLocalizedContext(context, language) return createLocalizedContext(context, locale)
}
/**
* 读取已保存的语言 localeattachBaseContext 中使用,此时 currentLanguage 可能尚未初始化)
*/
private fun getSavedLocale(context: Context): Locale {
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
val code = prefs.getString(KEY_LANGUAGE, AppLanguage.SIMPLIFIED_CHINESE.code)
?: AppLanguage.SIMPLIFIED_CHINESE.code
return AppLanguage.fromCode(code).locale
} }
/** /**
* 创建本地化的 Context * 创建本地化的 Context
*/ */
private fun createLocalizedContext(context: Context, language: String): Context { private fun createLocalizedContext(context: Context, locale: Locale): Context {
val locale = Locale(language)
Locale.setDefault(locale) Locale.setDefault(locale)
val resources = context.resources val resources = context.resources
val configuration = resources.configuration val configuration = resources.configuration
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Android 7.0 及以上
val localeList = LocaleList(locale) val localeList = LocaleList(locale)
configuration.setLocales(localeList) configuration.setLocales(localeList)
context.createConfigurationContext(configuration) context.createConfigurationContext(configuration)
} else { } else {
// Android 7.0 以下
configuration.locale = locale configuration.locale = locale
resources.updateConfiguration(configuration, resources.displayMetrics) resources.updateConfiguration(configuration, resources.displayMetrics)
context context
@@ -84,8 +135,7 @@ object LanguageUtil {
* 更新应用语言(用于在 Activity 中动态切换) * 更新应用语言(用于在 Activity 中动态切换)
*/ */
fun updateResources(context: Context): Context { fun updateResources(context: Context): Context {
val language = getCurrentLanguage(context) val locale = currentLanguage.locale
val locale = Locale(language)
Locale.setDefault(locale) Locale.setDefault(locale)
val resources = context.resources val resources = context.resources
@@ -107,8 +157,8 @@ object LanguageUtil {
*/ */
fun getLanguageDisplayName(language: String): String { fun getLanguageDisplayName(language: String): String {
return when (language) { return when (language) {
LANGUAGE_CHINESE -> "中文" "zh" -> "中文"
LANGUAGE_ENGLISH -> "English" "en" -> "English"
else -> "中文" else -> "中文"
} }
} }

View File

@@ -0,0 +1,67 @@
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.DialogAvatarSelectBinding
class AvatarSelectDialog(context: Context) {
private val dialog: Dialog = Dialog(context)
private val binding: DialogAvatarSelectBinding
private var onTakePhotoListener: (() -> Unit)? = null
private var onSelectAlbumListener: (() -> Unit)? = null
init {
binding = DialogAvatarSelectBinding.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))
setDimAmount(0.5f)
}
initListeners()
}
private fun initListeners() {
binding.itemTakePhoto.setOnClickListener {
onTakePhotoListener?.invoke()
dialog.dismiss()
}
binding.itemSelectAlbum.setOnClickListener {
onSelectAlbumListener?.invoke()
dialog.dismiss()
}
binding.itemCancel.setOnClickListener {
dialog.dismiss()
}
}
fun setOnTakePhotoListener(listener: () -> Unit): AvatarSelectDialog {
this.onTakePhotoListener = listener
return this
}
fun setOnSelectAlbumListener(listener: () -> Unit): AvatarSelectDialog {
this.onSelectAlbumListener = listener
return this
}
fun show() {
dialog.show()
}
fun dismiss() {
dialog.dismiss()
}
}

View File

@@ -1,64 +1,81 @@
package com.example.defenseapplication.view package com.example.defenseapplication.view
import android.content.Context import android.content.Context
import android.graphics.Canvas import android.graphics.*
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import com.google.mlkit.vision.face.Face import com.google.mlkit.vision.face.Face
class FaceOverlayView(context: Context, attrs: AttributeSet?) : View(context, attrs) { class FaceOverlayView @JvmOverloads constructor(
private val framePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val whitePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.WHITE color = Color.WHITE
style = Paint.Style.STROKE
strokeWidth = 6f
}
private val maskPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.parseColor("#7A000000")
style = Paint.Style.FILL style = Paint.Style.FILL
} }
private val facePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { private val clearPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.parseColor("#80FFFFFF") xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
style = Paint.Style.STROKE
strokeWidth = 3f
} }
private val maskPath = Path() private val circlePath = Path()
private val frameRect = RectF() private var centerX = 0f
private var faces = mutableListOf<Face>() private var centerY = 0f
private var radius = 0f
fun setFaces(faces: List<Face>) { // 需要绘制的所有人脸边界框(初始为空)
this.faces = faces.toMutableList() private var faces: List<Face> = emptyList()
invalidate() // 触发 onDraw
// 绘制人脸框的画笔
private val facePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.GREEN
style = Paint.Style.STROKE
strokeWidth = 6f
}
override fun onSizeChanged(w: Int, h: Int, oldW: Int, oldH: Int) {
super.onSizeChanged(w, h, oldW, oldH)
// 计算圆形区域(取屏幕中心,半径为宽高中较小值的一半,留一些边距)
centerX = w / 2f
centerY = h / 2f
radius = minOf(w, h) / 2f * 0.8f
circlePath.reset()
circlePath.addCircle(centerX, centerY, radius, Path.Direction.CW)
} }
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
super.onDraw(canvas) super.onDraw(canvas)
val cx = width / 2f // 1. 绘制白色背景
val cy = height * 0.45f canvas.drawColor(Color.WHITE)
val radius = minOf(width, height) * 0.31f
maskPath.reset() // 2. 裁剪出圆形区域并清除该区域像素(露出下层摄像头预览)
maskPath.addRect(0f, 0f, width.toFloat(), height.toFloat(), Path.Direction.CW) canvas.save()
maskPath.addCircle(cx, cy, radius, Path.Direction.CCW) canvas.clipPath(circlePath)
canvas.drawPath(maskPath, maskPaint) canvas.drawPaint(clearPaint)
canvas.drawCircle(cx, cy, radius, framePaint)
frameRect.set(cx - radius, cy - radius, cx + radius, cy + radius) // 3. 在圆形区域内绘制人脸框(坐标需要转换)
for (face in faces) { for (face in faces) {
val rect = face.boundingBox val rect = face.boundingBox
val clippedLeft = rect.left.coerceAtLeast(frameRect.left.toInt()).toFloat() // 注意rect 的坐标是基于 ImageProxy 中图像的原始尺寸和旋转的,
val clippedTop = rect.top.coerceAtLeast(frameRect.top.toInt()).toFloat() // 需要转换为当前 View 的坐标系。简单示例:直接绘制原始矩形(可能位置偏移较大)
val clippedRight = rect.right.coerceAtMost(frameRect.right.toInt()).toFloat() // 更精确的做法:传入图像宽高和旋转,用 Matrix 映射。
val clippedBottom = rect.bottom.coerceAtMost(frameRect.bottom.toInt()).toFloat() // 这里提供一个基本转换示例(假设预览视图已填充全屏,且无缩放裁剪):
if (clippedRight > clippedLeft && clippedBottom > clippedTop) { canvas.drawRect(rect.left.toFloat(), rect.top.toFloat(),
canvas.drawRect(clippedLeft, clippedTop, clippedRight, clippedBottom, facePaint) rect.right.toFloat(), rect.bottom.toFloat(), facePaint)
}
} }
canvas.restore()
}
/**
* 由 FaceAnalyzer 调用,设置最新检测到的人脸列表
*/
fun setFaces(faces: List<Face>) {
this.faces = faces
invalidate() // 触发重绘
} }
} }

View File

@@ -9,6 +9,7 @@ import android.view.WindowManager
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import com.example.defenseapplication.R import com.example.defenseapplication.R
import com.example.defenseapplication.utils.AppLanguage
import com.example.defenseapplication.utils.LanguageUtil import com.example.defenseapplication.utils.LanguageUtil
/** /**
@@ -16,7 +17,7 @@ import com.example.defenseapplication.utils.LanguageUtil
*/ */
class LanguageDialog( class LanguageDialog(
context: Context, context: Context,
private val onLanguageSelected: (String) -> Unit private val onLanguageSelected: (AppLanguage) -> Unit
) : Dialog(context, R.style.BottomDialogStyle) { ) : Dialog(context, R.style.BottomDialogStyle) {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -43,22 +44,21 @@ class LanguageDialog(
val tvEnglish = findViewById<TextView>(R.id.tvEnglish) val tvEnglish = findViewById<TextView>(R.id.tvEnglish)
val tvCancel = findViewById<TextView>(R.id.tvCancel) val tvCancel = findViewById<TextView>(R.id.tvCancel)
val currentLang = LanguageUtil.getCurrentLanguage(context) val currentLang = LanguageUtil.currentLanguage
// 根据当前语言高亮显示 if (currentLang == AppLanguage.SIMPLIFIED_CHINESE) {
if (currentLang == LanguageUtil.LANGUAGE_CHINESE) {
tvChinese.setTextColor(context.getColor(R.color.green)) tvChinese.setTextColor(context.getColor(R.color.green))
} else { } else {
tvEnglish.setTextColor(context.getColor(R.color.green)) tvEnglish.setTextColor(context.getColor(R.color.green))
} }
llChinese.setOnClickListener { llChinese.setOnClickListener {
onLanguageSelected(LanguageUtil.LANGUAGE_CHINESE) onLanguageSelected(AppLanguage.SIMPLIFIED_CHINESE)
dismiss() dismiss()
} }
llEnglish.setOnClickListener { llEnglish.setOnClickListener {
onLanguageSelected(LanguageUtil.LANGUAGE_ENGLISH) onLanguageSelected(AppLanguage.ENGLISH)
dismiss() dismiss()
} }

View File

@@ -0,0 +1,52 @@
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.WindowManager
import com.example.defenseapplication.databinding.DialogLoadingBinding
class LoadingDialog(context: Context) {
private val dialog: Dialog = Dialog(context)
private val binding: DialogLoadingBinding
init {
binding = DialogLoadingBinding.inflate(LayoutInflater.from(context))
dialog.setContentView(binding.root)
dialog.window?.apply {
setGravity(Gravity.CENTER)
setLayout(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT
)
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
setDimAmount(0.5f)
}
dialog.setCancelable(false)
}
fun setMessage(message: String): LoadingDialog {
binding.tvLoading.text = message
return this
}
fun show() {
if (!dialog.isShowing) {
dialog.show()
}
}
fun dismiss() {
if (dialog.isShowing) {
dialog.dismiss()
}
}
fun isShowing(): Boolean {
return dialog.isShowing
}
}

View File

@@ -22,6 +22,7 @@ class PasswordInputDialog(context: Context) : Dialog(context) {
private lateinit var binding: DialogPasswordInputBinding private lateinit var binding: DialogPasswordInputBinding
private var onConfirmListener: ((String) -> Unit)? = null private var onConfirmListener: ((String) -> Unit)? = null
private var onDismissListener: (() -> Unit)? = null private var onDismissListener: (() -> Unit)? = null
private var customTitle: String? = null
// 6个密码输入框数组 // 6个密码输入框数组
private lateinit var passwordEditTexts: Array<EditText> private lateinit var passwordEditTexts: Array<EditText>
@@ -61,6 +62,11 @@ class PasswordInputDialog(context: Context) : Dialog(context) {
setupPasswordInput() setupPasswordInput()
// 设置标题(如果通过 setTitle 设置了自定义标题)
customTitle?.let {
binding.tvTitle.text = it
}
binding.ivClose.setOnClickListener { binding.ivClose.setOnClickListener {
dismiss() dismiss()
} }
@@ -239,6 +245,14 @@ class PasswordInputDialog(context: Context) : Dialog(context) {
return this return this
} }
fun setTitle(title: String): PasswordInputDialog {
this.customTitle = title
if (::binding.isInitialized) {
binding.tvTitle.text = title
}
return this
}
fun setOnDismissListener(listener: () -> Unit): PasswordInputDialog { fun setOnDismissListener(listener: () -> Unit): PasswordInputDialog {
this.onDismissListener = listener this.onDismissListener = listener
return this return this

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#FFFFFF" />
<stroke
android:width="1dp"
android:color="#EEEEEE" />
</shape>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 背景 -->
<item android:id="@android:id/background"
android:height="4dp"
android:gravity="center_vertical">
<shape android:shape="rectangle">
<solid android:color="#44FFFFFF"/>
<corners android:radius="2dp"/>
</shape>
</item>
<!-- 进度 -->
<item android:id="@android:id/progress"
android:height="4dp"
android:gravity="center_vertical">
<clip>
<shape android:shape="rectangle">
<solid android:color="#09C2BD"/>
<corners android:radius="2dp"/>
</shape>
</clip>
</item>
</layer-list>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#09C2BD"/>
<size android:width="16dp" android:height="16dp"/>
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 735 B

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -58,12 +58,18 @@
android:src="@drawable/search" android:src="@drawable/search"
android:layout_marginRight="8dp"/> android:layout_marginRight="8dp"/>
<TextView <EditText
android:layout_width="wrap_content" android:id="@+id/etSearch"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/search_preset_text" android:layout_weight="1"
android:textColor="@color/gray" android:background="@null"
android:textSize="14sp"/> android:hint="@string/search_preset_text"
android:textColorHint="@color/gray"
android:textColor="@color/black"
android:textSize="14sp"
android:singleLine="true"
android:imeOptions="actionSearch"/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@@ -1,156 +1,157 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main" android:id="@+id/main"
android:layout_marginTop="30dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#F9F9F9" android:background="#000000"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <!-- 视频播放区域和悬浮按钮 -->
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<ImageView
android:id="@+id/btnBack"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/alarm_log_title"
android:textSize="16sp"
android:textStyle="bold" />
<View
android:layout_width="24dp"
android:layout_height="24dp" />
</LinearLayout>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="280dp" android:layout_height="wrap_content">
android:background="#000000">
<ImageView <!-- 视频播放区域 -->
<chuangyuan.ycj.videolibrary.widget.VideoPlayerView
android:id="@+id/exoPlayContextId"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="280dp"
android:scaleType="centerCrop" android:background="@android:color/transparent"
android:src="@drawable/img" /> app:use_controller="false"/>
<!-- 自定义顶部栏 - 返回、下载、删除在同一行 -->
<LinearLayout <LinearLayout
android:id="@+id/functionBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="44dp"
android:orientation="vertical"> android:layout_gravity="top"
android:background="@android:color/transparent"
android:gravity="center_vertical"
android:visibility="visible">
<LinearLayout <ImageView
android:layout_width="match_parent" android:id="@+id/ivBack"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="8dp"
android:src="@drawable/back_white"/>
<View
android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" android:layout_weight="1"/>
android:gravity="top|end"
android:padding="16dp">
<LinearLayout <ImageView
android:layout_width="wrap_content" android:id="@+id/ivDownload"
android:layout_height="wrap_content" android:layout_width="40dp"
android:orientation="vertical"> android:layout_height="40dp"
android:padding="8dp"
android:src="@drawable/download"/>
<ImageView <ImageView
android:layout_width="40dp" android:id="@+id/ivDelete"
android:layout_height="40dp" android:layout_width="40dp"
android:layout_marginBottom="8dp" android:layout_height="40dp"
android:src="@drawable/download" /> android:layout_marginStart="12dp"
android:padding="8dp"
<ImageView android:src="@drawable/delete"/>
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginBottom="8dp"
android:src="@drawable/mute"/>
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginBottom="8dp"
android:src="@drawable/delete" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/mute"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="bottom|end"
android:padding="16dp">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/full_screen" />
</LinearLayout>
</LinearLayout> </LinearLayout>
<!-- 右下角按钮区域 - 静音、全屏按钮 -->
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:id="@+id/muteBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom|end"
android:background="#000000" android:layout_marginEnd="6dp"
android:orientation="horizontal" android:orientation="vertical"
android:padding="8dp"> android:gravity="center">
<ImageView
android:id="@+id/ivMute"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="8dp"
android:src="@drawable/un_mute"/>
<ImageView
android:id="@+id/ivFullScreen"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="8dp"
android:layout_marginTop="8dp"
android:src="@drawable/full_size"/>
</LinearLayout>
<!-- 左下角播放按钮 -->
<LinearLayout
android:id="@+id/playBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|start">
<ImageView <ImageView
android:id="@+id/ivPlay" android:id="@+id/ivPlay"
android:layout_width="32dp" android:layout_width="48dp"
android:layout_height="32dp" android:layout_height="48dp"
android:src="@drawable/start" /> android:padding="8dp"
android:src="@drawable/zt"/>
</LinearLayout>
<!-- 底部进度条和时间区域 -->
<LinearLayout
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_gravity="bottom"
android:background="@android:color/transparent"
android:gravity="center_vertical"
android:paddingLeft="70dp"
android:paddingRight="70dp">
<!-- 当前时间 -->
<TextView <TextView
android:id="@+id/tvCurrentTime"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dp" android:text="00:00"
android:text="01:05"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textSize="14sp" /> android:textSize="14sp"/>
<!-- 进度条 -->
<SeekBar <SeekBar
android:id="@+id/seekBar" android:id="@+id/seekBar"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginLeft="8dp" android:layout_marginLeft="5dp"
android:layout_marginRight="8dp" android:layout_marginRight="5dp"
android:progress="20" /> android:max="100"
android:progress="0"
android:progressDrawable="@drawable/custom_seekbar"
android:thumb="@drawable/custom_thumb"/>
<!-- 总时长 -->
<TextView <TextView
android:id="@+id/tvTotalTime"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="05:05" android:text="00:00"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textSize="14sp" /> android:textSize="14sp"/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/titleLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:background="#FFFFFF" android:background="#FFFFFF"
@@ -159,6 +160,7 @@
android:paddingRight="16dp"> android:paddingRight="16dp">
<LinearLayout <LinearLayout
android:id="@+id/expandImg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal">
@@ -172,7 +174,6 @@
android:textStyle="bold" /> android:textStyle="bold" />
<ImageView <ImageView
android:id="@+id/expandImg"
android:layout_width="20dp" android:layout_width="20dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:src="@drawable/expand" /> android:src="@drawable/expand" />
@@ -188,4 +189,21 @@
android:layout_weight="1" android:layout_weight="1"
android:background="#FFFFFF" /> android:background="#FFFFFF" />
</LinearLayout> <LinearLayout
android:id="@+id/emptyLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:background="#FFFFFF"
android:visibility="gone">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/no_message" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/message_bg"
tools:context=".personal.ChangePasswordActivity">
<!-- 标题栏 -->
<LinearLayout
android:id="@+id/topBar"
android:layout_width="0dp"
android:layout_height="56dp"
android:gravity="center_vertical"
android:paddingHorizontal="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/ivBack"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/login_password"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
</LinearLayout>
<!-- 旧密码输入框 -->
<EditText
android:layout_margin="16dp"
android:id="@+id/etOldPassword"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:background="@drawable/textinput_white_bg"
android:hint="@string/enter_old_password"
android:inputType="textPassword"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp"
android:textColor="@color/black"
android:textColorHint="@color/gray"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/topBar" />
<!-- 新密码输入框 -->
<EditText
android:layout_margin="16dp"
android:id="@+id/etNewPassword"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/textinput_white_bg"
android:hint="@string/enter_new_password"
android:inputType="textPassword"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp"
android:textColor="@color/black"
android:textColorHint="@color/gray"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etOldPassword" />
<!-- 再次输入新密码输入框 -->
<EditText
android:layout_margin="16dp"
android:id="@+id/etConfirmPassword"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/textinput_white_bg"
android:hint="@string/enter_password_again"
android:inputType="textPassword"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp"
android:textColor="@color/black"
android:textColorHint="@color/gray"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etNewPassword" />
<!-- 确定重设密码按钮 -->
<android.widget.Button
android:layout_margin="16dp"
android:id="@+id/btnConfirm"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginTop="32dp"
android:background="@drawable/rounded_blue_bg"
android:text="@string/confirm_reset_password"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etConfirmPassword" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_bottom_sheet_rounded"
android:orientation="vertical">
<LinearLayout
android:id="@+id/itemTakePhoto"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/take_photo"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/dialog_view" />
<LinearLayout
android:id="@+id/itemSelectAlbum"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/select_from_album"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="8dp"
android:background="@color/face" />
<LinearLayout
android:id="@+id/itemCancel"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cancel"
android:textColor="@color/gray"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:padding="32dp"
android:background="@drawable/bg_white_rounded">
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
android:indeterminateTint="@color/green"/>
<TextView
android:id="@+id/tv_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/uploading"
android:textColor="@color/black"
android:textSize="16sp"/>
</LinearLayout>

View File

@@ -4,7 +4,6 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:background="@color/login_background" android:background="@color/login_background"
android:id="@+id/main" android:id="@+id/main"
android:padding="16dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".login.FaceLoginActivity"> tools:context=".login.FaceLoginActivity">
@@ -12,12 +11,12 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/topContainer" android:id="@+id/topContainer"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="56dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:paddingStart="16dp" android:layout_marginStart="16dp"
android:paddingEnd="16dp"> android:layout_marginRight="16dp">
<ImageView <ImageView
android:id="@+id/backIcon" android:id="@+id/backIcon"
android:layout_width="24dp" android:layout_width="24dp"
@@ -44,6 +43,7 @@
<!-- 副标题:注册用户 --> <!-- 副标题:注册用户 -->
<TextView <TextView
android:layout_marginStart="16dp"
android:id="@+id/tvRegisterSubtitle" android:id="@+id/tvRegisterSubtitle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -51,7 +51,7 @@
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="20dp" android:textSize="20dp"
android:textStyle="bold" android:textStyle="bold"
android:layout_marginTop="8dp" android:layout_marginTop="25dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/topContainer" /> app:layout_constraintTop_toBottomOf="@id/topContainer" />
@@ -63,6 +63,7 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvRegisterSubtitle" app:layout_constraintTop_toBottomOf="@id/tvRegisterSubtitle"
android:layout_marginTop="10dp"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingEnd="16dp"> android:paddingEnd="16dp">
<ImageView <ImageView
@@ -82,16 +83,16 @@
android:textColor="@color/green" android:textColor="@color/green"
android:textSize="12sp" android:textSize="12sp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/safeIcon" android:layout_marginStart="5dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/safeIcon"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/safeIcon"
app:layout_constraintTop_toTopOf="@id/safeIcon" /> app:layout_constraintBottom_toBottomOf="@id/safeIcon" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<!-- 人脸图标占位符(模拟人脸识别形象) --> <!-- 人脸图标占位符(模拟人脸识别形象) -->
<ImageView <ImageView
android:paddingTop="50dp" android:layout_marginTop="50dp"
android:id="@+id/cardFaceIcon" android:id="@+id/cardFaceIcon"
android:layout_width="150dp" android:layout_width="150dp"
android:layout_height="150dp" android:layout_height="150dp"
@@ -114,22 +115,23 @@
app:layout_constraintTop_toBottomOf="@id/cardFaceIcon" /> app:layout_constraintTop_toBottomOf="@id/cardFaceIcon" />
<LinearLayout <LinearLayout
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:layout_marginTop="48dp"
android:orientation="horizontal" android:orientation="horizontal"
android:id="@+id/cbLowLight" android:id="@+id/cbLowLight"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvInstruction" app:layout_constraintTop_toBottomOf="@id/tvInstruction">
android:paddingStart="16dp"
android:paddingTop="48dp"
android:paddingEnd="16dp">
<LinearLayout <LinearLayout
android:orientation="vertical" android:orientation="vertical"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_weight="1" android:layout_weight="1"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:layout_gravity="center"
android:background="@drawable/face_login_gray_bg" android:background="@drawable/face_login_gray_bg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@@ -166,6 +168,7 @@
android:layout_weight="1" android:layout_weight="1"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:layout_gravity="center"
android:background="@drawable/face_login_gray_bg" android:background="@drawable/face_login_gray_bg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@@ -202,6 +205,7 @@
android:layout_weight="1" android:layout_weight="1"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:layout_gravity="center"
android:background="@drawable/face_login_gray_bg" android:background="@drawable/face_login_gray_bg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@@ -238,6 +242,7 @@
android:layout_weight="1" android:layout_weight="1"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:layout_gravity="center"
android:background="@drawable/face_login_gray_bg" android:background="@drawable/face_login_gray_bg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@@ -276,7 +281,6 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginTop="40dp" android:layout_marginTop="40dp"
android:layout_marginBottom="16dp"
android:layout_marginStart="25dp" android:layout_marginStart="25dp"
android:layout_marginEnd="25dp" android:layout_marginEnd="25dp"
android:text="@string/start_verification" android:text="@string/start_verification"

View File

@@ -5,35 +5,39 @@
android:id="@+id/main" android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@android:color/black"
tools:context=".login.FaceVerificationActivity"> tools:context=".login.FaceVerificationActivity">
<androidx.camera.view.PreviewView <androidx.camera.view.PreviewView
android:id="@+id/previewView" android:id="@+id/previewView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:background="@android:color/black" />
<com.example.defenseapplication.view.FaceOverlayView <com.example.defenseapplication.view.FaceOverlayView
android:id="@+id/overlay" android:id="@+id/overlay"
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="match_parent" /> android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/topContainer" android:id="@+id/topContainer"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="56dp"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="16dp"
android:layout_marginRight="16dp">
<ImageView <ImageView
android:id="@+id/backIcon" android:id="@+id/backIcon"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:contentDescription="@null" android:contentDescription="@null"
android:src="@drawable/ic_back_arrow" android:src="@drawable/back"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
@@ -43,7 +47,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/face_collection" android:text="@string/face_collection"
android:textColor="@android:color/white"
android:textSize="22sp" android:textSize="22sp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/backIcon" app:layout_constraintBottom_toBottomOf="@id/backIcon"
@@ -77,7 +80,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/face_in_circle" android:text="@string/face_in_circle"
android:textColor="@android:color/white"
android:textSize="20sp" android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:letterSpacing="0.03" /> android:letterSpacing="0.03" />
@@ -92,7 +94,6 @@
android:paddingHorizontal="24dp" android:paddingHorizontal="24dp"
android:paddingTop="20dp" android:paddingTop="20dp"
android:paddingBottom="28dp" android:paddingBottom="28dp"
android:background="@drawable/bg_bottom_gradient"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent">

View File

@@ -93,7 +93,7 @@
</FrameLayout> </FrameLayout>
<FrameLayout <FrameLayout
android:id="@+id/add_family" android:id="@+id/addFamily"
android:layout_width="38dp" android:layout_width="38dp"
android:layout_height="38dp" android:layout_height="38dp"
android:layout_marginEnd="10dp" android:layout_marginEnd="10dp"
@@ -132,15 +132,6 @@
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:columnCount="2"
android:orientation="vertical"
android:rowCount="1" >
</GridLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout" android:id="@+id/swipeRefreshLayout"
@@ -164,8 +155,7 @@
<LinearLayout <LinearLayout
android:id="@+id/layoutNoPermission" android:id="@+id/layoutNoPermission"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingHorizontal="32dp" android:paddingHorizontal="32dp"

Some files were not shown because too many files have changed in this diff Show More