Skip to content

Commit 0c680b0

Browse files
authored
Merge pull request commons-app#851 from akaita/rx_authentication
Rx for Auth tasks
2 parents 4d82857 + 5cb1f72 commit 0c680b0

File tree

1 file changed

+32
-93
lines changed

1 file changed

+32
-93
lines changed

app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java

Lines changed: 32 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
import android.accounts.Account;
44
import android.accounts.AccountManager;
55
import android.accounts.AccountManagerFuture;
6-
import android.accounts.AuthenticatorException;
7-
import android.accounts.OperationCanceledException;
8-
import android.os.AsyncTask;
96
import android.os.Bundle;
107

11-
import java.io.IOException;
12-
138
import fr.free.nrw.commons.CommonsApplication;
149
import fr.free.nrw.commons.theme.NavigationBaseActivity;
10+
import io.reactivex.Single;
11+
import io.reactivex.android.schedulers.AndroidSchedulers;
12+
import io.reactivex.schedulers.Schedulers;
1513
import timber.log.Timber;
1614

1715
public abstract class AuthenticatedActivity extends NavigationBaseActivity {
@@ -24,87 +22,36 @@ public abstract class AuthenticatedActivity extends NavigationBaseActivity {
2422
public AuthenticatedActivity() {
2523
this.accountType = AccountUtil.accountType();
2624
}
27-
28-
private class GetAuthCookieTask extends AsyncTask<Void, String, String> {
29-
private Account account;
30-
private AccountManager accountManager;
31-
public GetAuthCookieTask(Account account, AccountManager accountManager) {
32-
this.account = account;
33-
this.accountManager = accountManager;
34-
}
35-
36-
@Override
37-
protected void onPostExecute(String result) {
38-
super.onPostExecute(result);
39-
if(result != null) {
40-
authCookie = result;
41-
onAuthCookieAcquired(result);
42-
} else {
43-
onAuthFailure();
44-
}
45-
}
4625

47-
@Override
48-
protected String doInBackground(Void... params) {
49-
try {
50-
return accountManager.blockingGetAuthToken(account, "", false);
51-
} catch (OperationCanceledException e) {
52-
e.printStackTrace();
53-
return null;
54-
} catch (AuthenticatorException e) {
55-
e.printStackTrace();
56-
return null;
57-
} catch (IOException e) {
58-
e.printStackTrace();
59-
return null;
60-
}
61-
}
26+
private void getAuthCookie(Account account, AccountManager accountManager) {
27+
Single.fromCallable(() -> accountManager.blockingGetAuthToken(account, "", false))
28+
.subscribeOn(Schedulers.io())
29+
.doOnError(Timber::e)
30+
.observeOn(AndroidSchedulers.mainThread())
31+
.subscribe(
32+
cookie -> onAuthCookieAcquired(cookie),
33+
throwable -> onAuthFailure());
6234
}
63-
64-
private class AddAccountTask extends AsyncTask<Void, String, String> {
65-
private AccountManager accountManager;
66-
public AddAccountTask(AccountManager accountManager) {
67-
this.accountManager = accountManager;
68-
}
69-
70-
@Override
71-
protected void onPostExecute(String result) {
72-
super.onPostExecute(result);
73-
if(result != null) {
74-
Account[] allAccounts =accountManager.getAccountsByType(accountType);
75-
Account curAccount = allAccounts[0];
76-
GetAuthCookieTask getCookieTask = new GetAuthCookieTask(curAccount, accountManager);
77-
getCookieTask.execute();
78-
} else {
79-
onAuthFailure();
80-
}
81-
}
8235

83-
@Override
84-
protected String doInBackground(Void... params) {
85-
AccountManagerFuture<Bundle> resultFuture = accountManager.addAccount(accountType, null, null, null, AuthenticatedActivity.this, null, null);
86-
Bundle result;
87-
try {
88-
result = resultFuture.getResult();
89-
} catch (OperationCanceledException e) {
90-
e.printStackTrace();
91-
return null;
92-
} catch (AuthenticatorException e) {
93-
// TODO Auto-generated catch block
94-
e.printStackTrace();
95-
return null;
96-
} catch (IOException e) {
97-
// TODO Auto-generated catch block
98-
e.printStackTrace();
99-
return null;
100-
}
101-
if(result.containsKey(AccountManager.KEY_ACCOUNT_NAME)) {
102-
return result.getString(AccountManager.KEY_ACCOUNT_NAME);
103-
} else {
104-
return null;
105-
}
106-
107-
}
36+
private void addAccount(AccountManager accountManager) {
37+
Single.just(accountManager.addAccount(accountType, null, null, null, AuthenticatedActivity.this, null, null))
38+
.subscribeOn(Schedulers.io())
39+
.map(AccountManagerFuture::getResult)
40+
.doOnEvent((bundle, throwable) -> {
41+
if (!bundle.containsKey(AccountManager.KEY_ACCOUNT_NAME)) {
42+
throw new RuntimeException("Bundle doesn't contain account-name key: "
43+
+ AccountManager.KEY_ACCOUNT_NAME);
44+
}
45+
})
46+
.map(bundle -> bundle.getString(AccountManager.KEY_ACCOUNT_NAME))
47+
.doOnError(Timber::e)
48+
.observeOn(AndroidSchedulers.mainThread())
49+
.subscribe(s -> {
50+
Account[] allAccounts = accountManager.getAccountsByType(accountType);
51+
Account curAccount = allAccounts[0];
52+
getAuthCookie(curAccount, accountManager);
53+
},
54+
throwable -> onAuthFailure());
10855
}
10956

11057
protected void requestAuthToken() {
@@ -115,17 +62,9 @@ protected void requestAuthToken() {
11562
AccountManager accountManager = AccountManager.get(this);
11663
Account curAccount = app.getCurrentAccount();
11764
if(curAccount == null) {
118-
AddAccountTask addAccountTask = new AddAccountTask(accountManager);
119-
// This AsyncTask blocks until the Login Activity returns
120-
// And since in Android 4.x+ only one background thread runs all AsyncTasks
121-
// And since LoginActivity can't return until it's own AsyncTask (that does the login)
122-
// returns, we have a deadlock!
123-
// Fixed by explicitly asking this to be executed in parallel
124-
// See: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/8M0RTFfO7-M
125-
addAccountTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
65+
addAccount(accountManager);
12666
} else {
127-
GetAuthCookieTask task = new GetAuthCookieTask(curAccount, accountManager);
128-
task.execute();
67+
getAuthCookie(curAccount, accountManager);
12968
}
13069
}
13170

0 commit comments

Comments
 (0)