操作密码弹窗修改

This commit is contained in:
2026-06-02 11:59:36 +08:00
parent a1ff4d100a
commit a1b9acb2a6
13 changed files with 479 additions and 213 deletions

View File

@@ -21,7 +21,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import androidx.recyclerview.widget.RecyclerView
//添加关联用户
//添加关联用户-删除和解除关联
class AddLinkedUserActivity : AppCompatActivity() {
private lateinit var binding: AddLinkedUserActivityBinding
private val selectedPhoneSet = mutableSetOf<String>()

View File

@@ -194,7 +194,7 @@ class AutoModeActivity : AppCompatActivity() {
Toast.makeText(this@AutoModeActivity, "修改成功", Toast.LENGTH_SHORT).show()
DeviceUpdateEvent.notifyDeviceUpdated(deviceId)
} else {
Toast.makeText(this@AutoModeActivity, response.msg, Toast.LENGTH_SHORT).show()
Toast.makeText(this@AutoModeActivity, "修改失败", Toast.LENGTH_SHORT).show()
}
finish()
}

View File

@@ -17,7 +17,9 @@ import com.example.defenseapplication.adapter.LinkedUserAdapter
import com.example.defenseapplication.bean.DeleteDeviceUserRequest
import com.example.defenseapplication.bean.DeviceUserBean
import com.example.defenseapplication.bean.FamilyMembersBean
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.databinding.LinkedUserActivityBinding
import com.example.defenseapplication.personal.PasswordInputDialog
import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.DeviceUserUpdateEvent
import com.example.defenseapplication.utils.RetrofitNetwork
@@ -25,6 +27,7 @@ import com.example.defenseapplication.view.CustomDialogFragmentText
import com.gyf.immersionbar.ImmersionBar
import com.yanzhenjie.recyclerview.SwipeMenuItem
import com.yanzhenjie.recyclerview.SwipeRecyclerView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -36,6 +39,8 @@ class LinkedUserActivity : AppCompatActivity() {
private val fullUserList = mutableListOf<LinkedUser>()
private val userList = mutableListOf<LinkedUser>()
private var mode: Int = MODE_SETTINGS
private var isPasswordVerified: Boolean = false
private lateinit var passwordDialog: PasswordInputDialog
companion object {
const val EXTRA_MODE = "extra_mode"
@@ -71,6 +76,9 @@ class LinkedUserActivity : AppCompatActivity() {
override fun onDestroy() {
super.onDestroy()
DeviceUserUpdateEvent.removeListener(deviceUserUpdateListener)
if (::passwordDialog.isInitialized) {
passwordDialog.dismiss()
}
}
private fun initView() {
@@ -135,11 +143,55 @@ class LinkedUserActivity : AppCompatActivity() {
}
dialog.setShowInput(false)
dialog.setOnConfirmListener {
deleteDeviceUser(user, position)
if (!isPasswordVerified) {
showPasswordDialog {
isPasswordVerified = true
deleteDeviceUser(user, position)
}
} else {
deleteDeviceUser(user, position)
}
}
dialog.show(supportFragmentManager, "DeleteDialog")
}
private fun showPasswordDialog(onVerified: () -> Unit) {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(inputPassword))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dismiss()
onVerified()
} else {
Toast.makeText(
this@LinkedUserActivity,
response.msg ?: getString(R.string.password_error),
Toast.LENGTH_SHORT
).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@LinkedUserActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
}
}
setOnDismissListener {
// Dialog dismissed
}
}
passwordDialog.show()
}
private fun deleteDeviceUser(user: LinkedUser, position: Int) {
val deviceId = DeviceIdEvent.getDeviceId()
if (deviceId.isNullOrEmpty() || user.userId.isEmpty()) {

View File

@@ -7,13 +7,13 @@ import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import com.example.defenseapplication.R
import com.example.defenseapplication.base.BaseActivity
import com.example.defenseapplication.bean.DeviceUserBean
import com.example.defenseapplication.databinding.SettingsActivityBinding
import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.view.CustomDialogFragmentText
import com.example.defenseapplication.view.RecognitionModeDialog
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.personal.PasswordInputDialog
import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -23,8 +23,10 @@ import kotlinx.coroutines.withContext
class SettingsActivity : BaseActivity() {
private lateinit var binding: SettingsActivityBinding
private lateinit var passwordDialog: PasswordInputDialog
private var alertAudio: String? = null
private var audioContent: String? = null
private var isPasswordVerified = false
override fun onResume() {
super.onResume()
@@ -50,11 +52,22 @@ class SettingsActivity : BaseActivity() {
}
binding.itemRecognitionMode.setOnClickListener {
val dialog = RecognitionModeDialog(this)
dialog.setOnConfirmListener { mode ->
updateRecognitionMode(mode)
if (isPasswordVerified) {
val dialog = RecognitionModeDialog(this)
dialog.setOnConfirmListener { mode ->
updateRecognitionMode(mode)
}
dialog.show()
} else {
showPasswordDialog {
isPasswordVerified = true
val dialog = RecognitionModeDialog(this)
dialog.setOnConfirmListener { mode ->
updateRecognitionMode(mode)
}
dialog.show()
}
}
dialog.show()
}
binding.itemDeviceName.setOnClickListener {
@@ -80,48 +93,26 @@ class SettingsActivity : BaseActivity() {
dialog.show(supportFragmentManager, "CustomDialogFragment")
}
binding.itemWaterGunSetting.setOnClickListener {
val intent = Intent(this, WaterGunSettingsActivity::class.java)
// 传递水枪设置参数
val deviceId = DeviceIdEvent.getDeviceId()
if (!deviceId.isNullOrEmpty()) {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getDeviceInfo(deviceId)
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val device = response.data
intent.putExtra("strikeRange", device.strikeRange ?: "7")
intent.putExtra("strikeInterval", device.strikeInterval ?: "3")
intent.putExtra("container", device.container ?: "容器4")
startActivity(intent)
} else {
// 如果获取失败,使用默认值
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
}
if (isPasswordVerified) {
navigateToWaterGunSettings()
} else {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
showPasswordDialog {
isPasswordVerified = true
navigateToWaterGunSettings()
}
}
}
binding.itemAutoMode.setOnClickListener {
val intent = Intent(this, AutoModeActivity::class.java)
startActivity(intent)
if (isPasswordVerified) {
val intent = Intent(this, AutoModeActivity::class.java)
startActivity(intent)
} else {
showPasswordDialog {
isPasswordVerified = true
val intent = Intent(this, AutoModeActivity::class.java)
startActivity(intent)
}
}
}
binding.itemDeviceInfo.setOnClickListener {
val intent = Intent(this, DeviceInfoActivity::class.java)
@@ -337,4 +328,87 @@ class SettingsActivity : BaseActivity() {
}
}
private fun showPasswordDialog(onVerified: () -> Unit) {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(inputPassword))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dismiss()
onVerified()
} else {
Toast.makeText(
this@SettingsActivity,
response.msg ?: getString(R.string.password_error),
Toast.LENGTH_SHORT
).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@SettingsActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
}
}
setOnDismissListener {
// Dialog dismissed
}
}
passwordDialog.show()
}
private fun navigateToWaterGunSettings() {
val intent = Intent(this, WaterGunSettingsActivity::class.java)
val deviceId = DeviceIdEvent.getDeviceId()
if (!deviceId.isNullOrEmpty()) {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getDeviceInfo(deviceId)
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val device = response.data
intent.putExtra("strikeRange", device.strikeRange ?: "7")
intent.putExtra("strikeInterval", device.strikeInterval ?: "3")
intent.putExtra("container", device.container ?: "容器4")
startActivity(intent)
} else {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
}
} else {
intent.putExtra("strikeRange", "7")
intent.putExtra("strikeInterval", "3")
intent.putExtra("container", "容器4")
startActivity(intent)
}
}
override fun onDestroy() {
if (::passwordDialog.isInitialized) {
passwordDialog.dismiss()
}
super.onDestroy()
}
}

