Files
SecurityDefenseDevice/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt
2026-06-08 17:07:44 +08:00

268 lines
10 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.example.defenseapplication.home
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.example.defenseapplication.R
import com.example.defenseapplication.bean.UserInfoBean
import com.example.defenseapplication.databinding.PersonalFragmentBinding
import com.example.defenseapplication.liveVideo.LinkedUserActivity
import com.example.defenseapplication.personal.FaceManagementActivity
import com.example.defenseapplication.personal.PasswordManagementActivity
import com.example.defenseapplication.personal.PersonalProfileActivity
import com.example.defenseapplication.utils.AppLanguage
import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.utils.UserinfoUtil
import com.example.defenseapplication.utils.ActivityManager
import com.example.defenseapplication.view.FamilySwitchDialog
import com.example.defenseapplication.view.LanguageDialog
import com.example.defenseapplication.home.HomeActivity
import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
//我的碎片
class PersonalFragment : Fragment() {
// ViewBinding
private var _binding: PersonalFragmentBinding? = null
private val binding get() = _binding!!
override fun onResume() {
super.onResume()
fetchUserInfo()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = PersonalFragmentBinding.inflate(inflater, container, false)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.headerLayout)
.init()
Glide.with(this)
.load(R.mipmap.img)
.circleCrop()
.into(binding.ivAvatar)
binding.headerLayout.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getUserInfo()
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val intent = Intent(requireContext(), PersonalProfileActivity::class.java)
intent.putExtra("userInfo", response.data)
startActivity(intent)
} else {
val intent = Intent(requireContext(), PersonalProfileActivity::class.java)
startActivity(intent)
}
}
} catch (e: Exception) {
e.printStackTrace()
val intent = Intent(requireContext(), PersonalProfileActivity::class.java)
startActivity(intent)
}
}
}
// 更新当前语言显示
updateCurrentLanguageDisplay()
// 语言设置点击事件
binding.itemLanguage.setOnClickListener {
showLanguageDialog()
}
// 切换家庭点击事件
binding.itemSwitchFamily.setOnClickListener {
showFamilySwitchDialog()
}
//用户管理点击事件跳转关联用户页面
binding.itemUserManage.setOnClickListener {
val intent = Intent(requireContext(), LinkedUserActivity::class.java)
intent.putExtra(LinkedUserActivity.EXTRA_MODE, LinkedUserActivity.MODE_PERSONAL)
startActivity(intent)
}
// 密码管理点击事件
binding.itemPwdManage.setOnClickListener {
val intent= Intent(requireContext(), PasswordManagementActivity::class.java)
startActivity(intent)
}
//人脸管理点击事件跳转人脸管理页面
binding.itemFaceManage.setOnClickListener {
val intent= Intent(requireContext(), FaceManagementActivity::class.java)
startActivity(intent)
}
// 退出登录点击事件
binding.btnLogout.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().logout()
withContext(Dispatchers.Main) {
if (response.code == 200) {
UserinfoUtil.clearUserInfo()
val intent = Intent(requireContext(), com.example.defenseapplication.login.LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent)
requireActivity().finish()
} else {
Toast.makeText(requireContext(), getString(R.string.logout_fail), Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
Toast.makeText(requireContext(), getString(R.string.logout_fail), Toast.LENGTH_SHORT).show()
}
}
}
}
fetchCurrentFamily()
return binding.root
}
private fun fetchCurrentFamily() {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getFamilyList()
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val userInfo = UserinfoUtil.getUserInfo()
val currentFamily = response.data.find {
it.role == userInfo?.role && it.role != "member"
} ?: response.data.firstOrNull()
currentFamily?.let {
val isAdmin = it.role == "appadmin"
if (isAdmin) {
binding.tvCurrentFamily.text = getString(R.string.my_family)
} else {
binding.tvCurrentFamily.text = "${it.parentName}${getString(R.string.family_with_normal)}"
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
/**
* 更新当前语言显示
*/
private fun updateCurrentLanguageDisplay() {
binding.tvCurrentLanguage.text = LanguageUtil.currentLanguage.let {
if (it == AppLanguage.SIMPLIFIED_CHINESE) "中文" else "English"
}
}
/**
* 显示语言选择对话框
*/
private fun showLanguageDialog() {
val dialog = LanguageDialog(requireContext()) { appLanguage ->
LanguageUtil.switchLanguage(requireContext(), appLanguage)
// 关闭所有 Activity重启到首页
ActivityManager.finishAllActivities()
val intent = Intent(requireContext(), HomeActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent)
requireActivity().finish()
}
dialog.show()
}
/**
* 显示家庭切换对话框
*/
private fun showFamilySwitchDialog() {
val dialog = FamilySwitchDialog(requireContext()) { familyName ->
updateFamilyDisplay(familyName)
}
dialog.show()
}
private fun updateFamilyDisplay(familyName: String) {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getFamilyList()
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val family = response.data.find { it.parentName == familyName }
family?.let {
val isAdmin = it.role == "appadmin"
if (isAdmin) {
binding.tvCurrentFamily.text = getString(R.string.my_family)
} else {
binding.tvCurrentFamily.text = "${it.parentName}${getString(R.string.family_with_normal)}"
}
} ?: run {
binding.tvCurrentFamily.text = familyName
}
} else {
binding.tvCurrentFamily.text = familyName
}
}
} catch (e: Exception) {
e.printStackTrace()
binding.tvCurrentFamily.text = familyName
}
}
}
private fun fetchUserInfo() {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getUserInfo()
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
updateUserUI(response.data)
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun updateUserUI(userInfo: UserInfoBean) {
userInfo.nickName?.let {
binding.tvNickname.text = it
}
userInfo.phonenumber?.let {
binding.tvPhone.text = it
}
userInfo.avatar?.let {
val requestOptions = RequestOptions()
.placeholder(R.mipmap.img) // 加载中显示
.error(R.mipmap.img) // 失败时显示
Glide.with(this)
.load(it) // 如果 avatar 为 nullGlide 会直接回调 error
.apply(requestOptions)
.circleCrop()
.into(binding.ivAvatar)
}
userInfo.role?.let {
binding.tvRoleTag.text = if (it == "appadmin") {
getString(R.string.admin)
} else {
getString(R.string.member)
}
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // 避免内存泄漏
}
}