Метод onActivityResult для Google + и Facebook - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть 3 действия в моем приложении, где пользователь может войти через Google + или Facebook (я использую Firebase для интеграции). Поэтому я подумал о создании абстрактного класса, который я могу расширить во всех действиях, где это необходимо.

Итак, это абстрактный класс:

public abstract class google_abstract extends Activity {

            @Override
            protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                // 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)
                        .requestEmail()
                        .build();

                // Build a GoogleSignInClient with the options specified by gso.
                mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

            }

            int RC_SIGN_IN = 0;
            GoogleSignInClient mGoogleSignInClient;

            public void signIn() {
                Intent signInIntent = mGoogleSignInClient.getSignInIntent();
                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 GoogleSignInClient.getSignInIntent(...);
                if (requestCode == RC_SIGN_IN) {
                    // The Task returned from this call is always completed, no need to attach
                    // a listener.
                    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
                    handleSignInResult(task);
                }


            }

            private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
                try {
                    GoogleSignInAccount account = completedTask.getResult(ApiException.class);
                    // Signed in successfully, show authenticated UI.
                    startActivity(new Intent(this, tags.class));
                } catch (ApiException e) {
                    // The ApiException status code indicates the detailed failure reason.
                    // Please refer to the GoogleSignInStatusCodes class reference for more information.
                    Log.w("Google Sign In Error", "signInResult:failed code=" + e.getStatusCode());
        //            pb.setVisibility(View.GONE);
                    Toast.makeText(getApplicationContext(), "Failed", Toast.LENGTH_LONG).show();
                }
            }

            @Override
            protected void onStart() {
                // Check for existing Google Sign In account, if the user is already signed in
                // the GoogleSignInAccount will be non-null.
                GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
                if (account != null) {
                    startActivity(new Intent(this, tags.class));
                }
                super.onStart();
            }
    }

Но у этого класса уже есть один onActivityResult () метод для Google +, поэтому я не могу написать код для интеграции с Facebook в этом же абстрактном классе.

Поэтому, вот моя mainActivity, где я расширяю класс google_abstract и интегрирую вход в Facebook отдельно.

public class welcome extends google_abstract {

    TextView tv_login1;
    TextView tv_login2;
    Button btn_signup;
    public ProgressBar pb;
    ImageView imageView_g;
    ImageView imageView_f;
    ImageView imageView_in;
    CallbackManager callbackManager;
    FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.welcome);

        tv_login1 = findViewById(R.id.tv_login1);
        tv_login2 = findViewById(R.id.tv_login2);
        btn_signup = findViewById(R.id.btn_signup);
        imageView_g = findViewById(R.id.imageView_g);
        imageView_f = findViewById(R.id.imageView_f);
        pb = findViewById(R.id.pb);

        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        Log.d("Success", "Login");

                    }

                    @Override
                    public void onCancel() {
                        Toast.makeText(welcome.this, "Login Cancel", Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        Toast.makeText(welcome.this, exception.getMessage(), Toast.LENGTH_LONG).show();
                    }
                });

        imageView_f.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LoginManager.getInstance().logInWithReadPermissions(welcome.this, Arrays.asList("email", "public_profile"));
            }
        });

        imageView_g.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signIn();
                pb.setVisibility(View.VISIBLE);

            }
        });

        tv_login1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(welcome.this, login.class);
                startActivity(intent);
            }
        });

        tv_login2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(welcome.this, login.class);
                startActivity(intent);
            }
        });

        btn_signup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(welcome.this, SignUp.class);
                startActivity(intent);
            }
        });
     }

    private void handleFacebookToken(AccessToken accessToken)
    {
        AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
        auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if(task.isSuccessful())
                {
                    FirebaseUser myuserobj=auth.getCurrentUser();
                    updateUI(myuserobj);
                }
                else
                {
                    Toast.makeText(getApplicationContext(),"could not register to firebase",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        callbackManager.onActivityResult(requestCode,resultCode,data );
        super.onActivityResult(requestCode, resultCode, data);
    }

    private void updateUI(FirebaseUser myuserobj) {

        String e_mail= myuserobj.getEmail();
    }

    public void onBackPressed() {
        // disable going back to the MainActivity
        moveTaskToBack(true);
    }
}

Это работает нормально. Но есть ли способ, с помощью которого я могу написать методы для google + и facebook в одном и том же абстрактном классе, а затем расширить его в других действиях, чтобы избежать повторения кода. Кто-нибудь может предложить изменения в моем существующем коде для этого? Или есть способ, которым я могу создать два интерфейса для них обоих и реализовать их в своих классах?

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

...