diff --git a/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java index e89c5c528..0db56e66b 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java @@ -3,15 +3,13 @@ package fr.free.nrw.commons.auth; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerFuture; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.os.AsyncTask; import android.os.Bundle; -import java.io.IOException; - import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.theme.NavigationBaseActivity; +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import timber.log.Timber; public abstract class AuthenticatedActivity extends NavigationBaseActivity { @@ -24,87 +22,36 @@ public abstract class AuthenticatedActivity extends NavigationBaseActivity { public AuthenticatedActivity() { this.accountType = AccountUtil.accountType(); } - - private class GetAuthCookieTask extends AsyncTask { - private Account account; - private AccountManager accountManager; - public GetAuthCookieTask(Account account, AccountManager accountManager) { - this.account = account; - this.accountManager = accountManager; - } - - @Override - protected void onPostExecute(String result) { - super.onPostExecute(result); - if(result != null) { - authCookie = result; - onAuthCookieAcquired(result); - } else { - onAuthFailure(); - } - } - @Override - protected String doInBackground(Void... params) { - try { - return accountManager.blockingGetAuthToken(account, "", false); - } catch (OperationCanceledException e) { - e.printStackTrace(); - return null; - } catch (AuthenticatorException e) { - e.printStackTrace(); - return null; - } catch (IOException e) { - e.printStackTrace(); - return null; - } - } + private void getAuthCookie(Account account, AccountManager accountManager) { + Single.fromCallable(() -> accountManager.blockingGetAuthToken(account, "", false)) + .subscribeOn(Schedulers.io()) + .doOnError(Timber::e) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + cookie -> onAuthCookieAcquired(cookie), + throwable -> onAuthFailure()); } - - private class AddAccountTask extends AsyncTask { - private AccountManager accountManager; - public AddAccountTask(AccountManager accountManager) { - this.accountManager = accountManager; - } - - @Override - protected void onPostExecute(String result) { - super.onPostExecute(result); - if(result != null) { - Account[] allAccounts =accountManager.getAccountsByType(accountType); - Account curAccount = allAccounts[0]; - GetAuthCookieTask getCookieTask = new GetAuthCookieTask(curAccount, accountManager); - getCookieTask.execute(); - } else { - onAuthFailure(); - } - } - @Override - protected String doInBackground(Void... params) { - AccountManagerFuture resultFuture = accountManager.addAccount(accountType, null, null, null, AuthenticatedActivity.this, null, null); - Bundle result; - try { - result = resultFuture.getResult(); - } catch (OperationCanceledException e) { - e.printStackTrace(); - return null; - } catch (AuthenticatorException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - return null; - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - return null; - } - if(result.containsKey(AccountManager.KEY_ACCOUNT_NAME)) { - return result.getString(AccountManager.KEY_ACCOUNT_NAME); - } else { - return null; - } - - } + private void addAccount(AccountManager accountManager) { + Single.just(accountManager.addAccount(accountType, null, null, null, AuthenticatedActivity.this, null, null)) + .subscribeOn(Schedulers.io()) + .map(AccountManagerFuture::getResult) + .doOnEvent((bundle, throwable) -> { + if (!bundle.containsKey(AccountManager.KEY_ACCOUNT_NAME)) { + throw new RuntimeException("Bundle doesn't contain account-name key: " + + AccountManager.KEY_ACCOUNT_NAME); + } + }) + .map(bundle -> bundle.getString(AccountManager.KEY_ACCOUNT_NAME)) + .doOnError(Timber::e) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(s -> { + Account[] allAccounts = accountManager.getAccountsByType(accountType); + Account curAccount = allAccounts[0]; + getAuthCookie(curAccount, accountManager); + }, + throwable -> onAuthFailure()); } protected void requestAuthToken() { @@ -115,17 +62,9 @@ public abstract class AuthenticatedActivity extends NavigationBaseActivity { AccountManager accountManager = AccountManager.get(this); Account curAccount = app.getCurrentAccount(); if(curAccount == null) { - AddAccountTask addAccountTask = new AddAccountTask(accountManager); - // This AsyncTask blocks until the Login Activity returns - // And since in Android 4.x+ only one background thread runs all AsyncTasks - // And since LoginActivity can't return until it's own AsyncTask (that does the login) - // returns, we have a deadlock! - // Fixed by explicitly asking this to be executed in parallel - // See: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/8M0RTFfO7-M - addAccountTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + addAccount(accountManager); } else { - GetAuthCookieTask task = new GetAuthCookieTask(curAccount, accountManager); - task.execute(); + getAuthCookie(curAccount, accountManager); } }