Skip to content

Instantly share code, notes, and snippets.

@TinasheMzondiwa
Last active November 15, 2017 12:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TinasheMzondiwa/b944744f431c6eeddfd9f9f4c50f4cb7 to your computer and use it in GitHub Desktop.
Save TinasheMzondiwa/b944744f431c6eeddfd9f9f4c50f4cb7 to your computer and use it in GitHub Desktop.
RxFirebase using kotlin
import com.google.android.gms.tasks.Task
import com.google.firebase.database.*
import io.reactivex.Observable
/**
* Created by tinashe on 2017/11/15.
*/
object RxFirebase {
enum class EventType {
CHILD_ADDED, CHILD_CHANGED, CHILD_REMOVED, CHILD_MOVED
}
class FirebaseChildEvent constructor(var snapshot: DataSnapshot, var eventType: EventType, var prevName: String)
fun observeChildren(ref: Query): Observable<FirebaseChildEvent> {
return Observable.create {
ref.addChildEventListener(object : ChildEventListener {
override fun onChildAdded(dataSnapshot: DataSnapshot, prevName: String) {
it.onNext(FirebaseChildEvent(dataSnapshot, EventType.CHILD_ADDED, prevName))
}
override fun onChildChanged(dataSnapshot: DataSnapshot, prevName: String) {
it.onNext(FirebaseChildEvent(dataSnapshot, EventType.CHILD_CHANGED, prevName))
}
override fun onChildRemoved(dataSnapshot: DataSnapshot) {
it.onNext(FirebaseChildEvent(dataSnapshot, EventType.CHILD_REMOVED, ""))
}
override fun onChildMoved(dataSnapshot: DataSnapshot, prevName: String) {
it.onNext(FirebaseChildEvent(dataSnapshot, EventType.CHILD_MOVED, prevName))
}
override fun onCancelled(error: DatabaseError) {
// Notify Subscriber
it.onError(error.toException())
ref.removeEventListener(this)
}
})
}
}
fun observe(ref: Query): Observable<DataSnapshot> {
return Observable.create {
ref.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
it.onNext(dataSnapshot)
}
override fun onCancelled(error: DatabaseError) {
// Notify Subscriber
it.onError(error.toException())
ref.removeEventListener(this)
}
})
}
}
fun observe(dbRef: DatabaseReference): Observable<DataSnapshot> {
return Observable.create {
dbRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
it.onNext(dataSnapshot)
}
override fun onCancelled(error: DatabaseError) {
// Notify Subscriber
it.onError(error.toException())
dbRef.removeEventListener(this)
}
})
}
}
fun observeSingle(ref: Query): Observable<DataSnapshot> {
return Observable.create {
ref.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(error: DatabaseError) {
it.onError(error.toException())
ref.removeEventListener(this)
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
it.onNext(dataSnapshot)
}
})
}
}
fun observePush(dbRef: DatabaseReference, value: Any): Observable<Task<Void>> {
return Observable.create { e ->
dbRef.push().setValue(value)
.addOnCompleteListener { e.onNext(it) }
.addOnFailureListener { e.onError(it) }
}
}
fun observeUpdate(dbRef: DatabaseReference, value: Any): Observable<Task<Void>> {
return Observable.create { e ->
dbRef.setValue(value)
.addOnCompleteListener { e.onNext(it) }
.addOnFailureListener { e.onError(it) }
}
}
}
val disposable = RxFirebase.observe(database.getReference("videos"))
.subscribeOn(schedulers.database)
.observeOn(schedulers.main)
.subscribe({
Log.d(javaClass.name, "Videos: " + it.toString())
}, { Log.e(javaClass.name, it.message, it) })
disposables.add(disposable)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment