diff --git a/commons/src/main/java/fr/free/nrw/commons/upload/MwVolley.java b/commons/src/main/java/fr/free/nrw/commons/upload/MwVolley.java index b68c0f218..c91bb33e5 100644 --- a/commons/src/main/java/fr/free/nrw/commons/upload/MwVolley.java +++ b/commons/src/main/java/fr/free/nrw/commons/upload/MwVolley.java @@ -1,17 +1,147 @@ package fr.free.nrw.commons.upload; import android.content.Context; +import android.net.Uri; +import android.util.Log; + +import com.android.volley.Cache; +import com.android.volley.NetworkResponse; +import com.android.volley.Request; import com.android.volley.RequestQueue; +import com.android.volley.Response; +import com.android.volley.toolbox.HttpHeaderParser; +import com.android.volley.toolbox.JsonRequest; + +import java.io.UnsupportedEncodingException; +import java.util.HashSet; +import java.util.Set; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; public class MwVolley { - public MwVolley(Context context) { + private Context context; + private String coords; + private static final String MWURL = "https://commons.wikimedia.org/"; + private String apiUrl; + private int radius; + private Gson GSON; + protected Set categorySet; + + public MwVolley(Context context, String coords) { + + this.context = context; + this.coords = coords; + categorySet = new HashSet(); + GSON = new GsonBuilder().create(); //Instantiate RequestQueue with Application context - RequestQueue queue = VolleyRequestQueue.getInstance(this.getApplicationContext()).getRequestQueue(); + RequestQueue queue = VolleyRequestQueue.getInstance(context.getApplicationContext()).getRequestQueue(); + } + protected void setRadius(int radius) { + this.radius = radius; + } + + protected int getRadius() { + return radius; + } + + /** + * Builds URL with image coords for MediaWiki API calls + * Example URL: https://commons.wikimedia.org/w/api.php?action=query&prop=categories|coordinates|pageprops&format=json&clshow=!hidden&coprop=type|name|dim|country|region|globe&codistancefrompoint=38.11386944444445|13.356263888888888& + * generator=geosearch&redirects=&ggscoord=38.11386944444445|13.356263888888888&ggsradius=100&ggslimit=10&ggsnamespace=6&ggsprop=type|name|dim|country|region|globe&ggsprimary=all&formatversion=2 + */ + private String buildUrl(int ggsradius) { + + Uri.Builder builder = Uri.parse(MWURL).buildUpon(); + + builder.appendPath("w") + .appendPath("api.php") + .appendQueryParameter("action", "query") + .appendQueryParameter("prop", "categories|coordinates|pageprops") + .appendQueryParameter("format", "json") + .appendQueryParameter("clshow", "!hidden") + .appendQueryParameter("coprop", "type|name|dim|country|region|globe") + .appendQueryParameter("codistancefrompoint", coords) + .appendQueryParameter("generator", "geosearch") + .appendQueryParameter("ggscoord", coords) + .appendQueryParameter("ggsradius", Integer.toString(ggsradius)) + .appendQueryParameter("ggslimit", "10") + .appendQueryParameter("ggsnamespace", "6") + .appendQueryParameter("ggsprop", "type|name|dim|country|region|globe") + .appendQueryParameter("ggsprimary", "all") + .appendQueryParameter("formatversion", "2"); + + return builder.toString(); + } + + public void request() { + + radius = getRadius(); + apiUrl = buildUrl(radius); + + ShareActivity.ResponseListener responseListener = new ShareActivity.ResponseListener(); + ShareActivity.ErrorListener errorListener = new ShareActivity.ErrorListener(); + + JsonRequest request = new QueryRequest(apiUrl, responseListener, errorListener); + VolleyRequestQueue.getInstance(context).addToRequestQueue(request); + } + + private class QueryRequest extends JsonRequest { + + public QueryRequest(String url, Response.Listener listener, Response.ErrorListener errorListener) { + super(Request.Method.GET, url, null, listener, errorListener); + } + + @Override + protected Response parseNetworkResponse(NetworkResponse response) { + String json = parseString(response); + QueryResponse queryResponse = GSON.fromJson(json, QueryResponse.class); + return Response.success(queryResponse, cacheEntry(response)); + } + + private Cache.Entry cacheEntry(NetworkResponse response) { + return HttpHeaderParser.parseCacheHeaders(response); + } + + private String parseString(NetworkResponse response) { + try { + return new String(response.data, HttpHeaderParser.parseCharset(response.headers)); + } catch (UnsupportedEncodingException e) { + return new String(response.data); + } + } + } + + private static class QueryResponse { + private Query query = new Query(); + + private String printSet() { + if (categorySet == null || categorySet.isEmpty()) { + GpsCatExists.setGpsCatExists(false); + Log.d("Cat", "gpsCatExists=" + GpsCatExists.getGpsCatExists()); + return "No collection of categories"; + } else { + GpsCatExists.setGpsCatExists(true); + Log.d("Cat", "gpsCatExists=" + GpsCatExists.getGpsCatExists()); + return "CATEGORIES FOUND" + categorySet.toString(); + } + } + + @Override + public String toString() { + if (query != null) { + return "query=" + query.toString() + "\n" + printSet(); + } else { + return "No pages found"; + } + } } + + } diff --git a/commons/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/commons/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index 614442487..d57047215 100644 --- a/commons/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/commons/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -5,6 +5,7 @@ import android.os.*; import com.android.volley.RequestQueue; import com.android.volley.Response; +import com.android.volley.VolleyError; import com.nostra13.universalimageloader.core.ImageLoader; import android.net.*; import android.support.v4.app.NavUtils; @@ -210,13 +211,23 @@ public class ShareActivity requestAuthToken(); } - private class ResponseListener implements Response.Listener{ + protected static class ResponseListener implements Response.Listener{ @Override public void onResponse(T response){ } } + protected static class ErrorListener implements Response.ErrorListener { + + private static final String TAG = ErrorListener.class.getName(); + + @Override + public void onErrorResponse(VolleyError error) { + Log.e(TAG, error.toString()); + } + } + @Override protected void onDestroy() {