Gmail refresh refactoring

pull/187/head
M66B 5 years ago
parent 8f33714f6e
commit 63d1e511f3

@ -776,7 +776,7 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac
if (account.auth_type == EmailService.AUTH_TYPE_GMAIL) { if (account.auth_type == EmailService.AUTH_TYPE_GMAIL) {
AccountManager am = AccountManager.get(context); AccountManager am = AccountManager.get(context);
boolean found = false; boolean found = false;
for (Account google : am.getAccountsByType("com.google")) for (Account google : am.getAccountsByType(EmailService.TYPE_GOOGLE))
if (account.user.equals(google.name)) { if (account.user.equals(google.name)) {
found = true; found = true;
break; break;

@ -3,6 +3,7 @@ package eu.faircode.email;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.accounts.AuthenticatorException; import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.security.KeyChain; import android.security.KeyChain;
@ -104,6 +105,8 @@ public class EmailService implements AutoCloseable {
private ExecutorService executor = Helper.getBackgroundExecutor(0, "mail"); private ExecutorService executor = Helper.getBackgroundExecutor(0, "mail");
static final String TYPE_GOOGLE = "com.google";
static final int AUTH_TYPE_PASSWORD = 1; static final int AUTH_TYPE_PASSWORD = 1;
static final int AUTH_TYPE_GMAIL = 2; static final int AUTH_TYPE_GMAIL = 2;
static final int AUTH_TYPE_OAUTH = 3; static final int AUTH_TYPE_OAUTH = 3;
@ -347,22 +350,9 @@ public class EmailService implements AutoCloseable {
// Refresh token // Refresh token
if (auth == AUTH_TYPE_GMAIL) if (auth == AUTH_TYPE_GMAIL)
try { try {
String type = "com.google"; String token = GmailRefresh(context, user, password);
AccountManager am = AccountManager.get(context); connect(host, port, auth, user, token, factory);
Account[] accounts = am.getAccountsByType(type); return token;
for (Account account : accounts)
if (user.equals(account.name)) {
Log.i("Refreshing token user=" + user);
am.invalidateAuthToken(type, password);
String token = am.blockingGetAuthToken(account, getAuthTokenType(type), true);
if (token == null)
throw new AuthenticatorException("No token on refresh for " + user);
connect(host, port, auth, user, token, factory);
return token;
}
throw new AuthenticatorException("Account not found for " + user);
} catch (Exception ex1) { } catch (Exception ex1) {
Log.e(ex1); Log.e(ex1);
throw new AuthenticationFailedException(ex.getMessage(), ex1); throw new AuthenticationFailedException(ex.getMessage(), ex1);
@ -619,6 +609,24 @@ public class EmailService implements AutoCloseable {
AuthorizationException error; AuthorizationException error;
} }
private static String GmailRefresh(Context context, String user, String password) throws AuthenticatorException, OperationCanceledException, IOException {
AccountManager am = AccountManager.get(context);
Account[] accounts = am.getAccountsByType(TYPE_GOOGLE);
for (Account account : accounts)
if (user.equals(account.name)) {
Log.i("Refreshing token user=" + user);
if (password != null)
am.invalidateAuthToken(TYPE_GOOGLE, password);
String token = am.blockingGetAuthToken(account, getAuthTokenType(TYPE_GOOGLE), true);
if (token == null)
throw new AuthenticatorException("No token on refresh for " + user);
return token;
}
throw new AuthenticatorException("Account not found for " + user);
}
private static AuthState OAuthRefresh(Context context, String id, String json) throws MessagingException { private static AuthState OAuthRefresh(Context context, String id, String json) throws MessagingException {
try { try {
AuthState authState = AuthState.jsonDeserialize(json); AuthState authState = AuthState.jsonDeserialize(json);

@ -1334,12 +1334,12 @@ public class FragmentAccount extends FragmentBase {
return null; return null;
AccountManager am = AccountManager.get(context); AccountManager am = AccountManager.get(context);
Account[] accounts = am.getAccountsByType("com.google"); Account[] accounts = am.getAccountsByType(EmailService.TYPE_GOOGLE);
for (Account google : accounts) for (Account google : accounts)
if (account.user.equals(google.name)) if (account.user.equals(google.name))
return am.blockingGetAuthToken( return am.blockingGetAuthToken(
google, google,
EmailService.getAuthTokenType("com.google"), EmailService.getAuthTokenType(EmailService.TYPE_GOOGLE),
true); true);
return null; return null;

@ -987,12 +987,12 @@ public class FragmentIdentity extends FragmentBase {
return null; return null;
AccountManager am = AccountManager.get(context); AccountManager am = AccountManager.get(context);
Account[] accounts = am.getAccountsByType("com.google"); Account[] accounts = am.getAccountsByType(EmailService.TYPE_GOOGLE);
for (Account google : accounts) for (Account google : accounts)
if (identity.user.equals(google.name)) if (identity.user.equals(google.name))
return am.blockingGetAuthToken( return am.blockingGetAuthToken(
google, google,
EmailService.getAuthTokenType("com.google"), EmailService.getAuthTokenType(EmailService.TYPE_GOOGLE),
true); true);
return null; return null;

Loading…
Cancel
Save