Skip to content

Instantly share code, notes, and snippets.

@TimoPtr
Created November 17, 2018 17:56
Show Gist options
  • Save TimoPtr/572c4b3ec001b036de1c305a3ad9bd60 to your computer and use it in GitHub Desktop.
Save TimoPtr/572c4b3ec001b036de1c305a3ad9bd60 to your computer and use it in GitHub Desktop.
RxBroadcastReceiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.util.Log
import io.reactivex.Observable
import io.reactivex.ObservableEmitter
import io.reactivex.subjects.PublishSubject
/**
* @author Nibeaudeau Timothy <timothy.nibeaudeau@gmail.com>
* @version 0.1
* on 17/11/2018 for rxjava-sample with IntelliJ IDEA.
*/
/**
* Helper class to store the context and the result intent
* @param context the context where to [Context.registerReceiver] and [Context.unregisterReceiver] the [BroadcastReceiver]
*/
class IntentWithContext(val context: Context, val intent: Intent)
/**
* Given an [filter] and a [context] create an [Observable] to listen broadcast which match the filter
*
* It will [Context.registerReceiver] to the [context] at the subscription to the observable and will
* [Context.unregisterReceiver] when [Observable.doOnComplete] or [Observable.doOnDispose] are call to avoid leaking [context]
*
* @param context the context where to [Context.registerReceiver] and [Context.unregisterReceiver] the [BroadcastReceiver]
* @param filter the IntentFilter to filter the broadcast
*/
fun Context.fromBroadcast(filter: IntentFilter): Observable<IntentWithContext> {
var receiver: BroadcastReceiver? = null
var isRegistered = false
return PublishSubject.create { emitter: ObservableEmitter<IntentWithContext> ->
receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
emitter.onNext(IntentWithContext(context, intent))
}
}
Log.i(TAG, "register")
registerReceiver(receiver, filter)
isRegistered = true
}.doOnComplete {
Log.i(TAG, "complete")
if (receiver != null && isRegistered) {
Log.i(TAG, "unregister")
unregisterReceiver(receiver)
isRegistered = false
}
}.doOnDispose {
Log.i(TAG, "dispose")
if (receiver != null && isRegistered) {
Log.i(TAG, "unregister")
unregisterReceiver(receiver)
isRegistered = false
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment