Это не плохая идея, на самом деле это вы должны сделать.Если вы хотите обрабатывать все действия и события из Google Auth, самый простой, элегантный, пригодный для многократного использования и проверяемый способ сделать это - заключить эту логику в одно или несколько выделенных для этого предложений.
Если у вас малодействия, которые вы могли бы инкапсулировать все из них только в одном классе Wrap.Например, вы можете создать класс GoogleSingInWrapper
и использовать шаблон Singleton
, чтобы убедиться, что во всем приложении есть только один экземпляр.
public class GoogleSingInWrapper {
private static GoogleSingInWrapper instance;
private GoogleApiClient mGoogleApiClient;
private GoogleSingainWrapper() {
// Private constructor to deny the creation of this object through the constructor and prevent creating more then one instance
mGoogleApiClient = /*create your client here*/;
}
public static getInstance(/*params you need*/) {
if(instance == null)
instance = new GoogleSingInWrapper (/*params*/);
return instance;
}
public void login(/*params*/) {
// Login
}
// Other methods
}
То есть получить (и создать экземпляр, если не 't еще существует) экземпляр GoogleSingInWrapper
, который вы используете:
GoogleSingInWrapper.gerInstance(/*params*/);
Теперь, если вы поместите все переменные и логику в этот класс, вы сможете получить к ним доступ из любого места.mGoogleApiClient
должен быть в этой оболочке.
Теперь вы можете добавить все необходимые вам методы login
, logout
и revoke
.
и использовать его следующим образом:
GoogleSingInWrapper.getInstance().login(/*params*/);
GoogleSingInWrapper.getInstance().logout(/*params*/);
GoogleSingInWrapper.getInstance().revoke(/*params*/);
Вы не должны использовать mGoogleApiClient
напрямую, оно должно быть заключено в GoogleSingInWrapper
.
РЕДАКТИРОВАТЬ
Когда я говорю mGoogleApiClient
должен быть закрытым внутри GoogleSingInWrapper
, это означает, что у вас не должно быть доступа к нему вне GoogleSingInWrapper
класса.Если вы создаете GoogleSingInWrapper
, но создаете метод с именем
public GoogleApiClient get_GoogleApiClient();
, у вас проблемы сохраняются, потому что вы все еще используете этот mGoogleApiClient
во всех действиях.Вы не хотите этого, поэтому вы хотите быть отделенным от этого объекта во всех действиях.
После ваших правок я буду набирать здесь больше кода, но чем больше свободного кода я дам вам, тем меньше вы изучаете.
public class GoogleSingInWrapper {
private static GoogleSingInWrapper instance;
private GoogleApiClient mGoogleApiClient;
private GoogleSingainWrapper(Context context) {
// Private constructor to deny the creation of this object through the constructor and prevent creating more then one instance
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(context)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
public static getInstance(Context context) {
if(instance == null)
instance = new GoogleSingInWrapper (/*params*/);
return instance;
}
public void login(/*params*/) {
// Login
}
// Other methods
public void logout(){
if(mGoogleApiClient.isConnected()) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
Log.d("LOGOUT-RESULT","LOGOUT");
}
});
}
}
}
Это должно выглядеть как ваш GoogleSingInWrapper
.И, например, для вызова метода выхода из системы вы должны вызвать следующее:
if (id == R.id.logout) {
GoogleSingInWrapper.getInstance(context).logout();
goLoginScreen();
}
Обратите внимание, что конструктор намеренно Private
, потому что вы не хотите вызывать new GoogleSingInWrapper
.Если вы делаете это, вы создаете несколько экземпляров этого объекта и нарушаете шаблон Singleton
.
Также вы можете заметить, что некоторым процессам, таким как login, требуется Activity
, потому что результатыразмещено в onActivityResult
.Чтобы отделить вас GoogleSingInWrapper
от всех ваших Activities
, вы можете создать выделенный Activity
для управления всеми onActivityResults
.Это действие должно быть прозрачным и невидимым для пользователя.
Этого можно добиться с помощью следующего кода:
public class GoogleActivity extends AppCompatActivity {
public static final int RC_SIGN_IN = 1000;
private static final String ACTION = "calling_action";
public static Intent getIntent(Context context, int action, Intent actionIntent) {
Intent i = new Intent(context, GoogleActivity.class);
i.putExtra(ACTION, action);
i.putExtra(Intent.EXTRA_INTENT, actionIntent);
return i;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Intent actionIntent;
int action = getIntent().getIntExtra(ACTION, 0);
switch (action) {
case RC_SIGN_IN:
actionIntent = (Intent) getIntent().getExtras().get(Intent.EXTRA_INTENT);
if (actionIntent != null)
startActivityForResult(actionIntent, RC_SIGN_IN);
break;
case 0:
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RC_SIGN_IN:
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
finish();
return;
}
}
}
Затем установите прозрачную тему в манифесте для этого Activity
:
<activity
android:name=".data.drive.GoogleActivity"
android:theme="@style/TransparentActivity"/>
И определите свой прозрачный стиль в своей папке values
:
<style name="TransparentActivity" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
Теперь вам нужно собрать все сделанные мной кусочки и создать конечный продукт, чтобы получитьэто работает.