package com.novoda.bonfire.login.database; import android.net.Uri; import android.support.annotation.NonNull; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; 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.GoogleAuthProvider; import com.novoda.bonfire.login.data.model.Authentication; import com.novoda.bonfire.user.data.model.User; import rx.Observable; import rx.Subscriber; public class FirebaseAuthDatabase implements AuthDatabase { private final FirebaseAuth firebaseAuth; public FirebaseAuthDatabase(FirebaseAuth firebaseAuth) { this.firebaseAuth = firebaseAuth; } @Override public Observable<Authentication> readAuthentication() { return Observable.create(new Observable.OnSubscribe<Authentication>() { @Override public void call(Subscriber<? super Authentication> subscriber) { FirebaseUser currentUser = firebaseAuth.getCurrentUser(); if (currentUser != null) { subscriber.onNext(authenticationFrom(currentUser)); } subscriber.onCompleted(); } }); } @Override public Observable<Authentication> loginWithGoogle(final String idToken) { return Observable.create(new Observable.OnSubscribe<Authentication>() { @Override public void call(final Subscriber<? super Authentication> subscriber) { AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null); firebaseAuth.signInWithCredential(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { FirebaseUser firebaseUser = task.getResult().getUser(); subscriber.onNext(authenticationFrom(firebaseUser)); } else { subscriber.onNext(new Authentication(task.getException())); } subscriber.onCompleted(); } }); } }); } private Authentication authenticationFrom(FirebaseUser currentUser) { Uri photoUrl = currentUser.getPhotoUrl(); return new Authentication(new User(currentUser.getUid(), currentUser.getDisplayName(), photoUrl == null ? "" : photoUrl.toString())); } }