package org.wikipedia.feed.announcement; import android.location.Location; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import org.wikipedia.WikipediaApp; /* This currently supports the "v4" version of the GeoIP cookie. For some info about the format and contents of the cookie: https://phabricator.wikimedia.org/diffusion/ECNO/browse/master/resources/subscribing/ext.centralNotice.geoIP.js */ public final class GeoIPCookieUnmarshaller { private static final String COOKIE_NAME = "GeoIP"; private enum Component { COUNTRY, REGION, CITY, LATITUDE, LONGITUDE, VERSION } @NonNull public static GeoIPCookie unmarshal(@NonNull WikipediaApp app) { return unmarshal(app.getCookieManager().getCookieByName(COOKIE_NAME)); } @VisibleForTesting @NonNull static GeoIPCookie unmarshal(@Nullable String cookie) throws IllegalArgumentException { if (TextUtils.isEmpty(cookie)) { throw new IllegalArgumentException("Cookie is empty."); } String[] components = cookie.split(":"); if (components.length < Component.values().length) { throw new IllegalArgumentException("Cookie is malformed."); } else if (!components[Component.VERSION.ordinal()].equals("v4")) { throw new IllegalArgumentException("Incorrect cookie version."); } Location location = null; if (!TextUtils.isEmpty(components[Component.LATITUDE.ordinal()]) && !TextUtils.isEmpty(components[Component.LONGITUDE.ordinal()])) { location = new Location(""); try { location.setLatitude(Double.parseDouble(components[Component.LATITUDE.ordinal()])); location.setLongitude(Double.parseDouble(components[Component.LONGITUDE.ordinal()])); } catch (NumberFormatException e) { throw new IllegalArgumentException("Location is malformed."); } } return new GeoIPCookie(components[Component.COUNTRY.ordinal()], components[Component.REGION.ordinal()], components[Component.CITY.ordinal()], location); } private GeoIPCookieUnmarshaller() { } }