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 注册) */
|
/** 下拉回调(由 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()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
// 防止重复导航
|
// 防止重复导航
|
||||||
|
|||||||
Reference in New Issue
Block a user