Skip to content

Commit ab9e57f

Browse files
authored
Decouple from the data-client service factory, with some code cleanup in the process (commons-app#5496)
1 parent 7ec2a22 commit ab9e57f

File tree

10 files changed

+75
-71
lines changed

10 files changed

+75
-71
lines changed

app/src/main/java/fr/free/nrw/commons/CommonsAppAdapter.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import okhttp3.OkHttpClient;
77
import org.wikipedia.AppAdapter;
88
import org.wikipedia.dataclient.SharedPreferenceCookieManager;
9-
import org.wikipedia.dataclient.WikiSite;
109
import org.wikipedia.json.GsonMarshaller;
1110
import org.wikipedia.json.GsonUnmarshaller;
1211

@@ -33,7 +32,7 @@ public String getRestbaseUriFormat() {
3332
}
3433

3534
@Override
36-
public OkHttpClient getOkHttpClient(@NonNull WikiSite wikiSite) {
35+
public OkHttpClient getOkHttpClient() {
3736
return OkHttpConnectionFactory.getClient();
3837
}
3938

app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java

-4
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,10 @@
2626
import androidx.core.content.ContextCompat;
2727

2828
import fr.free.nrw.commons.auth.login.LoginClient;
29-
import fr.free.nrw.commons.auth.login.LoginInterface;
3029
import fr.free.nrw.commons.auth.login.LoginResult;
3130
import fr.free.nrw.commons.databinding.ActivityLoginBinding;
3231
import fr.free.nrw.commons.utils.ActivityUtils;
3332
import java.util.Locale;
34-
import org.wikipedia.dataclient.ServiceFactory;
35-
import org.wikipedia.dataclient.WikiSite;
3633
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
3734
import fr.free.nrw.commons.auth.login.LoginCallback;
3835

@@ -57,7 +54,6 @@
5754
import static android.view.KeyEvent.KEYCODE_ENTER;
5855
import static android.view.View.VISIBLE;
5956
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
60-
import static fr.free.nrw.commons.di.NetworkingModule.NAMED_COMMONS_WIKI_SITE;
6157

6258
public class LoginActivity extends AccountAuthenticatorActivity {
6359

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

+43-51
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dagger.Provides;
88
import fr.free.nrw.commons.BetaConstants;
99
import fr.free.nrw.commons.BuildConfig;
10+
import fr.free.nrw.commons.OkHttpConnectionFactory;
1011
import fr.free.nrw.commons.actions.PageEditClient;
1112
import fr.free.nrw.commons.actions.PageEditInterface;
1213
import fr.free.nrw.commons.actions.ThanksInterface;
@@ -27,6 +28,7 @@
2728
import fr.free.nrw.commons.upload.UploadInterface;
2829
import fr.free.nrw.commons.upload.WikiBaseInterface;
2930
import fr.free.nrw.commons.upload.depicts.DepictsInterface;
31+
import fr.free.nrw.commons.wikidata.CommonsServiceFactory;
3032
import fr.free.nrw.commons.wikidata.WikidataInterface;
3133
import java.io.File;
3234
import java.util.Locale;
@@ -39,7 +41,7 @@
3941
import okhttp3.logging.HttpLoggingInterceptor;
4042
import okhttp3.logging.HttpLoggingInterceptor.Level;
4143
import fr.free.nrw.commons.auth.csrf.CsrfTokenClient;
42-
import org.wikipedia.dataclient.ServiceFactory;
44+
import org.wikipedia.AppAdapter;
4345
import org.wikipedia.dataclient.WikiSite;
4446
import org.wikipedia.json.GsonUtil;
4547
import fr.free.nrw.commons.auth.login.LoginClient;
@@ -53,7 +55,6 @@ public class NetworkingModule {
5355

5456
public static final long OK_HTTP_CACHE_SIZE = 10 * 1024 * 1024;
5557

56-
public static final String NAMED_COMMONS_WIKI_SITE = "commons-wikisite";
5758
private static final String NAMED_WIKI_DATA_WIKI_SITE = "wikidata-wikisite";
5859
private static final String NAMED_WIKI_PEDIA_WIKI_SITE = "wikipedia-wikisite";
5960

@@ -75,6 +76,12 @@ public OkHttpClient provideOkHttpClient(Context context,
7576
.build();
7677
}
7778

79+
@Provides
80+
@Singleton
81+
public CommonsServiceFactory serviceFactory() {
82+
return new CommonsServiceFactory(AppAdapter.get().getOkHttpClient());
83+
}
84+
7885
@Provides
7986
@Singleton
8087
public HttpLoggingInterceptor provideHttpLoggingInterceptor() {
@@ -110,14 +117,14 @@ public CsrfTokenClient provideCommonsCsrfTokenClient(SessionManager sessionManag
110117

111118
@Provides
112119
@Singleton
113-
public CsrfTokenInterface provideCsrfTokenInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
114-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, CsrfTokenInterface.class);
120+
public CsrfTokenInterface provideCsrfTokenInterface(CommonsServiceFactory serviceFactory) {
121+
return serviceFactory.create(BuildConfig.COMMONS_URL, CsrfTokenInterface.class);
115122
}
116123

117124
@Provides
118125
@Singleton
119-
public LoginInterface provideLoginInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
120-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, LoginInterface.class);
126+
public LoginInterface provideLoginInterface(CommonsServiceFactory serviceFactory) {
127+
return serviceFactory.create(BuildConfig.COMMONS_URL, LoginInterface.class);
121128
}
122129

123130
@Provides
@@ -142,13 +149,6 @@ public HttpUrl provideToolsForgeUrl() {
142149
return HttpUrl.parse(TOOLS_FORGE_URL);
143150
}
144151

145-
@Provides
146-
@Singleton
147-
@Named(NAMED_COMMONS_WIKI_SITE)
148-
public WikiSite provideCommonsWikiSite() {
149-
return new WikiSite(BuildConfig.COMMONS_URL);
150-
}
151-
152152
@Provides
153153
@Singleton
154154
@Named(NAMED_WIKI_DATA_WIKI_SITE)
@@ -169,40 +169,40 @@ public Gson provideGson() {
169169

170170
@Provides
171171
@Singleton
172-
public ReviewInterface provideReviewInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
173-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, ReviewInterface.class);
172+
public ReviewInterface provideReviewInterface(CommonsServiceFactory serviceFactory) {
173+
return serviceFactory.create(BuildConfig.COMMONS_URL, ReviewInterface.class);
174174
}
175175

176176
@Provides
177177
@Singleton
178-
public DepictsInterface provideDepictsInterface(@Named(NAMED_WIKI_DATA_WIKI_SITE) WikiSite wikidataWikiSite) {
179-
return ServiceFactory.get(wikidataWikiSite, BuildConfig.WIKIDATA_URL, DepictsInterface.class);
178+
public DepictsInterface provideDepictsInterface(CommonsServiceFactory serviceFactory) {
179+
return serviceFactory.create(BuildConfig.WIKIDATA_URL, DepictsInterface.class);
180180
}
181181

182182
@Provides
183183
@Singleton
184-
public WikiBaseInterface provideWikiBaseInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
185-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, WikiBaseInterface.class);
184+
public WikiBaseInterface provideWikiBaseInterface(CommonsServiceFactory serviceFactory) {
185+
return serviceFactory.create(BuildConfig.COMMONS_URL, WikiBaseInterface.class);
186186
}
187187

188188
@Provides
189189
@Singleton
190-
public UploadInterface provideUploadInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
191-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, UploadInterface.class);
190+
public UploadInterface provideUploadInterface(CommonsServiceFactory serviceFactory) {
191+
return serviceFactory.create(BuildConfig.COMMONS_URL, UploadInterface.class);
192192
}
193193

194194
@Named("commons-page-edit-service")
195195
@Provides
196196
@Singleton
197-
public PageEditInterface providePageEditService(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
198-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, PageEditInterface.class);
197+
public PageEditInterface providePageEditService(CommonsServiceFactory serviceFactory) {
198+
return serviceFactory.create(BuildConfig.COMMONS_URL, PageEditInterface.class);
199199
}
200200

201201
@Named("wikidata-page-edit-service")
202202
@Provides
203203
@Singleton
204-
public PageEditInterface provideWikiDataPageEditService(@Named(NAMED_WIKI_DATA_WIKI_SITE) WikiSite wikiDataWikiSite) {
205-
return ServiceFactory.get(wikiDataWikiSite, BuildConfig.WIKIDATA_URL, PageEditInterface.class);
204+
public PageEditInterface provideWikiDataPageEditService(CommonsServiceFactory serviceFactory) {
205+
return serviceFactory.create(BuildConfig.WIKIDATA_URL, PageEditInterface.class);
206206
}
207207

208208
@Named("commons-page-edit")
@@ -215,8 +215,8 @@ public PageEditClient provideCommonsPageEditClient(@Named(NAMED_COMMONS_CSRF) Cs
215215

216216
@Provides
217217
@Singleton
218-
public MediaInterface provideMediaInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
219-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, MediaInterface.class);
218+
public MediaInterface provideMediaInterface(CommonsServiceFactory serviceFactory) {
219+
return serviceFactory.create(BuildConfig.COMMONS_URL, MediaInterface.class);
220220
}
221221

222222
/**
@@ -227,52 +227,44 @@ public MediaInterface provideMediaInterface(@Named(NAMED_COMMONS_WIKI_SITE) Wiki
227227
*/
228228
@Provides
229229
@Singleton
230-
public WikidataMediaInterface provideWikidataMediaInterface(
231-
@Named(NAMED_COMMONS_WIKI_SITE) final WikiSite commonsWikiSite) {
232-
return ServiceFactory.get(commonsWikiSite,
233-
BetaConstants.COMMONS_URL, WikidataMediaInterface.class);
230+
public WikidataMediaInterface provideWikidataMediaInterface(CommonsServiceFactory serviceFactory) {
231+
return serviceFactory.create(BetaConstants.COMMONS_URL, WikidataMediaInterface.class);
234232
}
235233

236234
@Provides
237235
@Singleton
238-
public MediaDetailInterface providesMediaDetailInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikisite) {
239-
return ServiceFactory.get(commonsWikisite, BuildConfig.COMMONS_URL, MediaDetailInterface.class);
236+
public MediaDetailInterface providesMediaDetailInterface(CommonsServiceFactory serviceFactory) {
237+
return serviceFactory.create(BuildConfig.COMMONS_URL, MediaDetailInterface.class);
240238
}
241239

242240
@Provides
243241
@Singleton
244-
public CategoryInterface provideCategoryInterface(
245-
@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
246-
return ServiceFactory
247-
.get(commonsWikiSite, BuildConfig.COMMONS_URL, CategoryInterface.class);
242+
public CategoryInterface provideCategoryInterface(CommonsServiceFactory serviceFactory) {
243+
return serviceFactory.create(BuildConfig.COMMONS_URL, CategoryInterface.class);
248244
}
249245

250246
@Provides
251247
@Singleton
252-
public ThanksInterface provideThanksInterface(
253-
@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
254-
return ServiceFactory
255-
.get(commonsWikiSite, BuildConfig.COMMONS_URL, ThanksInterface.class);
248+
public ThanksInterface provideThanksInterface(CommonsServiceFactory serviceFactory) {
249+
return serviceFactory.create(BuildConfig.COMMONS_URL, ThanksInterface.class);
256250
}
257251

258252
@Provides
259253
@Singleton
260-
public NotificationInterface provideNotificationInterface(
261-
@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
262-
return ServiceFactory
263-
.get(commonsWikiSite, BuildConfig.COMMONS_URL, NotificationInterface.class);
254+
public NotificationInterface provideNotificationInterface(CommonsServiceFactory serviceFactory) {
255+
return serviceFactory.create(BuildConfig.COMMONS_URL, NotificationInterface.class);
264256
}
265257

266258
@Provides
267259
@Singleton
268-
public UserInterface provideUserInterface(@Named(NAMED_COMMONS_WIKI_SITE) WikiSite commonsWikiSite) {
269-
return ServiceFactory.get(commonsWikiSite, BuildConfig.COMMONS_URL, UserInterface.class);
260+
public UserInterface provideUserInterface(CommonsServiceFactory serviceFactory) {
261+
return serviceFactory.create(BuildConfig.COMMONS_URL, UserInterface.class);
270262
}
271263

272264
@Provides
273265
@Singleton
274-
public WikidataInterface provideWikidataInterface(@Named(NAMED_WIKI_DATA_WIKI_SITE) WikiSite wikiDataWikiSite) {
275-
return ServiceFactory.get(wikiDataWikiSite, BuildConfig.WIKIDATA_URL, WikidataInterface.class);
266+
public WikidataInterface provideWikidataInterface(CommonsServiceFactory serviceFactory) {
267+
return serviceFactory.create(BuildConfig.WIKIDATA_URL, WikidataInterface.class);
276268
}
277269

278270
/**
@@ -281,8 +273,8 @@ public WikidataInterface provideWikidataInterface(@Named(NAMED_WIKI_DATA_WIKI_SI
281273
*/
282274
@Provides
283275
@Singleton
284-
public PageMediaInterface providePageMediaInterface(@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE) WikiSite wikiSite) {
285-
return ServiceFactory.get(wikiSite, wikiSite.url(), PageMediaInterface.class);
276+
public PageMediaInterface providePageMediaInterface(@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE) WikiSite wikiSite, CommonsServiceFactory serviceFactory) {
277+
return serviceFactory.create(wikiSite.url(), PageMediaInterface.class);
286278
}
287279

288280
@Provides
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package fr.free.nrw.commons.wikidata
2+
3+
import okhttp3.OkHttpClient
4+
import org.wikipedia.json.GsonUtil
5+
import retrofit2.Retrofit
6+
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
7+
import retrofit2.converter.gson.GsonConverterFactory
8+
9+
class CommonsServiceFactory(private val okHttpClient: OkHttpClient) {
10+
11+
private val builder: Retrofit.Builder by lazy {
12+
// All instances of retrofit share this configuration, but create it lazily
13+
Retrofit.Builder().client(okHttpClient)
14+
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
15+
.addConverterFactory(GsonConverterFactory.create(GsonUtil.getDefaultGson()))
16+
}
17+
18+
private val retrofitCache: MutableMap<String, Retrofit> = mutableMapOf()
19+
20+
fun <T : Any> create(baseUrl: String, service: Class<T>): T = retrofitCache.getOrPut(baseUrl) {
21+
// Cache instances of retrofit based on API backend
22+
builder.baseUrl(baseUrl).build()
23+
}.create(service)
24+
25+
}

app/src/test/kotlin/fr/free/nrw/commons/MockWebServerTest.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package fr.free.nrw.commons;
22

3-
import static fr.free.nrw.commons.wikidata.WikidataConstants.WIKIPEDIA_URL;
4-
53
import androidx.annotation.NonNull;
64
import java.util.List;
75
import java.util.concurrent.AbstractExecutorService;
@@ -15,7 +13,6 @@
1513
import org.junit.runner.RunWith;
1614
import org.robolectric.RobolectricTestRunner;
1715
import org.wikipedia.AppAdapter;
18-
import org.wikipedia.dataclient.WikiSite;
1916
import org.wikipedia.json.GsonUtil;
2017
import retrofit2.Retrofit;
2118
import retrofit2.converter.gson.GsonConverterFactory;
@@ -27,7 +24,7 @@ public abstract class MockWebServerTest {
2724

2825
@Before public void setUp() throws Throwable {
2926
AppAdapter.set(new TestAppAdapter());
30-
OkHttpClient.Builder builder = AppAdapter.get().getOkHttpClient(new WikiSite(WIKIPEDIA_URL)).newBuilder();
27+
OkHttpClient.Builder builder = AppAdapter.get().getOkHttpClient().newBuilder();
3128
okHttpClient = builder.dispatcher(new Dispatcher(new ImmediateExecutorService())).build();
3229
server.setUp();
3330
}

app/src/test/kotlin/fr/free/nrw/commons/TestAppAdapter.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import okhttp3.OkHttpClient;
66
import org.wikipedia.AppAdapter;
77
import org.wikipedia.dataclient.SharedPreferenceCookieManager;
8-
import org.wikipedia.dataclient.WikiSite;
98
import org.wikipedia.dataclient.okhttp.TestStubInterceptor;
109
import org.wikipedia.dataclient.okhttp.UnsuccessfulResponseInterceptor;
1110

@@ -22,7 +21,7 @@ public String getRestbaseUriFormat() {
2221
}
2322

2423
@Override
25-
public OkHttpClient getOkHttpClient(@NonNull WikiSite wikiSite) {
24+
public OkHttpClient getOkHttpClient() {
2625
return new OkHttpClient.Builder()
2726
.addInterceptor(new UnsuccessfulResponseInterceptor())
2827
.addInterceptor(new TestStubInterceptor())

data-client/src/main/java/org/wikipedia/AppAdapter.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
import androidx.annotation.NonNull;
44

55
import org.wikipedia.dataclient.SharedPreferenceCookieManager;
6-
import org.wikipedia.dataclient.WikiSite;
76

87
import okhttp3.OkHttpClient;
98

109
public abstract class AppAdapter {
1110

1211
public abstract String getMediaWikiBaseUrl();
1312
public abstract String getRestbaseUriFormat();
14-
public abstract OkHttpClient getOkHttpClient(@NonNull WikiSite wikiSite);
13+
public abstract OkHttpClient getOkHttpClient();
1514
public abstract int getDesiredLeadImageDp();
1615

1716
public abstract boolean isLoggedIn();

data-client/src/main/java/org/wikipedia/dataclient/ServiceFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static RestService getRest(@NonNull WikiSite wiki) {
5757

5858
private static Retrofit createRetrofit(@NonNull WikiSite wiki, @NonNull String baseUrl) {
5959
return new Retrofit.Builder()
60-
.client(AppAdapter.get().getOkHttpClient(wiki))
60+
.client(AppAdapter.get().getOkHttpClient())
6161
.baseUrl(baseUrl)
6262
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
6363
.addConverterFactory(GsonConverterFactory.create(GsonUtil.getDefaultGson()))

data-client/src/test/java/org/wikipedia/TestAppAdapter.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import org.wikipedia.dataclient.Service;
66
import org.wikipedia.dataclient.SharedPreferenceCookieManager;
7-
import org.wikipedia.dataclient.WikiSite;
87
import org.wikipedia.dataclient.okhttp.TestStubInterceptor;
98
import org.wikipedia.dataclient.okhttp.UnsuccessfulResponseInterceptor;
109
import org.wikipedia.login.LoginResult;
@@ -24,7 +23,7 @@ public String getRestbaseUriFormat() {
2423
}
2524

2625
@Override
27-
public OkHttpClient getOkHttpClient(@NonNull WikiSite wikiSite) {
26+
public OkHttpClient getOkHttpClient() {
2827
return new OkHttpClient.Builder()
2928
.addInterceptor(new UnsuccessfulResponseInterceptor())
3029
.addInterceptor(new TestStubInterceptor())

data-client/src/test/java/org/wikipedia/test/MockWebServerTest.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
import org.robolectric.RobolectricTestRunner;
99
import org.wikipedia.AppAdapter;
1010
import org.wikipedia.TestAppAdapter;
11-
import org.wikipedia.dataclient.Service;
12-
import org.wikipedia.dataclient.WikiSite;
1311
import org.wikipedia.json.GsonUtil;
1412

1513
import okhttp3.Dispatcher;
@@ -25,7 +23,7 @@ public abstract class MockWebServerTest {
2523

2624
@Before public void setUp() throws Throwable {
2725
AppAdapter.set(new TestAppAdapter());
28-
OkHttpClient.Builder builder = AppAdapter.get().getOkHttpClient(new WikiSite(Service.WIKIPEDIA_URL)).newBuilder();
26+
OkHttpClient.Builder builder = AppAdapter.get().getOkHttpClient().newBuilder();
2927
okHttpClient = builder.dispatcher(new Dispatcher(new ImmediateExecutorService())).build();
3028
server.setUp();
3129
}

0 commit comments

Comments
 (0)