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