diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2013-12-28 11:10:33 +0100 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2013-12-28 11:16:33 +0100 |
| commit | 58d4c70c00ed1de52e8cda665a77230b249906ac (patch) | |
| tree | 924af3cccdc831fe00c4a6fe27483e1775c6a70e /main | |
| parent | 8a4a97f46ac02d7475a4a9532cb3b80800dcda90 (diff) | |
| download | cgeo-58d4c70c00ed1de52e8cda665a77230b249906ac.zip cgeo-58d4c70c00ed1de52e8cda665a77230b249906ac.tar.gz cgeo-58d4c70c00ed1de52e8cda665a77230b249906ac.tar.bz2 | |
fix #3480: quasi-systematic concurrent logins
The login procedure was initiated in both `onCreate()` and `onResume()`.
It has been limited to `onResume()` and refactored as to not manipulate
a global variable.
Also, the previous code prevented cgeo from retrying a failed login to
one of the cache providers if another had succeeded, as every provider
cleared `setLogin()` in case of success. This has been fixed as well.
Diffstat (limited to 'main')
5 files changed, 43 insertions, 34 deletions
diff --git a/main/src/cgeo/geocaching/CgeoApplication.java b/main/src/cgeo/geocaching/CgeoApplication.java index 3d2f758..2500d10 100644 --- a/main/src/cgeo/geocaching/CgeoApplication.java +++ b/main/src/cgeo/geocaching/CgeoApplication.java @@ -16,7 +16,7 @@ public class CgeoApplication extends Application { private volatile GeoDataProvider geo; private volatile DirectionProvider dir; - public boolean checkLogin = true; // c:geo is just launched + private boolean forceRelog = false; // c:geo needs to log into cache providers public boolean showLoginToast = true; //login toast shown just once. private boolean liveMapHintShown = false; // livemap hint has been shown final private StatusUpdater statusUpdater = new StatusUpdater(); @@ -150,4 +150,22 @@ public class CgeoApplication extends Application { liveMapHintShown = true; } + /** + * Check if cgeo must relog even if already logged in. + * + * @return <code>true</code> if it is necessary to relog + */ + public boolean mustRelog() { + final boolean mustLogin = forceRelog; + forceRelog = false; + return mustLogin; + } + + /** + * Force cgeo to relog when reaching the main activity. + */ + public void forceRelog() { + forceRelog = true; + } + } diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 127a21d..d3f78cf 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -1,8 +1,5 @@ package cgeo.geocaching; -import butterknife.ButterKnife; -import butterknife.InjectView; - import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.capability.ILogin; @@ -22,9 +19,10 @@ import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.RunnableWithArgument; import cgeo.geocaching.utils.Version; +import butterknife.ButterKnife; +import butterknife.InjectView; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; - import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -232,9 +230,28 @@ public class MainActivity extends AbstractActivity { locationUpdater.startGeo(); satellitesHandler.startGeo(); updateUserInfoHandler.sendEmptyMessage(-1); + startBackgroundLogin(); init(); } + private void startBackgroundLogin() { + assert(app != null); + + (new Thread() { + @Override + public void run() { + final boolean mustLogin = app.mustRelog(); + + for (final ILogin conn : ConnectorFactory.getActiveLiveConnectors()) { + if (mustLogin || !conn.isLoggedIn()) { + conn.login(firstLoginHandler, MainActivity.this); + updateUserInfoHandler.sendEmptyMessage(-1); + } + } + } + }).start(); + } + @Override public void onDestroy() { initialized = false; @@ -342,11 +359,6 @@ public class MainActivity extends AbstractActivity { } private void init() { - - if (app.checkLogin) { - (new FirstLoginThread()).start(); - } - if (initialized) { return; } @@ -700,23 +712,6 @@ public class MainActivity extends AbstractActivity { } } - private class FirstLoginThread extends Thread { - - @Override - public void run() { - if (app == null) { - return; - } - - ILogin[] conns = ConnectorFactory.getActiveLiveConnectors(); - - for (ILogin conn : conns) { - conn.login(firstLoginHandler, MainActivity.this); - updateUserInfoHandler.sendEmptyMessage(-1); - } - } - } - private class ObtainAddressThread extends Thread { public ObtainAddressThread() { diff --git a/main/src/cgeo/geocaching/connector/ec/ECConnector.java b/main/src/cgeo/geocaching/connector/ec/ECConnector.java index 3c66d7d..987b4f2 100644 --- a/main/src/cgeo/geocaching/connector/ec/ECConnector.java +++ b/main/src/cgeo/geocaching/connector/ec/ECConnector.java @@ -132,10 +132,6 @@ public class ECConnector extends AbstractConnector implements ISearchByGeocode, // login final StatusCode status = ECLogin.getInstance().login(); - if (status == StatusCode.NO_ERROR) { - CgeoApplication.getInstance().checkLogin = false; - } - if (CgeoApplication.getInstance().showLoginToast && handler != null) { handler.sendMessage(handler.obtainMessage(0, status)); CgeoApplication.getInstance().showLoginToast = false; diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index 4349d5d..5557954 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -304,7 +304,6 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, final StatusCode status = GCLogin.getInstance().login(); if (status == StatusCode.NO_ERROR) { - CgeoApplication.getInstance().checkLogin = false; GCLogin.detectGcCustomDate(); } diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index cd9296e..58acfc1 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -494,7 +494,7 @@ public class SettingsActivity extends PreferenceActivity { preference.setSummary(mapSource.getName()); } else if (isPreference(preference, R.string.pref_connectorOCActive) || isPreference(preference, R.string.pref_connectorOCPLActive) || isPreference(preference, R.string.pref_connectorGCActive) || isPreference(preference, R.string.pref_connectorECActive)) { // // reset log-in status if connector activation was changed - CgeoApplication.getInstance().checkLogin = true; + CgeoApplication.getInstance().forceRelog(); } else if (preference instanceof ListPreference) { // For list preferences, look up the correct display value in // the preference's 'entries' list. @@ -520,12 +520,13 @@ public class SettingsActivity extends PreferenceActivity { // simple string representation. preference.setSummary(stringValue); } + // TODO: do not special case geocaching.com here if ((isPreference(preference, R.string.pref_username) && !stringValue.equals(Settings.getUsername())) || (isPreference(preference, R.string.pref_password) && !stringValue.equals(Settings.getGcCredentials().getRight()))) { // reset log-in if gc user or password is changed if (GCLogin.getInstance().isActualLoginStatus()) { GCLogin.getInstance().logout(); } - CgeoApplication.getInstance().checkLogin = true; + CgeoApplication.getInstance().forceRelog(); } return true; } |
