Created
November 17, 2018 17:56
-
-
Save TimoPtr/572c4b3ec001b036de1c305a3ad9bd60 to your computer and use it in GitHub Desktop.
RxBroadcastReceiver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 <[email protected]> | |
* @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