Skip to content

Commit 32cb8df

Browse files
committed
Consolidate the networking libraries - drop volley in favor of OkHttp
1 parent 2255bd9 commit 32cb8df

File tree

8 files changed

+194
-262
lines changed

8 files changed

+194
-262
lines changed

app/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ dependencies {
1111
implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
1212
implementation 'in.yuvi:http.fluent:1.3'
1313
implementation 'com.github.chrisbanes:PhotoView:2.0.0'
14-
implementation 'com.android.volley:volley:1.0.0'
1514
implementation 'ch.acra:acra:4.9.2'
1615
implementation 'org.mediawiki:api:1.3'
1716
implementation 'commons-codec:commons-codec:1.10'

app/proguard-rules.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-dontobfuscate
22
-keep class org.apache.http.** { *; }
33
-dontwarn org.apache.http.**
4-
-keep class fr.free.nrw.commons.upload.MwVolleyApi$Page {*;}
4+
-keep class fr.free.nrw.commons.upload.CategoryApi$Page {*;}
55
-keep class android.support.v7.widget.ShareActionProvider { *; }

app/src/main/java/fr/free/nrw/commons/caching/CacheController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import java.util.Arrays;
88
import java.util.List;
99

10-
import fr.free.nrw.commons.upload.MwVolleyApi;
10+
import fr.free.nrw.commons.upload.CategoryApi;
1111
import timber.log.Timber;
1212

1313
public class CacheController {
@@ -31,8 +31,8 @@ public void setQtPoint(double decLongitude, double decLatitude) {
3131

3232
public void cacheCategory() {
3333
List<String> pointCatList = new ArrayList<>();
34-
if (MwVolleyApi.GpsCatExists.getGpsCatExists()) {
35-
pointCatList.addAll(MwVolleyApi.getGpsCat());
34+
if (CategoryApi.GpsCatExists.getGpsCatExists()) {
35+
pointCatList.addAll(CategoryApi.getGpsCat());
3636
Timber.d("Categories being cached: %s", pointCatList);
3737
} else {
3838
Timber.d("No categories found, so no categories cached");

app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import fr.free.nrw.commons.R;
4040
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
4141
import fr.free.nrw.commons.mwapi.MediaWikiApi;
42-
import fr.free.nrw.commons.upload.MwVolleyApi;
42+
import fr.free.nrw.commons.upload.CategoryApi;
4343
import fr.free.nrw.commons.utils.StringSortingUtils;
4444
import fr.free.nrw.commons.utils.ViewUtil;
4545
import io.reactivex.Observable;
@@ -288,8 +288,8 @@ private Observable<CategoryItem> directCategories() {
288288

289289
private Observable<CategoryItem> gpsCategories() {
290290
return Observable.fromIterable(
291-
MwVolleyApi.GpsCatExists.getGpsCatExists()
292-
? MwVolleyApi.getGpsCat() : new ArrayList<>())
291+
CategoryApi.GpsCatExists.getGpsCatExists()
292+
? CategoryApi.getGpsCat() : new ArrayList<>())
293293
.map(name -> new CategoryItem(name, false));
294294
}
295295

app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@
44
import android.content.Context;
55
import android.content.SharedPreferences;
66
import android.preference.PreferenceManager;
7+
import android.support.annotation.NonNull;
78
import android.support.v4.util.LruCache;
89

910
import com.google.gson.Gson;
11+
import com.google.gson.GsonBuilder;
1012

1113
import javax.inject.Named;
1214
import javax.inject.Singleton;
1315

1416
import dagger.Module;
1517
import dagger.Provides;
1618
import fr.free.nrw.commons.BuildConfig;
17-
import fr.free.nrw.commons.CommonsApplication;
1819
import fr.free.nrw.commons.auth.AccountUtil;
1920
import fr.free.nrw.commons.auth.SessionManager;
2021
import fr.free.nrw.commons.caching.CacheController;
@@ -24,6 +25,8 @@
2425
import fr.free.nrw.commons.mwapi.MediaWikiApi;
2526
import fr.free.nrw.commons.nearby.NearbyPlaces;
2627
import fr.free.nrw.commons.upload.UploadController;
28+
import okhttp3.HttpUrl;
29+
import okhttp3.OkHttpClient;
2730

2831
import static android.content.Context.MODE_PRIVATE;
2932
import static fr.free.nrw.commons.contributions.ContributionsContentProvider.CONTRIBUTION_AUTHORITY;
@@ -69,6 +72,12 @@ public ContentProviderClient provideModificationContentProviderClient(Context co
6972
return context.getContentResolver().acquireContentProviderClient(MODIFICATIONS_AUTHORITY);
7073
}
7174

75+
@Provides
76+
@Singleton
77+
public OkHttpClient provideOkHttpClient() {
78+
return new OkHttpClient.Builder().build();
79+
}
80+
7281
@Provides
7382
@Named("application_preferences")
7483
public SharedPreferences providesApplicationSharedPreferences(Context context) {
@@ -126,6 +135,14 @@ public MediaWikiApi provideMediaWikiApi(Context context,
126135
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, defaultPreferences, categoryPrefs, gson);
127136
}
128137

138+
@Provides
139+
@Named("commons_mediawiki_url")
140+
@NonNull
141+
@SuppressWarnings("ConstantConditions")
142+
public HttpUrl provideMwUrl() {
143+
return HttpUrl.parse("https://commons.wikimedia.org/");
144+
}
145+
129146
@Provides
130147
@Singleton
131148
public LocationServiceManager provideLocationServiceManager(Context context) {
@@ -139,7 +156,7 @@ public LocationServiceManager provideLocationServiceManager(Context context) {
139156
@Provides
140157
@Singleton
141158
public Gson provideGson() {
142-
return new Gson();
159+
return new GsonBuilder().create();
143160
}
144161

145162
@Provides
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
package fr.free.nrw.commons.upload;
2+
3+
import android.support.annotation.NonNull;
4+
5+
import com.google.gson.Gson;
6+
7+
import java.io.IOException;
8+
import java.util.ArrayList;
9+
import java.util.HashSet;
10+
import java.util.List;
11+
import java.util.Set;
12+
13+
import javax.inject.Inject;
14+
import javax.inject.Named;
15+
16+
import okhttp3.Call;
17+
import okhttp3.Callback;
18+
import okhttp3.HttpUrl;
19+
import okhttp3.OkHttpClient;
20+
import okhttp3.Request;
21+
import okhttp3.ResponseBody;
22+
import timber.log.Timber;
23+
24+
/**
25+
* Uses the OkHttp library to implement asynchronous calls to the Commons MediaWiki API to match
26+
* GPS coordinates with nearby Commons categories. Parses the results using GSON to obtain a list
27+
* of relevant categories.
28+
*/
29+
public class CategoryApi {
30+
31+
private static Set<String> categorySet;
32+
private static List<String> categoryList;
33+
private final OkHttpClient okHttpClient;
34+
private final HttpUrl mwUrl;
35+
private final Gson gson;
36+
37+
@Inject
38+
public CategoryApi(OkHttpClient okHttpClient, @Named("commons_mediawiki_url") HttpUrl mwUrl, Gson gson) {
39+
this.okHttpClient = okHttpClient;
40+
this.mwUrl = mwUrl;
41+
this.gson = gson;
42+
categorySet = new HashSet<>();
43+
}
44+
45+
public static List<String> getGpsCat() {
46+
return categoryList;
47+
}
48+
49+
public static void setGpsCat(List<String> cachedList) {
50+
categoryList = new ArrayList<>();
51+
categoryList.addAll(cachedList);
52+
Timber.d("Setting GPS cats from cache: %s", categoryList);
53+
}
54+
55+
public void request(String coords) {
56+
String apiUrl = buildUrl(coords);
57+
Timber.d("URL: %s", apiUrl);
58+
59+
Call call = okHttpClient.newCall(new Request.Builder().get().url(apiUrl).build());
60+
call.enqueue(new Callback() {
61+
@Override
62+
public void onFailure(@NonNull Call call, @NonNull IOException e) {
63+
Timber.e(e);
64+
GpsCatExists.setGpsCatExists(false);
65+
}
66+
67+
@Override
68+
public void onResponse(@NonNull Call call, @NonNull okhttp3.Response response) {
69+
categoryList = new ArrayList<>();
70+
categorySet = new HashSet<>();
71+
ResponseBody body = response.body();
72+
if (body == null) {
73+
return;
74+
}
75+
QueryResponse queryResponse = gson.fromJson(body.charStream(), QueryResponse.class);
76+
if (queryResponse != null && queryResponse.query != null && queryResponse.query.pages != null) {
77+
for (Page page : queryResponse.query.pages) {
78+
if (page.categories != null) {
79+
for (Category category : page.categories) {
80+
String categoryString = category.title.replace("Category:", "");
81+
categorySet.add(categoryString);
82+
}
83+
categoryList = new ArrayList<>(categorySet);
84+
}
85+
}
86+
}
87+
GpsCatExists.setGpsCatExists(!categorySet.isEmpty());
88+
}
89+
});
90+
}
91+
92+
/**
93+
* Builds URL with image coords for MediaWiki API calls
94+
* 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|1.356263888888888&ggsradius=100&ggslimit=10&ggsnamespace=6&ggsprop=type|name|dim|country|region|globe&ggsprimary=all&formatversion=2
95+
*
96+
* @param coords Coordinates to build query with
97+
* @return URL for API query
98+
*/
99+
private String buildUrl(String coords) {
100+
return mwUrl.newBuilder()
101+
.addPathSegment("w")
102+
.addPathSegment("api.php")
103+
.addQueryParameter("action", "query")
104+
.addQueryParameter("prop", "categories|coordinates|pageprops")
105+
.addQueryParameter("format", "json")
106+
.addQueryParameter("clshow", "!hidden")
107+
.addQueryParameter("coprop", "type|name|dim|country|region|globe")
108+
.addQueryParameter("codistancefrompoint", coords)
109+
.addQueryParameter("generator", "geosearch")
110+
.addQueryParameter("ggscoord", coords)
111+
.addQueryParameter("ggsradius", "10000")
112+
.addQueryParameter("ggslimit", "10")
113+
.addQueryParameter("ggsnamespace", "6")
114+
.addQueryParameter("ggsprop", "type|name|dim|country|region|globe")
115+
.addQueryParameter("ggsprimary", "all")
116+
.addQueryParameter("formatversion", "2")
117+
.build().toString();
118+
}
119+
120+
public static class GpsCatExists {
121+
private static boolean gpsCatExists;
122+
123+
public static void setGpsCatExists(boolean gpsCat) {
124+
gpsCatExists = gpsCat;
125+
}
126+
127+
public static boolean getGpsCatExists() {
128+
return gpsCatExists;
129+
}
130+
}
131+
132+
private static class QueryResponse {
133+
public Query query;
134+
135+
public QueryResponse() {
136+
}
137+
}
138+
139+
private static class Query {
140+
public Page[] pages;
141+
142+
public Query() {
143+
pages = new Page[0];
144+
}
145+
}
146+
147+
private static class Page {
148+
public String title;
149+
public Category[] categories;
150+
public Category category;
151+
152+
public Page() {
153+
}
154+
}
155+
156+
private static class Category {
157+
public String title;
158+
159+
public Category() {
160+
}
161+
}
162+
}
163+
164+
165+

0 commit comments

Comments
 (0)