secant-android-wallet/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/CoroutineBroadcastReceiver.kt

34 lines
1.3 KiB
Kotlin

package co.electriccoin.zcash.spackle
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
/**
* @param broadcastReceiverScope Scope for performing asynchronous work in the broadcast receiver.
* It is not recommended to cancel this scope.
*/
abstract class CoroutineBroadcastReceiver(private val broadcastReceiverScope: CoroutineScope) : BroadcastReceiver() {
final override fun onReceive(context: Context, intent: Intent) {
val pendingResult = goAsync()
broadcastReceiverScope.launch {
onReceiveSuspend(context, intent)
// Race condition here: if the broadcastReceiverScope is canceled before this
// completes, then the BroadcastReceiver will trigger an Application Not Responding
// because the PendingResult was leaked.
pendingResult.finish()
}
}
/**
* Override to perform work asynchronously. Note that this method must be quick to avoid
* the Android timeout for broadcast receivers. This method is suitable for brief disk IO but
* not suitable for network calls.
*/
abstract suspend fun onReceiveSuspend(context: Context, intent: Intent)
}