package com.github.abdularis.trackmylocation.data.rxfirestore; import com.google.firebase.firestore.EventListener; import com.google.firebase.firestore.FirebaseFirestoreException; import com.google.firebase.firestore.ListenerRegistration; import com.google.firebase.firestore.Query; import com.google.firebase.firestore.QuerySnapshot; import io.reactivex.FlowableEmitter; import io.reactivex.FlowableOnSubscribe; import io.reactivex.disposables.Disposable; public class FirestoreQueryOnSubscribe implements FlowableOnSubscribe<QuerySnapshot> { private Query mQuery; public FirestoreQueryOnSubscribe(Query query) { mQuery = query; } @Override public void subscribe(FlowableEmitter<QuerySnapshot> e) throws Exception { QueryEventListener listener = new QueryEventListener(e); ListenerRegistration registration = mQuery.addSnapshotListener(listener); e.setDisposable(new Disposable() { boolean disposed = false; @Override public void dispose() { if (!isDisposed()) { registration.remove(); listener.emitter = null; disposed = true; } } @Override public boolean isDisposed() { return disposed; } }); } class QueryEventListener implements EventListener<QuerySnapshot> { FlowableEmitter<QuerySnapshot> emitter; QueryEventListener(FlowableEmitter<QuerySnapshot> emitter) { this.emitter = emitter; } @Override public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) { if (e != null) { emitter.onError(e); } else { emitter.onNext(documentSnapshots); } } } }