feat: MQTT动态更新nfcOpenTime + 物理返回键触发NFC打卡

1. MQTT type=4: 解析nfcOpenTime参数,动态更新NFC超时时间
2. 物理返回键: 已绑定用户按返回键→展开面板+自动开始打卡
   面板已展开时按返回键→收回面板

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-04-29 11:26:57 +09:30
parent ecd3090a74
commit 866063b21c
2 changed files with 55 additions and 9 deletions

View File

@@ -61,6 +61,9 @@ class MainActivity : AppCompatActivity() {
/** 下拉回调(由 HomeFragment 注册) */ /** 下拉回调(由 HomeFragment 注册) */
var onSwipeDown: (() -> Unit)? = null var onSwipeDown: (() -> Unit)? = null
/** 返回键回调(由 HomeFragment 注册,触发 NFC 打卡) */
var onBackKeyPressed: (() -> Unit)? = null
private var touchStartY = 0f private var touchStartY = 0f
private var touchStartX = 0f private var touchStartX = 0f
private var swipeTriggered = false private var swipeTriggered = false
@@ -102,8 +105,9 @@ class MainActivity : AppCompatActivity() {
private fun setupBackButton() { private fun setupBackButton() {
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() { override fun handleOnBackPressed() {
// TODO: 后续模块实现 NFC 打卡触发
Timber.d("Back button pressed - intercepted") Timber.d("Back button pressed - intercepted")
// 已绑定用户 → 触发 NFC 打卡(由 HomeFragment 注册回调)
onBackKeyPressed?.invoke()
} }
}) })
} }

View File

@@ -122,8 +122,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
// 清理 Activity 下拉回调,避免泄漏 // 清理 Activity 回调,避免泄漏
(activity as? com.xiaoqu.watch.app.MainActivity)?.onSwipeDown = null (activity as? com.xiaoqu.watch.app.MainActivity)?.let {
it.onSwipeDown = null
it.onBackKeyPressed = null
}
} }
// ===== 打卡面板 ===== // ===== 打卡面板 =====
@@ -213,12 +216,35 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
* 在 Activity.dispatchTouchEvent 中检测——触摸事件链最顶层,不会被任何子 View 拦截 * 在 Activity.dispatchTouchEvent 中检测——触摸事件链最顶层,不会被任何子 View 拦截
*/ */
private fun initSwipeDownDetector() { private fun initSwipeDownDetector() {
(activity as? com.xiaoqu.watch.app.MainActivity)?.onSwipeDown = { val mainActivity = activity as? com.xiaoqu.watch.app.MainActivity ?: return
// 只在主页page=1且面板未展开时响应
// 下拉触发打卡面板
mainActivity.onSwipeDown = {
if (binding.viewPager.currentItem == 1 && !punchPanel.isShowing) { if (binding.viewPager.currentItem == 1 && !punchPanel.isShowing) {
showPunchPanel() 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<FragmentHomeBinding>() {
findNavController().navigate(R.id.action_home_to_bind) findNavController().navigate(R.id.action_home_to_bind)
} }
4 -> { 4 -> {
// 工作状态变更(上下班 // 系统参数变更(蓝牙/NFC 配置
Timber.d("首页: 收到工作状态变更") Timber.d("首页: 收到系统参数变更")
// TODO: 解析 rawJson 中的 action 字段 handleMqttParamsUpdate(event.rawJson)
// 暂时使用事件触发
} }
5 -> { 5 -> {
// 上下班状态推送 // 上下班状态推送
@@ -412,6 +437,23 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
} }
} }
/**
* 处理 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 参数) */ /** 跳转到任务列表(传 tableStatus 参数) */
private fun navigateToTaskList(tableStatus: Int) { private fun navigateToTaskList(tableStatus: Int) {
// 防止重复导航 // 防止重复导航