个人资料

This commit is contained in:
2026-05-12 14:25:13 +08:00
parent 638968e90a
commit 1372ba62a0
22 changed files with 1566 additions and 8 deletions

View File

@@ -9,6 +9,8 @@ import android.view.ViewGroup
import com.bumptech.glide.Glide
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.PersonalFragmentBinding
import com.example.defenseapplication.liveVideo.LinkedUserActivity
import com.example.defenseapplication.personal.PasswordManagementActivity
import com.example.defenseapplication.personal.PersonalProfileActivity
import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.view.FamilySwitchDialog
@@ -48,6 +50,14 @@ class PersonalFragment : Fragment() {
binding.itemSwitchFamily.setOnClickListener {
showFamilySwitchDialog()
}
binding.itemUserManage.setOnClickListener {
val intent= Intent(requireContext(), LinkedUserActivity::class.java)
startActivity(intent)
}
binding.itemPwdManage.setOnClickListener {
val intent= Intent(requireContext(), PasswordManagementActivity::class.java)
startActivity(intent)
}
return binding.root
}

View File

@@ -42,7 +42,13 @@ class LinkedUserActivity : AppCompatActivity() {
private fun initView() {
adapter = LinkedUserAdapter(
onItemClick = { user, position ->
val intent = Intent(this, UserDetailsActivity::class.java).apply {
putExtra("name", user.name)
putExtra("phone", user.phone)
putExtra("idCard", user.idCard)
putExtra("time", user.time)
}
startActivity(intent)
},
onDeleteClick = { user, position ->
showUnlinkDialog(user, position)

View File

@@ -0,0 +1,87 @@
package com.example.defenseapplication.liveVideo
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.UserDetailsActivityBinding
import com.example.defenseapplication.view.CustomDialogFragmentText
import com.gyf.immersionbar.ImmersionBar
//用户详情页面
class UserDetailsActivity : AppCompatActivity() {
private lateinit var binding: UserDetailsActivityBinding
private lateinit var userName: String
private lateinit var phone: String
private lateinit var idCard: String
private lateinit var time: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = UserDetailsActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initData()
initView()
initListener()
}
private fun initData() {
userName = intent.getStringExtra("name") ?: ""
phone = intent.getStringExtra("phone") ?: ""
idCard = intent.getStringExtra("idCard") ?: ""
time = intent.getStringExtra("time") ?: ""
}
private fun initView() {
binding.tvContactName.text = userName
binding.tvPhone.text = phone
binding.tvIdCard.text = idCard
binding.tvMacAddress.text = "AA:BB:CC:DD:EE:FF"
}
private fun initListener() {
binding.ivBack.setOnClickListener {
finish()
}
binding.swUserStatus.setOnCheckedChangeListener { _, isChecked ->
when (isChecked) {
true -> {
// 打开开关业务逻辑
}
false -> {
// 关闭开关业务逻辑
}
}
}
binding.btnDelete.setOnClickListener {
showDeleteDialog()
}
}
private fun showDeleteDialog() {
val dialog = CustomDialogFragmentText()
dialog.setTitle(getString(R.string.tip))
dialog.setMessage(getString(R.string.confirm_delete_user))
dialog.setShowInput(false)
dialog.setPositiveText(getString(R.string.confirm))
dialog.setNegativeText(getString(R.string.cancel))
dialog.setOnConfirmListener {
finish()
// if(){
// ToastUtils.showSuccess(this, getString(R.string.wifi_connection_success)
// }else{
// ToastUtils.showError(this, getString(R.string.wifi_connection_failed))
// }
}
dialog.show(supportFragmentManager, "DeleteUserDialog")
}
}

View File

@@ -0,0 +1,35 @@
package com.example.defenseapplication.personal
import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.FaceManagementActivityBinding
import com.example.defenseapplication.databinding.LoginPasswordActivityBinding
import com.example.defenseapplication.login.FaceVerificationActivity
import com.gyf.immersionbar.ImmersionBar
//人脸管理页面
class FaceManagementActivity : AppCompatActivity() {
private lateinit var binding: FaceManagementActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = FaceManagementActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.ivBack.setOnClickListener {
finish()
}
binding.faceManagement.setOnClickListener {
startActivity(Intent(this, FaceVerificationActivity::class.java))
}
}
}

View File

@@ -0,0 +1,30 @@
package com.example.defenseapplication.personal
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.LoginPasswordActivityBinding
import com.example.defenseapplication.databinding.PasswordManagementActivityBinding
import com.gyf.immersionbar.ImmersionBar
//登录密码
class LoginPasswordActivity : AppCompatActivity() {
private lateinit var binding: LoginPasswordActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = LoginPasswordActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.ivBack.setOnClickListener {
finish()
}
}
}

View File

@@ -0,0 +1,80 @@
package com.example.defenseapplication.personal
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.SPUtils
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.OperationPasswordActivityBinding
import com.gyf.immersionbar.ImmersionBar
//操作密码
class OperationPasswordActivity : AppCompatActivity() {
private lateinit var binding: OperationPasswordActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = OperationPasswordActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initListener()
}
private fun initListener() {
binding.ivBack.setOnClickListener {
finish()
}
binding.swOperationPassword.setOnCheckedChangeListener { _, isChecked ->
when (isChecked) {
true -> {
binding.etPassword.isEnabled = true
binding.etConfirmPassword.isEnabled = true
binding.btnConfirmReset.isEnabled = true
Toast.makeText(this, getString(R.string.operation_password_enabled), Toast.LENGTH_SHORT).show()
}
false -> {
binding.etPassword.isEnabled = false
binding.etConfirmPassword.isEnabled = false
binding.btnConfirmReset.isEnabled = false
SPUtils.getInstance().remove("operation_password")
Toast.makeText(this, getString(R.string.operation_password_disabled), Toast.LENGTH_SHORT).show()
}
}
}
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
}
SPUtils.getInstance().put("operation_password", password)
Toast.makeText(this, getString(R.string.operation_success), Toast.LENGTH_SHORT).show()
}
}
}

