设备(1)

This commit is contained in:
2026-05-18 17:39:30 +08:00
parent a9fb39cfde
commit 45828c7e9b
23 changed files with 895 additions and 67 deletions

View File

@@ -29,6 +29,7 @@ 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.DeviceIdEvent
import com.example.defenseapplication.utils.FamilySwitchEvent
import com.example.defenseapplication.utils.MessageStatusManager
import com.example.defenseapplication.utils.RetrofitNetwork
@@ -52,6 +53,10 @@ class HomeMenuFragment : Fragment() {
private var isFamilyExpanded = false
private lateinit var currentFamily: String
private var currentPage = 1
private val pageSize = 10
private var hasMore = true
private var isLoading = false
private val requestPermissionsLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
@@ -222,6 +227,23 @@ class HomeMenuFragment : Fragment() {
)
}
binding.swipeRefreshLayout.setOnRefreshListener {
refreshDeviceList()
}
binding.rvDeviceList.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val layoutManager = recyclerView.layoutManager as GridLayoutManager
val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition()
val totalItemCount = layoutManager.itemCount
if (!isLoading && hasMore && lastVisibleItemPosition >= totalItemCount - 1 && dy > 0) {
loadMoreDevices()
}
}
})
binding.familyHeaderLayout.setOnClickListener {
toggleFamilyList()
}
@@ -349,8 +371,10 @@ class HomeMenuFragment : Fragment() {
}
}
private fun fetchDeviceList() {
if (!canViewDevice) return
private fun fetchDeviceList(page: Int = 1, isLoadMore: Boolean = false) {
if (!canViewDevice || isLoading) return
isLoading = true
CoroutineScope(Dispatchers.IO).launch {
try {
@@ -358,21 +382,49 @@ class HomeMenuFragment : Fragment() {
withContext(Dispatchers.Main) {
Log.d("DeviceList", "code = ${response.code}, data = ${response.data}")
if (response.code == 200 && response.data != null) {
deviceBeanList = response.data
val newDevices = response.data
if (isLoadMore) {
deviceBeanList = deviceBeanList + newDevices
hasMore = newDevices.size >= pageSize
} else {
deviceBeanList = newDevices
hasMore = newDevices.size >= pageSize
}
Log.d("DeviceList", "deviceBeanList size = ${deviceBeanList.size}")
updateDeviceList()
} else {
Toast.makeText(requireContext(), response.msg, Toast.LENGTH_SHORT).show()
if (isLoadMore) {
hasMore = false
}
}
isLoading = false
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(requireContext(), R.string.network_error, Toast.LENGTH_SHORT).show()
isLoading = false
if (isLoadMore) {
hasMore = false
}
}
}
}
}
private fun refreshDeviceList() {
currentPage = 1
hasMore = true
fetchDeviceList(currentPage, false)
binding.swipeRefreshLayout.isRefreshing = false
}
private fun loadMoreDevices() {
if (isLoading || !hasMore) return
currentPage++
fetchDeviceList(currentPage, true)
}
private fun toggleFamilyList() {
isFamilyExpanded = !isFamilyExpanded
val visibility = if (isFamilyExpanded) View.VISIBLE else View.GONE
@@ -396,12 +448,12 @@ class HomeMenuFragment : Fragment() {
private fun updateDeviceList() {
val deviceUiList = deviceBeanList.map {
DeviceUi(it.deviceName, it.status == "0")
DeviceUi(it.deviceName, it.status, it.id)
}
if (deviceUiList.isEmpty()) {
deviceAdapter.submitList(listOf(
DeviceUi(getString(R.string.no_device), false)
DeviceUi(getString(R.string.no_device), "0")
))
} else {
deviceAdapter.submitList(deviceUiList)
@@ -409,10 +461,16 @@ class HomeMenuFragment : Fragment() {
}
private fun onDeviceClicked(device: DeviceUi) {
if (device.isOnline) return
showDefenseDialog(
config = DefenseDialogs.deviceOfflineConfig(requireContext())
)
if (device.isOnline) {
DeviceIdEvent.setDeviceId(device.deviceId)
val intent = Intent(requireContext(), com.example.defenseapplication.liveVideo.LiveVideoActivity::class.java)
intent.putExtra("device_name", device.name)
startActivity(intent)
} else {
showDefenseDialog(
config = DefenseDialogs.deviceOfflineConfig(requireContext())
)
}
}
private fun dpToPx(dp: Int): Int {