34 lines
1.3 KiB
Kotlin
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)
|
|
}
|