Compare commits
18 Commits
d5be6a9b5f
...
60ecdf140b
| Author | SHA1 | Date | |
|---|---|---|---|
| 60ecdf140b | |||
| b1aa844ff6 | |||
| 5822e562de | |||
| a1b9acb2a6 | |||
| a1ff4d100a | |||
| c4fd35bfe4 | |||
| 5cda6d959e | |||
| ed9d05cb42 | |||
| 08449d8abb | |||
| 9186cd00aa | |||
| b2d3046560 | |||
| bb0d3278d9 | |||
| c5043e4b94 | |||
| 97a0cdc14f | |||
| ac906c901b | |||
| 298b06d456 | |||
| c073c88e10 | |||
| 5b7d20d38c |
48
.kotlin/errors/errors-1779756141582.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779862167743.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779862168073.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779862519016.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779862519318.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779864992260.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779864992589.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779865234723.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779865235198.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779865796497.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779870337849.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779870821738.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779931289291.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779931289628.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779932726340.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779933092076.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779933481106.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779938258562.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779938756594.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779938957981.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779939585880.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1779952547113.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1780047327329.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1780384685236.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1780384852520.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1780384887923.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1780384964383.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
48
.kotlin/errors/errors-1780385942943.log
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
@@ -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")
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.example.defenseapplication.bean
|
||||||
|
|
||||||
|
data class DeviceAlarmResponse(
|
||||||
|
val total: Int,
|
||||||
|
val rows: List<DeviceAlarmBean>
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.example.defenseapplication.bean
|
||||||
|
|
||||||
|
data class MessageListResponse(
|
||||||
|
val total: Int,
|
||||||
|
val rows: List<MessageBean>
|
||||||
|
)
|
||||||
@@ -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?
|
||||||
|
)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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 为 null,Glide 会直接回调 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改家庭用户状态
|
* 修改家庭用户状态
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取已保存的语言 locale(attachBaseContext 中使用,此时 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 -> "中文"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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() // 触发重绘
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
9
app/src/main/res/drawable/card_bg.xml
Normal 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>
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 639 B |
|
Before Width: | Height: | Size: 5.8 KiB |
23
app/src/main/res/drawable/custom_seekbar.xml
Normal 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>
|
||||||
6
app/src/main/res/drawable/custom_thumb.xml
Normal 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>
|
||||||
BIN
app/src/main/res/drawable/down.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
app/src/main/res/drawable/down2.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 1.3 KiB |
BIN
app/src/main/res/drawable/full_size.png
Normal file
|
After Width: | Height: | Size: 389 B |
BIN
app/src/main/res/drawable/left.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
app/src/main/res/drawable/left2.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 735 B After Width: | Height: | Size: 406 B |
BIN
app/src/main/res/drawable/right.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
app/src/main/res/drawable/right2.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
5
app/src/main/res/drawable/selector_down.xml
Normal 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>
|
||||||
5
app/src/main/res/drawable/selector_left.xml
Normal 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>
|
||||||
5
app/src/main/res/drawable/selector_right.xml
Normal 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>
|
||||||
5
app/src/main/res/drawable/selector_up.xml
Normal 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>
|
||||||
BIN
app/src/main/res/drawable/un_mute.png
Normal file
|
After Width: | Height: | Size: 526 B |
BIN
app/src/main/res/drawable/up.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
app/src/main/res/drawable/up2.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
app/src/main/res/drawable/zt.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
112
app/src/main/res/layout/change_password_activity.xml
Normal 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>
|
||||||
64
app/src/main/res/layout/dialog_avatar_select.xml
Normal 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>
|
||||||
26
app/src/main/res/layout/dialog_loading.xml
Normal 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>
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||