Compare commits
12 Commits
ef4dfb0307
...
02fc928f20
| Author | SHA1 | Date | |
|---|---|---|---|
| 02fc928f20 | |||
| b67de551ba | |||
| e28e167085 | |||
| 8cd802a826 | |||
| 7e14dd379a | |||
| 4a584fa7d7 | |||
| a32c165424 | |||
| 9177c00a3c | |||
| e937ce207c | |||
| 4462ba5ba2 | |||
| 0672d762c9 | |||
| efbba44250 |
2
.idea/deploymentTargetSelector.xml
generated
@@ -4,7 +4,7 @@
|
|||||||
<selectionStates>
|
<selectionStates>
|
||||||
<SelectionState runConfigName="app">
|
<SelectionState runConfigName="app">
|
||||||
<option name="selectionMode" value="DROPDOWN" />
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
<DropdownSelection timestamp="2026-05-18T09:18:19.023586Z">
|
<DropdownSelection timestamp="2026-06-22T08:46:41.014465400Z">
|
||||||
<Target type="DEFAULT_BOOT">
|
<Target type="DEFAULT_BOOT">
|
||||||
<handle>
|
<handle>
|
||||||
<DeviceId pluginId="PhysicalDevice" identifier="serial=80bece4" />
|
<DeviceId pluginId="PhysicalDevice" identifier="serial=80bece4" />
|
||||||
|
|||||||
48
.kotlin/errors/errors-1782700916835.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-tsmarker16051875768763165132.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-1782787409833.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-tsmarker3580585840179793220.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-1782788041845.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-tsmarker11763075351170172587.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)
|
||||||
|
|
||||||
|
|
||||||
@@ -36,6 +36,11 @@ android {
|
|||||||
buildFeatures {
|
buildFeatures {
|
||||||
viewBinding=true
|
viewBinding=true
|
||||||
}
|
}
|
||||||
|
lint {
|
||||||
|
disable += "ExpiredTargetSdkVersion"
|
||||||
|
checkReleaseBuilds = false
|
||||||
|
abortOnError = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -69,14 +74,8 @@ dependencies {
|
|||||||
// Kotlin 协程
|
// Kotlin 协程
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
|
||||||
|
|
||||||
// CameraX 用于相机预览
|
|
||||||
implementation("androidx.camera:camera-camera2:1.3.0")
|
|
||||||
implementation("androidx.camera:camera-lifecycle:1.3.0")
|
|
||||||
implementation("androidx.camera:camera-view:1.3.0")
|
|
||||||
// Google ML Kit 人脸检测
|
// Google ML Kit 人脸检测
|
||||||
implementation("com.google.mlkit:face-detection:16.1.5")
|
implementation("com.google.mlkit:face-detection:16.1.5")
|
||||||
// 图形绘制库(绘制人脸框)
|
|
||||||
implementation("com.github.bumptech.glide:glide:4.15.1")
|
|
||||||
//Glide 依赖
|
//Glide 依赖
|
||||||
implementation("com.github.bumptech.glide:glide:4.16.0")
|
implementation("com.github.bumptech.glide:glide:4.16.0")
|
||||||
// ZXing 二维码扫描库
|
// ZXing 二维码扫描库
|
||||||
@@ -87,8 +86,6 @@ dependencies {
|
|||||||
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")
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ckkj.defense_device.bean
|
||||||
|
|
||||||
|
data class InviterInfoBean(
|
||||||
|
val nickName: String? = null,
|
||||||
|
val idCard: String? = null,
|
||||||
|
val phonenumber: String? = null,
|
||||||
|
val avatar: String? = null,
|
||||||
|
val id: String? = null,
|
||||||
|
val parentId: String? = null,
|
||||||
|
val userId: String? = null,
|
||||||
|
val mac: String? = null,
|
||||||
|
val status: String? = null,
|
||||||
|
) {
|
||||||
|
fun resolveParentId(): String? =
|
||||||
|
parentId?.takeIf { it.isNotBlank() }
|
||||||
|
?: userId?.takeIf { it.isNotBlank() }
|
||||||
|
?: id?.takeIf { it.isNotBlank() }
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ import android.content.pm.PackageManager
|
|||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.graphics.drawable.GradientDrawable
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
@@ -263,12 +263,7 @@ class HomeMenuFragment : Fragment() {
|
|||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
// 为 LinearLayout 设置渐变背景
|
binding.gradientLayout.setBackgroundColor(Color.TRANSPARENT)
|
||||||
setGradientBackground(
|
|
||||||
view = binding.gradientLayout,
|
|
||||||
startColor = resources.getColor(R.color.gradientLayout1),
|
|
||||||
endColor = resources.getColor(R.color.gradientLayout2)
|
|
||||||
)
|
|
||||||
binding.message.setOnClickListener {
|
binding.message.setOnClickListener {
|
||||||
val intent = Intent(requireContext(), MessageActivity::class.java)
|
val intent = Intent(requireContext(), MessageActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
@@ -589,17 +584,6 @@ class HomeMenuFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setGradientBackground(
|
|
||||||
view: View,
|
|
||||||
startColor: Int,
|
|
||||||
endColor: Int,
|
|
||||||
orientation: GradientDrawable.Orientation = GradientDrawable.Orientation.TL_BR
|
|
||||||
) {
|
|
||||||
val gradientDrawable = GradientDrawable(orientation, intArrayOf(startColor, endColor))
|
|
||||||
gradientDrawable.gradientType = GradientDrawable.LINEAR_GRADIENT
|
|
||||||
view.background = gradientDrawable
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
binding.rvFamilyList.adapter = null
|
binding.rvFamilyList.adapter = null
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class PersonalFragment : Fragment() {
|
|||||||
.titleBar(binding.headerLayout)
|
.titleBar(binding.headerLayout)
|
||||||
.init()
|
.init()
|
||||||
Glide.with(this)
|
Glide.with(this)
|
||||||
.load(R.mipmap.img)
|
.load("")
|
||||||
.circleCrop()
|
.circleCrop()
|
||||||
.into(binding.ivAvatar)
|
.into(binding.ivAvatar)
|
||||||
binding.headerLayout.setOnClickListener {
|
binding.headerLayout.setOnClickListener {
|
||||||
@@ -267,6 +267,7 @@ class PersonalFragment : Fragment() {
|
|||||||
} else {
|
} else {
|
||||||
getString(R.string.member)
|
getString(R.string.member)
|
||||||
}
|
}
|
||||||
|
binding.tvRoleTag.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,9 @@ class SetNameActivity : AppCompatActivity() {
|
|||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
if (result.code == 200) {
|
if (result.code == 200) {
|
||||||
Toast.makeText(this@SetNameActivity, "设备添加成功", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@SetNameActivity, "设备添加成功", Toast.LENGTH_SHORT).show()
|
||||||
startActivity(Intent(this@SetNameActivity, LiveVideoActivity::class.java))
|
startActivity(Intent(this@SetNameActivity, HomeActivity::class.java).apply {
|
||||||
|
putExtra(HomeActivity.EXTRA_REFRESH, true)
|
||||||
|
})
|
||||||
finish()
|
finish()
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(this@SetNameActivity, result.msg ?: "添加失败", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@SetNameActivity, result.msg ?: "添加失败", Toast.LENGTH_SHORT).show()
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class AutoModeActivity : AppCompatActivity() {
|
|||||||
private var selectedStartMinute = 0
|
private var selectedStartMinute = 0
|
||||||
private var selectedEndHour = 10
|
private var selectedEndHour = 10
|
||||||
private var selectedEndMinute = 0
|
private var selectedEndMinute = 0
|
||||||
|
private var optionPassword: String? = null
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -42,6 +43,8 @@ class AutoModeActivity : AppCompatActivity() {
|
|||||||
.titleBar(binding.topBar)
|
.titleBar(binding.topBar)
|
||||||
.init()
|
.init()
|
||||||
|
|
||||||
|
optionPassword = intent.getStringExtra("optionPassword")
|
||||||
|
|
||||||
initListener()
|
initListener()
|
||||||
|
|
||||||
loadCurrentSettings()
|
loadCurrentSettings()
|
||||||
@@ -177,7 +180,8 @@ class AutoModeActivity : AppCompatActivity() {
|
|||||||
id = deviceId,
|
id = deviceId,
|
||||||
workMode = selectedMode,
|
workMode = selectedMode,
|
||||||
startTime = startTime,
|
startTime = startTime,
|
||||||
endTime = endTime
|
endTime = endTime,
|
||||||
|
optionPassword = optionPassword
|
||||||
)
|
)
|
||||||
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
private var alertAudio: String? = null
|
private var alertAudio: String? = null
|
||||||
private var audioContent: String? = null
|
private var audioContent: String? = null
|
||||||
private var isPasswordVerified = false
|
private var isPasswordVerified = false
|
||||||
|
private var verifiedPassword: String? = null
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
@@ -55,15 +56,15 @@ class SettingsActivity : BaseActivity() {
|
|||||||
if (isPasswordVerified) {
|
if (isPasswordVerified) {
|
||||||
val dialog = RecognitionModeDialog(this)
|
val dialog = RecognitionModeDialog(this)
|
||||||
dialog.setOnConfirmListener { mode ->
|
dialog.setOnConfirmListener { mode ->
|
||||||
updateRecognitionMode(mode)
|
updateRecognitionMode(mode, verifiedPassword)
|
||||||
}
|
}
|
||||||
dialog.show()
|
dialog.show()
|
||||||
} else {
|
} else {
|
||||||
showPasswordDialog {
|
showPasswordDialog { inputPassword ->
|
||||||
isPasswordVerified = true
|
isPasswordVerified = true
|
||||||
val dialog = RecognitionModeDialog(this)
|
val dialog = RecognitionModeDialog(this)
|
||||||
dialog.setOnConfirmListener { mode ->
|
dialog.setOnConfirmListener { mode ->
|
||||||
updateRecognitionMode(mode)
|
updateRecognitionMode(mode, inputPassword)
|
||||||
}
|
}
|
||||||
dialog.show()
|
dialog.show()
|
||||||
}
|
}
|
||||||
@@ -94,22 +95,24 @@ class SettingsActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
binding.itemWaterGunSetting.setOnClickListener {
|
binding.itemWaterGunSetting.setOnClickListener {
|
||||||
if (isPasswordVerified) {
|
if (isPasswordVerified) {
|
||||||
navigateToWaterGunSettings()
|
navigateToWaterGunSettings(verifiedPassword)
|
||||||
} else {
|
} else {
|
||||||
showPasswordDialog {
|
showPasswordDialog { inputPassword ->
|
||||||
isPasswordVerified = true
|
isPasswordVerified = true
|
||||||
navigateToWaterGunSettings()
|
navigateToWaterGunSettings(inputPassword)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
binding.itemAutoMode.setOnClickListener {
|
binding.itemAutoMode.setOnClickListener {
|
||||||
if (isPasswordVerified) {
|
if (isPasswordVerified) {
|
||||||
val intent = Intent(this, AutoModeActivity::class.java)
|
val intent = Intent(this, AutoModeActivity::class.java)
|
||||||
|
intent.putExtra("optionPassword", verifiedPassword)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
} else {
|
} else {
|
||||||
showPasswordDialog {
|
showPasswordDialog { inputPassword ->
|
||||||
isPasswordVerified = true
|
isPasswordVerified = true
|
||||||
val intent = Intent(this, AutoModeActivity::class.java)
|
val intent = Intent(this, AutoModeActivity::class.java)
|
||||||
|
intent.putExtra("optionPassword", inputPassword)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -258,7 +261,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateRecognitionMode(mode: String) {
|
private fun updateRecognitionMode(mode: String, optionPassword: String?) {
|
||||||
val deviceId = DeviceIdEvent.getDeviceId()
|
val deviceId = DeviceIdEvent.getDeviceId()
|
||||||
if (deviceId.isNullOrEmpty()) {
|
if (deviceId.isNullOrEmpty()) {
|
||||||
Toast.makeText(this, "设备ID为空", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "设备ID为空", Toast.LENGTH_SHORT).show()
|
||||||
@@ -276,6 +279,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
val deviceBean = com.ckkj.defense_device.bean.DeviceBean(
|
val deviceBean = com.ckkj.defense_device.bean.DeviceBean(
|
||||||
id = deviceId,
|
id = deviceId,
|
||||||
patternPerception = patternPerception,
|
patternPerception = patternPerception,
|
||||||
|
optionPassword = optionPassword
|
||||||
)
|
)
|
||||||
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
@@ -328,7 +332,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showPasswordDialog(onVerified: () -> Unit) {
|
private fun showPasswordDialog(onVerified: (String) -> Unit) {
|
||||||
passwordDialog = PasswordInputDialog(this).apply {
|
passwordDialog = PasswordInputDialog(this).apply {
|
||||||
setOnConfirmListener { inputPassword ->
|
setOnConfirmListener { inputPassword ->
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
@@ -338,7 +342,8 @@ class SettingsActivity : BaseActivity() {
|
|||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
if (response.code == 200) {
|
if (response.code == 200) {
|
||||||
dismiss()
|
dismiss()
|
||||||
onVerified()
|
verifiedPassword = inputPassword
|
||||||
|
onVerified(inputPassword)
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
this@SettingsActivity,
|
this@SettingsActivity,
|
||||||
@@ -365,8 +370,9 @@ class SettingsActivity : BaseActivity() {
|
|||||||
passwordDialog.show()
|
passwordDialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun navigateToWaterGunSettings() {
|
private fun navigateToWaterGunSettings(optionPassword: String? = null) {
|
||||||
val intent = Intent(this, WaterGunSettingsActivity::class.java)
|
val intent = Intent(this, WaterGunSettingsActivity::class.java)
|
||||||
|
intent.putExtra("optionPassword", optionPassword)
|
||||||
val deviceId = DeviceIdEvent.getDeviceId()
|
val deviceId = DeviceIdEvent.getDeviceId()
|
||||||
if (!deviceId.isNullOrEmpty()) {
|
if (!deviceId.isNullOrEmpty()) {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class WaterGunSettingsActivity : BaseActivity() {
|
|||||||
private var currentStrikeRange: String = "7"
|
private var currentStrikeRange: String = "7"
|
||||||
private var currentStrikeInterval: String = "3"
|
private var currentStrikeInterval: String = "3"
|
||||||
private var currentContainer: String = "容器4"
|
private var currentContainer: String = "容器4"
|
||||||
|
private var optionPassword: String? = null
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -41,6 +42,7 @@ class WaterGunSettingsActivity : BaseActivity() {
|
|||||||
currentStrikeRange = intent.getStringExtra("strikeRange") ?: "7"
|
currentStrikeRange = intent.getStringExtra("strikeRange") ?: "7"
|
||||||
currentStrikeInterval = intent.getStringExtra("strikeInterval") ?: "3"
|
currentStrikeInterval = intent.getStringExtra("strikeInterval") ?: "3"
|
||||||
currentContainer = intent.getStringExtra("container") ?: "容器4"
|
currentContainer = intent.getStringExtra("container") ?: "容器4"
|
||||||
|
optionPassword = intent.getStringExtra("optionPassword")
|
||||||
|
|
||||||
// 显示初始值
|
// 显示初始值
|
||||||
binding.tvDistance.text = "${currentStrikeRange}m"
|
binding.tvDistance.text = "${currentStrikeRange}m"
|
||||||
@@ -100,7 +102,8 @@ class WaterGunSettingsActivity : BaseActivity() {
|
|||||||
try {
|
try {
|
||||||
val deviceBean = DeviceBean(
|
val deviceBean = DeviceBean(
|
||||||
id = deviceId,
|
id = deviceId,
|
||||||
strikeRange = distance
|
strikeRange = distance,
|
||||||
|
optionPassword = optionPassword
|
||||||
)
|
)
|
||||||
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
@@ -131,7 +134,8 @@ class WaterGunSettingsActivity : BaseActivity() {
|
|||||||
try {
|
try {
|
||||||
val deviceBean = DeviceBean(
|
val deviceBean = DeviceBean(
|
||||||
id = deviceId,
|
id = deviceId,
|
||||||
strikeInterval = interval
|
strikeInterval = interval,
|
||||||
|
optionPassword = optionPassword
|
||||||
)
|
)
|
||||||
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
@@ -162,7 +166,8 @@ class WaterGunSettingsActivity : BaseActivity() {
|
|||||||
try {
|
try {
|
||||||
val deviceBean = DeviceBean(
|
val deviceBean = DeviceBean(
|
||||||
id = deviceId,
|
id = deviceId,
|
||||||
container = container
|
container = container,
|
||||||
|
optionPassword = optionPassword
|
||||||
)
|
)
|
||||||
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
val response = RetrofitNetwork.getNetworkService().updateDeviceInfo(deviceBean)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
|||||||
@@ -108,11 +108,10 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
* 开始验证码按钮倒计时
|
* 开始验证码按钮倒计时
|
||||||
*/
|
*/
|
||||||
private fun startCountDown() {
|
private fun startCountDown() {
|
||||||
|
binding.sendCodeBtn.isEnabled = false
|
||||||
countDownTimer = object : CountDownTimer(COUNTDOWN_DURATION, COUNTDOWN_INTERVAL) {
|
countDownTimer = object : CountDownTimer(COUNTDOWN_DURATION, COUNTDOWN_INTERVAL) {
|
||||||
override fun onTick(millisUntilFinished: Long) {
|
override fun onTick(millisUntilFinished: Long) {
|
||||||
val secondsRemaining = (millisUntilFinished / 1000).toInt()
|
binding.sendCodeBtn.text = getString(R.string.countdown_retry, millisUntilFinished / 1000)
|
||||||
binding.sendCodeBtn.text = "${secondsRemaining}秒后重试"
|
|
||||||
binding.sendCodeBtn.isEnabled = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFinish() {
|
override fun onFinish() {
|
||||||
@@ -127,7 +126,7 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
private fun resetSendButton() {
|
private fun resetSendButton() {
|
||||||
countDownTimer?.cancel()
|
countDownTimer?.cancel()
|
||||||
countDownTimer = null
|
countDownTimer = null
|
||||||
binding.sendCodeBtn.text = "发送验证码"
|
binding.sendCodeBtn.text = getString(R.string.resend_code)
|
||||||
binding.sendCodeBtn.isEnabled = true
|
binding.sendCodeBtn.isEnabled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import bean.LoginRequest
|
|||||||
import com.ckkj.defense_device.R
|
import com.ckkj.defense_device.R
|
||||||
import com.ckkj.defense_device.databinding.ActivityLoginBinding
|
import com.ckkj.defense_device.databinding.ActivityLoginBinding
|
||||||
import com.ckkj.defense_device.home.HomeActivity
|
import com.ckkj.defense_device.home.HomeActivity
|
||||||
|
import com.ckkj.defense_device.utils.ApiConfig
|
||||||
import com.ckkj.defense_device.utils.RetrofitNetwork
|
import com.ckkj.defense_device.utils.RetrofitNetwork
|
||||||
import com.ckkj.defense_device.utils.UserinfoUtil
|
import com.ckkj.defense_device.utils.UserinfoUtil
|
||||||
import com.gyf.immersionbar.ImmersionBar
|
import com.gyf.immersionbar.ImmersionBar
|
||||||
@@ -27,11 +28,13 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private lateinit var binding: ActivityLoginBinding
|
private lateinit var binding: ActivityLoginBinding
|
||||||
private var currentLoginMode = LoginMode.SMS
|
private var currentLoginMode = LoginMode.SMS
|
||||||
|
private var countDownTimer: CountDownTimer? = null
|
||||||
|
|
||||||
enum class LoginMode { SMS, PASSWORD }
|
enum class LoginMode { SMS, PASSWORD }
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
ApiConfig.resetAuthRedirectFlag()
|
||||||
|
|
||||||
binding = ActivityLoginBinding.inflate(layoutInflater)
|
binding = ActivityLoginBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
@@ -167,25 +170,24 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
binding.registerText.setOnClickListener {
|
binding.registerText.setOnClickListener {
|
||||||
val intent= Intent(this, RegisterActivity::class.java)
|
val intent= Intent(this, RegisterActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
Toast.makeText(this, R.string.redirect_register_page, Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.forgetText.setOnClickListener {
|
binding.forgetText.setOnClickListener {
|
||||||
val intent= Intent(this, ForgetPasswordActivity::class.java)
|
val intent= Intent(this, ForgetPasswordActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
Toast.makeText(this, R.string.forgot_password_page, Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startCountDown() {
|
private fun startCountDown() {
|
||||||
binding.sendCodeBtn.isEnabled = false
|
binding.sendCodeBtn.isEnabled = false
|
||||||
object : CountDownTimer(60000, 1000) {
|
countDownTimer = object : CountDownTimer(60000, 1000) {
|
||||||
override fun onTick(millisUntilFinished: Long) {
|
override fun onTick(millisUntilFinished: Long) {
|
||||||
binding.sendCodeBtn.text = getString(R.string.countdown_retry, millisUntilFinished / 1000)
|
binding.sendCodeBtn.text = getString(R.string.countdown_retry, millisUntilFinished / 1000)
|
||||||
}
|
}
|
||||||
override fun onFinish() {
|
override fun onFinish() {
|
||||||
binding.sendCodeBtn.text = getString(R.string.send_code)
|
binding.sendCodeBtn.text = getString(R.string.resend_code)
|
||||||
binding.sendCodeBtn.isEnabled = true
|
binding.sendCodeBtn.isEnabled = true
|
||||||
|
countDownTimer = null
|
||||||
}
|
}
|
||||||
}.start()
|
}.start()
|
||||||
}
|
}
|
||||||
@@ -287,4 +289,10 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
gradientDrawable.gradientType = GradientDrawable.LINEAR_GRADIENT
|
gradientDrawable.gradientType = GradientDrawable.LINEAR_GRADIENT
|
||||||
view.background = gradientDrawable
|
view.background = gradientDrawable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
countDownTimer?.cancel()
|
||||||
|
countDownTimer = null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -100,11 +100,10 @@ class RegisterActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun startCountDown() {
|
private fun startCountDown() {
|
||||||
|
binding.sendCodeBtn.isEnabled = false
|
||||||
countDownTimer = object : CountDownTimer(COUNTDOWN_DURATION, COUNTDOWN_INTERVAL) {
|
countDownTimer = object : CountDownTimer(COUNTDOWN_DURATION, COUNTDOWN_INTERVAL) {
|
||||||
override fun onTick(millisUntilFinished: Long) {
|
override fun onTick(millisUntilFinished: Long) {
|
||||||
val secondsRemaining = (millisUntilFinished / 1000).toInt()
|
binding.sendCodeBtn.text = getString(R.string.countdown_retry, millisUntilFinished / 1000)
|
||||||
binding.sendCodeBtn.text = "${secondsRemaining}秒后重试"
|
|
||||||
binding.sendCodeBtn.isEnabled = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFinish() {
|
override fun onFinish() {
|
||||||
@@ -116,7 +115,7 @@ class RegisterActivity : AppCompatActivity() {
|
|||||||
private fun resetSendButton() {
|
private fun resetSendButton() {
|
||||||
countDownTimer?.cancel()
|
countDownTimer?.cancel()
|
||||||
countDownTimer = null
|
countDownTimer = null
|
||||||
binding.sendCodeBtn.text = getString(R.string.send_code)
|
binding.sendCodeBtn.text = getString(R.string.resend_code)
|
||||||
binding.sendCodeBtn.isEnabled = true
|
binding.sendCodeBtn.isEnabled = true
|
||||||
isSendingCode = false
|
isSendingCode = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ class RetrievePasswordActivity : AppCompatActivity() {
|
|||||||
override fun onFinish() {
|
override fun onFinish() {
|
||||||
isCountingDown = false
|
isCountingDown = false
|
||||||
binding.btnGetCode.isEnabled = true
|
binding.btnGetCode.isEnabled = true
|
||||||
binding.btnGetCode.text = getString(R.string.get_verification_code)
|
binding.btnGetCode.text = getString(R.string.resend_code)
|
||||||
}
|
}
|
||||||
}.start()
|
}.start()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
package com.ckkj.defense_device.utils
|
package com.ckkj.defense_device.utils
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
|
import com.blankj.utilcode.util.Utils
|
||||||
import com.ckkj.defense_device.bean.BaseInfo
|
import com.ckkj.defense_device.bean.BaseInfo
|
||||||
|
import com.ckkj.defense_device.login.LoginActivity
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.JsonParser
|
import com.google.gson.JsonParser
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
@@ -24,10 +30,17 @@ object ApiConfig {
|
|||||||
@Volatile
|
@Volatile
|
||||||
public var authToken: String = ""
|
public var authToken: String = ""
|
||||||
|
|
||||||
|
@Volatile
|
||||||
|
private var isRedirectingToLogin = false
|
||||||
|
|
||||||
fun updateAuthToken(token: String) {
|
fun updateAuthToken(token: String) {
|
||||||
authToken = token
|
authToken = token
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun resetAuthRedirectFlag() {
|
||||||
|
isRedirectingToLogin = false
|
||||||
|
}
|
||||||
|
|
||||||
fun hasAuthToken(): Boolean {
|
fun hasAuthToken(): Boolean {
|
||||||
return authToken.isNotBlank()
|
return authToken.isNotBlank()
|
||||||
}
|
}
|
||||||
@@ -116,8 +129,8 @@ object ApiConfig {
|
|||||||
val businessCode = if (jsonObject.has("code")) jsonObject.get("code").asInt else 0
|
val businessCode = if (jsonObject.has("code")) jsonObject.get("code").asInt else 0
|
||||||
|
|
||||||
if (httpCode == 401 || httpCode == 424 || businessCode == 401) {
|
if (httpCode == 401 || httpCode == 424 || businessCode == 401) {
|
||||||
clearUserLoginInfo()
|
|
||||||
val msg = if (jsonObject.has("msg")) jsonObject.get("msg").asString else "登录已过期,请重新登录"
|
val msg = if (jsonObject.has("msg")) jsonObject.get("msg").asString else "登录已过期,请重新登录"
|
||||||
|
redirectToLogin(msg)
|
||||||
return@Interceptor buildFakeErrorResponse(request, msg, code = if (businessCode != 0) businessCode else httpCode)
|
return@Interceptor buildFakeErrorResponse(request, msg, code = if (businessCode != 0) businessCode else httpCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,12 +192,36 @@ object ApiConfig {
|
|||||||
private fun buildAuthorizationValue(token: String): String {
|
private fun buildAuthorizationValue(token: String): String {
|
||||||
return if (token.startsWith("Bearer ")) token else "Bearer $token"
|
return if (token.startsWith("Bearer ")) token else "Bearer $token"
|
||||||
}
|
}
|
||||||
|
//401跳转登录界面
|
||||||
|
private fun redirectToLogin(msg: String) {
|
||||||
|
Handler(Looper.getMainLooper()).post {
|
||||||
|
if (isRedirectingToLogin) return@post
|
||||||
|
val current = ActivityManager.getCurrentActivity()
|
||||||
|
if (current is LoginActivity) return@post
|
||||||
|
|
||||||
|
isRedirectingToLogin = true
|
||||||
|
clearUserLoginInfo()
|
||||||
|
|
||||||
|
val context = current ?: Utils.getApp()
|
||||||
|
ActivityManager.finishAllActivities()
|
||||||
|
|
||||||
|
val intent = Intent(context, LoginActivity::class.java).apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||||
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
|
||||||
|
if (msg.isNotBlank()) {
|
||||||
|
Toast.makeText(Utils.getApp(), msg, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun clearUserLoginInfo() {
|
private fun clearUserLoginInfo() {
|
||||||
try {
|
try {
|
||||||
authToken = ""
|
UserinfoUtil.clearUserInfo()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
|
authToken = ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
5
app/src/main/res/color/send_code_text_color.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:state_enabled="false" android:color="@color/white"/>
|
||||||
|
<item android:color="@color/white"/>
|
||||||
|
</selector>
|
||||||
15
app/src/main/res/drawable/send_code_btn_selector.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:state_enabled="false">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="@color/gray"/>
|
||||||
|
<corners android:radius="16dp"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="@color/green"/>
|
||||||
|
<corners android:radius="16dp"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</selector>
|
||||||
@@ -156,16 +156,17 @@
|
|||||||
<!-- 发送验证码按钮 -->
|
<!-- 发送验证码按钮 -->
|
||||||
<android.widget.Button
|
<android.widget.Button
|
||||||
android:id="@+id/sendCodeBtn"
|
android:id="@+id/sendCodeBtn"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="110dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="36dp"
|
||||||
|
android:minWidth="0dp"
|
||||||
|
android:minHeight="0dp"
|
||||||
android:text="@string/send_sms_code"
|
android:text="@string/send_sms_code"
|
||||||
android:textSize="16sp"
|
android:textSize="14sp"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/send_code_text_color"
|
||||||
android:background="@drawable/rounded_blue_bg"
|
android:background="@drawable/send_code_btn_selector"
|
||||||
android:paddingHorizontal="12dp"
|
|
||||||
android:maxWidth="120dp"
|
|
||||||
android:elevation="0dp"
|
android:elevation="0dp"
|
||||||
android:stateListAnimator="@null"
|
android:stateListAnimator="@null"
|
||||||
|
android:gravity="center"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
|||||||
@@ -15,9 +15,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent">
|
||||||
android:paddingStart="16dp"
|
|
||||||
android:paddingEnd="16dp">
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/backIcon"
|
android:id="@+id/backIcon"
|
||||||
android:layout_width="24dp"
|
android:layout_width="24dp"
|
||||||
@@ -142,19 +140,20 @@
|
|||||||
<!-- 发送验证码按钮 -->
|
<!-- 发送验证码按钮 -->
|
||||||
<android.widget.Button
|
<android.widget.Button
|
||||||
android:id="@+id/sendCodeBtn"
|
android:id="@+id/sendCodeBtn"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="110dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="36dp"
|
||||||
android:text="@string/send_code"
|
android:minWidth="0dp"
|
||||||
android:textSize="16sp"
|
android:minHeight="0dp"
|
||||||
|
android:text="@string/send_sms_code"
|
||||||
|
android:textSize="14sp"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:background="@drawable/rounded_blue_bg"
|
android:background="@drawable/send_code_btn_selector"
|
||||||
android:paddingHorizontal="12dp"
|
android:elevation="0dp"
|
||||||
android:maxWidth="120dp"
|
android:stateListAnimator="@null"
|
||||||
|
android:gravity="center"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
android:elevation="0dp"
|
|
||||||
android:stateListAnimator="@null"
|
|
||||||
android:layout_marginStart="12dp" />
|
android:layout_marginStart="12dp" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="@mipmap/home_back"
|
||||||
tools:context=".home.HomeMenuFragment">
|
tools:context=".home.HomeMenuFragment">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@@ -136,8 +137,12 @@
|
|||||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
android:id="@+id/swipeRefreshLayout"
|
android:id="@+id/swipeRefreshLayout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
android:layout_marginLeft="12dp"
|
||||||
|
android:layout_marginRight="12dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1">
|
android:layout_weight="1"
|
||||||
|
android:background="@android:color/transparent">
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/rvDeviceList"
|
android:id="@+id/rvDeviceList"
|
||||||
@@ -149,6 +154,7 @@
|
|||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:nestedScrollingEnabled="false"
|
android:nestedScrollingEnabled="false"
|
||||||
android:paddingBottom="16dp"
|
android:paddingBottom="16dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
tools:listitem="@layout/item_device" />
|
tools:listitem="@layout/item_device" />
|
||||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -197,9 +197,10 @@
|
|||||||
<!-- 底部按钮区域 -->
|
<!-- 底部按钮区域 -->
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_weight="1"
|
||||||
|
android:layout_height="0dp"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:layout_marginTop="42dp"
|
android:layout_gravity="bottom"
|
||||||
android:layout_marginBottom="10dp"
|
android:layout_marginBottom="10dp"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:gravity="bottom">
|
android:gravity="bottom">
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
android:id="@+id/tvNickname"
|
android:id="@+id/tvNickname"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/enter_nickname"
|
android:text=""
|
||||||
android:textColor="@color/black"
|
android:textColor="@color/black"
|
||||||
android:textSize="16dp"
|
android:textSize="16dp"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
@@ -54,10 +54,11 @@
|
|||||||
android:background="@drawable/rounded_blue_bg"
|
android:background="@drawable/rounded_blue_bg"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:paddingHorizontal="8dp"
|
android:paddingHorizontal="8dp"
|
||||||
android:text="@string/admin"
|
android:text=""
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:textSize="11sp"
|
android:textSize="11sp"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold"
|
||||||
|
android:visibility="gone"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
@@ -65,7 +66,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="4dp"
|
android:layout_marginTop="4dp"
|
||||||
android:text="13589898989"
|
android:text=""
|
||||||
android:textColor="#666666"
|
android:textColor="#666666"
|
||||||
android:textSize="16dp" />
|
android:textSize="16dp" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@@ -140,16 +140,17 @@
|
|||||||
<!-- 发送验证码按钮 -->
|
<!-- 发送验证码按钮 -->
|
||||||
<android.widget.Button
|
<android.widget.Button
|
||||||
android:id="@+id/sendCodeBtn"
|
android:id="@+id/sendCodeBtn"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="110dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="36dp"
|
||||||
|
android:minWidth="0dp"
|
||||||
|
android:minHeight="0dp"
|
||||||
android:text="@string/send_sms_code"
|
android:text="@string/send_sms_code"
|
||||||
android:textSize="16sp"
|
android:textSize="14sp"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:background="@drawable/rounded_blue_bg"
|
android:background="@drawable/send_code_btn_selector"
|
||||||
android:paddingHorizontal="12dp"
|
|
||||||
android:maxWidth="120dp"
|
|
||||||
android:elevation="0dp"
|
android:elevation="0dp"
|
||||||
android:stateListAnimator="@null"
|
android:stateListAnimator="@null"
|
||||||
|
android:gravity="center"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
|||||||
@@ -82,17 +82,19 @@
|
|||||||
|
|
||||||
<android.widget.Button
|
<android.widget.Button
|
||||||
android:id="@+id/btnGetCode"
|
android:id="@+id/btnGetCode"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="110dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="36dp"
|
||||||
|
android:minWidth="0dp"
|
||||||
|
android:minHeight="0dp"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginRight="8dp"
|
||||||
android:background="@drawable/rounded_blue_bg"
|
android:background="@drawable/send_code_btn_selector"
|
||||||
android:paddingHorizontal="16dp"
|
android:text="@string/send_sms_code"
|
||||||
android:text="@string/get_verification_code"
|
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:elevation="0dp"
|
android:elevation="0dp"
|
||||||
android:stateListAnimator="@null"
|
android:stateListAnimator="@null"
|
||||||
|
android:gravity="center"
|
||||||
android:textSize="14sp" />
|
android:textSize="14sp" />
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -77,6 +77,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/save"
|
android:text="@string/save"
|
||||||
|
android:textColor="@color/white"
|
||||||
android:layout_marginEnd="20dp"
|
android:layout_marginEnd="20dp"
|
||||||
android:layout_marginStart="20dp"
|
android:layout_marginStart="20dp"
|
||||||
android:layout_marginBottom="90dp"
|
android:layout_marginBottom="90dp"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 592 B After Width: | Height: | Size: 901 B |
BIN
app/src/main/res/mipmap-xhdpi/home_back.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 592 B After Width: | Height: | Size: 1.7 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/home_back.png
Normal file
|
After Width: | Height: | Size: 183 KiB |
|
Before Width: | Height: | Size: 592 B After Width: | Height: | Size: 1.3 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/home_back.png
Normal file
|
After Width: | Height: | Size: 296 KiB |
@@ -2,7 +2,7 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<!-- App Name -->
|
<!-- App Name -->
|
||||||
<string name="app_name">防御器</string>
|
<string name="app_name">防御机</string>
|
||||||
|
|
||||||
<!-- Common -->
|
<!-- Common -->
|
||||||
<string name="confirm">确定</string>
|
<string name="confirm">确定</string>
|
||||||
@@ -340,6 +340,7 @@
|
|||||||
<string name="enter_phone_number">请输入手机号</string>
|
<string name="enter_phone_number">请输入手机号</string>
|
||||||
<string name="enter_verification_code">请输入验证码</string>
|
<string name="enter_verification_code">请输入验证码</string>
|
||||||
<string name="send_code">发送验证码</string>
|
<string name="send_code">发送验证码</string>
|
||||||
|
<string name="resend_code">重新发送</string>
|
||||||
<string name="enter_new_password">请输入新密码</string>
|
<string name="enter_new_password">请输入新密码</string>
|
||||||
<string name="enter_password_again">请再次输入新密码</string>
|
<string name="enter_password_again">请再次输入新密码</string>
|
||||||
<string name="determine">确定</string>
|
<string name="determine">确定</string>
|
||||||
|
|||||||
@@ -329,6 +329,7 @@
|
|||||||
<string name="enter_phone_number">Enter phone number</string>
|
<string name="enter_phone_number">Enter phone number</string>
|
||||||
<string name="enter_verification_code">Enter verification code</string>
|
<string name="enter_verification_code">Enter verification code</string>
|
||||||
<string name="send_code">Send Code</string>
|
<string name="send_code">Send Code</string>
|
||||||
|
<string name="resend_code">Resend</string>
|
||||||
<string name="enter_new_password">Enter new password</string>
|
<string name="enter_new_password">Enter new password</string>
|
||||||
<string name="enter_password_again">Enter password again</string>
|
<string name="enter_password_again">Enter password again</string>
|
||||||
<string name="determine">Confirm</string>
|
<string name="determine">Confirm</string>
|
||||||
|
|||||||