33import android .accounts .Account ;
44import android .accounts .AccountManager ;
55import android .accounts .AccountManagerFuture ;
6- import android .accounts .AuthenticatorException ;
7- import android .accounts .OperationCanceledException ;
8- import android .os .AsyncTask ;
96import android .os .Bundle ;
107
11- import java .io .IOException ;
12-
138import fr .free .nrw .commons .CommonsApplication ;
149import fr .free .nrw .commons .theme .NavigationBaseActivity ;
10+ import io .reactivex .Single ;
11+ import io .reactivex .android .schedulers .AndroidSchedulers ;
12+ import io .reactivex .schedulers .Schedulers ;
1513import timber .log .Timber ;
1614
1715public 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