Compare commits
25 Commits
b16ced1c18
...
native1
| Author | SHA1 | Date | |
|---|---|---|---|
| 60ecdf140b | |||
| b1aa844ff6 | |||
| 5822e562de | |||
| a1b9acb2a6 | |||
| a1ff4d100a | |||
| c4fd35bfe4 | |||
| 5cda6d959e | |||
| ed9d05cb42 | |||
| 08449d8abb | |||
| 9186cd00aa | |||
| b2d3046560 | |||
| bb0d3278d9 | |||
| c5043e4b94 | |||
| 97a0cdc14f | |||
| ac906c901b | |||
| 298b06d456 | |||
| c073c88e10 | |||
| 5b7d20d38c | |||
| d5be6a9b5f | |||
| fa3ac69752 | |||
| 95e2d9a3bf | |||
| fd84f18e4d | |||
| fe025c8a69 | |||
| 3cd21f8fca | |||
| 2c88a9eb7e |
48
.kotlin/errors/errors-1779517395470.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-tsmarker12650102232292672793.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-1779517396396.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-tsmarker2077405252922174295.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-1779525667150.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-tsmarker13865236646716426209.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-1779526129559.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-tsmarker3565929668175938003.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-1779526336962.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-tsmarker16671810096599011118.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-1779526448861.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-tsmarker16632472017645128501.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-1779676920998.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-tsmarker3136252475112532487.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-1779691414613.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-tsmarker1604220527296352118.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-1779694070210.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-tsmarker9673505676987263453.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-1779696172157.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-tsmarker17838896787258721930.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-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")
|
||||||
@@ -102,5 +98,11 @@ dependencies {
|
|||||||
implementation("androidx.camera:camera-view:1.0.0-alpha25")
|
implementation("androidx.camera:camera-view:1.0.0-alpha25")
|
||||||
//上拉刷新下拉加载
|
//上拉刷新下拉加载
|
||||||
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
|
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
|
||||||
|
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(
|
||||||
@@ -15,10 +16,8 @@ data class LinkedUser(
|
|||||||
)
|
)
|
||||||
|
|
||||||
class LinkedUserAdapter(
|
class LinkedUserAdapter(
|
||||||
private val deleteText: String,
|
|
||||||
private val isUnlinkMode: Boolean,
|
private val isUnlinkMode: Boolean,
|
||||||
private val onItemClick: (LinkedUser, Int) -> Unit,
|
private val onItemClick: (LinkedUser, Int) -> Unit
|
||||||
private val onDeleteClick: (LinkedUser, Int) -> Unit
|
|
||||||
) : RecyclerView.Adapter<LinkedUserAdapter.LinkedUserViewHolder>() {
|
) : RecyclerView.Adapter<LinkedUserAdapter.LinkedUserViewHolder>() {
|
||||||
|
|
||||||
private val items = mutableListOf<LinkedUser>()
|
private val items = mutableListOf<LinkedUser>()
|
||||||
@@ -36,12 +35,6 @@ class LinkedUserAdapter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun closeSwipe(position: Int) {
|
|
||||||
if (position in items.indices) {
|
|
||||||
notifyItemChanged(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LinkedUserViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LinkedUserViewHolder {
|
||||||
val binding = ItemLinkedUserBinding.inflate(
|
val binding = ItemLinkedUserBinding.inflate(
|
||||||
LayoutInflater.from(parent.context),
|
LayoutInflater.from(parent.context),
|
||||||
@@ -52,53 +45,25 @@ class LinkedUserAdapter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: LinkedUserViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: LinkedUserViewHolder, position: Int) {
|
||||||
|
|
||||||
holder.bind(items[position], position)
|
holder.bind(items[position], position)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = items.size
|
override fun getItemCount(): Int = items.size
|
||||||
|
|
||||||
inner class LinkedUserViewHolder(
|
inner class LinkedUserViewHolder(
|
||||||
private val binding: ItemLinkedUserBinding
|
val binding: ItemLinkedUserBinding
|
||||||
) : RecyclerView.ViewHolder(binding.root) {
|
) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
|
||||||
fun bind(item: LinkedUser, position: Int) {
|
fun bind(item: LinkedUser, position: Int) {
|
||||||
binding.tvPhone.text = "手机号码:${item.phone}"
|
val context = binding.root.context
|
||||||
binding.tvIdCard.text = "身份证号:${item.idCard}"
|
|
||||||
binding.llContent.translationX = 0f
|
|
||||||
binding.tvUserName.text = item.name
|
binding.tvUserName.text = item.name
|
||||||
binding.tvTime.text = item.time
|
binding.tvTime.text = item.time
|
||||||
|
binding.tvPhone.text = context.getString(R.string.linked_user_phone_label, item.phone)
|
||||||
|
binding.tvIdCard.text = context.getString(R.string.linked_user_idcard_label, item.idCard)
|
||||||
|
|
||||||
// MODE_SETTINGS → 显示"解除关联";MODE_PERSONAL → 显示"删除"
|
binding.root.setOnClickListener {
|
||||||
if (isUnlinkMode) {
|
onItemClick(item, position)
|
||||||
binding.tvUnlinkAction.visibility = View.VISIBLE
|
|
||||||
binding.tvDeleteAction.visibility = View.GONE
|
|
||||||
} else {
|
|
||||||
binding.tvUnlinkAction.visibility = View.GONE
|
|
||||||
binding.tvDeleteAction.visibility = View.VISIBLE
|
|
||||||
binding.tvDeleteAction.text = deleteText
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.llContent.setOnClickListener {
|
|
||||||
if (binding.llContent.translationX < 0f) {
|
|
||||||
binding.llContent.animate()
|
|
||||||
.translationX(0f)
|
|
||||||
.setDuration(200)
|
|
||||||
.start()
|
|
||||||
} else {
|
|
||||||
onItemClick(item, position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.tvDeleteAction.setOnClickListener {
|
|
||||||
onDeleteClick(item, position)
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.tvUnlinkAction.setOnClickListener {
|
|
||||||
onDeleteClick(item, position)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getContentLayout(): View = binding.llContent
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,10 +6,12 @@ import androidx.recyclerview.widget.RecyclerView
|
|||||||
import com.example.defenseapplication.databinding.ItemWifiBinding
|
import com.example.defenseapplication.databinding.ItemWifiBinding
|
||||||
|
|
||||||
class WifiListAdapter(
|
class WifiListAdapter(
|
||||||
private val wifiList: List<String>,
|
wifiList: List<String>,
|
||||||
private val onItemClick: (String) -> Unit
|
private val onItemClick: (String) -> Unit
|
||||||
) : RecyclerView.Adapter<WifiListAdapter.ViewHolder>() {
|
) : RecyclerView.Adapter<WifiListAdapter.ViewHolder>() {
|
||||||
|
|
||||||
|
private val wifiList = mutableListOf<String>().apply { addAll(wifiList) }
|
||||||
|
|
||||||
inner class ViewHolder(val binding: ItemWifiBinding) : RecyclerView.ViewHolder(binding.root) {
|
inner class ViewHolder(val binding: ItemWifiBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
init {
|
init {
|
||||||
itemView.setOnClickListener {
|
itemView.setOnClickListener {
|
||||||
@@ -35,4 +37,17 @@ class WifiListAdapter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = wifiList.size
|
override fun getItemCount(): Int = wifiList.size
|
||||||
|
|
||||||
|
fun updateData(newList: List<String>) {
|
||||||
|
wifiList.clear()
|
||||||
|
wifiList.addAll(newList)
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addData(newList: List<String>) {
|
||||||
|
val startPosition = wifiList.size
|
||||||
|
val newItems = newList.filter { !wifiList.contains(it) }
|
||||||
|
wifiList.addAll(newItems)
|
||||||
|
notifyItemRangeInserted(startPosition, newItems.size)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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,13 @@
|
|||||||
|
package com.example.defenseapplication.bean
|
||||||
|
|
||||||
|
data class AddDeviceBean(
|
||||||
|
val deviceEm: String? = null,//设备型号
|
||||||
|
val deviceNo: String? = null,//设备编号
|
||||||
|
val deviceSn: String? = null,//设备序列号
|
||||||
|
val fwVer: String? = null,//固件版本
|
||||||
|
val status: String? = null,//状态 1-在线 0-离线 2-故障 3-到期
|
||||||
|
val wifiName: String? = null,//WiFi名称
|
||||||
|
val wifiPassword: String? = null,//WiFi密码
|
||||||
|
val mac: String? = null,//邀请码
|
||||||
|
val deviceName: String? = null,//设备名称
|
||||||
|
)
|
||||||
@@ -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,12 @@
|
|||||||
|
package com.example.defenseapplication.bean
|
||||||
|
|
||||||
|
data class ObtainInviterInformationBean(
|
||||||
|
val nickName: String? = null,
|
||||||
|
val idCard: String? = null,
|
||||||
|
val phonenumber: String? = null,
|
||||||
|
val userId: String? = null,
|
||||||
|
val id: String? = null,
|
||||||
|
val status: String? = null,
|
||||||
|
val mac: String? = null
|
||||||
|
|
||||||
|
)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example.defenseapplication.bean
|
||||||
|
|
||||||
|
data class ObtainInviterInformationRequest(
|
||||||
|
val childId: String
|
||||||
|
)
|
||||||
@@ -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?
|
||||||
|
)
|
||||||
@@ -6,12 +6,8 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.net.ConnectivityManager
|
import android.graphics.Rect
|
||||||
import android.net.Network
|
|
||||||
import android.net.NetworkCapabilities
|
|
||||||
import android.net.NetworkRequest
|
|
||||||
import android.net.wifi.ScanResult
|
import android.net.wifi.ScanResult
|
||||||
import android.net.wifi.WifiConfiguration
|
|
||||||
import android.net.wifi.WifiManager
|
import android.net.wifi.WifiManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
@@ -26,24 +22,22 @@ import android.widget.Toast
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
import com.example.defenseapplication.adapter.WifiListAdapter
|
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
|
||||||
//选择wifi页面
|
|
||||||
class AddFamilyActivity : AppCompatActivity() {
|
class AddFamilyActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var binding: AddFamilyActivityBinding
|
private lateinit var binding: AddFamilyActivityBinding
|
||||||
private lateinit var wifiManager: WifiManager
|
private lateinit var wifiManager: WifiManager
|
||||||
private lateinit var connectivityManager: ConnectivityManager
|
|
||||||
private lateinit var wifiScanReceiver: BroadcastReceiver
|
private lateinit var wifiScanReceiver: BroadcastReceiver
|
||||||
private var popupWindow: PopupWindow? = null
|
private var popupWindow: PopupWindow? = null
|
||||||
private val handler = Handler(Looper.getMainLooper())
|
private val handler = Handler(Looper.getMainLooper())
|
||||||
private var isConnecting = false
|
private var wifiListAdapter: WifiListAdapter? = null
|
||||||
private var targetWifiName: String = ""
|
private var isLoadingMore = false
|
||||||
private var networkCallback: ConnectivityManager.NetworkCallback? = null
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -53,6 +47,7 @@ class AddFamilyActivity : AppCompatActivity() {
|
|||||||
.statusBarDarkFont(true)
|
.statusBarDarkFont(true)
|
||||||
.titleBar(binding.topBar)
|
.titleBar(binding.topBar)
|
||||||
.init()
|
.init()
|
||||||
|
|
||||||
binding.ivBack.setOnClickListener {
|
binding.ivBack.setOnClickListener {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
@@ -70,8 +65,8 @@ class AddFamilyActivity : AppCompatActivity() {
|
|||||||
updateBottomButtonVisibility()
|
updateBottomButtonVisibility()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
|
wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
|
||||||
connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
|
||||||
|
|
||||||
wifiScanReceiver = object : BroadcastReceiver() {
|
wifiScanReceiver = object : BroadcastReceiver() {
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
@@ -81,12 +76,8 @@ class AddFamilyActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.btnConfirm.setOnClickListener {
|
binding.btnConfirm.setOnClickListener {
|
||||||
//startActivity(Intent(this, ConnectDeviceActivity::class.java))
|
|
||||||
if (isConnecting) {
|
|
||||||
return@setOnClickListener
|
|
||||||
}
|
|
||||||
|
|
||||||
val wifiName = binding.etWifiName.text.toString().trim()
|
val wifiName = binding.etWifiName.text.toString().trim()
|
||||||
val wifiPassword = binding.etWifiPassword.text.toString()
|
val wifiPassword = binding.etWifiPassword.text.toString()
|
||||||
|
|
||||||
@@ -100,143 +91,13 @@ class AddFamilyActivity : AppCompatActivity() {
|
|||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
isConnecting = true
|
val intent = Intent(this@AddFamilyActivity, ConnectDeviceActivity::class.java)
|
||||||
binding.btnConfirm.isEnabled = false
|
intent.putExtra("wifi_name", wifiName)
|
||||||
|
intent.putExtra("wifi_password", wifiPassword)
|
||||||
verifyWifiPassword(wifiName, wifiPassword)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun verifyWifiPassword(wifiName: String, wifiPassword: String) {
|
|
||||||
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
|
|
||||||
!= PackageManager.PERMISSION_GRANTED ||
|
|
||||||
ActivityCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE)
|
|
||||||
!= PackageManager.PERMISSION_GRANTED ||
|
|
||||||
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE)
|
|
||||||
!= PackageManager.PERMISSION_GRANTED) {
|
|
||||||
ActivityCompat.requestPermissions(this,
|
|
||||||
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,
|
|
||||||
Manifest.permission.CHANGE_WIFI_STATE,
|
|
||||||
Manifest.permission.ACCESS_NETWORK_STATE),
|
|
||||||
1002)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
targetWifiName = wifiName
|
|
||||||
|
|
||||||
if (!wifiManager.isWifiEnabled) {
|
|
||||||
wifiManager.isWifiEnabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
val existingConfig = findExistingWifiConfig(wifiName)
|
|
||||||
var netId: Int
|
|
||||||
|
|
||||||
if (existingConfig != null) {
|
|
||||||
netId = existingConfig.networkId
|
|
||||||
existingConfig.preSharedKey = "\"$wifiPassword\""
|
|
||||||
wifiManager.updateNetwork(existingConfig)
|
|
||||||
} else {
|
|
||||||
val wifiConfig = createWifiConfig(wifiName, wifiPassword)
|
|
||||||
netId = wifiManager.addNetwork(wifiConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (netId == -1) {
|
|
||||||
isConnecting = false
|
|
||||||
binding.btnConfirm.isEnabled = true
|
|
||||||
ToastUtils.showError(this, getString(R.string.wifi_connection_failed))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
networkCallback = object : ConnectivityManager.NetworkCallback() {
|
|
||||||
override fun onAvailable(network: Network) {
|
|
||||||
super.onAvailable(network)
|
|
||||||
checkWifiConnected()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCapabilitiesChanged(network: Network, capabilities: NetworkCapabilities) {
|
|
||||||
super.onCapabilitiesChanged(network, capabilities)
|
|
||||||
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
|
|
||||||
checkWifiConnected()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val request = NetworkRequest.Builder()
|
|
||||||
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
connectivityManager.registerNetworkCallback(request, networkCallback!!)
|
|
||||||
|
|
||||||
wifiManager.enableNetwork(netId, true)
|
|
||||||
wifiManager.saveConfiguration()
|
|
||||||
|
|
||||||
handler.postDelayed({
|
|
||||||
if (isConnecting) {
|
|
||||||
isConnecting = false
|
|
||||||
binding.btnConfirm.isEnabled = true
|
|
||||||
networkCallback?.let {
|
|
||||||
try {
|
|
||||||
connectivityManager.unregisterNetworkCallback(it)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
networkCallback = null
|
|
||||||
ToastUtils.showError(this, getString(R.string.wifi_connection_failed))
|
|
||||||
}
|
|
||||||
}, 15000)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun findExistingWifiConfig(wifiName: String): WifiConfiguration? {
|
|
||||||
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
|
|
||||||
!= PackageManager.PERMISSION_GRANTED) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
val configuredNetworks = wifiManager.configuredNetworks
|
|
||||||
configuredNetworks?.forEach { config ->
|
|
||||||
if (config.SSID == "\"$wifiName\"") {
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun checkWifiConnected() {
|
|
||||||
if (!isConnecting) return
|
|
||||||
|
|
||||||
val info = wifiManager.connectionInfo
|
|
||||||
if (info.ssid == "\"$targetWifiName\"" && info.networkId != -1) {
|
|
||||||
isConnecting = false
|
|
||||||
binding.btnConfirm.isEnabled = true
|
|
||||||
networkCallback?.let {
|
|
||||||
try {
|
|
||||||
connectivityManager.unregisterNetworkCallback(it)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
networkCallback = null
|
|
||||||
runOnUiThread {
|
|
||||||
ToastUtils.showSuccess(this@AddFamilyActivity, getString(R.string.wifi_connection_success))
|
|
||||||
val intent = Intent(this@AddFamilyActivity, ConnectDeviceActivity::class.java)
|
|
||||||
intent.putExtra("wifi_name", targetWifiName)
|
|
||||||
startActivity(intent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createWifiConfig(ssid: String, password: String): WifiConfiguration {
|
|
||||||
val config = WifiConfiguration()
|
|
||||||
config.SSID = "\"$ssid\""
|
|
||||||
config.preSharedKey = "\"$password\""
|
|
||||||
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK)
|
|
||||||
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN)
|
|
||||||
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA)
|
|
||||||
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP)
|
|
||||||
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP)
|
|
||||||
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP)
|
|
||||||
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP)
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun showWifiListDialog() {
|
private fun showWifiListDialog() {
|
||||||
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
|
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
|
||||||
!= PackageManager.PERMISSION_GRANTED ||
|
!= PackageManager.PERMISSION_GRANTED ||
|
||||||
@@ -255,10 +116,14 @@ class AddFamilyActivity : AppCompatActivity() {
|
|||||||
wifiManager.startScan()
|
wifiManager.startScan()
|
||||||
|
|
||||||
val dialogBinding = DialogWifiListBinding.inflate(LayoutInflater.from(this))
|
val dialogBinding = DialogWifiListBinding.inflate(LayoutInflater.from(this))
|
||||||
|
|
||||||
|
val screenHeight = getScreenHeight()
|
||||||
|
val popupHeight = (screenHeight * 2 / 3).toInt()
|
||||||
|
|
||||||
popupWindow = PopupWindow(
|
popupWindow = PopupWindow(
|
||||||
dialogBinding.root,
|
dialogBinding.root,
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
popupHeight
|
||||||
).apply {
|
).apply {
|
||||||
isFocusable = true
|
isFocusable = true
|
||||||
setBackgroundDrawable(null)
|
setBackgroundDrawable(null)
|
||||||
@@ -273,10 +138,54 @@ class AddFamilyActivity : AppCompatActivity() {
|
|||||||
dialogBinding.rvWifiList.layoutManager = LinearLayoutManager(this@AddFamilyActivity)
|
dialogBinding.rvWifiList.layoutManager = LinearLayoutManager(this@AddFamilyActivity)
|
||||||
|
|
||||||
val wifiList = getWifiList()
|
val wifiList = getWifiList()
|
||||||
dialogBinding.rvWifiList.adapter = WifiListAdapter(wifiList) { wifiName ->
|
wifiListAdapter = WifiListAdapter(wifiList) { wifiName ->
|
||||||
binding.etWifiName.setText(wifiName)
|
binding.etWifiName.setText(wifiName)
|
||||||
popupWindow?.dismiss()
|
popupWindow?.dismiss()
|
||||||
}
|
}
|
||||||
|
dialogBinding.rvWifiList.adapter = wifiListAdapter
|
||||||
|
|
||||||
|
dialogBinding.swipeRefreshLayout.setOnRefreshListener {
|
||||||
|
refreshWifiList(dialogBinding)
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogBinding.rvWifiList.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 lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition()
|
||||||
|
val totalItemCount = layoutManager.itemCount
|
||||||
|
|
||||||
|
if (lastVisibleItemPosition == totalItemCount - 1 && dy > 0 && !isLoadingMore && totalItemCount > 0) {
|
||||||
|
loadMoreWifiList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getScreenHeight(): Int {
|
||||||
|
val rect = Rect()
|
||||||
|
window.decorView.getWindowVisibleDisplayFrame(rect)
|
||||||
|
return rect.height()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun refreshWifiList(dialogBinding: DialogWifiListBinding) {
|
||||||
|
dialogBinding.swipeRefreshLayout.isRefreshing = true
|
||||||
|
handler.postDelayed({
|
||||||
|
wifiManager.startScan()
|
||||||
|
val newWifiList = getWifiList()
|
||||||
|
wifiListAdapter?.updateData(newWifiList)
|
||||||
|
dialogBinding.swipeRefreshLayout.isRefreshing = false
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun loadMoreWifiList() {
|
||||||
|
isLoadingMore = true
|
||||||
|
handler.postDelayed({
|
||||||
|
wifiManager.startScan()
|
||||||
|
val newWifiList = getWifiList()
|
||||||
|
wifiListAdapter?.addData(newWifiList)
|
||||||
|
isLoadingMore = false
|
||||||
|
}, 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateBottomButtonVisibility() {
|
private fun updateBottomButtonVisibility() {
|
||||||
@@ -315,31 +224,19 @@ class AddFamilyActivity : AppCompatActivity() {
|
|||||||
super.onStop()
|
super.onStop()
|
||||||
unregisterReceiver(wifiScanReceiver)
|
unregisterReceiver(wifiScanReceiver)
|
||||||
popupWindow?.dismiss()
|
popupWindow?.dismiss()
|
||||||
networkCallback?.let {
|
|
||||||
try {
|
|
||||||
connectivityManager.unregisterNetworkCallback(it)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
networkCallback = null
|
|
||||||
handler.removeCallbacksAndMessages(null)
|
handler.removeCallbacksAndMessages(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
|
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
|
||||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||||
when (requestCode) {
|
when (requestCode) {
|
||||||
1002 -> {
|
1001 -> {
|
||||||
if (grantResults.isNotEmpty() &&
|
if (grantResults.isNotEmpty() &&
|
||||||
grantResults.size >= 3 &&
|
grantResults.size >= 2 &&
|
||||||
grantResults[0] == PackageManager.PERMISSION_GRANTED &&
|
grantResults[0] == PackageManager.PERMISSION_GRANTED &&
|
||||||
grantResults[1] == PackageManager.PERMISSION_GRANTED &&
|
grantResults[1] == PackageManager.PERMISSION_GRANTED) {
|
||||||
grantResults[2] == PackageManager.PERMISSION_GRANTED) {
|
showWifiListDialog()
|
||||||
val wifiName = binding.etWifiName.text.toString().trim()
|
|
||||||
val wifiPassword = binding.etWifiPassword.text.toString()
|
|
||||||
verifyWifiPassword(wifiName, wifiPassword)
|
|
||||||
} else {
|
} else {
|
||||||
isConnecting = false
|
|
||||||
binding.btnConfirm.isEnabled = true
|
|
||||||
Toast.makeText(this, R.string.permission_denied, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, R.string.permission_denied, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,12 @@ class ConnectDeviceActivity : AppCompatActivity() {
|
|||||||
// 跳转到下一个界面或关闭当前页面
|
// 跳转到下一个界面或关闭当前页面
|
||||||
// 使用 Handler 延迟跳转
|
// 使用 Handler 延迟跳转
|
||||||
Handler(Looper.getMainLooper()).postDelayed({
|
Handler(Looper.getMainLooper()).postDelayed({
|
||||||
startActivity(Intent(this, SetNameActivity::class.java))
|
val wifiName = intent.getStringExtra("wifi_name") ?: ""
|
||||||
|
val wifiPassword = intent.getStringExtra("wifi_password") ?: ""
|
||||||
|
startActivity(Intent(this, SetNameActivity::class.java).apply {
|
||||||
|
putExtra("wifi_name", wifiName)
|
||||||
|
putExtra("wifi_password", wifiPassword)
|
||||||
|
})
|
||||||
finish()
|
finish()
|
||||||
}, 1000) // 1秒后跳转
|
}, 1000) // 1秒后跳转
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -2,14 +2,24 @@ package com.example.defenseapplication.home
|
|||||||
|
|
||||||
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.bean.AddDeviceBean
|
||||||
|
import com.example.defenseapplication.bean.DeviceBean
|
||||||
import com.example.defenseapplication.databinding.SetNameActivityBinding
|
import com.example.defenseapplication.databinding.SetNameActivityBinding
|
||||||
import com.example.defenseapplication.liveVideo.LiveVideoActivity
|
import com.example.defenseapplication.liveVideo.LiveVideoActivity
|
||||||
|
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 SetNameActivity : AppCompatActivity() {
|
class SetNameActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var binding: SetNameActivityBinding
|
private lateinit var binding: SetNameActivityBinding
|
||||||
|
private var wifiName: String = ""
|
||||||
|
private var wifiPassword: String = ""
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -19,12 +29,49 @@ class SetNameActivity : AppCompatActivity() {
|
|||||||
.statusBarDarkFont(true)
|
.statusBarDarkFont(true)
|
||||||
.titleBar(binding.topBar)
|
.titleBar(binding.topBar)
|
||||||
.init()
|
.init()
|
||||||
|
|
||||||
|
// 获取传递的 WiFi 名称和密码
|
||||||
|
wifiName = intent.getStringExtra("wifi_name") ?: ""
|
||||||
|
wifiPassword = intent.getStringExtra("wifi_password") ?: ""
|
||||||
|
|
||||||
binding.ivBack.setOnClickListener {
|
binding.ivBack.setOnClickListener {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.btnConfirm.setOnClickListener {
|
binding.btnConfirm.setOnClickListener {
|
||||||
val deviceName = binding.etName.text.toString().trim()
|
val deviceName = binding.etName.text.toString().trim()
|
||||||
startActivity(Intent(this, LiveVideoActivity::class.java).apply {})
|
if (deviceName.isEmpty()) {
|
||||||
|
Toast.makeText(this, "请输入设备名称", Toast.LENGTH_SHORT).show()
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
addDevice(deviceName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun addDevice(deviceName: String) {
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
try {
|
||||||
|
val deviceBean = AddDeviceBean(
|
||||||
|
deviceName = deviceName,
|
||||||
|
wifiName = wifiName,
|
||||||
|
wifiPassword = wifiPassword,
|
||||||
|
status = "0"
|
||||||
|
)
|
||||||
|
val result = RetrofitNetwork.getNetworkService().addDevice(deviceBean)
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
if (result.code == 200) {
|
||||||
|
Toast.makeText(this@SetNameActivity, "设备添加成功", Toast.LENGTH_SHORT).show()
|
||||||
|
startActivity(Intent(this@SetNameActivity, LiveVideoActivity::class.java))
|
||||||
|
finish()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this@SetNameActivity, result.msg ?: "添加失败", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
Toast.makeText(this@SetNameActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
@@ -18,10 +20,12 @@ import com.gyf.immersionbar.ImmersionBar
|
|||||||
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 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>()
|
||||||
|
|
||||||
@@ -37,9 +41,16 @@ class AddLinkedUserActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
initRecyclerView()
|
initRecyclerView()
|
||||||
initListener()
|
initListener()
|
||||||
|
setupSwipeRefresh()
|
||||||
fetchFamilyMembers()
|
fetchFamilyMembers()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setupSwipeRefresh() {
|
||||||
|
binding.swipeRefresh.setOnRefreshListener {
|
||||||
|
fetchFamilyMembers()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun initRecyclerView() {
|
private fun initRecyclerView() {
|
||||||
binding.rvAddLinkedUser.layoutManager = LinearLayoutManager(this)
|
binding.rvAddLinkedUser.layoutManager = LinearLayoutManager(this)
|
||||||
binding.rvAddLinkedUser.adapter =
|
binding.rvAddLinkedUser.adapter =
|
||||||
@@ -52,13 +63,31 @@ class AddLinkedUserActivity : AppCompatActivity() {
|
|||||||
selectedUserIdMap.remove(phone)
|
selectedUserIdMap.remove(phone)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置上拉加载更多
|
||||||
|
binding.rvAddLinkedUser.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 (totalItemCount > 0 && lastVisibleItem >= totalItemCount - 3) {
|
||||||
|
// 滑到底部时自动刷新(加载更多)
|
||||||
|
if (!binding.swipeRefresh.isRefreshing) {
|
||||||
|
fetchFamilyMembers()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fetchFamilyMembers() {
|
private fun fetchFamilyMembers() {
|
||||||
|
binding.swipeRefresh.isRefreshing = true
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
try {
|
try {
|
||||||
val response = RetrofitNetwork.getNetworkService().getFamilyMembers()
|
val response = RetrofitNetwork.getNetworkService().getFamilyMembers()
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
binding.swipeRefresh.isRefreshing = false
|
||||||
if (response.code == 200) {
|
if (response.code == 200) {
|
||||||
if (response.data != null && response.data.isNotEmpty()) {
|
if (response.data != null && response.data.isNotEmpty()) {
|
||||||
updateFamilyMemberList(response.data)
|
updateFamilyMemberList(response.data)
|
||||||
@@ -72,6 +101,7 @@ class AddLinkedUserActivity : AppCompatActivity() {
|
|||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
android.util.Log.e("AddLinkedUserActivity", "网络请求异常", e)
|
android.util.Log.e("AddLinkedUserActivity", "网络请求异常", e)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
binding.swipeRefresh.isRefreshing = false
|
||||||
Toast.makeText(this@AddLinkedUserActivity, "网络请求失败: ${e.message}", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@AddLinkedUserActivity, "网络请求失败: ${e.message}", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,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 ?: "",
|
||||||
@@ -89,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()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ package com.example.defenseapplication.liveVideo
|
|||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.TypedValue
|
import android.text.Editable
|
||||||
|
import android.text.TextWatcher
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
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
|
||||||
import androidx.recyclerview.widget.ItemTouchHelper
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
@@ -16,26 +17,32 @@ 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
|
||||||
import com.example.defenseapplication.view.CustomDialogFragmentText
|
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.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
|
||||||
//关联用户页面
|
//关联用户
|
||||||
class LinkedUserActivity : AppCompatActivity() {
|
class LinkedUserActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var binding: LinkedUserActivityBinding
|
private lateinit var binding: LinkedUserActivityBinding
|
||||||
private lateinit var adapter: LinkedUserAdapter
|
private lateinit var adapter: LinkedUserAdapter
|
||||||
|
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 REQUEST_CODE_SEARCH = 1001
|
|
||||||
const val EXTRA_SEARCH_RESULT = "search_result"
|
|
||||||
const val EXTRA_MODE = "extra_mode"
|
const val EXTRA_MODE = "extra_mode"
|
||||||
const val MODE_SETTINGS = 0
|
const val MODE_SETTINGS = 0
|
||||||
const val MODE_PERSONAL = 1
|
const val MODE_PERSONAL = 1
|
||||||
@@ -69,145 +76,63 @@ 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() {
|
||||||
val deleteText = if (mode == MODE_SETTINGS) getString(R.string.unlink) else getString(R.string.delete)
|
|
||||||
val isUnlinkMode = mode == MODE_SETTINGS
|
|
||||||
adapter = LinkedUserAdapter(
|
adapter = LinkedUserAdapter(
|
||||||
deleteText = deleteText,
|
isUnlinkMode = mode == MODE_SETTINGS,
|
||||||
isUnlinkMode = isUnlinkMode,
|
|
||||||
onItemClick = { user, position ->
|
onItemClick = { user, position ->
|
||||||
val intent = Intent(this, UserDetailsActivity::class.java).apply {
|
val intent = Intent(this, UserDetailsActivity::class.java).apply {
|
||||||
putExtra("name", user.name)
|
putExtra("userId", user.userId)
|
||||||
putExtra("phone", user.phone)
|
putExtra("deleteText", if (mode == MODE_SETTINGS) getString(R.string.unlink) else getString(R.string.delete))
|
||||||
putExtra("idCard", user.idCard)
|
putExtra("isUnlinkMode", mode == MODE_SETTINGS)
|
||||||
putExtra("time", user.time)
|
|
||||||
}
|
}
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
},
|
|
||||||
onDeleteClick = { user, position ->
|
|
||||||
showUnlinkDialog(user, position)
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
binding.rvLinkedUser.layoutManager = LinearLayoutManager(this)
|
|
||||||
binding.rvLinkedUser.adapter = adapter
|
|
||||||
|
|
||||||
// 根据模式只显示一个按钮,滑动露出完整按钮
|
(binding.rvLinkedUser as RecyclerView).layoutManager = LinearLayoutManager(this)
|
||||||
val swipeThresholdPx = TypedValue.applyDimension(
|
|
||||||
TypedValue.COMPLEX_UNIT_DIP, -100f, resources.displayMetrics
|
|
||||||
)
|
|
||||||
val heldPositions = mutableMapOf<Int, Boolean>()
|
|
||||||
|
|
||||||
var currentlyHeldPosition: Int = -1
|
binding.swipeRefresh.setOnRefreshListener {
|
||||||
|
fetchUserList()
|
||||||
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
|
}
|
||||||
override fun onMove(
|
|
||||||
recyclerView: RecyclerView,
|
|
||||||
viewHolder: RecyclerView.ViewHolder,
|
|
||||||
target: RecyclerView.ViewHolder
|
|
||||||
): Boolean = false
|
|
||||||
|
|
||||||
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
|
binding.rvLinkedUser.setSwipeMenuCreator { leftMenu, rightMenu, position ->
|
||||||
}
|
if (mode == MODE_SETTINGS) {
|
||||||
|
val unlinkItem = SwipeMenuItem(this@LinkedUserActivity).apply {
|
||||||
override fun onChildDraw(
|
setText(getString(R.string.unlink))
|
||||||
c: android.graphics.Canvas,
|
setBackgroundColor(getColor(R.color.red))
|
||||||
recyclerView: RecyclerView,
|
setTextColor(getColor(R.color.white))
|
||||||
viewHolder: RecyclerView.ViewHolder,
|
width = 200
|
||||||
dX: Float,
|
height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
dY: Float,
|
|
||||||
actionState: Int,
|
|
||||||
isCurrentlyActive: Boolean
|
|
||||||
) {
|
|
||||||
if (viewHolder is LinkedUserAdapter.LinkedUserViewHolder) {
|
|
||||||
val contentLayout = viewHolder.getContentLayout()
|
|
||||||
val position = viewHolder.adapterPosition
|
|
||||||
|
|
||||||
// 如果当前滑动的位置和已展开的位置不同,先收起已展开的项
|
|
||||||
if (isCurrentlyActive && currentlyHeldPosition != -1 && currentlyHeldPosition != position) {
|
|
||||||
val oldViewHolder = recyclerView.findViewHolderForAdapterPosition(currentlyHeldPosition)
|
|
||||||
if (oldViewHolder is LinkedUserAdapter.LinkedUserViewHolder) {
|
|
||||||
oldViewHolder.getContentLayout().animate()
|
|
||||||
.translationX(0f)
|
|
||||||
.setDuration(200)
|
|
||||||
.start()
|
|
||||||
}
|
|
||||||
heldPositions.remove(currentlyHeldPosition)
|
|
||||||
currentlyHeldPosition = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isCurrentlyActive) {
|
|
||||||
val isHeld = heldPositions[position]
|
|
||||||
if (isHeld == true) {
|
|
||||||
if (dX > 0) {
|
|
||||||
// 已展开时向右滑动 → 平滑收回
|
|
||||||
val newX = swipeThresholdPx + dX
|
|
||||||
// 不能超过原位
|
|
||||||
contentLayout.translationX = if (newX > 0) 0f else newX
|
|
||||||
} else {
|
|
||||||
// 保持展开或继续左滑(限制不超过阈值)
|
|
||||||
contentLayout.translationX = swipeThresholdPx
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 未展开,正常滑动限制(左滑不超过阈值,右滑不超过原位)
|
|
||||||
val swipeDistance = when {
|
|
||||||
dX < swipeThresholdPx -> swipeThresholdPx
|
|
||||||
dX > 0 -> 0f
|
|
||||||
else -> dX
|
|
||||||
}
|
|
||||||
contentLayout.translationX = swipeDistance
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
val isHeld = heldPositions[position]
|
|
||||||
if (isHeld == true) {
|
|
||||||
contentLayout.translationX = swipeThresholdPx
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
rightMenu.addMenuItem(unlinkItem)
|
||||||
|
} else {
|
||||||
/*
|
val deleteItem = SwipeMenuItem(this@LinkedUserActivity).apply {
|
||||||
- 滑动超过一半后松手:列表项 保持在滑动位置,显示按钮
|
setText(getString(R.string.delete))
|
||||||
- 滑动未超过一半松手:列表项 恢复原位
|
setBackgroundColor(getColor(R.color.red))
|
||||||
- 已展开状态下向右拖动归位或拖动超过一半松手:恢复原位
|
setTextColor(getColor(R.color.white))
|
||||||
* */
|
width = 200
|
||||||
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
|
height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
super.clearView(recyclerView, viewHolder)
|
|
||||||
if (viewHolder is LinkedUserAdapter.LinkedUserViewHolder) {
|
|
||||||
val position = viewHolder.adapterPosition
|
|
||||||
val contentLayout = viewHolder.getContentLayout()
|
|
||||||
|
|
||||||
// 判断滑动距离是否超过一半阈值(注意都是负数,所以绝对值比较)
|
|
||||||
if (Math.abs(contentLayout.translationX) > Math.abs(swipeThresholdPx / 2)) {
|
|
||||||
heldPositions[position] = true
|
|
||||||
currentlyHeldPosition = position
|
|
||||||
contentLayout.translationX = swipeThresholdPx
|
|
||||||
} else {
|
|
||||||
heldPositions.remove(position)
|
|
||||||
if (currentlyHeldPosition == position) {
|
|
||||||
currentlyHeldPosition = -1
|
|
||||||
}
|
|
||||||
contentLayout.animate()
|
|
||||||
.translationX(0f)
|
|
||||||
.setDuration(300)
|
|
||||||
.start()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
rightMenu.addMenuItem(deleteItem)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun getSwipeThreshold(viewHolder: RecyclerView.ViewHolder): Float = 0.05f
|
binding.rvLinkedUser.setOnItemMenuClickListener { _, position ->
|
||||||
})
|
// 直接关闭菜单(使用 RecyclerView 的方法)
|
||||||
itemTouchHelper.attachToRecyclerView(binding.rvLinkedUser)
|
binding.rvLinkedUser.smoothCloseMenu() // 或 closeMenu()
|
||||||
|
val user = userList[position]
|
||||||
|
showDeleteDialog(user, position)
|
||||||
|
}
|
||||||
|
|
||||||
|
(binding.rvLinkedUser as RecyclerView).adapter = adapter
|
||||||
}
|
}
|
||||||
|
|
||||||
private var currentSwipePosition: Int = -1
|
private fun showDeleteDialog(user: LinkedUser, position: Int) {
|
||||||
private var currentSwipeHeld: Boolean = false
|
|
||||||
|
|
||||||
private fun showUnlinkDialog(user: LinkedUser, position: Int) {
|
|
||||||
currentSwipePosition = position
|
|
||||||
currentSwipeHeld = true
|
|
||||||
|
|
||||||
val dialog = CustomDialogFragmentText()
|
val dialog = CustomDialogFragmentText()
|
||||||
if (mode == MODE_SETTINGS) {
|
if (mode == MODE_SETTINGS) {
|
||||||
dialog.setTitle(getString(R.string.tip))
|
dialog.setTitle(getString(R.string.tip))
|
||||||
@@ -217,22 +142,60 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
dialog.setMessage(getString(R.string.confirm_delete_user))
|
dialog.setMessage(getString(R.string.confirm_delete_user))
|
||||||
}
|
}
|
||||||
dialog.setShowInput(false)
|
dialog.setShowInput(false)
|
||||||
dialog.setPositiveText(getString(R.string.confirm))
|
|
||||||
dialog.setNegativeText(getString(R.string.cancel))
|
|
||||||
dialog.setOnConfirmListener {
|
dialog.setOnConfirmListener {
|
||||||
deleteDeviceUser(user, position)
|
if (!isPasswordVerified) {
|
||||||
|
showPasswordDialog {
|
||||||
|
isPasswordVerified = true
|
||||||
|
deleteDeviceUser(user, position)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
deleteDeviceUser(user, position)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dialog.setOnDismissListener {
|
dialog.show(supportFragmentManager, "DeleteDialog")
|
||||||
resetSwipeState()
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dialog.show(supportFragmentManager, "UnlinkDialog")
|
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()) {
|
||||||
Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT).show()
|
||||||
resetSwipeState()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,57 +209,48 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
if (response.code == 200) {
|
if (response.code == 200) {
|
||||||
userList.removeAt(position)
|
userList.removeAt(position)
|
||||||
adapter.removeItem(position)
|
adapter.notifyItemRemoved(position) // 通知删除动画
|
||||||
|
adapter.notifyItemRangeChanged(position, userList.size - position) // 更新后续位置索引
|
||||||
Toast.makeText(this@LinkedUserActivity, "删除成功", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@LinkedUserActivity, "删除成功", Toast.LENGTH_SHORT).show()
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(this@LinkedUserActivity, response.msg, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@LinkedUserActivity, response.msg, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
resetSwipeState()
|
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
Toast.makeText(this@LinkedUserActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@LinkedUserActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
|
||||||
resetSwipeState()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resetSwipeState() {
|
|
||||||
if (currentSwipePosition >= 0 && currentSwipeHeld) {
|
|
||||||
binding.rvLinkedUser.post {
|
|
||||||
val viewHolder = binding.rvLinkedUser.findViewHolderForAdapterPosition(currentSwipePosition)
|
|
||||||
if (viewHolder is LinkedUserAdapter.LinkedUserViewHolder) {
|
|
||||||
viewHolder.getContentLayout().animate()
|
|
||||||
.translationX(0f)
|
|
||||||
.setDuration(300)
|
|
||||||
.start()
|
|
||||||
}
|
|
||||||
currentSwipePosition = -1
|
|
||||||
currentSwipeHeld = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initData() {
|
private fun initData() {
|
||||||
fetchUserList()
|
fetchUserList()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fetchUserList() {
|
private fun fetchUserList() {
|
||||||
|
binding.swipeRefresh.isRefreshing = true
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
try {
|
try {
|
||||||
val response = if (mode == MODE_SETTINGS) {
|
var deviceId: String? = null
|
||||||
val deviceId = DeviceIdEvent.getDeviceId()
|
if (mode == MODE_SETTINGS) {
|
||||||
|
deviceId = DeviceIdEvent.getDeviceId()
|
||||||
if (deviceId.isNullOrEmpty()) {
|
if (deviceId.isNullOrEmpty()) {
|
||||||
Toast.makeText(this@LinkedUserActivity, "设备 ID 为空", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@LinkedUserActivity, "设备 ID 为空", Toast.LENGTH_SHORT).show()
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
binding.swipeRefresh.isRefreshing = false
|
||||||
|
}
|
||||||
return@launch
|
return@launch
|
||||||
}
|
}
|
||||||
RetrofitNetwork.getNetworkService().getDeviceUserList(deviceId)
|
}
|
||||||
|
val response = if (mode == MODE_SETTINGS) {
|
||||||
|
RetrofitNetwork.getNetworkService().getDeviceUserList(deviceId!!)
|
||||||
} else {
|
} else {
|
||||||
RetrofitNetwork.getNetworkService().getFamilyMembers()
|
RetrofitNetwork.getNetworkService().getFamilyMembers()
|
||||||
}
|
}
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
binding.swipeRefresh.isRefreshing = false
|
||||||
if (response.code == 200 && response.data != null) {
|
if (response.code == 200 && response.data != null) {
|
||||||
if (mode == MODE_SETTINGS) {
|
if (mode == MODE_SETTINGS) {
|
||||||
updateDeviceUserList(response.data as List<DeviceUserBean>)
|
updateDeviceUserList(response.data as List<DeviceUserBean>)
|
||||||
@@ -310,6 +264,7 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
binding.swipeRefresh.isRefreshing = false
|
||||||
Toast.makeText(this@LinkedUserActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@LinkedUserActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -317,9 +272,9 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun updateDeviceUserList(deviceUserList: List<DeviceUserBean>) {
|
private fun updateDeviceUserList(deviceUserList: List<DeviceUserBean>) {
|
||||||
userList.clear()
|
fullUserList.clear()
|
||||||
deviceUserList.forEach { deviceUser ->
|
deviceUserList.forEach { deviceUser ->
|
||||||
userList.add(
|
fullUserList.add(
|
||||||
LinkedUser(
|
LinkedUser(
|
||||||
userId = deviceUser.userId ?: "",
|
userId = deviceUser.userId ?: "",
|
||||||
name = deviceUser.nickName ?: "未知用户",
|
name = deviceUser.nickName ?: "未知用户",
|
||||||
@@ -329,13 +284,13 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
adapter.submitList(userList)
|
filterUsers(binding.etSearch.text?.toString() ?: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateFamilyMembersList(familyMembersList: List<FamilyMembersBean>) {
|
private fun updateFamilyMembersList(familyMembersList: List<FamilyMembersBean>) {
|
||||||
userList.clear()
|
fullUserList.clear()
|
||||||
familyMembersList.forEach { member ->
|
familyMembersList.forEach { member ->
|
||||||
userList.add(
|
fullUserList.add(
|
||||||
LinkedUser(
|
LinkedUser(
|
||||||
userId = member.userId ?: "",
|
userId = member.userId ?: "",
|
||||||
name = member.nickName ?: member.parentName ?: "未知用户",
|
name = member.nickName ?: member.parentName ?: "未知用户",
|
||||||
@@ -345,6 +300,20 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
filterUsers(binding.etSearch.text?.toString() ?: "")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun filterUsers(keyword: String) {
|
||||||
|
userList.clear()
|
||||||
|
if (keyword.isEmpty()) {
|
||||||
|
userList.addAll(fullUserList)
|
||||||
|
} else {
|
||||||
|
val lowerKeyword = keyword.lowercase()
|
||||||
|
fullUserList.filter {
|
||||||
|
it.name.lowercase().contains(lowerKeyword) ||
|
||||||
|
it.phone.contains(keyword)
|
||||||
|
}.forEach { userList.add(it) }
|
||||||
|
}
|
||||||
adapter.submitList(userList)
|
adapter.submitList(userList)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,21 +322,41 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.searchLayout.setOnClickListener {
|
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() ?: "")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
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
|
||||||
@@ -380,18 +369,5 @@ class LinkedUserActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
if (requestCode == REQUEST_CODE_SEARCH && resultCode == RESULT_OK) {
|
|
||||||
data?.getStringExtra(EXTRA_SEARCH_RESULT)?.let { result ->
|
|
||||||
val newUser = LinkedUser(
|
|
||||||
userId = "",
|
|
||||||
name = result,
|
|
||||||
phone = "13800000000",
|
|
||||||
idCard = "110101199001011234",
|
|
||||||
time = "2026-05-10 ${android.text.format.DateFormat.format("HH:mm:ss", System.currentTimeMillis())}"
|
|
||||||
)
|
|
||||||
userList.add(0, newUser)
|
|
||||||
adapter.submitList(userList)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,32 @@
|
|||||||
package com.example.defenseapplication.liveVideo
|
package com.example.defenseapplication.liveVideo
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
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.ObtainInviterInformationRequest
|
||||||
|
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
|
||||||
|
import com.example.defenseapplication.personal.PasswordInputDialog
|
||||||
|
import com.example.defenseapplication.utils.DeviceIdEvent
|
||||||
|
import com.example.defenseapplication.utils.DeviceUserUpdateEvent
|
||||||
import com.example.defenseapplication.databinding.UserDetailsActivityBinding
|
import com.example.defenseapplication.databinding.UserDetailsActivityBinding
|
||||||
|
import com.example.defenseapplication.utils.RetrofitNetwork
|
||||||
import com.example.defenseapplication.view.CustomDialogFragmentText
|
import com.example.defenseapplication.view.CustomDialogFragmentText
|
||||||
import com.gyf.immersionbar.ImmersionBar
|
import com.gyf.immersionbar.ImmersionBar
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
//用户详情页面
|
//用户详情页面
|
||||||
class UserDetailsActivity : AppCompatActivity() {
|
class UserDetailsActivity : AppCompatActivity() {
|
||||||
private lateinit var binding: UserDetailsActivityBinding
|
private lateinit var binding: UserDetailsActivityBinding
|
||||||
|
|
||||||
private lateinit var userName: String
|
private var userId: String = ""
|
||||||
private lateinit var phone: String
|
private var isPasswordVerified: Boolean = false
|
||||||
private lateinit var idCard: String
|
private lateinit var passwordDialog: PasswordInputDialog
|
||||||
private lateinit var time: String
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -27,22 +39,45 @@ class UserDetailsActivity : AppCompatActivity() {
|
|||||||
.init()
|
.init()
|
||||||
|
|
||||||
initData()
|
initData()
|
||||||
initView()
|
|
||||||
initListener()
|
initListener()
|
||||||
|
fetchInviterInformation()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initData() {
|
private fun initData() {
|
||||||
userName = intent.getStringExtra("name") ?: ""
|
userId = intent.getStringExtra("userId") ?: ""
|
||||||
phone = intent.getStringExtra("phone") ?: ""
|
|
||||||
idCard = intent.getStringExtra("idCard") ?: ""
|
|
||||||
time = intent.getStringExtra("time") ?: ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initView() {
|
private fun fetchInviterInformation() {
|
||||||
binding.tvContactName.text = userName
|
if (userId.isEmpty()) {
|
||||||
binding.tvPhone.text = phone
|
Toast.makeText(this, "用户ID为空", Toast.LENGTH_SHORT).show()
|
||||||
binding.tvIdCard.text = idCard
|
return
|
||||||
binding.tvMacAddress.text = "AA:BB:CC:DD:EE:FF"
|
}
|
||||||
|
|
||||||
|
lifecycleScope.launch {
|
||||||
|
try {
|
||||||
|
val request = ObtainInviterInformationRequest(childId = userId)
|
||||||
|
val response = RetrofitNetwork.getNetworkService().obtainInviterInformation(request)
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
if (response.code == 200 && response.data != null) {
|
||||||
|
updateUI(response.data!!)
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this@UserDetailsActivity, response.msg ?: "获取信息失败", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
Toast.makeText(this@UserDetailsActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateUI(data: com.example.defenseapplication.bean.ObtainInviterInformationBean) {
|
||||||
|
binding.tvContactName.text = data.nickName ?: "未知用户"
|
||||||
|
binding.tvPhone.text = data.phonenumber ?: ""
|
||||||
|
binding.tvIdCard.text = data.idCard ?: ""
|
||||||
|
binding.tvMacAddress.text = data.mac ?: ""
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initListener() {
|
private fun initListener() {
|
||||||
@@ -51,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
|
||||||
// 关闭开关业务逻辑
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,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()
|
||||||
@@ -75,13 +144,47 @@ 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 {
|
||||||
finish()
|
if (isPasswordVerified) {
|
||||||
// if(){
|
deleteDeviceUser()
|
||||||
// ToastUtils.showSuccess(this, getString(R.string.wifi_connection_success)
|
} else {
|
||||||
// }else{
|
showPasswordDialog {
|
||||||
// ToastUtils.showError(this, getString(R.string.wifi_connection_failed))
|
isPasswordVerified = true
|
||||||
// }
|
deleteDeviceUser()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dialog.show(supportFragmentManager, "DeleteUserDialog")
|
dialog.show(supportFragmentManager, "DeleteUserDialog")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private fun deleteDeviceUser() {
|
||||||
|
val deviceId = DeviceIdEvent.getDeviceId()
|
||||||
|
if (deviceId.isNullOrEmpty() || userId.isEmpty()) {
|
||||||
|
Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT).show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
lifecycleScope.launch {
|
||||||
|
try {
|
||||||
|
val request = DeleteDeviceUserRequest(
|
||||||
|
userId = userId,
|
||||||
|
deviceId = deviceId
|
||||||
|
)
|
||||||
|
val response = RetrofitNetwork.getNetworkService().deleteDeviceUser(request)
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
if (response.code == 200) {
|
||||||
|
Toast.makeText(this@UserDetailsActivity, "删除成功", Toast.LENGTH_SHORT).show()
|
||||||
|
DeviceUserUpdateEvent.notifyUpdate()
|
||||||
|
finish()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this@UserDetailsActivity, response.msg ?: "删除失败", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
Toast.makeText(this@UserDetailsActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,40 +6,43 @@ import android.graphics.Bitmap
|
|||||||
import android.graphics.Canvas
|
import android.graphics.Canvas
|
||||||
import android.graphics.Color
|
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 android.widget.RadioButton
|
|
||||||
import android.widget.RadioGroup
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
|
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
|
||||||
import com.example.defenseapplication.databinding.DialogExpireTimeBinding
|
import com.example.defenseapplication.databinding.DialogExpireTimeBinding
|
||||||
import com.example.defenseapplication.databinding.InvitationCodeActivityBinding
|
import com.example.defenseapplication.databinding.InvitationCodeActivityBinding
|
||||||
|
import com.example.defenseapplication.utils.RetrofitNetwork
|
||||||
import com.google.zxing.BarcodeFormat
|
import com.google.zxing.BarcodeFormat
|
||||||
import com.google.zxing.EncodeHintType
|
import com.google.zxing.EncodeHintType
|
||||||
import com.google.zxing.qrcode.QRCodeWriter
|
import com.google.zxing.qrcode.QRCodeWriter
|
||||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
|
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
|
||||||
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 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
|
||||||
private var expireTimeInMillis: Long = 24 * 60 * 60 * 1000 // 默认24小时
|
private var expireTimeInMillis: Long = EXPIRE_24H // 默认24小时
|
||||||
private var selectedExpireOption: Int = 0 // 0: 24h, 1: 7d,默认选中24h
|
private var selectedExpireOption: Int = 0 // 0: 24h, 1: 7d,默认选中24h
|
||||||
private var generatedInviteCode: String = "" // 生成的邀请码
|
private var generatedInviteCode: String = "" // 生成的邀请码
|
||||||
private var expireTimestamp: Long = 0 // 过期时间戳
|
private var expireTimestamp: Long = 0 // 过期时间戳
|
||||||
private var qrCodeContent: String = "" // 生成的二维码内容
|
private var qrCodeContent: String = "" // 生成的二维码内容
|
||||||
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 hasGeneratedQrCode = false // 是否已经生成过二维码
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val EXPIRE_24H = 24 * 60 * 60 * 1000L
|
const val EXPIRE_24H = 24 * 60 * 60 * 1000L
|
||||||
@@ -57,10 +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)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initListener() {
|
private fun initListener() {
|
||||||
@@ -73,7 +78,7 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
binding.llWechatShare.setOnClickListener {
|
binding.llWechatShare.setOnClickListener {
|
||||||
// 防止多次点击(间隔1秒)
|
// 防止多次点击(间隔3秒)
|
||||||
val currentTime = System.currentTimeMillis()
|
val currentTime = System.currentTimeMillis()
|
||||||
if (currentTime - lastClickTime < 3000) {
|
if (currentTime - lastClickTime < 3000) {
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
@@ -82,6 +87,33 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
// 微信分享功能
|
// 微信分享功能
|
||||||
shareToWeChat()
|
shareToWeChat()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 撤销邀请按钮
|
||||||
|
binding.btnCancelInvite.setOnClickListener {
|
||||||
|
showPasswordDialog {
|
||||||
|
cancelInvitation()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成/重新生成按钮
|
||||||
|
binding.btnRegenerate.setOnClickListener {
|
||||||
|
showPasswordDialog {
|
||||||
|
generateOrRegenerateInvitation()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成或重新生成邀请码
|
||||||
|
*/
|
||||||
|
private fun generateOrRegenerateInvitation() {
|
||||||
|
// 根据当前选择的时效生成邀请码
|
||||||
|
generateQRCode()
|
||||||
|
showQrCode()
|
||||||
|
// 更新按钮文字为"重新生成"
|
||||||
|
binding.btnRegenerate.text = getString(R.string.regenerate)
|
||||||
|
hasGeneratedQrCode = true
|
||||||
|
ToastUtils.showSuccess(this, getString(R.string.operation_success))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showExpireTimeDialog() {
|
private fun showExpireTimeDialog() {
|
||||||
@@ -108,6 +140,7 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dialogBinding.tvConfirm.setOnClickListener {
|
dialogBinding.tvConfirm.setOnClickListener {
|
||||||
|
// 直接设置新的时效并生成二维码
|
||||||
when (selectedExpireOption) {
|
when (selectedExpireOption) {
|
||||||
0 -> {
|
0 -> {
|
||||||
expireTimeInMillis = EXPIRE_24H
|
expireTimeInMillis = EXPIRE_24H
|
||||||
@@ -118,7 +151,7 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
binding.tvExpireTime.text = getString(R.string.expire_7d)
|
binding.tvExpireTime.text = getString(R.string.expire_7d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 选择后显示二维码并生成
|
// 显示二维码并生成
|
||||||
showQrCode()
|
showQrCode()
|
||||||
generateQRCode()
|
generateQRCode()
|
||||||
expireTimeDialog?.dismiss()
|
expireTimeDialog?.dismiss()
|
||||||
@@ -128,40 +161,47 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun hideQrCode() {
|
private fun hideQrCode() {
|
||||||
// 隐藏二维码,显示灰色占位区域
|
|
||||||
binding.ivQrCode.visibility = View.GONE
|
binding.ivQrCode.visibility = View.GONE
|
||||||
binding.ivQrLogo.visibility = View.GONE
|
binding.ivQrLogo.visibility = View.GONE
|
||||||
binding.vQrPlaceholder.visibility = View.VISIBLE
|
binding.vQrPlaceholder.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showQrCode() {
|
private fun showQrCode() {
|
||||||
// 显示二维码,隐藏灰色占位区域
|
|
||||||
binding.vQrPlaceholder.visibility = View.GONE
|
binding.vQrPlaceholder.visibility = View.GONE
|
||||||
binding.ivQrCode.visibility = View.VISIBLE
|
binding.ivQrCode.visibility = View.VISIBLE
|
||||||
binding.ivQrLogo.visibility = View.VISIBLE
|
binding.ivQrLogo.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateQRCode() {
|
private fun generateQRCode() {
|
||||||
val content = 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateInviteCode(): String {
|
private fun generateInviteCode(): String {
|
||||||
// 生成包含邀请信息的JSON字符串
|
|
||||||
val timestamp = System.currentTimeMillis()
|
val timestamp = System.currentTimeMillis()
|
||||||
expireTimestamp = timestamp + expireTimeInMillis
|
expireTimestamp = timestamp + expireTimeInMillis
|
||||||
generatedInviteCode = "INV${timestamp}"
|
generatedInviteCode = "INV${timestamp}"
|
||||||
qrCodeContent = "{\"type\":\"invite\",\"code\":\"$generatedInviteCode\",\"expire\":$expireTimestamp}"
|
qrCodeContent = "{\"type\":\"invite\",\"code\":\"$generatedInviteCode\",\"expire\":$expireTimestamp}"
|
||||||
|
// 输出日志,方便调试验证
|
||||||
|
android.util.Log.d("InvitationCode", "生成的二维码内容: $qrCodeContent")
|
||||||
|
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>()
|
||||||
hints[EncodeHintType.CHARACTER_SET] = "UTF-8"
|
hints[EncodeHintType.CHARACTER_SET] = "UTF-8"
|
||||||
hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H
|
hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H
|
||||||
// 设置二维码边距为最小(1)
|
|
||||||
hints[EncodeHintType.MARGIN] = 1
|
hints[EncodeHintType.MARGIN] = 1
|
||||||
|
|
||||||
val writer = QRCodeWriter()
|
val writer = QRCodeWriter()
|
||||||
@@ -170,10 +210,8 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
val qrBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
val qrBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||||||
val canvas = Canvas(qrBitmap)
|
val canvas = Canvas(qrBitmap)
|
||||||
|
|
||||||
// 绘制白色背景
|
|
||||||
canvas.drawColor(Color.WHITE)
|
canvas.drawColor(Color.WHITE)
|
||||||
|
|
||||||
// 绘制二维码
|
|
||||||
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
|
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
|
||||||
paint.color = Color.BLACK
|
paint.color = Color.BLACK
|
||||||
|
|
||||||
@@ -194,10 +232,8 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 在二维码中间绘制logo
|
|
||||||
val logoDrawable = ContextCompat.getDrawable(this, R.mipmap.loge)
|
val logoDrawable = ContextCompat.getDrawable(this, R.mipmap.loge)
|
||||||
if (logoDrawable != null) {
|
if (logoDrawable != null) {
|
||||||
// logo大小为二维码的1/5
|
|
||||||
val logoSize = width / 5
|
val logoSize = width / 5
|
||||||
val logoX = (width - logoSize) / 2
|
val logoX = (width - logoSize) / 2
|
||||||
val logoY = (height - logoSize) / 2
|
val logoY = (height - logoSize) / 2
|
||||||
@@ -217,52 +253,57 @@ 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))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成分享海报
|
|
||||||
val shareBitmap = generateSharePoster()
|
val shareBitmap = generateSharePoster()
|
||||||
if (shareBitmap == null) {
|
if (shareBitmap == null) {
|
||||||
ToastUtils.showError(this, getString(R.string.share_failed))
|
ToastUtils.showError(this, getString(R.string.share_failed))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存图片到本地
|
|
||||||
val imagePath = saveBitmapToFile(shareBitmap)
|
val imagePath = saveBitmapToFile(shareBitmap)
|
||||||
if (imagePath.isEmpty()) {
|
if (imagePath.isEmpty()) {
|
||||||
ToastUtils.showError(this, getString(R.string.share_failed))
|
ToastUtils.showError(this, getString(R.string.share_failed))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用系统分享功能
|
|
||||||
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)
|
||||||
?: return null
|
?: return null
|
||||||
|
|
||||||
// 创建画布
|
|
||||||
val width = posterBackground.intrinsicWidth
|
val width = posterBackground.intrinsicWidth
|
||||||
val height = posterBackground.intrinsicHeight
|
val height = posterBackground.intrinsicHeight
|
||||||
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||||||
val canvas = Canvas(bitmap)
|
val canvas = Canvas(bitmap)
|
||||||
|
|
||||||
// 绘制背景图
|
|
||||||
posterBackground.setBounds(0, 0, width, height)
|
posterBackground.setBounds(0, 0, width, height)
|
||||||
posterBackground.draw(canvas)
|
posterBackground.draw(canvas)
|
||||||
|
|
||||||
// 使用已生成的二维码内容生成二维码
|
|
||||||
val qrCode = createQRCodeWithLogo(qrCodeContent, 300, 300)
|
val qrCode = createQRCodeWithLogo(qrCodeContent, 300, 300)
|
||||||
?: return bitmap
|
?: return bitmap
|
||||||
|
|
||||||
// 绘制二维码到海报上
|
|
||||||
val qrSize = (width * 0.38f).toInt()
|
val qrSize = (width * 0.38f).toInt()
|
||||||
val qrX = (width - qrSize) / 2
|
val qrX = (width - qrSize) / 2
|
||||||
val qrY = (height * 0.60f).toInt()
|
val qrY = (height * 0.60f).toInt()
|
||||||
@@ -270,54 +311,52 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
val scaledQr = Bitmap.createScaledBitmap(qrCode, qrSize, qrSize, true)
|
val scaledQr = Bitmap.createScaledBitmap(qrCode, qrSize, qrSize, true)
|
||||||
canvas.drawBitmap(scaledQr, qrX.toFloat(), qrY.toFloat(), null)
|
canvas.drawBitmap(scaledQr, qrX.toFloat(), qrY.toFloat(), null)
|
||||||
|
|
||||||
// 获取时效文本
|
|
||||||
val expireText = if (expireTimeInMillis == EXPIRE_24H) {
|
val expireText = if (expireTimeInMillis == EXPIRE_24H) {
|
||||||
getString(R.string.expire_24h)
|
getString(R.string.expire_24h)
|
||||||
} else {
|
} else {
|
||||||
getString(R.string.expire_7d)
|
getString(R.string.expire_7d)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制底部提示文字
|
|
||||||
val tipsText = getString(R.string.share_poster_tips, expireText)
|
val tipsText = getString(R.string.share_poster_tips, expireText)
|
||||||
val tipsPaint = android.text.TextPaint().apply {
|
val tipsPaint = android.text.TextPaint().apply {
|
||||||
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()
|
||||||
|
|
||||||
|
|
||||||
bitmap
|
bitmap
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
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)
|
||||||
@@ -334,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()) {
|
||||||
@@ -342,7 +388,6 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用 FileProvider 获取内容 URI
|
|
||||||
val authority = "${packageName}.fileprovider"
|
val authority = "${packageName}.fileprovider"
|
||||||
val contentUri = androidx.core.content.FileProvider.getUriForFile(this, authority, file)
|
val contentUri = androidx.core.content.FileProvider.getUriForFile(this, authority, file)
|
||||||
|
|
||||||
@@ -350,11 +395,9 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
type = "image/*"
|
type = "image/*"
|
||||||
putExtra(Intent.EXTRA_STREAM, contentUri)
|
putExtra(Intent.EXTRA_STREAM, contentUri)
|
||||||
putExtra(Intent.EXTRA_TEXT, getString(R.string.invite_friend))
|
putExtra(Intent.EXTRA_TEXT, getString(R.string.invite_friend))
|
||||||
// 授予读取权限
|
|
||||||
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||||
}
|
}
|
||||||
|
|
||||||
// 为所有匹配的应用授予权限
|
|
||||||
val resInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
|
val resInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
|
||||||
for (resolveInfo in resInfoList) {
|
for (resolveInfo in resInfoList) {
|
||||||
val packageName = resolveInfo.activityInfo.packageName
|
val packageName = resolveInfo.activityInfo.packageName
|
||||||
@@ -369,9 +412,61 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 撤销邀请
|
||||||
|
*/
|
||||||
|
private fun cancelInvitation() {
|
||||||
|
// 撤销邀请逻辑
|
||||||
|
hideQrCode()
|
||||||
|
generatedInviteCode = ""
|
||||||
|
qrCodeContent = ""
|
||||||
|
expireTimestamp = 0
|
||||||
|
hasGeneratedQrCode = false
|
||||||
|
// 恢复按钮文字为"生成邀请码"
|
||||||
|
binding.btnRegenerate.text = getString(R.string.generate_invite_code)
|
||||||
|
// 显示提示
|
||||||
|
ToastUtils.showSuccess(this, getString(R.string.operation_success))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示密码输入对话框
|
||||||
|
* @param onSuccess 验证成功后的回调
|
||||||
|
*/
|
||||||
|
private fun showPasswordDialog(onSuccess: () -> Unit) {
|
||||||
|
val dialog = PasswordInputDialog(this)
|
||||||
|
dialog.setTitle(getString(R.string.input_op_pwd))
|
||||||
|
dialog.setOnConfirmListener { password ->
|
||||||
|
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() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
// 关闭弹窗,防止内存泄漏
|
|
||||||
expireTimeDialog?.dismiss()
|
expireTimeDialog?.dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
@@ -8,18 +9,26 @@ import com.example.defenseapplication.bean.GetCodeBean
|
|||||||
import bean.LoginBean
|
import bean.LoginBean
|
||||||
import bean.LoginRequest
|
import bean.LoginRequest
|
||||||
import bean.RegisterRequest
|
import bean.RegisterRequest
|
||||||
|
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.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
|
||||||
@@ -69,7 +78,17 @@ 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
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加设备并绑定家庭
|
||||||
|
*/
|
||||||
|
@POST("/app/addDevice")
|
||||||
|
suspend fun addDevice(@Body deviceBean: AddDeviceBean): GetCodeBean<AddDeviceBean>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改设备信息
|
* 修改设备信息
|
||||||
@@ -171,6 +190,61 @@ interface ApiService {
|
|||||||
suspend fun logout(): GetCodeBean<Any>
|
suspend fun logout(): GetCodeBean<Any>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取邀请人信息
|
||||||
|
*/
|
||||||
|
@POST("/app/obtainInviterInformation")
|
||||||
|
suspend fun obtainInviterInformation(@Body request: ObtainInviterInformationRequest): GetCodeBean<ObtainInviterInformationBean>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询推荐码状态
|
||||||
|
*/
|
||||||
|
@POST("/app/selectRecommendationCode/{code}")
|
||||||
|
suspend fun selectRecommendationCode(@retrofit2.http.Path("code") code: String): GetCodeBean<Any>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成推荐码
|
||||||
|
*/
|
||||||
|
@POST("/app/generateRecommendationCode")
|
||||||
|
suspend fun generateRecommendationCode(@Body request: VerifyOptionPasswordRequest): GetCodeBean<Any>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 撤销邀请码
|
||||||
|
*/
|
||||||
|
@POST("/app/revokeInvitation")
|
||||||
|
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>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改家庭用户状态
|
||||||
|
*/
|
||||||
|
//@POST("/app/updateFamilyUser")
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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/bg_blue_border_round.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">
|
||||||
|
<solid android:color="@color/white" />
|
||||||
|
<stroke
|
||||||
|
android:width="1dp"
|
||||||
|
android:color="@color/green" />
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
</shape>
|
||||||
6
app/src/main/res/drawable/bg_blue_round.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="rectangle">
|
||||||
|
<solid android:color="@color/green" />
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
</shape>
|
||||||
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 |