Guest User

Untitled

a guest
Dec 11th, 2018
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. package com.aniketkadam.wifimanager.androidhelpers
  2.  
  3. import android.content.BroadcastReceiver
  4. import android.content.Context
  5. import android.content.Intent
  6. import android.content.IntentFilter
  7. import io.reactivex.Observable
  8. import io.reactivex.ObservableEmitter
  9. import io.reactivex.ObservableOnSubscribe
  10. import io.reactivex.disposables.Disposable
  11. import java.io.Closeable
  12. import java.util.concurrent.atomic.AtomicBoolean
  13.  
  14. class ObservableBroadcastReceiver<T> private constructor(
  15. val context: Context,
  16. val intentFilter: IntentFilter,
  17. val intentMapper: (Intent) -> T
  18. ) : ObservableOnSubscribe<T>,
  19. Disposable {
  20.  
  21. companion object {
  22. fun <T> create(context: Context, intentFilter: IntentFilter, intentMapper: (Intent) -> T) =
  23. Observable.create(ObservableBroadcastReceiver(context, intentFilter, intentMapper))
  24. }
  25.  
  26. private val isDisposed = AtomicBoolean(false)
  27.  
  28. override fun isDisposed(): Boolean = isDisposed.get()
  29.  
  30. override fun dispose() {
  31. broadcastBroadcastReceiverTemplate.close()
  32. isDisposed.set(true)
  33. }
  34.  
  35. private lateinit var broadcastBroadcastReceiverTemplate: BroadcastReceiverTemplate
  36.  
  37. override fun subscribe(emitter: ObservableEmitter<T>) {
  38. broadcastBroadcastReceiverTemplate =
  39. BroadcastReceiverTemplate(context, { i ->
  40. isDisposed.get().also { disposed ->
  41. if (!disposed) {
  42. emitter.onNext(intentMapper(i))
  43. }
  44. }
  45. }, intentFilter)
  46.  
  47. broadcastBroadcastReceiverTemplate.start()
  48. }
  49.  
  50. }
  51.  
  52. private class BroadcastReceiverTemplate(
  53. context: Context,
  54. val onEvent: (Intent) -> Unit,
  55. val intentFilter: IntentFilter
  56. ) : BroadcastReceiver(), Closeable {
  57.  
  58. private var context: Context? =
  59. context // Have to allow for nulling out later, despite requiring a non-null one initially
  60.  
  61. override fun onReceive(context: Context, intent: Intent) {
  62. onEvent(intent)
  63. }
  64.  
  65. internal fun start() {
  66. context?.registerReceiver(this, intentFilter)
  67. }
  68.  
  69. override fun close() {
  70. context?.unregisterReceiver(this)
  71. context = null
  72. }
  73.  
  74. }
Add Comment
Please, Sign In to add comment