View File

@@ -0,0 +1,75 @@
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.databinding.PasswordManagementActivityBinding
import com.example.defenseapplication.view.PasswordInputDialog
import com.blankj.utilcode.util.SPUtils
import com.gyf.immersionbar.ImmersionBar
//密码管理
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)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
binding.ivBack.setOnClickListener {
finish()
}
binding.loginPassword.setOnClickListener {
startActivity(Intent(this, LoginPasswordActivity::class.java))
}
binding.retrievePassword.setOnClickListener {
startActivity(Intent(this, RetrievePasswordActivity::class.java))
}
binding.operationPassword.setOnClickListener {
showPasswordDialog()
}
}
private fun showPasswordDialog() {
passwordDialog = PasswordInputDialog(this).apply {
setOnConfirmListener { inputPassword ->
val savedPassword = SPUtils.getInstance().getString("operation_password", "111111")
if (savedPassword.isEmpty()) {
Toast.makeText(this@PasswordManagementActivity, getString(R.string.operation_password_not_set), Toast.LENGTH_SHORT).show()
dismiss()
return@setOnConfirmListener
}
if (inputPassword == savedPassword) {
startActivity(Intent(this@PasswordManagementActivity, OperationPasswordActivity::class.java))
dismiss()
} else {
showError(getString(R.string.password_error))
clearPassword()
}
}
setOnDismissListener {
// Dialog dismissed
}
}
passwordDialog.show()
}
override fun onDestroy() {
if (::passwordDialog.isInitialized) {
passwordDialog.dismiss()
}
super.onDestroy()
}
}

View File

