Я использую в своем проекте библиотеку Android AAC и библиотеку привязки данных Android. У меня AuthActivity и AuthViewModel расширяет класс android ViewModel. В некоторых случаях мне нужно попросить Activity вызвать некоторые методы для ViewModel. Например, когда пользователь нажимает кнопку Google Auth или Facebook Auth, которая инициализируется в классе Activity (потому что для инициализации GoogleApiClient мне нужен контекст действия, который я не могу передать в ViewModel, модель просмотра не может сохранять поля Activity). Вся логика с API Google Api и Facebook реализована в классе Activity:
//google api initialization
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
//facebook login button
loginButton.setReadPermissions(Arrays.asList("email", "public_profile"));
loginButton.registerCallback(callbackManager,
Также мне нужно вызвать функцию sign, которая требует контекста Activity:
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
Я не могу запросить логин для входа в facebook и логин google или startActivity из класса модели просмотра, поэтому я создал интерфейс класса AuthActivityListener:
public interface AuthActivityListener {
void requestSignedIn();
void requestGoogleAuth();
void requestFacebookAuth();
void requestShowDialogFragment(int type);
}
Выполнить прослушиватель в классе активности:
AuthActivityRequester authRequestListener = new AuthActivityRequester() {
@Override
public void requestSignedIn() {
Intent intent = new Intent(AuthActivity.this, ScanActivity.class);
startActivity(intent);
AuthActivity.this.finish();
}
@Override
public void requestGoogleAuth() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
}
...
И назначьте этот слушатель в классе модели вида вызвать методы активности:
// in constructor
this.authRequester = listener;
// call activity method
public void onClickedAuthGoogle() {
authRequester.requestGoogleAuth();
}
После того, как аутентификация google или facebook прошла, я вызываю метод модели вызова из активности:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == GOOGLE_AUTH) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount acct = result.getSignInAccount();
if (acct != null) {
viewModel.onGoogleUserLoaded(acct.getEmail(), acct.getId());
} else {
viewModel.onGoogleUserLoaded("", "");
}
}
}
}
Может ли кто-нибудь объяснить мне, является ли такой подход связи между моделью представления и активностью правильным, или мне нужно найти другой способ вызова методов деятельности из модели представления?