View File

@@ -8,6 +8,8 @@ import androidx.lifecycle.lifecycleScope
import com.example.defenseapplication.R
import com.example.defenseapplication.bean.DeleteDeviceUserRequest
import com.example.defenseapplication.bean.ObtainInviterInformationRequest
import com.example.defenseapplication.bean.VerifyOptionPasswordRequest
import com.example.defenseapplication.personal.PasswordInputDialog
import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.DeviceUserUpdateEvent
import com.example.defenseapplication.databinding.UserDetailsActivityBinding
@@ -23,6 +25,8 @@ class UserDetailsActivity : AppCompatActivity() {
private lateinit var binding: UserDetailsActivityBinding
private var userId: String = ""
private var isPasswordVerified: Boolean = false
private lateinit var passwordDialog: PasswordInputDialog
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -82,12 +86,11 @@ class UserDetailsActivity : AppCompatActivity() {
}
binding.swUserStatus.setOnCheckedChangeListener { _, isChecked ->
when (isChecked) {
true -> {
// 打开开关业务逻辑
}
false -> {
// 关闭开关业务逻辑
if (!isPasswordVerified) {
binding.swUserStatus.isChecked = !isChecked
showPasswordDialog {
isPasswordVerified = true
binding.swUserStatus.isChecked = isChecked
}
}
}
@@ -97,6 +100,41 @@ class UserDetailsActivity : AppCompatActivity() {
}
}
private fun showPasswordDialog(onVerified: () -> Unit) {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
lifecycleScope.launch {
try {
val response = RetrofitNetwork.getNetworkService()
.verifyOptionPassword(VerifyOptionPasswordRequest(inputPassword))
withContext(Dispatchers.Main) {
if (response.code == 200) {
dismiss()
onVerified()
} else {
Toast.makeText(
this@UserDetailsActivity,
response.msg ?: getString(R.string.password_error),
Toast.LENGTH_SHORT
).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@UserDetailsActivity, "网络请求失败", Toast.LENGTH_SHORT).show()
showError(getString(R.string.password_error))
clearPassword()
}
}
}
}
setOnDismissListener {}
}
passwordDialog.show()
}
private fun showDeleteDialog() {
val dialog = CustomDialogFragmentText()
@@ -106,7 +144,14 @@ class UserDetailsActivity : AppCompatActivity() {
dialog.setPositiveText(getString(R.string.confirm))
dialog.setNegativeText(getString(R.string.cancel))
dialog.setOnConfirmListener {
deleteDeviceUser()
if (isPasswordVerified) {
deleteDeviceUser()
} else {
showPasswordDialog {
isPasswordVerified = true
deleteDeviceUser()
}
}
}
dialog.show(supportFragmentManager, "DeleteUserDialog")
}

View File

@@ -0,0 +1,74 @@
package com.example.defenseapplication.personal
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.R
import com.example.defenseapplication.bean.UpdatePassword
import com.example.defenseapplication.databinding.ChangePasswordActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork
import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
//登录密码修改
class ChangePasswordActivity : AppCompatActivity() {
private lateinit var binding: ChangePasswordActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ChangePasswordActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.ivBack.setOnClickListener {
finish()
}
binding.btnConfirm.setOnClickListener {
val oldPassword = binding.etOldPassword.text.toString().trim()
val newPassword = binding.etNewPassword.text.toString().trim()
val confirmPassword = binding.etConfirmPassword.text.toString().trim()
if (oldPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_old_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_new_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword != confirmPassword) {
Toast.makeText(this, getString(R.string.password_not_match), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
CoroutineScope(Dispatchers.IO).launch {
try {
val result = RetrofitNetwork.getNetworkService().updatePassword(UpdatePassword(oldPassword, newPassword))
withContext(Dispatchers.Main) {
if (result.code == 200) {
Toast.makeText(this@ChangePasswordActivity, getString(R.string.password_reset_success), Toast.LENGTH_SHORT).show()
finish()
} else {
Toast.makeText(this@ChangePasswordActivity, result.msg ?: getString(R.string.password_reset_failed), Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@ChangePasswordActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
}
}
}
}
}
}

View File

@@ -1,24 +1,20 @@
package com.example.defenseapplication.personal
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import bean.LoginRequest
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.defenseapplication.R
import com.example.defenseapplication.bean.UpdatePassword
import com.example.defenseapplication.bean.UserInfoBean
import com.example.defenseapplication.databinding.LoginPasswordActivityBinding
import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.databinding.PasswordManagementActivityBinding
import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
//登录密码修改
//登录密码
class LoginPasswordActivity : AppCompatActivity() {
private lateinit var binding: LoginPasswordActivityBinding
private lateinit var binding: LoginPasswordActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = LoginPasswordActivityBinding.inflate(layoutInflater)
@@ -33,44 +29,13 @@ class LoginPasswordActivity : AppCompatActivity() {
finish()
}
binding.btnConfirm.setOnClickListener {
val oldPassword = binding.etOldPassword.text.toString().trim()
val newPassword = binding.etNewPassword.text.toString().trim()
val confirmPassword = binding.etConfirmPassword.text.toString().trim()
if (oldPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_old_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_new_password), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword != confirmPassword) {
Toast.makeText(this, getString(R.string.password_not_match), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
CoroutineScope(Dispatchers.IO).launch {
try {
val result = RetrofitNetwork.getNetworkService().updatePassword(UpdatePassword(oldPassword, newPassword))
withContext(Dispatchers.Main) {
if (result.code == 200) {
Toast.makeText(this@LoginPasswordActivity, getString(R.string.password_reset_success), Toast.LENGTH_SHORT).show()
finish()
} else {
Toast.makeText(this@LoginPasswordActivity, result.msg ?: getString(R.string.password_reset_failed), Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(this@LoginPasswordActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show()
}
}
}
binding.changePassword.setOnClickListener {
startActivity(Intent(this, ChangePasswordActivity::class.java))
}
binding.retrievePassword.setOnClickListener {
startActivity(Intent(this, RetrievePasswordActivity::class.java))
}
}
}
}

View File

@@ -34,11 +34,7 @@ class PasswordManagementActivity : AppCompatActivity() {
}
binding.loginPassword.setOnClickListener {
startActivity(Intent(this, LoginPasswordActivity::class.java))
}
binding.retrievePassword.setOnClickListener {
startActivity(Intent(this, RetrievePasswordActivity::class.java))
startActivity(Intent(this, ChangePasswordActivity::class.java))
}
binding.operationPassword.setOnClickListener {