package com.kelvinapps.rxfirebase; import android.support.annotation.NonNull; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.ProviderQueryResult; import rx.Observable; import rx.Subscriber; import rx.functions.Action0; import rx.subscriptions.Subscriptions; /** * Created by Nick Moskalenko on 15/05/2016. */ public class RxFirebaseAuth { @NonNull public static Observable<AuthResult> signInAnonymously(@NonNull final FirebaseAuth firebaseAuth) { return Observable.unsafeCreate(new Observable.OnSubscribe<AuthResult>() { @Override public void call(final Subscriber<? super AuthResult> subscriber) { RxTask.assignOnTask(subscriber, firebaseAuth.signInAnonymously()); } }); } @NonNull public static Observable<AuthResult> signInWithEmailAndPassword(@NonNull final FirebaseAuth firebaseAuth, @NonNull final String email, @NonNull final String password) { return Observable.unsafeCreate(new Observable.OnSubscribe<AuthResult>() { @Override public void call(final Subscriber<? super AuthResult> subscriber) { RxTask.assignOnTask(subscriber, firebaseAuth.signInWithEmailAndPassword(email, password)); } }); } @NonNull public static Observable<AuthResult> signInWithCredential(@NonNull final FirebaseAuth firebaseAuth, @NonNull final AuthCredential credential) { return Observable.unsafeCreate(new Observable.OnSubscribe<AuthResult>() { @Override public void call(final Subscriber<? super AuthResult> subscriber) { RxTask.assignOnTask(subscriber, firebaseAuth.signInWithCredential(credential)); } }); } @NonNull public static Observable<AuthResult> signInWithCustomToken(@NonNull final FirebaseAuth firebaseAuth, @NonNull final String token) { return Observable.unsafeCreate(new Observable.OnSubscribe<AuthResult>() { @Override public void call(final Subscriber<? super AuthResult> subscriber) { RxTask.assignOnTask(subscriber, firebaseAuth.signInWithCustomToken(token)); } }); } @NonNull public static Observable<AuthResult> createUserWithEmailAndPassword(@NonNull final FirebaseAuth firebaseAuth, @NonNull final String email, @NonNull final String password) { return Observable.unsafeCreate(new Observable.OnSubscribe<AuthResult>() { @Override public void call(final Subscriber<? super AuthResult> subscriber) { RxTask.assignOnTask(subscriber, firebaseAuth.createUserWithEmailAndPassword(email, password)); } }); } @NonNull public static Observable<ProviderQueryResult> fetchProvidersForEmail(@NonNull final FirebaseAuth firebaseAuth, @NonNull final String email) { return Observable.unsafeCreate(new Observable.OnSubscribe<ProviderQueryResult>() { @Override public void call(final Subscriber<? super ProviderQueryResult> subscriber) { RxTask.assignOnTask(subscriber, firebaseAuth.fetchProvidersForEmail(email)); } }); } @NonNull public static Observable<Void> sendPasswordResetEmail(@NonNull final FirebaseAuth firebaseAuth, @NonNull final String email) { return Observable.unsafeCreate(new Observable.OnSubscribe<Void>() { @Override public void call(final Subscriber<? super Void> subscriber) { RxTask.assignOnTask(subscriber, firebaseAuth.sendPasswordResetEmail(email)); } }); } @NonNull public static Observable<FirebaseUser> observeAuthState(@NonNull final FirebaseAuth firebaseAuth) { return Observable.unsafeCreate(new Observable.OnSubscribe<FirebaseUser>() { @Override public void call(final Subscriber<? super FirebaseUser> subscriber) { final FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { if (!subscriber.isUnsubscribed()) { subscriber.onNext(firebaseAuth.getCurrentUser()); } } }; firebaseAuth.addAuthStateListener(authStateListener); subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { firebaseAuth.removeAuthStateListener(authStateListener); } })); } }); } }