0

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. :)

Répondre

0

MISE À JOUR: 01/02/2017

Après des tonnes de recherches sur le sujet, je me suis finalement fait le travail. Au lieu du désordre ci-dessus de Observables imbriqué, j'ai utilisé l'un des operators de RxJava appelé concatMap. Vous pouvez le rechercher si vous le souhaitez. Je vais juste vous montrer avec le code ci-dessous pour vous aider à mieux comprendre. à ma question

FirebaseAuthorization.observableSignInWithCredential(mAuth, credential) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribeOn(Schedulers.io()) 
     .concatMap(new Function<AuthResult, Observable<DataSnapshot>>() { 
    @Override 
    public Observable<DataSnapshot> apply(AuthResult authResult) throws Exception { 
     databaseReference = FirebaseDatabase.getInstance().getReference(); 
     firebaseUser = authResult.getUser(); 
     progressDialog.setContent("Transferring Your User Data From Google To My App!"); 
     return observableSingleValueEvent(databaseReference.child("usersID").child(firebaseUser.getUid())); 
    } 
}).subscribe(checkUserExists); 

Je viens de fusionner les imbriquées ci-dessus en utilisant observables concatMap() ici, qui se traduit par un Observer appelé checkUserExists. Il n'y a pas authenticateWithCredential Observateur dans cette approche. Cela prend environ moins d'une seconde à terminer (Testé) et est beaucoup plus rapide que mon approche ci-dessus.

Si quelqu'un a une meilleure approche à ce problème. S'il vous plaît faire partager :)