aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/Settings.java21
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractActivity.java3
-rw-r--r--main/src/cgeo/geocaching/cgBase.java60
3 files changed, 67 insertions, 17 deletions
diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/Settings.java
index 777332d..5386316 100644
--- a/main/src/cgeo/geocaching/Settings.java
+++ b/main/src/cgeo/geocaching/Settings.java
@@ -67,6 +67,7 @@ public final class Settings {
private static final String KEY_LOAD_DIRECTION_IMG = "loaddirectionimg";
private static final String KEY_GC_CUSTOM_DATE = "gccustomdate";
private static final String KEY_SHOW_WAYPOINTS_THRESHOLD = "gcshowwaypointsthreshold";
+ private static final String KEY_COOKIE_STORE = "cookiestore";
private final static int unitsMetric = 1;
private final static int unitsImperial = 2;
@@ -262,6 +263,26 @@ public final class Settings {
return sharedPrefs.getString(KEY_SIGNATURE, null);
}
+ public static boolean setCookieStore(final String cookies) {
+ return editSharedSettings(new PrefRunnable() {
+
+ @Override
+ public void edit(final Editor edit) {
+ if (StringUtils.isBlank(cookies)) {
+ // erase cookies
+ edit.remove(KEY_COOKIE_STORE);
+ } else {
+ // save cookies
+ edit.putString(KEY_COOKIE_STORE, cookies);
+ }
+ }
+ });
+ }
+
+ public static String getCookieStore() {
+ return sharedPrefs.getString(KEY_COOKIE_STORE, null);
+ }
+
public static String setCacheType(final String cacheTypeIn) {
editSharedSettings(new PrefRunnable() {
@Override
diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java
index 2b3aede..14dbfd7 100644
--- a/main/src/cgeo/geocaching/activity/AbstractActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java
@@ -76,6 +76,9 @@ public abstract class AbstractActivity extends Activity implements IAbstractActi
app = (cgeoapplication) this.getApplication();
prefs = getSharedPreferences(Settings.preferences, Context.MODE_PRIVATE);
base = new cgBase(app);
+
+ // Restore cookie store if needed
+ cgBase.restoreCookieStore(Settings.getCookieStore());
}
public void addVisitMenu(Menu menu, cgCache cache) {
diff --git a/main/src/cgeo/geocaching/cgBase.java b/main/src/cgeo/geocaching/cgBase.java
index d0aa00b..90923a7 100644
--- a/main/src/cgeo/geocaching/cgBase.java
+++ b/main/src/cgeo/geocaching/cgBase.java
@@ -26,9 +26,11 @@ import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.cookie.Cookie;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
@@ -468,6 +470,7 @@ public class cgBase {
}
clearCookies();
+ Settings.setCookieStore(null);
final Parameters params = new Parameters(
"__EVENTTARGET", "",
@@ -486,6 +489,7 @@ public class cgBase {
Log.i(Settings.tag, "Successfully logged in Geocaching.com as " + login.left);
switchToEnglish(loginData);
+ Settings.setCookieStore(dumpCookieStore());
return StatusCode.NO_ERROR; // logged in
} else {
@@ -2794,32 +2798,54 @@ public class cgBase {
return request(uri, addFToParams(params, my, addF), xContentType);
}
- private static HttpParams clientParams;
- private static CookieStore cookieStore;
+ final private static CookieStore cookieStore = new BasicCookieStore();
+ private static boolean cookieStoreRestored = false;
+ final private static HttpParams clientParams = new BasicHttpParams();
+
+ static {
+ clientParams.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, HTTP.UTF_8);
+ clientParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
+ clientParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 30000);
+ }
public static HttpClient getHttpClient() {
- if (cookieStore == null) {
- synchronized (cgBase.class) {
- if (cookieStore == null) {
- clientParams = new BasicHttpParams();
- clientParams.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, HTTP.UTF_8);
- clientParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
- clientParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 30000);
- cookieStore = new BasicCookieStore();
- }
- }
- }
final DefaultHttpClient client = new DefaultHttpClient();
client.setCookieStore(cookieStore);
client.setParams(clientParams);
return client;
}
- public static void clearCookies() {
- if (cookieStore == null) {
- // If cookie store has not been created yet, force its creation
- getHttpClient();
+ public static void restoreCookieStore(final String oldCookies) {
+ if (!cookieStoreRestored) {
+ clearCookies();
+ if (oldCookies != null) {
+ for (final String cookie : StringUtils.split(oldCookies, ';')) {
+ final String[] split = StringUtils.split(cookie, "=", 3);
+ if (split.length == 3) {
+ final BasicClientCookie newCookie = new BasicClientCookie(split[0], split[1]);
+ newCookie.setDomain(split[2]);
+ cookieStore.addCookie(newCookie);
+ }
+ }
+ }
+ cookieStoreRestored = true;
+ }
+ }
+
+ public static String dumpCookieStore() {
+ StringBuilder cookies = new StringBuilder();
+ for (final Cookie cookie : cookieStore.getCookies()) {
+ cookies.append(cookie.getName());
+ cookies.append('=');
+ cookies.append(cookie.getValue());
+ cookies.append('=');
+ cookies.append(cookie.getDomain());
+ cookies.append(';');
}
+ return cookies.toString();
+ }
+
+ public static void clearCookies() {
cookieStore.clear();
}