@@ -0,0 +1,126 @@
package com.example.defenseapplication.personal
import android.os.Bundle
import android.os.CountDownTimer
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.RetrievePasswordActivityBinding
import com.gyf.immersionbar.ImmersionBar
//找回密码页面
class RetrievePasswordActivity : AppCompatActivity() {
private lateinit var binding: RetrievePasswordActivityBinding
private var countDownTimer: CountDownTimer? = null
private var isCountingDown = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = RetrievePasswordActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initListener()
}
private fun initListener() {
binding.ivBack.setOnClickListener {
finish()
}
binding.btnGetCode.setOnClickListener {
val phoneNumber = binding.etPhoneNumber.text.toString()
if (phoneNumber.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_phone_number), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (phoneNumber.length != 11) {
Toast.makeText(this, getString(R.string.phone_format_invalid), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
startCountdown()
Toast.makeText(this, String.format(getString(R.string.code_sent_to), phoneNumber), Toast.LENGTH_SHORT).show()
}
binding.btnConfirmReset.setOnClickListener {
val phoneNumber = binding.etPhoneNumber.text.toString()
val verificationCode = binding.etVerificationCode.text.toString()
val newPassword = binding.etNewPassword.text.toString()
val confirmPassword = binding.etConfirmPassword.text.toString()
if (phoneNumber.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_phone_number), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (phoneNumber.length != 11) {
Toast.makeText(this, getString(R.string.phone_format_invalid), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (verificationCode.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_verification_code_pls), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (verificationCode.length != 6) {
Toast.makeText(this, getString(R.string.verification_code_error), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.password_cannot_empty), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword.length < 6 || newPassword.length > 20) {
Toast.makeText(this, getString(R.string.password_requirement), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (confirmPassword.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_password_again), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (newPassword != confirmPassword) {
Toast.makeText(this, getString(R.string.password_mismatch), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
Toast.makeText(this, getString(R.string.reset_success), Toast.LENGTH_SHORT).show()
finish()
}
}
private fun startCountdown() {
isCountingDown = true
binding.btnGetCode.isEnabled = false
countDownTimer = object : CountDownTimer(60000, 1000) {
override fun onTick(millisUntilFinished: Long) {
val seconds = millisUntilFinished / 1000
binding.btnGetCode.text = String.format(getString(R.string.countdown_retry), seconds)
}
override fun onFinish() {
isCountingDown = false
binding.btnGetCode.isEnabled = true
binding.btnGetCode.text = getString(R.string.get_verification_code)
}
}.start()
}
override fun onDestroy() {
super.onDestroy()
countDownTimer?.cancel()
}
}

View File

@@ -0,0 +1,127 @@
package com.example.defenseapplication.view
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.widget.EditText
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.DialogPasswordInputBinding
class PasswordInputDialog(context: Context) : Dialog(context) {
private lateinit var binding: DialogPasswordInputBinding
private var onConfirmListener: ((String) -> Unit)? = null
private var onDismissListener: (() -> Unit)? = null
init {
initView()
}
private fun initView() {
binding = DialogPasswordInputBinding.inflate(LayoutInflater.from(context))
setContentView(binding.root)
window?.apply {
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val params = attributes
params.gravity = Gravity.CENTER
params.width = WindowManager.LayoutParams.MATCH_PARENT
params.height = WindowManager.LayoutParams.WRAP_CONTENT
params.horizontalMargin = 40f
attributes = params
}
setupPasswordInput()
binding.btnCancel.setOnClickListener {
dismiss()
}
binding.btnConfirm.setOnClickListener {
val password = getPassword()
if (password.length == 6) {
onConfirmListener?.invoke(password)
dismiss()
}
}
}
private fun setupPasswordInput() {
val editTexts = listOf(
binding.etPassword1,
binding.etPassword2,
binding.etPassword3,
binding.etPassword4,
binding.etPassword5,
binding.etPassword6
)
editTexts.forEachIndexed { index, editText ->
editText.setOnKeyListener { _, _, _ ->
if (editText.text.isNotEmpty()) {
if (index < editTexts.size - 1) {
editTexts[index + 1].requestFocus()
} else {
editText.clearFocus()
}
}
false
}
editText.setOnFocusChangeListener { v, hasFocus ->
if (hasFocus) {
(v as EditText).setSelection((v.text?.length ?: 0))
}
}
}
}
private fun getPassword(): String {
return binding.etPassword1.text.toString() +
binding.etPassword2.text.toString() +
binding.etPassword3.text.toString() +
binding.etPassword4.text.toString() +
binding.etPassword5.text.toString() +
binding.etPassword6.text.toString()
}
fun setOnConfirmListener(listener: (String) -> Unit): PasswordInputDialog {
this.onConfirmListener = listener
return this
}
fun setOnDismissListener(listener: () -> Unit): PasswordInputDialog {
this.onDismissListener = listener
return this
}
fun showError(message: String) {
binding.tvError.text = message
binding.tvError.visibility = View.VISIBLE
}
fun clearError() {
binding.tvError.visibility = View.GONE
binding.tvError.text = ""
}
fun clearPassword() {
binding.etPassword1.text?.clear()
binding.etPassword2.text?.clear()
binding.etPassword3.text?.clear()
binding.etPassword4.text?.clear()
binding.etPassword5.text?.clear()
binding.etPassword6.text?.clear()
binding.etPassword1.requestFocus()
}
override fun dismiss() {
super.dismiss()
onDismissListener?.invoke()
}
}