切换家庭联动

This commit is contained in:
2026-05-16 17:18:05 +08:00
parent a8f202a906
commit 4c53c43f7b
23 changed files with 515 additions and 121 deletions

View File

@@ -5,6 +5,7 @@ import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.util.Log
import android.util.TypedValue
import android.widget.Toast
import androidx.fragment.app.Fragment
@@ -22,6 +23,8 @@ import com.example.defenseapplication.bean.DeviceBean
import com.example.defenseapplication.bean.FamilyBean
import com.example.defenseapplication.bean.SwitchFamilyRequest
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
import com.example.defenseapplication.utils.FamilySwitchEvent
import com.example.defenseapplication.utils.MessageStatusManager
import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.utils.UserinfoUtil
import com.example.defenseapplication.view.DefenseDialogs
@@ -42,6 +45,33 @@ class HomeMenuFragment : Fragment() {
private var isFamilyExpanded = false
private lateinit var currentFamily: String
private val unreadCountChangeListener = object : MessageStatusManager.UnreadCountChangeListener {
override fun onUnreadCountChanged(count: Int) {
updateUnreadCountUI(count)
}
}
private val familySwitchListener = object : FamilySwitchEvent.FamilySwitchListener {
override fun onFamilySwitched(familyName: String) {
if (familyName != currentFamily) {
currentFamily = familyName
updateFamilyDisplayText(familyName)
familyAdapter.submitList(familyBeanList, currentFamily)
switchToFamily(familyName)
}
}
}
private fun updateFamilyDisplayText(familyName: String) {
val familyBean = familyBeanList.find { it.parentName == familyName }
val isAdmin = familyBean?.role == "appadmin"
binding.tvCurrentFamily.text = if (isAdmin) {
getString(R.string.my_family)
} else {
"${familyName}${getString(R.string.family_with_normal)}"
}
}
private var familyList: List<String> = emptyList()
private var familyBeanList: List<FamilyBean> = emptyList()
private var deviceBeanList: List<DeviceBean> = emptyList()
@@ -87,6 +117,11 @@ class HomeMenuFragment : Fragment() {
}
fetchFamilyList()
fetchUnreadMessageCount()
MessageStatusManager.addListener(unreadCountChangeListener)
FamilySwitchEvent.addListener(familySwitchListener)
updateUnreadCountUI(MessageStatusManager.getUnreadCount())
}
private fun initView() {
@@ -111,17 +146,49 @@ class HomeMenuFragment : Fragment() {
}
}
private fun fetchUnreadMessageCount() {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getMessage()
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
val messageGroups = response.data as List<*>
var unreadCount = 0
messageGroups.forEach { group ->
if (group is Map<*, *>) {
val list = group["list"] as? List<*>
list?.let { unreadCount += it.size }
}
}
MessageStatusManager.setUnreadCount(unreadCount)
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun updateUnreadCountUI(count: Int) {
if (count > 0) {
binding.tvUnreadCount.visibility = View.VISIBLE
binding.tvUnreadCount.text = if (count > 99) "99+" else count.toString()
} else {
binding.tvUnreadCount.visibility = View.GONE
}
}
private fun fetchFamilyList() {
CoroutineScope(Dispatchers.IO).launch {
try {
val response = RetrofitNetwork.getNetworkService().getFamilyList()
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
familyBeanList = response.data
familyList = response.data.map { it.parentName }
familyBeanList = response.data.reversed()
familyList = response.data.map { it.parentName }.reversed()
if (familyList.isNotEmpty()) {
currentFamily = familyList.first()
binding.tvCurrentFamily.text = currentFamily
updateFamilyDisplayText(currentFamily)
familyAdapter.submitList(familyBeanList, currentFamily)
val userInfo = UserinfoUtil.getUserInfo()
@@ -144,6 +211,7 @@ class HomeMenuFragment : Fragment() {
}
private fun updateAdminUI() {
Log.d("HomeMenuFragment", "canViewDevice = $canViewDevice")
if (canViewDevice) {
binding.tvDeviceTitle.visibility = View.VISIBLE
binding.rvDeviceList.visibility = View.VISIBLE
@@ -180,7 +248,9 @@ class HomeMenuFragment : Fragment() {
val userInfo = UserinfoUtil.getUserInfo()
canViewDevice = userInfo?.role == "appadmin" && familyBean.role != "member"
updateAdminUI()
updateFamilyDisplayText(familyName)
fetchDeviceList()
FamilySwitchEvent.notifyFamilySwitched(familyName)
} else {
Toast.makeText(requireContext(), response.msg, Toast.LENGTH_SHORT).show()
}
@@ -200,8 +270,10 @@ class HomeMenuFragment : Fragment() {
try {
val response = RetrofitNetwork.getNetworkService().getDeviceList()
withContext(Dispatchers.Main) {
Log.d("DeviceList", "code = ${response.code}, data = ${response.data}")
if (response.code == 200 && response.data != null) {
deviceBeanList = response.data
Log.d("DeviceList", "deviceBeanList size = ${deviceBeanList.size}")
updateDeviceList()
} else {
Toast.makeText(requireContext(), response.msg, Toast.LENGTH_SHORT).show()
@@ -237,15 +309,8 @@ class HomeMenuFragment : Fragment() {
}
private fun updateDeviceList() {
val currentFamilyId = currentFamilyBean?.id
val filteredDevices = if (currentFamilyId != null) {
deviceBeanList.filter { it.parentId == currentFamilyId }
} else {
deviceBeanList
}
val deviceUiList = filteredDevices.map {
DeviceUi(it.deviceName, it.status == "online")
val deviceUiList = deviceBeanList.map {
DeviceUi(it.deviceName, it.status == "0")
}
if (deviceUiList.isEmpty()) {
@@ -307,6 +372,8 @@ class HomeMenuFragment : Fragment() {
super.onDestroyView()
binding.rvFamilyList.adapter = null
binding.rvDeviceList.adapter = null
MessageStatusManager.removeListener(unreadCountChangeListener)
FamilySwitchEvent.removeListener(familySwitchListener)
_binding = null // 避免内存泄漏
}
}