From 5822e562deaee2bdcbd0a731be2e170e61165dc1 Mon Sep 17 00:00:00 2001 From: maxinyu Date: Tue, 2 Jun 2026 16:45:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=AF=86=E7=A0=81=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E4=BF=AE=E6=94=B92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 + .../personal/InvitationCodeActivity.kt | 165 ++++-------- .../personal/OperationPasswordActivity.kt | 236 +++++++++++------- .../personal/PasswordManagementActivity.kt | 52 +--- .../view/PasswordInputDialog.kt | 14 ++ .../res/layout/login_password_activity.xml | 6 +- .../layout/operation_password_activity.xml | 76 ++---- app/src/main/res/values-zh/strings.xml | 13 + app/src/main/res/values/strings.xml | 10 + 9 files changed, 261 insertions(+), 314 deletions(-) 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