fix: actively fetch FCM token on login if not cached
- LoginViewModel now calls Tasks.await(FirebaseMessaging.getInstance().token) to actively fetch the FCM token if not yet saved in prefs - Previous code relied solely on onNewToken callback, which may not fire before the user logs in on a fresh install
This commit is contained in:
@@ -8,10 +8,14 @@ import com.devlab.app.data.api.SessionManager
|
|||||||
import com.devlab.app.data.repository.AuthRepository
|
import com.devlab.app.data.repository.AuthRepository
|
||||||
import com.devlab.app.data.model.FcmRegisterRequest
|
import com.devlab.app.data.model.FcmRegisterRequest
|
||||||
import com.devlab.app.util.PreferencesManager
|
import com.devlab.app.util.PreferencesManager
|
||||||
|
import com.google.android.gms.tasks.Tasks
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|
||||||
data class LoginUiState(
|
data class LoginUiState(
|
||||||
val username: String = "",
|
val username: String = "",
|
||||||
@@ -100,7 +104,17 @@ class LoginViewModel : ViewModel() {
|
|||||||
|
|
||||||
private suspend fun registerFcmToken() {
|
private suspend fun registerFcmToken() {
|
||||||
try {
|
try {
|
||||||
val fcmToken = prefs.getFcmToken()
|
var fcmToken = prefs.getFcmToken()
|
||||||
|
if (fcmToken.isBlank()) {
|
||||||
|
fcmToken = withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
Tasks.await(FirebaseMessaging.getInstance().token)
|
||||||
|
} catch (_: Exception) { "" }
|
||||||
|
}
|
||||||
|
if (fcmToken.isNotBlank()) {
|
||||||
|
prefs.saveFcmToken(fcmToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
if (fcmToken.isNotBlank()) {
|
if (fcmToken.isNotBlank()) {
|
||||||
val service = RetrofitClient.getApiService()
|
val service = RetrofitClient.getApiService()
|
||||||
service.registerFcmToken(FcmRegisterRequest(fcmToken))
|
service.registerFcmToken(FcmRegisterRequest(fcmToken))
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user