fix: 绑定消息移到MainActivity处理,彻底解决配对失败
与解绑一样,BindFragment的collect可能在MQTT消息到达时还未注册, 导致消息丢失。改为Activity级别统一处理type=2绑定消息。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,8 +7,13 @@ import android.view.View
|
||||
import androidx.navigation.fragment.NavHostFragment
|
||||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.google.gson.Gson
|
||||
import com.xiaoqu.watch.R
|
||||
import com.xiaoqu.watch.data.device.WatchBindInfo
|
||||
import com.xiaoqu.watch.data.prefs.DevicePrefs
|
||||
import com.xiaoqu.watch.databinding.ActivityMainBinding
|
||||
import com.xiaoqu.watch.network.api.CommonApi
|
||||
import com.xiaoqu.watch.network.safeApiCall
|
||||
import com.xiaoqu.watch.event.AppEvent
|
||||
import com.xiaoqu.watch.event.EventBus
|
||||
import com.xiaoqu.watch.data.prefs.UserPrefs
|
||||
@@ -52,6 +57,9 @@ class MainActivity : AppCompatActivity() {
|
||||
/** NFC 任务打卡管理器 */
|
||||
@Inject lateinit var nfcTaskManager: NfcTaskManager
|
||||
@Inject lateinit var userPrefs: UserPrefs
|
||||
@Inject lateinit var devicePrefs: DevicePrefs
|
||||
@Inject lateinit var commonApi: CommonApi
|
||||
@Inject lateinit var gson: Gson
|
||||
/** OTA 更新弹窗 */
|
||||
lateinit var updateDialog: UpdateDialogView
|
||||
lateinit var notificationBanner: NotificationBannerView
|
||||
@@ -121,6 +129,11 @@ class MainActivity : AppCompatActivity() {
|
||||
notificationBanner.show(count)
|
||||
}
|
||||
}
|
||||
2 -> {
|
||||
// 绑定成功 → 存用户信息 → 跳首页
|
||||
Timber.d("MainActivity: 收到绑定消息")
|
||||
handleBindMessage(event.rawJson)
|
||||
}
|
||||
3 -> {
|
||||
// 解绑 → 清除数据 → 跳绑定页(从任何页面都能跳)
|
||||
Timber.d("MainActivity: 收到解绑消息")
|
||||
@@ -229,6 +242,53 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
// ===== 绑定处理 =====
|
||||
|
||||
/** 防止重复处理绑定消息 */
|
||||
private var bindHandled = false
|
||||
|
||||
/** 处理 MQTT type=2 绑定消息(Activity 级别,不受 Fragment 生命周期影响) */
|
||||
private fun handleBindMessage(rawJson: String) {
|
||||
if (bindHandled) return
|
||||
bindHandled = true
|
||||
|
||||
try {
|
||||
val bindInfo = gson.fromJson(rawJson, WatchBindInfo::class.java)
|
||||
|
||||
// 存入 UserPrefs
|
||||
userPrefs.saveUser(
|
||||
userId = bindInfo.userId,
|
||||
mobile = bindInfo.mobile,
|
||||
userName = bindInfo.userName,
|
||||
headUrl = bindInfo.headUrl
|
||||
)
|
||||
|
||||
// 异步调 API 确认(不阻塞导航)
|
||||
activityScope.launch {
|
||||
try {
|
||||
val params = hashMapOf<String, Any>(
|
||||
"imei" to devicePrefs.imei,
|
||||
"userId" to bindInfo.userId
|
||||
)
|
||||
safeApiCall { commonApi.bindWatchConfirm(params) }
|
||||
Timber.d("MainActivity: 绑定确认 API 已调用")
|
||||
} catch (e: Exception) {
|
||||
Timber.w(e, "MainActivity: 绑定确认 API 异常")
|
||||
}
|
||||
}
|
||||
|
||||
// 导航到首页
|
||||
val navHost = supportFragmentManager
|
||||
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
|
||||
navHost.navController.navigate(R.id.action_global_to_home)
|
||||
Timber.d("MainActivity: 绑定成功,已导航到首页")
|
||||
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "MainActivity: 绑定处理异常")
|
||||
bindHandled = false
|
||||
}
|
||||
}
|
||||
|
||||
// ===== OTA 更新 =====
|
||||
|
||||
/** 设置更新弹窗按钮回调 */
|
||||
|
||||
Reference in New Issue
Block a user