From 866063b21c96b42ac9d2a2456fbcf9376f7c0cf3 Mon Sep 17 00:00:00 2001 From: dongliang Date: Wed, 29 Apr 2026 11:26:57 +0930 Subject: [PATCH] =?UTF-8?q?feat:=20MQTT=E5=8A=A8=E6=80=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0nfcOpenTime=20+=20=E7=89=A9=E7=90=86=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E9=94=AE=E8=A7=A6=E5=8F=91NFC=E6=89=93=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. MQTT type=4: 解析nfcOpenTime参数,动态更新NFC超时时间 2. 物理返回键: 已绑定用户按返回键→展开面板+自动开始打卡 面板已展开时按返回键→收回面板 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../java/com/xiaoqu/watch/app/MainActivity.kt | 6 +- .../com/xiaoqu/watch/ui/home/HomeFragment.kt | 58 ++++++++++++++++--- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/xiaoqu/watch/app/MainActivity.kt b/app/src/main/java/com/xiaoqu/watch/app/MainActivity.kt index 796194f..c12bd61 100644 --- a/app/src/main/java/com/xiaoqu/watch/app/MainActivity.kt +++ b/app/src/main/java/com/xiaoqu/watch/app/MainActivity.kt @@ -61,6 +61,9 @@ class MainActivity : AppCompatActivity() { /** 下拉回调(由 HomeFragment 注册) */ var onSwipeDown: (() -> Unit)? = null + /** 返回键回调(由 HomeFragment 注册,触发 NFC 打卡) */ + var onBackKeyPressed: (() -> Unit)? = null + private var touchStartY = 0f private var touchStartX = 0f private var swipeTriggered = false @@ -102,8 +105,9 @@ class MainActivity : AppCompatActivity() { private fun setupBackButton() { onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { - // TODO: 后续模块实现 NFC 打卡触发 Timber.d("Back button pressed - intercepted") + // 已绑定用户 → 触发 NFC 打卡(由 HomeFragment 注册回调) + onBackKeyPressed?.invoke() } }) } diff --git a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt index edc2af7..63854a1 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt @@ -122,8 +122,11 @@ class HomeFragment : BaseFragment() { override fun onDestroyView() { super.onDestroyView() - // 清理 Activity 下拉回调,避免泄漏 - (activity as? com.xiaoqu.watch.app.MainActivity)?.onSwipeDown = null + // 清理 Activity 回调,避免泄漏 + (activity as? com.xiaoqu.watch.app.MainActivity)?.let { + it.onSwipeDown = null + it.onBackKeyPressed = null + } } // ===== 打卡面板 ===== @@ -213,12 +216,35 @@ class HomeFragment : BaseFragment() { * 在 Activity.dispatchTouchEvent 中检测——触摸事件链最顶层,不会被任何子 View 拦截 */ private fun initSwipeDownDetector() { - (activity as? com.xiaoqu.watch.app.MainActivity)?.onSwipeDown = { - // 只在主页(page=1)且面板未展开时响应 + val mainActivity = activity as? com.xiaoqu.watch.app.MainActivity ?: return + + // 下拉触发打卡面板 + mainActivity.onSwipeDown = { if (binding.viewPager.currentItem == 1 && !punchPanel.isShowing) { showPunchPanel() } } + + // 物理返回键触发 NFC 打卡(已绑定用户在首页时) + mainActivity.onBackKeyPressed = { + if (userPrefs.isBound) { + // 面板已展开 → 收回面板 + if (punchPanel.isShowing) { + punchPanel.dismiss() + } else { + // 展开面板并自动开始上班/下班打卡 + showPunchPanel() + // 延迟一帧等面板展开后,根据状态自动触发打卡 + binding.root.post { + val state = punchViewModel.uiState.value + when { + state.onPunchState == 0 -> punchViewModel.startPunch(0) + state.onPunchState == 1 -> punchViewModel.startPunch(1) + } + } + } + } + } } // ===== 主页 ===== @@ -375,10 +401,9 @@ class HomeFragment : BaseFragment() { findNavController().navigate(R.id.action_home_to_bind) } 4 -> { - // 工作状态变更(上下班) - Timber.d("首页: 收到工作状态变更") - // TODO: 解析 rawJson 中的 action 字段 - // 暂时使用事件触发 + // 系统参数变更(蓝牙/NFC 配置) + Timber.d("首页: 收到系统参数变更") + handleMqttParamsUpdate(event.rawJson) } 5 -> { // 上下班状态推送 @@ -412,6 +437,23 @@ class HomeFragment : BaseFragment() { } } + /** + * 处理 MQTT type=4 系统参数变更 + * 从中提取 nfcOpenTime 更新 NFC 超时时间 + */ + private fun handleMqttParamsUpdate(rawJson: String) { + try { + val json = org.json.JSONObject(rawJson) + val nfcOpenTime = json.optInt("nfcOpenTime", -1) + if (nfcOpenTime > 0) { + punchViewModel.nfcTimeoutMs = nfcOpenTime * 1000L + Timber.d("首页: NFC超时更新为 ${nfcOpenTime}s") + } + } catch (e: Exception) { + Timber.w(e, "解析 MQTT 参数变更消息失败") + } + } + /** 跳转到任务列表(传 tableStatus 参数) */ private fun navigateToTaskList(tableStatus: Int) { // 防止重复导航