Thursday, 13 June 2019

FCM + Coroutine

package com.example.background.fcm

import android.content.Context
import androidx.annotation.WorkerThreadimport com.google.firebase.iid.FirebaseInstanceId
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers.IOimport kotlinx.coroutines.async
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine

class TokenManager(scope: CoroutineScope = CoroutineScope(IO)) {
    private val instanceId = FirebaseInstanceId.getInstance().instanceId
    var currentToken: Deferred

    init {
        currentToken = scope.async {            instanceId.awaitTask()?.token        }    }

    @WorkerThread    internal suspend fun share(appContext: Context) {
        decorateToken {            deferredToken = currentToken            context = appContext
        }    }
}


-----------------
import com.google.android.gms.tasks.Task
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlin.coroutines.suspendCoroutine

suspend fun <T> Task<T>.awaitTask(): T? = suspendCoroutine { continuation ->    this.addOnCompleteListener { task ->        if (task.isSuccessful) {
            continuation.resume(task.result)
        } else {
            continuation.resumeWithException(task.exception!!)
        }
    }}

------------------
import android.content.Contextimport androidx.annotation.WorkerThreadimport kotlinx.coroutines.CoroutineScopeimport kotlinx.coroutines.Deferredimport kotlinx.coroutines.Dispatchersimport kotlinx.coroutines.launch
class TokenDecorator(private val scope : CoroutineScope = CoroutineScope(Dispatchers.IO)) {
    lateinit var deferredToken : Deferred
    lateinit var context : Context

    @WorkerThread    fun decorate() {
        scope.launch {            val token = deferredToken?.await().toString()

            //share with third party
            //sendToServer(token)        }    }
}
fun decorateToken(block : TokenDecorator.() -> Unit) = TokenDecorator().apply(block).decorate()




1 comment:

Simon Matthew said...

Great write-up. Integrating usability testing into mobile app development will help app developers identify whether the app is offering a rich experience or not. Eiliana.com is an ideal freelancing portal for professional app developers looking for work.