Мне наконец-то удалось это сделать.
Вот класс слушателя для аутентификации AuthListeners :
public class AuthListener : Java.Lang.Object, IOnSuccessListener, IOnFailureListener
{
public delegate void OnAuthFailure(string error);
public event OnAuthFailure OnAuthFailureEvent;
public delegate void OnAuthSuccess();
public event OnAuthSuccess OnAuthSuccessEvent;
public AuthListener()
{
}
public void OnSuccess(Java.Lang.Object result)
{
Console.WriteLine("success");
OnAuthSuccessEvent?.Invoke();
}
public void OnFailure(Java.Lang.Exception e)
{
Console.WriteLine("failure: " + e.Message);
OnAuthFailureEvent?.Invoke(e.Message);
}
}
Вот класс AuthService :
public class AuthService
{
private FirebaseAuth firebaseAuth;
public AuthService()
{
Initialise();
}
private void Initialise()
{
this.firebaseAuth = FirebaseAuth.Instance;
}
public void SignInWithEmailAndPassword(string email, string password, AuthListener authListener)
{
FirebaseAuth.Instance.SignInWithEmailAndPassword(email, password)
.AddOnSuccessListener(authListener)
.AddOnFailureListener(authListener);
}
public void CreateUserWithEmailAndPassword(string email, string password, string userName, AuthListener authListener)
{
FirebaseAuth.Instance.CreateUserWithEmailAndPassword(email, password)
.AddOnFailureListener(authListener)
.AddOnSuccessListener(authListener);
}
public void SignOut()
{
FirebaseAuth.Instance.SignOut();
}
}
Затем во фрагменте входа || create_account || я просто вызываю службу Auth и подписываюсь на событие от AuthListeners.
Пример с LoginActivity :
public class LoginActivity : Activity
{
AuthListener _authListener;
AuthService _authService;
private EditText loginMail;
private EditText loginPassword;
private Button buttonLogin;
private Button buttonGoToCreateAccount;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_login);
_authListener = new AuthListener();
_authService = new AuthService();
Subscribe();
loginMail = FindViewById<EditText>(Resource.Id.emaillogin);
loginPassword = FindViewById<EditText>(Resource.Id.passwordlogin);
buttonLogin = FindViewById<Button>(Resource.Id.loginbutton);
buttonGoToCreateAccount = FindViewById<Button>(Resource.Id.goto_create_account);
buttonLogin.Click += (sender, e) =>
{
_authService.SignInWithEmailAndPassword(loginMail.Text, loginPassword.Text, this._authListener );
};
buttonGoToCreateAccount.Click += (sender, e) =>
{
UnSubscribe();
StartActivity(typeof(CreateAccountActivity));
Finish();
};
}
private void UnSubscribe()
{
_authListener.OnAuthFailureEvent -= ShowErrorDialog;
_authListener.OnAuthSuccessEvent -= AuthSuccess;
}
private void Subscribe()
{
_authListener.OnAuthFailureEvent += ShowErrorDialog;
_authListener.OnAuthSuccessEvent += AuthSuccess;
}
private void AuthSuccess()
{
StartActivity(typeof(DashboardActivity));
Finish();
}
private void ShowErrorDialog(string error)
{
this.RunOnUiThread(() =>
{
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.SetTitle("Error");
alertDialog.SetMessage(error);
alertDialog.SetNeutralButton("Try again!", delegate
{
alertDialog.Dispose();
});
alertDialog.Show();
});
}
}
Теперь я могу утверждать, что я инкапсулировал службу аутентификации Firebase, поэтому однажды, если я, наконец, захочу оставить базу Firebase для другой службы, это не будет беспорядок или, по крайней мере, полный беспорядок.