Rx Java Как выполнить наблюдение за потоком аутентификации Google перед вызовом API (наблюдаемое) при подписке? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь убедиться, что пользователь прошел аутентификацию с помощью учетной записи Google и имеет активный экземпляр Диска (com.google.api.services.drive.Drive), прежде чем пытаться делать какие-либо вызовы GoogleDriveRestApi. Как я могу добиться этого с помощью Rx Java, если пользователь уже может быть аутентифицирован или нет?

// connect()
    public final rx.Observable<Drive> connect() {
        return rx.Observable.fromCallable(() -> {
            final GoogleSignInOptions signInOptions =
                    new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                            .requestEmail()
                            .requestScopes(new Scope(DriveScopes.DRIVE_APPDATA))
                            .build();
            return GoogleSignIn.getClient(mActivity.get(), signInOptions);
            })
            .flatMapSingle(client -> startActivityForResult(client.getSignInIntent(), GoogleDriveHelper.RESOLVE_SIGN_IN_CODE))
            .switchMap(activityResult -> resolveDriveSession(activityResult));
        }
// resolveDriveSession()
    public final rx.Observable<Drive> resolveDriveSession(ActivityResultData result) {
        return rx.Observable.fromCallable(() -> {
            try {
                GoogleSignInAccount googleAccount = GoogleSignIn.getSignedInAccountFromIntent(result.getIntent())
                        .getResult(ApiException.class);
                GoogleAccountCredential credential =
                        GoogleAccountCredential.usingOAuth2(
                                mActivity.get(), Collections.singleton(DriveScopes.DRIVE_APPDATA));
                credential.setSelectedAccount(googleAccount.getAccount());
                return new Drive.Builder(
                        AndroidHttp.newCompatibleTransport(),
                        new GsonFactory(),
                        credential)
                        .setApplicationName("ApplicationName")
                        .build();
            } catch (ApiException e) {
                Timber.e(e, TAG);
            }
            return null;
        });
    }
//onBackupToDriveAsync()
    private rx.Observable<String> onBackupToDriveAsync() {
        return rx.Observable.fromCallable(() -> {
                String folderId = createFolderIfNotExists(GoogleDriveHelper.BACKUP_PARENTS);
                if (folderId != null) {
                    String result = writeFileToDrive(folderId, file);
                    return result;
                }
                return null;
        });
    }

Как я могу связать connect () и onBackupToDriveAsyn c () , так что подписка на connect () дает экземпляр Drive, который необходимо сохранить локально ( mDriveService , не разрешено реактивно, но я нахожусь посередине рефакторинга), а onBackupToDriveAsyn c () использует локальную версию Drive (mDriveService) для выполнения действий Api?

Любая помощь будет принята с благодарностью, спасибо.

...