J'essaie d'intégrer Google SignIn pour Firebase dans mon application en utilisant l'approche RxJava. Mais pour une raison quelconque, c'est lent. J'utilise Observables imbriqués dans mon approche pour résoudre ce problème. Quelqu'un peut-il proposer une solution meilleure et efficace à ce problème?Rxjava2 + Connexion à Google Firebase
C'est une procédure pas à pas, étape par étape à mon code
L'utilisateur clique sur le bouton Google SignIn
@OnClick(R.id.googleButton)
void googleSignUpButtonClicked() {
// Configure sign-in to request the user's ID, email address, and basic
// profile. ID and basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.enableAutoManage(getActivity(), new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
} /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
ci-dessus était simple copier coller de here, pour les personnes intéressées. Puis, en onActivityResult()
j'appelle ma fonction qui fait la « SignIn »:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account);
} else {
// Google Sign In failed, update UI appropriately
// ...
}
}
}
Encore une fois son simple copier-coller de here.
Dans mon firebaseAuthWithGoogle()
Observable
Sign's-Dans l'utilisateur, puis le Observer
attaché à cette Observable
crée une autre observable qui vérifie si l'utilisateur existe dans mon firebase ou non.
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
authenticateWithCredential = new DisposableObserver<AuthResult>() {
private DatabaseReference databaseReference;
private FirebaseUser firebaseUser;
@Override
public void onNext(AuthResult authResult) {
databaseReference = FirebaseDatabase.getInstance().getReference();
firebaseUser = authResult.getUser();
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
//checkUserExists.dispose();
checkIfUserExists(databaseReference, firebaseUser);
}
};
FirebaseAuthorization.observableSignInWithCredential(mAuth, credential)
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(authenticateWithCredential);
}
Pour vérifier si l'utilisateur existe ou non.
public void checkIfUserExists(DatabaseReference databaseReference, FirebaseUser firebaseUser) {
checkUserExists = new DisposableObserver<DataSnapshot>() {
@Override
public void onNext(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
SharedPreferences pref = getActivity().getSharedPreferences("GoogleFacebook", MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("username", dataSnapshot.toString());
editor.apply();
} else {
enterUsernameDialog = new MaterialDialog.Builder(getActivity())
.title("Almost There!")
.content("Give us an Awesome Username to Identify Yourself")
.inputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PERSON_NAME)
.positiveText("Submit!")
.inputRange(4, 16)
.canceledOnTouchOutside(false)
.alwaysCallInputCallback() // this forces the callback to be invoked with every input change
.input("Username", "", new MaterialDialog.InputCallback() {
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
if (input.toString().length() > 3 && input.toString().length() < 16) {
dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true);
}
}
}).onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
//showIndeterminateProgressDialog(false);
Toast.makeText(getActivity(), dialog.getInputEditText().getText().toString(), Toast.LENGTH_SHORT).show();
}
}).autoDismiss(false).show();
}
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "I do Exist: Error", Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
Toast.makeText(getActivity(), "I do Exist: Complete", Toast.LENGTH_SHORT).show();
}
};
observableSingleValueEvent(databaseReference.child("usersID").child(firebaseUser.getUid()))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(checkUserExists);
}
Maintenant d'abord, c'est trop lent pour une raison quelconque. Deuxièmement, le toast: "I do Exist: Complete" est appelé avant le MaterialDialog enterUsernameDialog
est même montré.
Quelqu'un peut-il décrire une meilleure approche à ce que ce que j'ai fait. :)