From a8f202a906394cbdc4a87743a1908295854be908 Mon Sep 17 00:00:00 2001 From: maxinyu Date: Sat, 16 May 2026 10:15:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=91=E7=9A=84=E5=AE=B6=E5=BA=AD=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/FamilyAdapter.kt | 41 +++++- .../defenseapplication/bean/LoginBean.kt | 5 - .../bean/SwitchFamilyRequest.kt | 9 ++ .../home/HomeMenuFragment.kt | 123 +++++++++++++----- .../defenseapplication/login/LoginActivity.kt | 1 - .../defenseapplication/utils/ApiService.kt | 13 +- app/src/main/res/drawable/default_page.png | Bin 0 -> 16445 bytes .../main/res/layout/home_menu_fragment.xml | 35 ++++- app/src/main/res/layout/item_family.xml | 48 +++++-- app/src/main/res/values-zh/strings.xml | 4 + app/src/main/res/values/strings.xml | 5 + 11 files changed, 220 insertions(+), 64 deletions(-) create mode 100644 app/src/main/java/com/example/defenseapplication/bean/SwitchFamilyRequest.kt create mode 100644 app/src/main/res/drawable/default_page.png diff --git a/app/src/main/java/com/example/defenseapplication/adapter/FamilyAdapter.kt b/app/src/main/java/com/example/defenseapplication/adapter/FamilyAdapter.kt index c6ff813..f7807fd 100644 --- a/app/src/main/java/com/example/defenseapplication/adapter/FamilyAdapter.kt +++ b/app/src/main/java/com/example/defenseapplication/adapter/FamilyAdapter.kt @@ -1,19 +1,21 @@ package com.example.defenseapplication.adapter import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.example.defenseapplication.R +import com.example.defenseapplication.bean.FamilyBean import com.example.defenseapplication.databinding.ItemFamilyBinding class FamilyAdapter( private val onItemClick: (String) -> Unit ) : RecyclerView.Adapter() { - private val items = mutableListOf() + private val items = mutableListOf() private var selectedFamily: String? = null - fun submitList(familyList: List, currentFamily: String) { + fun submitList(familyList: List, currentFamily: String) { items.clear() items.addAll(familyList) selectedFamily = currentFamily @@ -34,11 +36,36 @@ class FamilyAdapter( inner class FamilyViewHolder(private val binding: ItemFamilyBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(item: String) { - binding.tvFamilyName.text = item - val textColor = if (item == selectedFamily) R.color.green else R.color.black - binding.tvFamilyName.setTextColor(binding.root.context.getColor(textColor)) - binding.root.setOnClickListener { onItemClick(item) } + fun bind(item: FamilyBean) { + binding.tvFamilyName.text = item.parentName + binding.tvFamilyRole.text = getRoleText(item.role) + + val isSelected = item.parentName == selectedFamily + updateSelectedState(isSelected) + + binding.root.setOnClickListener { onItemClick(item.parentName) } + } + + private fun getRoleText(role: String): String { + return when (role) { + "appadmin" ->binding.root.context.getString(R.string.admin_user) + else -> binding.root.context.getString(R.string.normal_user) + } + } + + private fun updateSelectedState(isSelected: Boolean) { + if (isSelected) { + binding.layoutFamilyItem.setBackgroundResource(R.drawable.bg_family_selected) + binding.tvFamilyName.setTextColor(binding.root.context.getColor(R.color.white)) + binding.tvFamilyRole.setTextColor(binding.root.context.getColor(R.color.white)) + binding.ivCheck.visibility = View.VISIBLE + binding.ivCheck.setImageResource(R.drawable.ic_check_white) + } else { + binding.layoutFamilyItem.setBackgroundResource(0) + binding.tvFamilyName.setTextColor(binding.root.context.getColor(R.color.black)) + binding.tvFamilyRole.setTextColor(binding.root.context.getColor(R.color.gray)) + binding.ivCheck.visibility = View.GONE + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/bean/LoginBean.kt b/app/src/main/java/com/example/defenseapplication/bean/LoginBean.kt index 948a85c..5755616 100644 --- a/app/src/main/java/com/example/defenseapplication/bean/LoginBean.kt +++ b/app/src/main/java/com/example/defenseapplication/bean/LoginBean.kt @@ -35,9 +35,4 @@ data class ForgotRequest( val phonenumber: String, val smsCode: String, val password: String -) -data class LoginResponse( - val clientid: String, - val content_language: String, - ) \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/bean/SwitchFamilyRequest.kt b/app/src/main/java/com/example/defenseapplication/bean/SwitchFamilyRequest.kt new file mode 100644 index 0000000..757e4ae --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/bean/SwitchFamilyRequest.kt @@ -0,0 +1,9 @@ +package com.example.defenseapplication.bean + +data class SwitchFamilyRequest( + val clientId: String, + val grantType: String, + val id: String, + val userType: String, + val role: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt b/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt index d3a3852..3059f8e 100644 --- a/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt +++ b/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt @@ -14,16 +14,16 @@ import android.view.ViewGroup import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import bean.LoginRequest -import bean.LoginResponse import com.example.defenseapplication.R import com.example.defenseapplication.adapter.DeviceAdapter import com.example.defenseapplication.adapter.DeviceUi import com.example.defenseapplication.adapter.FamilyAdapter 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.RetrofitNetwork +import com.example.defenseapplication.utils.UserinfoUtil import com.example.defenseapplication.view.DefenseDialogs import com.example.defenseapplication.view.showDefenseDialog import com.gyf.immersionbar.ImmersionBar @@ -45,6 +45,10 @@ class HomeMenuFragment : Fragment() { private var familyList: List = emptyList() private var familyBeanList: List = emptyList() private var deviceBeanList: List = emptyList() + private var canViewDevice = false + + private val currentFamilyBean: FamilyBean? + get() = familyBeanList.find { it.parentName == currentFamily } override fun onCreateView( inflater: LayoutInflater, @@ -110,11 +114,6 @@ class HomeMenuFragment : Fragment() { private fun fetchFamilyList() { CoroutineScope(Dispatchers.IO).launch { try { - val loginRequest = LoginResponse( - clientid = "428a8310cd442757ae699df5d894f051", - content_language = "en_US", - ) - val response = RetrofitNetwork.getNetworkService().getFamilyList() withContext(Dispatchers.Main) { if (response.code == 200 && response.data != null) { @@ -123,7 +122,14 @@ class HomeMenuFragment : Fragment() { if (familyList.isNotEmpty()) { currentFamily = familyList.first() binding.tvCurrentFamily.text = currentFamily - familyAdapter.submitList(familyList, currentFamily) + familyAdapter.submitList(familyBeanList, currentFamily) + + val userInfo = UserinfoUtil.getUserInfo() + val currentFamilyData = familyBeanList.firstOrNull() + canViewDevice = userInfo?.role == "appadmin" && currentFamilyData?.role != "member" + updateAdminUI() + + switchToFamily(currentFamily) } } else { Toast.makeText(requireContext(), response.msg, Toast.LENGTH_SHORT).show() @@ -134,28 +140,79 @@ class HomeMenuFragment : Fragment() { Toast.makeText(requireContext(), R.string.network_error, Toast.LENGTH_SHORT).show() } } - fetchDeviceList() + } + } + + private fun updateAdminUI() { + if (canViewDevice) { + binding.tvDeviceTitle.visibility = View.VISIBLE + binding.rvDeviceList.visibility = View.VISIBLE + binding.message.visibility = View.VISIBLE + binding.addFamily.visibility = View.VISIBLE + binding.add.visibility = View.VISIBLE + binding.layoutNoPermission.visibility = View.GONE + } else { + binding.tvDeviceTitle.visibility = View.GONE + binding.rvDeviceList.visibility = View.GONE + binding.message.visibility = View.GONE + binding.addFamily.visibility = View.GONE + binding.add.visibility = View.GONE + binding.layoutNoPermission.visibility = View.VISIBLE + } + } + + private fun switchToFamily(familyName: String) { + val familyBean = familyBeanList.find { it.parentName == familyName } ?: return + + CoroutineScope(Dispatchers.IO).launch { + try { + val userInfo = UserinfoUtil.getUserInfo() + val request = SwitchFamilyRequest( + clientId = "428a8310cd442757ae699df5d894f051", + grantType = "switch", + id = familyBean.id, + userType = "app_user", + role = userInfo?.role ?: "" + ) + val response = RetrofitNetwork.getNetworkService().switchFamily(request) + withContext(Dispatchers.Main) { + if (response.code == 200) { + val userInfo = UserinfoUtil.getUserInfo() + canViewDevice = userInfo?.role == "appadmin" && familyBean.role != "member" + updateAdminUI() + fetchDeviceList() + } else { + Toast.makeText(requireContext(), response.msg, Toast.LENGTH_SHORT).show() + } + } + } catch (e: Exception) { + withContext(Dispatchers.Main) { + Toast.makeText(requireContext(), R.string.network_error, Toast.LENGTH_SHORT).show() + } + } } } private fun fetchDeviceList() { -// CoroutineScope(Dispatchers.IO).launch { -// try { -// val response = RetrofitNetwork.getNetworkService().getDeviceList() -// withContext(Dispatchers.Main) { -// if (response.code == 200 && response.data != null) { -// deviceBeanList = response.data -// updateDeviceList() -// } else { -// Toast.makeText(requireContext(), response.msg, Toast.LENGTH_SHORT).show() -// } -// } -// } catch (e: Exception) { -// withContext(Dispatchers.Main) { -// Toast.makeText(requireContext(), R.string.network_error, Toast.LENGTH_SHORT).show() -// } -// } -// } + if (!canViewDevice) return + + CoroutineScope(Dispatchers.IO).launch { + try { + val response = RetrofitNetwork.getNetworkService().getDeviceList() + withContext(Dispatchers.Main) { + if (response.code == 200 && response.data != null) { + deviceBeanList = response.data + updateDeviceList() + } else { + Toast.makeText(requireContext(), response.msg, Toast.LENGTH_SHORT).show() + } + } + } catch (e: Exception) { + withContext(Dispatchers.Main) { + Toast.makeText(requireContext(), R.string.network_error, Toast.LENGTH_SHORT).show() + } + } + } } private fun toggleFamilyList() { @@ -172,25 +229,25 @@ class HomeMenuFragment : Fragment() { private fun onFamilySelected(familyName: String) { currentFamily = familyName binding.tvCurrentFamily.text = familyName - familyAdapter.submitList(familyList, currentFamily) - updateDeviceList() + familyAdapter.submitList(familyBeanList, currentFamily) + switchToFamily(familyName) if (isFamilyExpanded) { toggleFamilyList() } } private fun updateDeviceList() { - val currentFamilyBean = familyBeanList.find { it.parentName == currentFamily } - val filteredDevices = if (currentFamilyBean != null) { - deviceBeanList.filter { it.parentId == currentFamilyBean.id } + 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") } - + if (deviceUiList.isEmpty()) { deviceAdapter.submitList(listOf( DeviceUi(getString(R.string.no_device), false) diff --git a/app/src/main/java/com/example/defenseapplication/login/LoginActivity.kt b/app/src/main/java/com/example/defenseapplication/login/LoginActivity.kt index 1555961..003af94 100644 --- a/app/src/main/java/com/example/defenseapplication/login/LoginActivity.kt +++ b/app/src/main/java/com/example/defenseapplication/login/LoginActivity.kt @@ -237,7 +237,6 @@ class LoginActivity : AppCompatActivity() { intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) finish() - //1 } else { Toast.makeText(this@LoginActivity, response.msg, Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt b/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt index 98a8cd9..abc257f 100644 --- a/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt +++ b/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt @@ -7,6 +7,7 @@ import com.example.defenseapplication.bean.GetCodeBean import bean.LoginBean import bean.LoginRequest import bean.RegisterRequest +import com.example.defenseapplication.bean.SwitchFamilyRequest import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.POST @@ -46,7 +47,15 @@ interface ApiService { /** * 切换家庭 */ - //@POST("/app/switchFamily") - //suspend fun switchFamily(@Body request: com.example.defenseapplication.bean.SwitchFamilyRequest): GetCodeBean + @POST("/app/switchFamily") + suspend fun switchFamily(@Body request: SwitchFamilyRequest): GetCodeBean + + /** + * 获取设备列表 + */ + @GET("/app/getdeviceList") + suspend fun getDeviceList(): GetCodeBean> + + } diff --git a/app/src/main/res/drawable/default_page.png b/app/src/main/res/drawable/default_page.png new file mode 100644 index 0000000000000000000000000000000000000000..34bf5b7bfb110c30b4b436eed4e7aec4479f99c3 GIT binary patch literal 16445 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 XKa0XxZ#En900000NkvXXu0mjf5R)L) literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/home_menu_fragment.xml b/app/src/main/res/layout/home_menu_fragment.xml index 2afd8d2..b85c80a 100644 --- a/app/src/main/res/layout/home_menu_fragment.xml +++ b/app/src/main/res/layout/home_menu_fragment.xml @@ -36,17 +36,20 @@ @@ -144,6 +147,24 @@ android:nestedScrollingEnabled="false" android:paddingBottom="16dp" tools:listitem="@layout/item_device" /> + + + + + + + android:padding="4dp"> - + android:orientation="horizontal" + android:gravity="center_vertical" + android:paddingHorizontal="12dp" + android:paddingVertical="10dp" + android:background="?attr/selectableItemBackground" + android:clickable="true"> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index f6a4675..f70fb18 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -60,6 +60,8 @@ 首页 个人 + 管理者 + 普通用户 我的设备 @@ -82,6 +84,8 @@ 绑定设备 解绑设备 暂无设备 + 暂无权限 + 您暂无权查看设备,请联系管理员 添加设备 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1d31e83..cedcb16 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -54,6 +54,9 @@ Home Profile + Administrator + Ordinary User + My Devices @@ -75,6 +78,8 @@ Unbind Device No devices found No device + No permission + You do not have permission to view devices Add Device