diff --git a/app/src/main/java/com/ckkj/defense_device/annotation/ApiEncrypt.kt b/app/src/main/java/com/ckkj/defense_device/annotation/ApiEncrypt.kt deleted file mode 100644 index 28b909e..0000000 --- a/app/src/main/java/com/ckkj/defense_device/annotation/ApiEncrypt.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.ckkj.defense_device.annotation - -/** - * API 加密注解 - * - * 用于标记需要加密的 API 接口 - * - * @param response 是否同时加密响应体,默认 false(仅加密请求) - * - * 使用示例: - * - @ApiEncrypt // 仅加密请求 - * - @ApiEncrypt(response = true) // 请求和响应都加密 - */ -@Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.FUNCTION) -annotation class ApiEncrypt( - /** - * 是否加密响应体 - * - false (默认): 仅加密请求体 - * - true: 请求体和响应体都加密 - */ - val response: Boolean = false -) diff --git a/app/src/main/java/com/ckkj/defense_device/bean/DeviceBean.kt b/app/src/main/java/com/ckkj/defense_device/bean/DeviceBean.kt index f98b8a3..4324edc 100644 --- a/app/src/main/java/com/ckkj/defense_device/bean/DeviceBean.kt +++ b/app/src/main/java/com/ckkj/defense_device/bean/DeviceBean.kt @@ -9,11 +9,11 @@ data class DeviceBean( val deviceFamilyId: String? = null, val deviceImg: String? = null, val deviceName: String? = null,//设备名称 - val deviceNo: String? = null,//设备编号 - val deviceSn: String? = null,//设备序列号 + val deviceNo: String = "",//设备编号 + val deviceSn: String = "",//设备序列号 val endTime: String? = null,//自动布放结束时间 val expirationTime: String? = null, - val fwVer: String? = null,//固件版本 + val fwVer: String= "",//固件版本 val id: String? = null, val light: String? = null,//强光开启 val patternPerception: String? = null,//识别模式 diff --git a/app/src/main/java/com/ckkj/defense_device/home/MessageActivity.kt b/app/src/main/java/com/ckkj/defense_device/home/MessageActivity.kt index f57d297..56a091b 100644 --- a/app/src/main/java/com/ckkj/defense_device/home/MessageActivity.kt +++ b/app/src/main/java/com/ckkj/defense_device/home/MessageActivity.kt @@ -12,6 +12,7 @@ import com.ckkj.defense_device.databinding.MessageActivityBinding import com.ckkj.defense_device.utils.MessageStatusManager import com.ckkj.defense_device.utils.RetrofitNetwork import com.ckkj.defense_device.view.LoadingDialog +import com.ckkj.defense_device.view.PullRefreshLayout import com.gyf.immersionbar.ImmersionBar import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -47,6 +48,14 @@ class MessageActivity : AppCompatActivity() { binding.ivBack.setOnClickListener { finish() } binding.rvMessageList.layoutManager = LinearLayoutManager(this) binding.rvMessageList.adapter = messageAdapter + + binding.swipeRefreshLayout.setOnRefreshListener(object : PullRefreshLayout.OnRefreshListener { + override fun onRefresh() { + currentPage = 1 + hasMoreData = true + loadMessageList() + } + }) binding.rvMessageList.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { @@ -135,6 +144,7 @@ class MessageActivity : AppCompatActivity() { if (currentPage == 1) { withContext(Dispatchers.Main) { hideLoading() + binding.swipeRefreshLayout.finishRefresh() } } } @@ -149,30 +159,30 @@ class MessageActivity : AppCompatActivity() { } private fun showLoading() { - binding.rvMessageList.visibility = View.GONE + binding.swipeRefreshLayout.visibility = View.GONE binding.emptyLayout.visibility = View.GONE binding.layoutNoNetwork.visibility = View.GONE loadingDialog.show() } private fun hideLoading() { - binding.rvMessageList.visibility = View.VISIBLE + binding.swipeRefreshLayout.visibility = View.VISIBLE loadingDialog.dismiss() } private fun showEmptyState() { - binding.rvMessageList.visibility = View.GONE + binding.swipeRefreshLayout.visibility = View.GONE binding.emptyLayout.visibility = View.VISIBLE binding.tvNoMoreData.visibility = View.GONE } private fun hideEmptyState() { - binding.rvMessageList.visibility = View.VISIBLE + binding.swipeRefreshLayout.visibility = View.VISIBLE binding.emptyLayout.visibility = View.GONE } private fun noNetwork() { - binding.rvMessageList.visibility = View.GONE + binding.swipeRefreshLayout.visibility = View.GONE binding.layoutNoNetwork.visibility = View.VISIBLE binding.tvNoMoreData.visibility = View.GONE } diff --git a/app/src/main/java/com/ckkj/defense_device/liveVideo/DeviceInfoActivity.kt b/app/src/main/java/com/ckkj/defense_device/liveVideo/DeviceInfoActivity.kt index 5d332f8..830979d 100644 --- a/app/src/main/java/com/ckkj/defense_device/liveVideo/DeviceInfoActivity.kt +++ b/app/src/main/java/com/ckkj/defense_device/liveVideo/DeviceInfoActivity.kt @@ -55,8 +55,8 @@ class DeviceInfoActivity : AppCompatActivity() { } private fun updateDeviceInfo(device: com.ckkj.defense_device.bean.DeviceBean) { - binding.tvDeviceModelValue.text = device.deviceNo.toString() - binding.tvDeviceNoValue.text = device.deviceSn.toString() - binding.tvFwVersionValue.text = device.fwVer.toString() + binding.tvDeviceModelValue.text = device.deviceNo?.toString()?: "" + binding.tvDeviceNoValue.text = device.deviceSn?.toString() ?: "" + binding.tvFwVersionValue.text = device.fwVer?.toString()?: "" } } \ No newline at end of file diff --git a/app/src/main/java/com/ckkj/defense_device/liveVideo/LinkedUserActivity.kt b/app/src/main/java/com/ckkj/defense_device/liveVideo/LinkedUserActivity.kt index 643087d..e0d3c53 100644 --- a/app/src/main/java/com/ckkj/defense_device/liveVideo/LinkedUserActivity.kt +++ b/app/src/main/java/com/ckkj/defense_device/liveVideo/LinkedUserActivity.kt @@ -24,6 +24,7 @@ import com.ckkj.defense_device.utils.DeviceIdEvent import com.ckkj.defense_device.utils.DeviceUserUpdateEvent import com.ckkj.defense_device.utils.RetrofitNetwork import com.ckkj.defense_device.view.CustomDialogFragmentText +import com.ckkj.defense_device.view.PullRefreshLayout import com.gyf.immersionbar.ImmersionBar import com.yanzhenjie.recyclerview.SwipeMenuItem import kotlinx.coroutines.CoroutineScope @@ -95,9 +96,11 @@ class LinkedUserActivity : AppCompatActivity() { (binding.rvLinkedUser as RecyclerView).layoutManager = LinearLayoutManager(this) - binding.swipeRefresh.setOnRefreshListener { - fetchUserList() - } + binding.swipeRefresh.setOnRefreshListener(object : PullRefreshLayout.OnRefreshListener { + override fun onRefresh() { + fetchUserList() + } + }) binding.rvLinkedUser.setSwipeMenuCreator { leftMenu, rightMenu, position -> if (mode == MODE_SETTINGS) { @@ -229,7 +232,6 @@ class LinkedUserActivity : AppCompatActivity() { } private fun fetchUserList() { - binding.swipeRefresh.isRefreshing = true lifecycleScope.launch { try { var deviceId: String? = null @@ -238,7 +240,7 @@ class LinkedUserActivity : AppCompatActivity() { if (deviceId.isNullOrEmpty()) { Toast.makeText(this@LinkedUserActivity, "设备 ID 为空", Toast.LENGTH_SHORT).show() withContext(Dispatchers.Main) { - binding.swipeRefresh.isRefreshing = false + binding.swipeRefresh.finishRefresh() } return@launch } @@ -249,7 +251,7 @@ class LinkedUserActivity : AppCompatActivity() { RetrofitNetwork.getNetworkService().getFamilyMembers() } withContext(Dispatchers.Main) { - binding.swipeRefresh.isRefreshing = false + binding.swipeRefresh.finishRefresh() if (response.code == 200 && response.data != null) { if (mode == MODE_SETTINGS) { updateDeviceUserList(response.data as List) @@ -264,7 +266,7 @@ class LinkedUserActivity : AppCompatActivity() { } catch (e: Exception) { e.printStackTrace() withContext(Dispatchers.Main) { - binding.swipeRefresh.isRefreshing = false + binding.swipeRefresh.finishRefresh() noNetwork() Toast.makeText(this@LinkedUserActivity, R.string.network_request_failed, Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/ckkj/defense_device/liveVideo/UserDetailsActivity.kt b/app/src/main/java/com/ckkj/defense_device/liveVideo/UserDetailsActivity.kt index b0fe7a8..23b89fa 100644 --- a/app/src/main/java/com/ckkj/defense_device/liveVideo/UserDetailsActivity.kt +++ b/app/src/main/java/com/ckkj/defense_device/liveVideo/UserDetailsActivity.kt @@ -75,7 +75,7 @@ class UserDetailsActivity : AppCompatActivity() { } private fun updateUI(data: com.ckkj.defense_device.bean.ObtainInviterInformationBean) { - binding.tvContactName.text = data.nickName ?: "未知用户" + binding.tvContactName.text = data.nickName ?: "" binding.tvPhone.text = data.phonenumber ?: "" binding.tvIdCard.text = data.idCard ?: "" binding.tvMacAddress.text = data.mac ?: "" diff --git a/app/src/main/java/com/ckkj/defense_device/personal/SettingsMenusActivity.kt b/app/src/main/java/com/ckkj/defense_device/personal/SettingsMenusActivity.kt index 675a7f7..ad793bf 100644 --- a/app/src/main/java/com/ckkj/defense_device/personal/SettingsMenusActivity.kt +++ b/app/src/main/java/com/ckkj/defense_device/personal/SettingsMenusActivity.kt @@ -7,6 +7,7 @@ import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import com.ckkj.defense_device.databinding.SettingsMenusActivityBinding import com.gyf.immersionbar.ImmersionBar +import java.io.File class SettingsMenusActivity : AppCompatActivity() { private lateinit var binding: SettingsMenusActivityBinding @@ -25,6 +26,8 @@ class SettingsMenusActivity : AppCompatActivity() { val versionName = packageManager.getPackageInfo(packageName, 0).versionName binding.tvVersion.text = versionName + // 显示缓存大小 + displayCacheSize() setupClickListeners() } @@ -42,8 +45,9 @@ class SettingsMenusActivity : AppCompatActivity() { // 清除缓存 binding.itemClearCache.setOnClickListener { + clearCache() + displayCacheSize() // 更新缓存大小显示 Toast.makeText(this, "缓存已清除", Toast.LENGTH_SHORT).show() - binding.tvCacheSize.text = "0 KB" } // 用户协议 @@ -62,4 +66,46 @@ class SettingsMenusActivity : AppCompatActivity() { startActivity(intent) } } + //缓存方法 + private fun displayCacheSize() { + val cacheSize = getCacheSize() + val sizeString = when { + cacheSize >= 1024 * 1024 -> String.format("%.2f MB", cacheSize / (1024.0 * 1024.0)) + else -> String.format("%d KB", cacheSize / 1024) + } + binding.tvCacheSize.text = sizeString + } + + private fun getCacheSize(): Long { + val cacheDir = cacheDir + return getFolderSize(cacheDir) + } + + private fun getFolderSize(dir: File?): Long { + var size = 0L + if (dir != null && dir.isDirectory) { + dir.listFiles()?.forEach { file -> + size += if (file.isFile) { + file.length() + } else { + getFolderSize(file) + } + } + } + return size + } + + private fun clearCache() { + val cacheDir = cacheDir + deleteDir(cacheDir) + } + + private fun deleteDir(dir: File?): Boolean { + if (dir != null && dir.isDirectory) { + dir.listFiles()?.forEach { file -> + deleteDir(file) + } + } + return dir?.delete() ?: false + } } \ No newline at end of file diff --git a/app/src/main/java/com/ckkj/defense_device/utils/RetrofitNetwork.kt b/app/src/main/java/com/ckkj/defense_device/utils/RetrofitNetwork.kt index e7a263f..1ff8c2a 100644 --- a/app/src/main/java/com/ckkj/defense_device/utils/RetrofitNetwork.kt +++ b/app/src/main/java/com/ckkj/defense_device/utils/RetrofitNetwork.kt @@ -14,8 +14,8 @@ import java.util.concurrent.TimeUnit object RetrofitNetwork { private const val DEFAULT_TIMEOUT = 30L - const val BASE_URL = "https://stem-boozy-margarine.ngrok-free.dev" - //const val BASE_URL = "http://service.reinkun.com:8001" + //const val BASE_URL = "https://stem-boozy-margarine.ngrok-free.dev" + const val BASE_URL = "http://service.reinkun.com:8001" private var retrofit: Retrofit? = null private val gson = Gson() diff --git a/app/src/main/res/layout-land/linked_user_activity.xml b/app/src/main/res/layout-land/linked_user_activity.xml index 675c16b..54ecb30 100644 --- a/app/src/main/res/layout-land/linked_user_activity.xml +++ b/app/src/main/res/layout-land/linked_user_activity.xml @@ -73,7 +73,7 @@ - - + android:paddingBottom="16dp" + android:clipToPadding="false" + android:overScrollMode="never"/> + @@ -37,6 +38,7 @@ android:text="@string/confirm" android:textColor="@color/green" android:textSize="14dp" + android:textStyle="bold" android:clickable="true" android:focusable="true" /> @@ -45,6 +47,7 @@ android:id="@+id/rvMessageList" android:layout_width="match_parent" android:layout_height="wrap_content" + android:maxHeight="150dp" android:clipToPadding="false" android:paddingStart="14dp" android:paddingTop="12dp" diff --git a/app/src/main/res/layout/home_menu_fragment.xml b/app/src/main/res/layout/home_menu_fragment.xml index e0e13e5..0f21bb1 100644 --- a/app/src/main/res/layout/home_menu_fragment.xml +++ b/app/src/main/res/layout/home_menu_fragment.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@mipmap/home_back" tools:context=".home.HomeMenuFragment"> @@ -37,15 +38,13 @@ + android:textSize="20sp" + android:textStyle="bold" /> - - + android:layout_height="wrap_content"> + android:textSize="14dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/linked_user_activity.xml b/app/src/main/res/layout/linked_user_activity.xml index 74e859c..a950e3b 100644 --- a/app/src/main/res/layout/linked_user_activity.xml +++ b/app/src/main/res/layout/linked_user_activity.xml @@ -85,7 +85,7 @@ android:layout_weight="1"> - @@ -93,8 +93,11 @@ - + android:layout_height="match_parent" + android:clipToPadding="false" + android:overScrollMode="never" + android:paddingBottom="16dp"/> + - + android:layout_height="match_parent"> + + + +