diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3dac209..6b9d989 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -27,6 +27,9 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DefenseApplication">
+
diff --git a/app/src/main/java/com/example/defenseapplication/personal/InvitationCodeActivity.kt b/app/src/main/java/com/example/defenseapplication/personal/InvitationCodeActivity.kt
index 624e44e..1ff538f 100644
--- a/app/src/main/java/com/example/defenseapplication/personal/InvitationCodeActivity.kt
+++ b/app/src/main/java/com/example/defenseapplication/personal/InvitationCodeActivity.kt
@@ -8,7 +8,6 @@ import android.graphics.Color
import android.graphics.Paint
import android.os.Bundle
import android.os.Environment
-import android.text.TextPaint
import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.app.AppCompatActivity
@@ -43,6 +42,7 @@ class InvitationCodeActivity : AppCompatActivity() {
private var lastClickTime: Long = 0 // 上次点击时间,用于防止多次点击
private var expireTimeDialog: BottomSheetDialog? = null // 时效选择弹窗
private var isLoading = false // 是否正在加载
+ private var hasGeneratedQrCode = false // 是否已经生成过二维码
companion object {
const val EXPIRE_24H = 24 * 60 * 60 * 1000L
@@ -64,9 +64,8 @@ class InvitationCodeActivity : AppCompatActivity() {
binding.tvExpireTime.text = getString(R.string.expire_24h)
// 默认显示灰色占位区域,二维码不可见
hideQrCode()
-
- // 页面加载时查询推荐码状态
- queryRecommendationCodeStatus()
+ // 初始按钮文字为"生成二维码"
+ binding.btnRegenerate.text = getString(R.string.generate_invite_code)
}
private fun initListener() {
@@ -91,116 +90,30 @@ class InvitationCodeActivity : AppCompatActivity() {
// 撤销邀请按钮
binding.btnCancelInvite.setOnClickListener {
- cancelInvitation()
+ showPasswordDialog {
+ cancelInvitation()
+ }
}
- // 重新生成按钮
+ // 生成/重新生成按钮
binding.btnRegenerate.setOnClickListener {
- regenerateInvitation()
- }
- }
-
- /**
- * 查询推荐码状态
- */
- private fun queryRecommendationCodeStatus() {
- isLoading = true
- CoroutineScope(Dispatchers.IO).launch {
- try {
- // 注意:接口需要传入code参数,但我们可能不知道当前的推荐码
- // 这里使用空字符串或默认值进行查询
- val response = RetrofitNetwork.getNetworkService().selectRecommendationCode("")
- withContext(Dispatchers.Main) {
- isLoading = false
- if (response.code == 200) {
- // 有推荐码,解析返回的数据
- handleRecommendationCodeResponse(response.data)
- } else {
- // 没有推荐码或查询失败,生成默认24小时的推荐码
- generateDefaultRecommendationCode()
- }
- }
- } catch (e: Exception) {
- e.printStackTrace()
- withContext(Dispatchers.Main) {
- isLoading = false
- // 网络异常,生成默认24小时的推荐码
- generateDefaultRecommendationCode()
- }
+ showPasswordDialog {
+ generateOrRegenerateInvitation()
}
}
}
/**
- * 处理推荐码查询响应
+ * 生成或重新生成邀请码
*/
- private fun handleRecommendationCodeResponse(data: Any?) {
- // 解析返回的数据,获取推荐码和过期时间
- // 这里需要根据实际接口返回格式进行解析
- if (data is Map<*, *>) {
- generatedInviteCode = data["code"]?.toString() ?: ""
- expireTimestamp = data["expireTime"]?.toString()?.toLongOrNull() ?: 0L
-
- // 检查推荐码是否过期
- if (expireTimestamp > 0 && System.currentTimeMillis() < expireTimestamp) {
- // 推荐码有效,显示二维码
- qrCodeContent = "{\"type\":\"invite\",\"code\":\"$generatedInviteCode\",\"expire\":$expireTimestamp}"
- showQrCode()
- generateQRCode()
-
- // 根据过期时间设置显示的时效
- val remainingTime = expireTimestamp - System.currentTimeMillis()
- if (remainingTime > EXPIRE_24H) {
- // 超过24小时,认为是7天的
- expireTimeInMillis = EXPIRE_7D
- selectedExpireOption = 1
- binding.tvExpireTime.text = getString(R.string.expire_7d)
- } else {
- expireTimeInMillis = EXPIRE_24H
- selectedExpireOption = 0
- binding.tvExpireTime.text = getString(R.string.expire_24h)
- }
- } else {
- // 推荐码已过期,生成新的默认24小时推荐码
- generateDefaultRecommendationCode()
- }
- } else {
- // 数据格式不对,生成新的推荐码
- generateDefaultRecommendationCode()
- }
- }
-
- /**
- * 生成默认24小时的推荐码
- */
- private fun generateDefaultRecommendationCode() {
- expireTimeInMillis = EXPIRE_24H
- selectedExpireOption = 0
- binding.tvExpireTime.text = getString(R.string.expire_24h)
-
- // 生成推荐码(本地生成,实际应该调用API)
+ private fun generateOrRegenerateInvitation() {
+ // 根据当前选择的时效生成邀请码
generateQRCode()
showQrCode()
- }
-
- /**
- * 处理生成推荐码成功
- */
- private fun handleGenerateSuccess(data: Any?, expireDays: Int) {
- // 解析返回的数据
- if (data is Map<*, *>) {
- generatedInviteCode = data["code"]?.toString() ?: ""
- expireTimestamp = data["expireTime"]?.toString()?.toLongOrNull() ?: (System.currentTimeMillis() + expireTimeInMillis)
- qrCodeContent = "{\"type\":\"invite\",\"code\":\"$generatedInviteCode\",\"expire\":$expireTimestamp}"
-
- showQrCode()
- generateQRCode()
- } else {
- // 如果接口没有返回推荐码,本地生成一个
- generateInviteCode()
- showQrCode()
- generateQRCode()
- }
+ // 更新按钮文字为"重新生成"
+ binding.btnRegenerate.text = getString(R.string.regenerate)
+ hasGeneratedQrCode = true
+ ToastUtils.showSuccess(this, getString(R.string.operation_success))
}
private fun showExpireTimeDialog() {
@@ -260,7 +173,9 @@ class InvitationCodeActivity : AppCompatActivity() {
}
private fun generateQRCode() {
- val content = if (qrCodeContent.isNotEmpty()) qrCodeContent else generateInviteCode()
+ // 检查二维码是否过期,如果过期则生成新的邀请码
+ val isExpired = expireTimestamp > 0 && System.currentTimeMillis() > expireTimestamp
+ val content = if (qrCodeContent.isNotEmpty() && !isExpired) qrCodeContent else generateInviteCode()
val qrBitmap = createQRCodeWithLogo(content, 400, 400)
binding.ivQrCode.setImageBitmap(qrBitmap)
}
@@ -476,18 +391,48 @@ class InvitationCodeActivity : AppCompatActivity() {
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 regenerateInvitation() {
- // 根据当前选择的时效重新生成邀请码
- generateQRCode()
- showQrCode()
- ToastUtils.showSuccess(this, getString(R.string.operation_success))
+ 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() {
diff --git a/app/src/main/java/com/example/defenseapplication/personal/OperationPasswordActivity.kt b/app/src/main/java/com/example/defenseapplication/personal/OperationPasswordActivity.kt
index a3ff8e0..8e77874 100644
--- a/app/src/main/java/com/example/defenseapplication/personal/OperationPasswordActivity.kt
+++ b/app/src/main/java/com/example/defenseapplication/personal/OperationPasswordActivity.kt
@@ -1,15 +1,16 @@
package com.example.defenseapplication.personal
import android.os.Bundle
-import android.text.Editable
-import android.text.TextWatcher
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
-import com.blankj.utilcode.util.SPUtils
import com.example.defenseapplication.R
import com.example.defenseapplication.bean.UpdateUserInfo
+import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.databinding.OperationPasswordActivityBinding
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 kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -20,6 +21,7 @@ import kotlinx.coroutines.withContext
class OperationPasswordActivity : AppCompatActivity() {
private lateinit var binding: OperationPasswordActivityBinding
+ private var isLoading = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -31,6 +33,7 @@ class OperationPasswordActivity : AppCompatActivity() {
.titleBar(binding.topBar)
.init()
+ getUserInfo()
initListener()
}
@@ -39,104 +42,151 @@ class OperationPasswordActivity : AppCompatActivity() {
finish()
}
- binding.swOperationPassword.setOnCheckedChangeListener { _, isChecked ->
- when (isChecked) {
- 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.changePassword.setOnClickListener {
+ showOldPasswordDialog()
}
- binding.etPassword.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?) {
+ binding.swOperationPassword.setOnCheckedChangeListener { _, isChecked ->
+ if (!isLoading) {
+ updateOptionStatus(isChecked)
}
- })
+ }
+ }
- binding.etConfirmPassword.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?) {
- }
- })
-
- binding.btnConfirmReset.setOnClickListener {
- 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()
+ private fun getUserInfo() {
+ isLoading = true
+ CoroutineScope(Dispatchers.IO).launch {
+ try {
+ val response = RetrofitNetwork.getNetworkService().getUserInfo()
+ withContext(Dispatchers.Main) {
+ isLoading = false
+ if (response.code == 200) {
+ response.data?.optionStatus?.let { status ->
+ binding.swOperationPassword.isChecked = status == "0"
}
+ } else {
+ Toast.makeText(this@OperationPasswordActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
}
- } catch (e: Exception) {
- withContext(Dispatchers.Main) {
- binding.btnConfirmReset.isEnabled = true
- Toast.makeText(this@OperationPasswordActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
- }
+ }
+ } catch (e: Exception) {
+ withContext(Dispatchers.Main) {
+ 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()
+ })
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/defenseapplication/personal/PasswordManagementActivity.kt b/app/src/main/java/com/example/defenseapplication/personal/PasswordManagementActivity.kt
index 0de2230..191244d 100644
--- a/app/src/main/java/com/example/defenseapplication/personal/PasswordManagementActivity.kt
+++ b/app/src/main/java/com/example/defenseapplication/personal/PasswordManagementActivity.kt
@@ -2,23 +2,13 @@ package com.example.defenseapplication.personal
import android.content.Intent
import android.os.Bundle
-import android.widget.Toast
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.utils.RetrofitNetwork
import com.gyf.immersionbar.ImmersionBar
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
//密码管理
class PasswordManagementActivity : AppCompatActivity() {
private lateinit var binding: PasswordManagementActivityBinding
- private lateinit var passwordDialog: PasswordInputDialog
-
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = PasswordManagementActivityBinding.inflate(layoutInflater)
@@ -34,50 +24,12 @@ class PasswordManagementActivity : AppCompatActivity() {
}
binding.loginPassword.setOnClickListener {
- startActivity(Intent(this, ChangePasswordActivity::class.java))
+ startActivity(Intent(this, LoginPasswordActivity::class.java))
}
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()
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/defenseapplication/view/PasswordInputDialog.kt b/app/src/main/java/com/example/defenseapplication/view/PasswordInputDialog.kt
index 7e61a7a..225beab 100644
--- a/app/src/main/java/com/example/defenseapplication/view/PasswordInputDialog.kt
+++ b/app/src/main/java/com/example/defenseapplication/view/PasswordInputDialog.kt
@@ -22,6 +22,7 @@ class PasswordInputDialog(context: Context) : Dialog(context) {
private lateinit var binding: DialogPasswordInputBinding
private var onConfirmListener: ((String) -> Unit)? = null
private var onDismissListener: (() -> Unit)? = null
+ private var customTitle: String? = null
// 6个密码输入框数组
private lateinit var passwordEditTexts: Array
@@ -61,6 +62,11 @@ class PasswordInputDialog(context: Context) : Dialog(context) {
setupPasswordInput()
+ // 设置标题(如果通过 setTitle 设置了自定义标题)
+ customTitle?.let {
+ binding.tvTitle.text = it
+ }
+
binding.ivClose.setOnClickListener {
dismiss()
}
@@ -239,6 +245,14 @@ class PasswordInputDialog(context: Context) : Dialog(context) {
return this
}
+ fun setTitle(title: String): PasswordInputDialog {
+ this.customTitle = title
+ if (::binding.isInitialized) {
+ binding.tvTitle.text = title
+ }
+ return this
+ }
+
fun setOnDismissListener(listener: () -> Unit): PasswordInputDialog {
this.onDismissListener = listener
return this
diff --git a/app/src/main/res/layout/login_password_activity.xml b/app/src/main/res/layout/login_password_activity.xml
index f210303..d727483 100644
--- a/app/src/main/res/layout/login_password_activity.xml
+++ b/app/src/main/res/layout/login_password_activity.xml
@@ -6,6 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
+ android:background="@color/white"
tools:context=".personal.LoginPasswordActivity">
@@ -28,7 +29,6 @@
android:layout_weight="1"
android:gravity="center"
android:text="@string/password_management"
- android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
@@ -36,7 +36,6 @@
android:id="@+id/change_password"
android:layout_width="match_parent"
android:layout_height="60dp"
- android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
@@ -45,7 +44,6 @@
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/change_password"
- android:textColor="@color/black"
android:textSize="16dp" />
@@ -67,7 +64,6 @@
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/retrieve_password"
- android:textColor="@color/black"
android:textSize="16dp" />
@@ -44,8 +44,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/operation_password_switch"
- android:textSize="14dp"/>
-
+ android:textSize="16dp" />
+
-
-
+ android:layout_height="60dp"
+ android:gravity="center_vertical"
+ android:orientation="horizontal"
+ android:paddingHorizontal="16dp">
-
-
-
-
+ android:layout_weight="1"
+ android:text="@string/change_password"
+ android:textSize="16dp" />
-
-
+
-
-
+
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index bb960cb..46140b5 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -324,6 +324,7 @@
采集人脸
登录密码
找回密码
+ 请输入新操作密码|
操作密码
请输入手机号
请输入验证码
@@ -440,6 +441,7 @@
重新生成
设备编号
固件版本
+ 生成邀请码
未设置
@@ -475,4 +477,15 @@
最多添加11个用户
手机号码:%s
身份证号:%s
+ 向上移动
+ 向下移动
+ 向左移动
+ 向右移动
+
+
+ 请先开启操作密码
+ 确定要关闭操作密码吗?
+ 验证失败
+ 密码修改成功
+ 密码修改失败
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index dc0b66c..06fa8f0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -232,6 +232,7 @@
Scan code to join via smart defense management APP
Cancel Invitation
Regenerate
+ Generate Invite Code
Tip
@@ -308,6 +309,7 @@
Please align your face within the circular area
Collect Face
Login Password
+ Enter new operation password
Enter old password
Confirm Reset Password
Retrieve Password
@@ -485,4 +487,12 @@
Move Down
Move Left
Move Right
+
+
+ Please enable operation password first
+ Are you sure you want to disable operation password?
+ Verification failed
+ Password updated successfully
+ Failed to update password
+ Update failed
\ No newline at end of file