silentSignIn
是解决方案的关键。我们还需要处理边缘箱,当
Silentsignin公司
失败。这是真实世界的代码片段。
public static GoogleSignInClient buildGoogleSignInClient() {
GoogleSignInOptions signInOptions =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(Drive.SCOPE_APPFOLDER)
.build();
return GoogleSignIn.getClient(WeNoteApplication.instance(), signInOptions);
}
public static boolean silentSignInThenSync(SyncViewModel syncViewModel, boolean handleSignInRequired) {
GoogleSignInClient googleSignInClient = buildGoogleSignInClient();
Task<GoogleSignInAccount> task = googleSignInClient.silentSignIn();
if (task.isSuccessful()) {
syncViewModel.getSlientSignInSuccessLiveData().postValue(true);
return sync(task.getResult(), syncViewModel);
} else {
try {
Tasks.await(task);
try {
GoogleSignInAccount googleSignInAccount = task.getResult(ApiException.class);
syncViewModel.getSlientSignInSuccessLiveData().postValue(true);
return sync(googleSignInAccount, syncViewModel);
} catch (ApiException e) {
Log.e(TAG, "", e);
if (handleSignInRequired) {
if (e.getStatusCode() == GoogleSignInStatusCodes.SIGN_IN_REQUIRED) {
syncViewModel.getSignInRequiredLiveData().postValue(true);
return false;
}
}
String message = WeNoteApplication.instance().getString(R.string.sync_with_google_drive_failed_template, e.getLocalizedMessage());
syncViewModel.getMessageLiveData().postValue(message);
}
} catch (ExecutionException e) {
Log.e(TAG, "", e);
if (handleSignInRequired) {
if (e.getCause() instanceof ApiException) {
if (((ApiException) e.getCause()).getStatusCode() == GoogleSignInStatusCodes.SIGN_IN_REQUIRED) {
syncViewModel.getSignInRequiredLiveData().postValue(true);
return false;
}
}
}
String message = WeNoteApplication.instance().getString(R.string.sync_with_google_drive_failed_template, e.getLocalizedMessage());
syncViewModel.getMessageLiveData().postValue(message);
} catch (InterruptedException e) {
Log.e(TAG, "", e);
String message = WeNoteApplication.instance().getString(R.string.sync_with_google_drive_failed_template, e.getLocalizedMessage());
syncViewModel.getMessageLiveData().postValue(message);
}
}
return false;
}