mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
Fix bug causing Login to hang when called from another AsyncTask
This commit is contained in:
parent
76fc431532
commit
388eed5aee
3 changed files with 72 additions and 80 deletions
|
|
@ -85,6 +85,8 @@ public class ShareActivity extends AuthenticatedActivity {
|
||||||
descEdit = (EditText)findViewById(R.id.descEdit);
|
descEdit = (EditText)findViewById(R.id.descEdit);
|
||||||
uploadButton = (Button)findViewById(R.id.uploadButton);
|
uploadButton = (Button)findViewById(R.id.uploadButton);
|
||||||
|
|
||||||
|
requestAuthToken();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,7 @@ public class AuthenticatedActivity extends Activity {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private class GetAuthCookieTask extends AsyncTask<String, String, String> {
|
private class GetAuthCookieTask extends AsyncTask<Void, String, String> {
|
||||||
|
|
||||||
private Account account;
|
private Account account;
|
||||||
private AccountManager accountManager;
|
private AccountManager accountManager;
|
||||||
public GetAuthCookieTask(Account account, AccountManager accountManager) {
|
public GetAuthCookieTask(Account account, AccountManager accountManager) {
|
||||||
|
|
@ -39,7 +38,7 @@ public class AuthenticatedActivity extends Activity {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String doInBackground(String... params) {
|
protected String doInBackground(Void... params) {
|
||||||
try {
|
try {
|
||||||
return accountManager.blockingGetAuthToken(account, "", false);
|
return accountManager.blockingGetAuthToken(account, "", false);
|
||||||
} catch (OperationCanceledException e) {
|
} catch (OperationCanceledException e) {
|
||||||
|
|
@ -53,87 +52,74 @@ public class AuthenticatedActivity extends Activity {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// private class onTokenAcquired implements AccountManagerCallback<Bundle> {
|
|
||||||
//
|
|
||||||
// @Override
|
private class AddAccountTask extends AsyncTask<Void, String, String> {
|
||||||
// public void run(AccountManagerFuture<Bundle> result) {
|
private AccountManager accountManager;
|
||||||
// Bundle bundle;
|
public AddAccountTask(AccountManager accountManager) {
|
||||||
// try {
|
this.accountManager = accountManager;
|
||||||
// bundle = result.getResult();
|
}
|
||||||
// } catch (OperationCanceledException e) {
|
|
||||||
// // TODO Auto-generated catch block
|
|
||||||
// e.printStackTrace();
|
|
||||||
// throw new RuntimeException(e);
|
|
||||||
// } catch (AuthenticatorException e) {
|
|
||||||
// // TODO Auto-generated catch block
|
|
||||||
// e.printStackTrace();
|
|
||||||
// throw new RuntimeException(e);
|
|
||||||
// } catch (IOException e) {
|
|
||||||
// // TODO Auto-generated catch block
|
|
||||||
// e.printStackTrace();
|
|
||||||
// throw new RuntimeException(e);
|
|
||||||
// }
|
|
||||||
// Log.d("Commons", "Token Found!");
|
|
||||||
// if(bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
|
|
||||||
// String authCookie = bundle.getString(AccountManager.KEY_AUTHTOKEN);
|
|
||||||
// onAuthCookieAcquired(authCookie);
|
|
||||||
// } else {
|
|
||||||
// if(bundle.containsKey(AccountManager.KEY_INTENT)) {
|
|
||||||
// Intent launchIntent = (Intent) bundle.get(AccountManager.KEY_INTENT);
|
|
||||||
// startActivityForResult(launchIntent, 0);
|
|
||||||
// } else {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
||||||
// super.onActivityResult(requestCode, resultCode, data);
|
|
||||||
// Log.d("Commons", "Result of the loginactivity!");
|
|
||||||
// if(resultCode == Activity.RESULT_OK) {
|
|
||||||
// requestAuthToken();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private void requestAuthToken() {
|
|
||||||
// AccountManager accountManager = AccountManager.get(this);
|
|
||||||
// Account[] allAccounts =accountManager.getAccountsByType(accountType);
|
|
||||||
// if(allAccounts.length == 0) {
|
|
||||||
// Log.d("Commons", "No accounts yet!");
|
|
||||||
// // No Commons Accounts yet!
|
|
||||||
// accountManager.addAccount(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE, "", null, null, this, new onTokenAcquired(), null);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Log.d("Commons", "Accounts found!");
|
|
||||||
// // For now - always pick the first account
|
|
||||||
// Account curAccount = allAccounts[0];
|
|
||||||
// Bundle cookieOptions = new Bundle();
|
|
||||||
// accountManager.getAuthToken(curAccount, "", cookieOptions, this, new onTokenAcquired(), null);
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onPostExecute(String result) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onPostExecute(result);
|
||||||
AccountManager accountManager = AccountManager.get(this);
|
if(result != null) {
|
||||||
Account[] allAccounts =accountManager.getAccountsByType(accountType);
|
Account[] allAccounts =accountManager.getAccountsByType(accountType);
|
||||||
if(allAccounts.length == 0) {
|
Account curAccount = allAccounts[0];
|
||||||
// No Commons Accounts yet!
|
GetAuthCookieTask getCookieTask = new GetAuthCookieTask(curAccount, accountManager);
|
||||||
accountManager.addAccount(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE, "", null, null, this, null, null);
|
getCookieTask.execute();
|
||||||
return;
|
} else {
|
||||||
|
onAuthFailure();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For now - always pick the first account
|
@Override
|
||||||
Account curAccount = allAccounts[0];
|
protected String doInBackground(Void... params) {
|
||||||
GetAuthCookieTask task = new GetAuthCookieTask(curAccount, accountManager);
|
AccountManagerFuture<Bundle> resultFuture = accountManager.addAccount(accountType, null, null, null, AuthenticatedActivity.this, null, null);
|
||||||
task.execute("");
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected void requestAuthToken() {
|
||||||
|
AccountManager accountManager = AccountManager.get(this);
|
||||||
|
Account[] allAccounts =accountManager.getAccountsByType(accountType);
|
||||||
|
Account curAccount = null;
|
||||||
|
if(allAccounts.length == 0) {
|
||||||
|
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);
|
||||||
|
} else {
|
||||||
|
curAccount = allAccounts[0];
|
||||||
|
GetAuthCookieTask task = new GetAuthCookieTask(curAccount, accountManager);
|
||||||
|
task.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void onAuthCookieAcquired(String authCookie) {
|
protected void onAuthCookieAcquired(String authCookie) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ import android.accounts.AccountAuthenticatorResponse;
|
||||||
import android.accounts.AccountManager;
|
import android.accounts.AccountManager;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.ProgressDialog;
|
import android.app.ProgressDialog;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.*;
|
import android.view.*;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
@ -43,8 +44,9 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(String result) {
|
protected void onPostExecute(String result) {
|
||||||
super.onPostExecute(result);
|
super.onPostExecute(result);
|
||||||
|
Log.d("Commons", "Login done!");
|
||||||
if (result.equals("Success")) {
|
if (result.equals("Success")) {
|
||||||
dialog.cancel();
|
dialog.dismiss();
|
||||||
Toast successToast = Toast.makeText(context, R.string.login_success, Toast.LENGTH_SHORT);
|
Toast successToast = Toast.makeText(context, R.string.login_success, Toast.LENGTH_SHORT);
|
||||||
successToast.show();
|
successToast.show();
|
||||||
Account account = new Account(username, WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE);
|
Account account = new Account(username, WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE);
|
||||||
|
|
@ -112,6 +114,8 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
||||||
String username = usernameEdit.getText().toString();
|
String username = usernameEdit.getText().toString();
|
||||||
String password = passwordEdit.getText().toString();
|
String password = passwordEdit.getText().toString();
|
||||||
|
|
||||||
|
|
||||||
|
Log.d("Commons", "Login to start!");
|
||||||
LoginTask task = new LoginTask(that);
|
LoginTask task = new LoginTask(that);
|
||||||
task.execute(username, password);
|
task.execute(username, password);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue