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) { // 防止重复导航