package org.petabytes.awesomeblogs.auth; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.annimon.stream.Optional; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.GoogleAuthProvider; import com.jakewharton.rxrelay.BehaviorRelay; import org.petabytes.awesomeblogs.util.Preferences; import hugo.weaving.DebugLog; import rx.Observable; public class Authenticator { private final BehaviorRelay<Optional<User>> userRelay; private final FirebaseAuth firebaseAuth; public Authenticator() { userRelay = BehaviorRelay.create(); firebaseAuth = FirebaseAuth.getInstance(); firebaseAuth.addAuthStateListener(auth -> userRelay.call((auth != null && auth.getCurrentUser() != null) ? Optional.of(User.of(auth.getCurrentUser())) : Optional.empty())); } public Observable<Optional<User>> user() { return userRelay; } public Observable<Boolean> isSignIn() { return userRelay.map(Optional::isPresent); } public Observable<Optional<User>> signIn(@NonNull Context context) { context.startActivity(SignInActivity.intent(context)); return userRelay.skip(1); } public void signOut() { firebaseAuth.signOut(); } @DebugLog void signInWithGoogle(@Nullable GoogleSignInAccount account) { if (account != null) { firebaseAuth.signInWithCredential(GoogleAuthProvider.getCredential(account.getIdToken(), null)); Preferences.accessToken().set(account.getIdToken()); } else { userRelay.call(Optional.empty()); } } }