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:
@@ -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()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -122,8 +122,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
|
||||
|
||||
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<FragmentHomeBinding>() {
|
||||
* 在 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<FragmentHomeBinding>() {
|
||||
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<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 参数) */
|
||||
private fun navigateToTaskList(tableStatus: Int) {
|
||||
// 防止重复导航
|
||||
|
||||
Reference in New Issue
Block a user