Dbrant has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/322700

Change subject: Utility functions for accessing GeoIP information.
......................................................................

Utility functions for accessing GeoIP information.

Lays some groundwork for conditionally showing announcements based on
country code.

Bug: T151085
Change-Id: I4857433286d415d1a1a15cf7e22e603cb6b70410
---
M app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java
M app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
A app/src/main/java/org/wikipedia/util/GeoUtil.java
M app/src/main/java/org/wikipedia/util/UriUtil.java
4 files changed, 110 insertions(+), 22 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/00/322700/1

diff --git a/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java 
b/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java
index cf2a157..a76430f 100644
--- a/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java
+++ b/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java
@@ -1,6 +1,7 @@
 package org.wikipedia;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import org.wikipedia.settings.Prefs;
 import org.wikipedia.util.StringUtil;
@@ -14,6 +15,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -136,6 +138,29 @@
         return StringUtil.delimiterStringToList(str, DELIMITER);
     }
 
+    @Nullable
+    public synchronized String getCookieByName(@NonNull String name) {
+        for (String domainSpec: cookieJar.keySet()) {
+            for (String cookie : cookieJar.get(domainSpec).keySet()) {
+                if (cookie.equals(name)) {
+                    return cookieJar.get(domainSpec).get(cookie);
+                }
+            }
+        }
+        return null;
+    }
+
+    public synchronized void clearCookieByName(@NonNull String name) {
+        for (String domainSpec: cookieJar.keySet()) {
+            Iterator<String> iterator = 
cookieJar.get(domainSpec).keySet().iterator();
+            while (iterator.hasNext()) {
+                if (iterator.next().equals(name)) {
+                    iterator.remove();
+                }
+            }
+        }
+    }
+
     private Map<String, String> makeCookieMap(@NonNull List<String> cookies) {
         Map<String, String> cookiesMap = new HashMap<>();
         for (String cookie : cookies) {
diff --git 
a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java 
b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
index d954388..230e15c 100755
--- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
+++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
@@ -38,7 +38,7 @@
 import org.wikipedia.server.PageServiceFactory;
 import org.wikipedia.server.PageSummary;
 import org.wikipedia.util.FeedbackUtil;
-import org.wikipedia.util.UriUtil;
+import org.wikipedia.util.GeoUtil;
 import org.wikipedia.util.log.L;
 import org.wikipedia.views.ViewUtil;
 
@@ -404,7 +404,7 @@
     private void goToExternalMapsApp() {
         if (location != null) {
             dismiss();
-            UriUtil.sendGeoIntent(getActivity(), location, 
pageTitle.getDisplayText());
+            GeoUtil.sendGeoIntent(getActivity(), location, 
pageTitle.getDisplayText());
         }
     }
 
diff --git a/app/src/main/java/org/wikipedia/util/GeoUtil.java 
b/app/src/main/java/org/wikipedia/util/GeoUtil.java
new file mode 100644
index 0000000..968bde9
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/util/GeoUtil.java
@@ -0,0 +1,83 @@
+package org.wikipedia.util;
+
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.location.Location;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
+import org.wikipedia.R;
+import org.wikipedia.WikipediaApp;
+
+public final class GeoUtil {
+    private enum GeoIPComponent {
+        COUNTRY, REGION, CITY, LATITUDE, LONGITUDE, VERSION
+    }
+
+    public static void sendGeoIntent(@NonNull Activity activity,
+                                     @NonNull Location location,
+                                     String placeName) {
+        String geoStr = "geo:";
+        geoStr += Double.toString(location.getLatitude()) + ","
+                + Double.toString(location.getLongitude());
+        if (!TextUtils.isEmpty(placeName)) {
+            geoStr += "?q=" + Uri.encode(placeName);
+        }
+        try {
+            activity.startActivity(new Intent(Intent.ACTION_VIEW, 
Uri.parse(geoStr)));
+        } catch (ActivityNotFoundException e) {
+            FeedbackUtil.showMessage(activity, R.string.error_no_maps_app);
+        }
+    }
+
+    @Nullable
+    public static String getGeoIPCountry() {
+        return getGeoIPComponent(GeoIPComponent.COUNTRY);
+    }
+
+    @Nullable
+    public static String getGeoIPRegion() {
+        return getGeoIPComponent(GeoIPComponent.REGION);
+    }
+
+    @Nullable
+    public static String getGeoIPCity() {
+        return getGeoIPComponent(GeoIPComponent.CITY);
+    }
+
+    @Nullable
+    public static Location getGeoIPLocation() {
+        try {
+            Location location = new Location("");
+            
location.setLatitude(Double.parseDouble(getGeoIPComponent(GeoIPComponent.LATITUDE)));
+            
location.setLongitude(Double.parseDouble(getGeoIPComponent(GeoIPComponent.LONGITUDE)));
+            return location;
+        } catch (Exception e) {
+            // swallow exceptions from possible malformations in the cookie
+        }
+        return null;
+    }
+
+    /*
+    Information about the format and contents of the GeoIP cookie:
+    
https://phabricator.wikimedia.org/diffusion/ECNO/browse/master/resources/subscribing/ext.centralNotice.geoIP.js
+     */
+    @Nullable
+    private static String getGeoIPComponent(GeoIPComponent component) {
+        String geoIP = 
WikipediaApp.getInstance().getCookieManager().getCookieByName("GeoIP");
+        if (!TextUtils.isEmpty(geoIP) && geoIP.contains(":v4")) {
+            try {
+                return geoIP.split(":")[component.ordinal()];
+            } catch (Exception e) {
+                // swallow exceptions from possible malformations in the cookie
+            }
+        }
+        return null;
+    }
+
+    private GeoUtil() {
+    }
+}
diff --git a/app/src/main/java/org/wikipedia/util/UriUtil.java 
b/app/src/main/java/org/wikipedia/util/UriUtil.java
index 485dbda..e69c0a6 100644
--- a/app/src/main/java/org/wikipedia/util/UriUtil.java
+++ b/app/src/main/java/org/wikipedia/util/UriUtil.java
@@ -1,17 +1,13 @@
 package org.wikipedia.util;
 
-import android.app.Activity;
-import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
-import android.location.Location;
 import android.net.Uri;
 import android.support.annotation.NonNull;
 import android.support.annotation.StringRes;
 import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
 
-import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.settings.Prefs;
@@ -102,22 +98,6 @@
         }
 
         showZeroExitInterstitialDialog(context, uri);
-    }
-
-    public static void sendGeoIntent(@NonNull Activity activity,
-                                     @NonNull Location location,
-                                     String placeName) {
-        String geoStr = "geo:";
-        geoStr += Double.toString(location.getLatitude()) + ","
-                + Double.toString(location.getLongitude());
-        if (!TextUtils.isEmpty(placeName)) {
-            geoStr += "?q=" + Uri.encode(placeName);
-        }
-        try {
-            activity.startActivity(new Intent(Intent.ACTION_VIEW, 
Uri.parse(geoStr)));
-        } catch (ActivityNotFoundException e) {
-            FeedbackUtil.showMessage(activity, R.string.error_no_maps_app);
-        }
     }
 
     public static String getUrlWithProvenance(Context context, PageTitle title,

-- 
To view, visit https://gerrit.wikimedia.org/r/322700
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4857433286d415d1a1a15cf7e22e603cb6b70410
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <dbr...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to