У меня есть 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.