关联用户2

This commit is contained in:
2026-05-20 16:30:24 +08:00
parent 133ea5a88b
commit 246b39ca1a
15 changed files with 254 additions and 172 deletions

View File

@@ -3,16 +3,27 @@ package com.example.defenseapplication.liveVideo
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.AddLinkedUserAdapter
import com.example.defenseapplication.adapter.UserItem
import com.example.defenseapplication.bean.AddDeviceUserRequest
import com.example.defenseapplication.bean.FamilyMembersBean
import com.example.defenseapplication.databinding.AddLinkedUserActivityBinding
import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.DeviceUserUpdateEvent
import com.example.defenseapplication.utils.RetrofitNetwork
import com.gyf.immersionbar.ImmersionBar
//添加关联用户
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class AddLinkedUserActivity : AppCompatActivity() {
private lateinit var binding: AddLinkedUserActivityBinding
private val selectedPhoneSet = mutableSetOf<String>()
private val userItemList = mutableListOf<UserItem>()
private val selectedUserIdMap = mutableMapOf<String, String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -26,36 +37,112 @@ class AddLinkedUserActivity : AppCompatActivity() {
initRecyclerView()
initListener()
fetchFamilyMembers()
}
private fun initRecyclerView() {
val mockData = listOf(
UserItem("王五", "13566666666"),
UserItem("赵六", "15733333333")
)
binding.rvAddLinkedUser.layoutManager = LinearLayoutManager(this)
binding.rvAddLinkedUser.adapter =
AddLinkedUserAdapter(mockData, selectedPhoneSet) { phone, isChecked ->
AddLinkedUserAdapter(userItemList, selectedPhoneSet, selectedUserIdMap) { phone, isChecked, userId ->
if (isChecked) {
selectedPhoneSet.add(phone)
userId?.let { selectedUserIdMap[phone] = it }
} else {
selectedPhoneSet.remove(phone)
selectedUserIdMap.remove(phone)
}
}
}
private fun fetchFamilyMembers() {
lifecycleScope.launch {
try {
val response = RetrofitNetwork.getNetworkService().getFamilyMembers()
withContext(Dispatchers.Main) {
if (response.code == 200) {
if (response.data != null && response.data.isNotEmpty()) {
updateFamilyMemberList(response.data)
} else {
Toast.makeText(this@AddLinkedUserActivity, "暂无家庭成员数据", Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(this@AddLinkedUserActivity, "请求失败: ${response.msg}", Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
android.util.Log.e("AddLinkedUserActivity", "网络请求异常", e)
withContext(Dispatchers.Main) {
Toast.makeText(this@AddLinkedUserActivity, "网络请求失败: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun updateFamilyMemberList(familyMembersList: List<FamilyMembersBean>) {
userItemList.clear()
familyMembersList.forEach { member ->
userItemList.add(
UserItem(
name = member.nickName ?: member.parentName ?: "未知用户",
phone = member.phonenumber ?: "",
userId = member.userId ?: ""
)
)
}
binding.rvAddLinkedUser.adapter?.notifyDataSetChanged()
}
private fun initListener() {
binding.btnAddLinkedUser.setOnClickListener {
if (selectedPhoneSet.isEmpty()) {
Toast.makeText(this, getString(R.string.please_select_at_least_one_user), Toast.LENGTH_SHORT).show()
} else {
val message = getString(R.string.selected_users_voice, selectedPhoneSet.size)
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
addDeviceUser()
}
}
binding.ivBack.setOnClickListener {
finish()
}
}
private fun addDeviceUser() {
val deviceId = DeviceIdEvent.getDeviceId()
if (deviceId.isNullOrEmpty()) {
Toast.makeText(this, "设备ID为空", Toast.LENGTH_SHORT).show()
return
}
lifecycleScope.launch {
var successCount = 0
for ((phone, userId) in selectedUserIdMap) {
try {
val request = AddDeviceUserRequest(
deviceId = deviceId,
userId = userId
)
val response = RetrofitNetwork.getNetworkService().addDeviceUser(request)
withContext(Dispatchers.Main) {
if (response.code == 200) {
successCount++
} else {
Toast.makeText(this@AddLinkedUserActivity, "添加用户 $phone 失败: ${response.msg}", Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
Toast.makeText(this@AddLinkedUserActivity, "添加用户 $phone 失败: 网络错误", Toast.LENGTH_SHORT).show()
}
}
}
withContext(Dispatchers.Main) {
if (successCount > 0) {
Toast.makeText(this@AddLinkedUserActivity, "成功添加 $successCount 个用户", Toast.LENGTH_SHORT).show()
DeviceUserUpdateEvent.notifyUpdate()
finish()
}
}
}
}
}

View File

@@ -15,8 +15,10 @@ import com.example.defenseapplication.adapter.LinkedUser
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.databinding.LinkedUserActivityBinding
import com.example.defenseapplication.utils.DeviceIdEvent
import com.example.defenseapplication.utils.DeviceUserUpdateEvent
import com.example.defenseapplication.utils.RetrofitNetwork
import com.example.defenseapplication.view.CustomDialogFragmentText
import com.gyf.immersionbar.ImmersionBar
@@ -55,6 +57,18 @@ class LinkedUserActivity : AppCompatActivity() {
initData()
initListener()
setupModeUI()
DeviceUserUpdateEvent.addListener(deviceUserUpdateListener)
}
private val deviceUserUpdateListener = object : DeviceUserUpdateEvent.DeviceUserUpdateListener {
override fun onDeviceUserUpdated() {
fetchUserList()
}
}
override fun onDestroy() {
super.onDestroy()
DeviceUserUpdateEvent.removeListener(deviceUserUpdateListener)
}
private fun initView() {
@@ -222,22 +236,29 @@ class LinkedUserActivity : AppCompatActivity() {
}
private fun initData() {
fetchDeviceUserList()
fetchUserList()
}
private fun fetchDeviceUserList() {
val deviceId = DeviceIdEvent.getDeviceId()
if (deviceId.isNullOrEmpty()) {
Toast.makeText(this, "设备 ID 为空", Toast.LENGTH_SHORT).show()
return
}
private fun fetchUserList() {
lifecycleScope.launch {
try {
val response = RetrofitNetwork.getNetworkService().getDeviceUserList(deviceId)
val response = if (mode == MODE_SETTINGS) {
val deviceId = DeviceIdEvent.getDeviceId()
if (deviceId.isNullOrEmpty()) {
Toast.makeText(this@LinkedUserActivity, "设备 ID 为空", Toast.LENGTH_SHORT).show()
return@launch
}
RetrofitNetwork.getNetworkService().getDeviceUserList(deviceId)
} else {
RetrofitNetwork.getNetworkService().getFamilyMembers()
}
withContext(Dispatchers.Main) {
if (response.code == 200 && response.data != null) {
updateDeviceUserList(response.data)
if (mode == MODE_SETTINGS) {
updateDeviceUserList(response.data as List<DeviceUserBean>)
} else {
updateFamilyMembersList(response.data as List<FamilyMembersBean>)
}
} else {
Toast.makeText(this@LinkedUserActivity, response.msg, Toast.LENGTH_SHORT).show()
}
@@ -267,14 +288,29 @@ class LinkedUserActivity : AppCompatActivity() {
adapter.submitList(userList)
}
private fun updateFamilyMembersList(familyMembersList: List<FamilyMembersBean>) {
userList.clear()
familyMembersList.forEach { member ->
userList.add(
LinkedUser(
userId = member.userId ?: "",
name = member.nickName ?: member.parentName ?: "未知用户",
phone = member.phonenumber ?: "",
idCard = member.idCard ?: "",
time = member.createTime ?: ""
)
)
}
adapter.submitList(userList)
}
private fun initListener() {
binding.ivBack.setOnClickListener {
finish()
}
binding.searchLayout.setOnClickListener {
val intent = Intent(this, LinkedUserSearchActivity::class.java)
startActivityForResult(intent, REQUEST_CODE_SEARCH)
}
binding.btnAddLinkedUser.setOnClickListener {

View File

@@ -1,45 +0,0 @@
package com.example.defenseapplication.liveVideo
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.defenseapplication.databinding.LinkedUserSearchActivityBinding
import com.gyf.immersionbar.ImmersionBar
//搜索
class LinkedUserSearchActivity : AppCompatActivity() {
private lateinit var binding: LinkedUserSearchActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = LinkedUserSearchActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initListener()
initData()
}
private fun initListener() {
binding.ivBack.setOnClickListener {
finish()
}
binding.btnSearch.setOnClickListener {
initData()
}
}
private fun initData() {
val searchText = binding.etSearch.text.toString().trim()
binding.rvSearchResult.layoutManager = LinearLayoutManager(this)
}
}