Инкапсулировать метод, который запускает действие, вне действия

#android #authentication #android-intent #google-authentication

#Android #аутентификация #android-намерение #google-аутентификация

Вопрос:

Я пытаюсь создать метод, который аутентифицирует пользователя Google в Firebase.

Я использую этот метод в 3 разных действиях, и я хотел бы очистить код, создающий метод.

Это код, который я пытаюсь создать как статический метод в классе.

   private void firebaseAuthWithGoogle(GoogleSignInAccount acct, final Context activity, FirebaseAuth firebaseAuth) {
        Log.d("MainACtivity", "firebaseAuthWithGoogle:"   acct.getId());

        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        firebaseAuth.signInWithCredential(credential)
                .addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d("Main", "signInWithCredential:onComplete:"   task.isSuccessful());

                        if (!task.isSuccessful()) {
                            Log.w("MainAcitivyt", "signInWithCredential", task.getException());
                            Toast.makeText(activity, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                        else{
                            startActivity(AccountCreationActivity.newIntent(activity));
                        }
                    }
                });
    }
  

У меня возникли проблемы с пониманием того, как я могу использовать ‘startActivity’ из другого класса при вызове моих методов.
Или второй вариант, который я также пытался, — это вернуть намерение, но поскольку ‘onComplete’ возвращает void, я полностью потерял, как действовать.

Вот код для моей регистрации в Google, который я хотел бы скопировать в разных действиях и планировал создать его метод в другом классе. Я думаю, что единственный метод, который я не могу извлечь из своей активности регистрации, — это ‘onActivityResult’

 private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    @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) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                firebaseAuthWithGoogle(account);
            } catch (ApiException e) {
                // Google Sign In failed, update UI appropriately
                Log.w(TAG, "Google sign in failed", e);
                // ...
            }
        }
    }
    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        Log.d("MainACtivity", "firebaseAuthWithGoogle:"   acct.getId());

        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        firebaseAuth.signInWithCredential(credential)
                .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d("Main", "signInWithCredential:onComplete:"   task.isSuccessful());

                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Log.w("MainAcitivyt", "signInWithCredential", task.getException());
                            Toast.makeText(getActivity(), "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                        else{
                            startActivity(AccountCreationActivity.newIntent(getActivity()));
                        }
                    }
                });
    }
  

Ответ №1:

как я могу использовать ‘startActivity’ из другого класса

Используйте экземпляр Context для запуска действия. У вас есть Context activity в параметрах метода, используйте его.

 private void firebaseAuthWithGoogle(GoogleSignInAccount acct, final Context activity, FirebaseAuth firebaseAuth) {
        Log.d("MainACtivity", "firebaseAuthWithGoogle:"   acct.getId());

        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        firebaseAuth.signInWithCredential(credential)
                .addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d("Main", "signInWithCredential:onComplete:"   task.isSuccessful());

                        if (!task.isSuccessful()) {
                            Log.w("MainAcitivyt", "signInWithCredential", task.getException());
                            Toast.makeText(activity, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                        else{
                           // This line has been changed.
                           activity.startActivity(AccountCreationActivity.newIntent(activity));
                        }
                    }
                });
    }