aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2013-12-28 11:10:33 +0100
committerSamuel Tardieu <sam@rfc1149.net>2013-12-28 11:16:33 +0100
commit58d4c70c00ed1de52e8cda665a77230b249906ac (patch)
tree924af3cccdc831fe00c4a6fe27483e1775c6a70e /main
parent8a4a97f46ac02d7475a4a9532cb3b80800dcda90 (diff)
downloadcgeo-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')
-rw-r--r--main/src/cgeo/geocaching/CgeoApplication.java20
-rw-r--r--main/src/cgeo/geocaching/MainActivity.java47
-rw-r--r--main/src/cgeo/geocaching/connector/ec/ECConnector.java4
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConnector.java1
-rw-r--r--main/src/cgeo/geocaching/settings/SettingsActivity.java5
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;
}