Convert the NetworkingModule to kotlin

This commit is contained in:
Paul Hawke 2024-11-28 20:52:58 -06:00
parent 1f545c4755
commit f5388c4acc
5 changed files with 330 additions and 371 deletions

View file

@ -3,7 +3,7 @@ package fr.free.nrw.commons.actions
import fr.free.nrw.commons.CommonsApplication
import fr.free.nrw.commons.auth.csrf.CsrfTokenClient
import fr.free.nrw.commons.auth.csrf.InvalidLoginTokenException
import fr.free.nrw.commons.di.NetworkingModule.NAMED_COMMONS_CSRF
import fr.free.nrw.commons.di.NetworkingModule.Companion.NAMED_COMMONS_CSRF
import io.reactivex.Observable
import javax.inject.Inject
import javax.inject.Named

View file

@ -1,350 +0,0 @@
package fr.free.nrw.commons.di;
import android.content.Context;
import androidx.annotation.NonNull;
import com.google.gson.Gson;
import dagger.Module;
import dagger.Provides;
import fr.free.nrw.commons.BetaConstants;
import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.OkHttpConnectionFactory;
import fr.free.nrw.commons.actions.PageEditClient;
import fr.free.nrw.commons.actions.PageEditInterface;
import fr.free.nrw.commons.actions.ThanksInterface;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.auth.csrf.CsrfTokenClient;
import fr.free.nrw.commons.auth.csrf.CsrfTokenInterface;
import fr.free.nrw.commons.auth.csrf.LogoutClient;
import fr.free.nrw.commons.auth.login.LoginClient;
import fr.free.nrw.commons.auth.login.LoginInterface;
import fr.free.nrw.commons.category.CategoryInterface;
import fr.free.nrw.commons.explore.depictions.DepictsClient;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.media.MediaDetailInterface;
import fr.free.nrw.commons.media.MediaInterface;
import fr.free.nrw.commons.media.PageMediaInterface;
import fr.free.nrw.commons.media.WikidataMediaInterface;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.mwapi.UserInterface;
import fr.free.nrw.commons.notification.NotificationInterface;
import fr.free.nrw.commons.review.ReviewInterface;
import fr.free.nrw.commons.upload.UploadInterface;
import fr.free.nrw.commons.upload.WikiBaseInterface;
import fr.free.nrw.commons.upload.depicts.DepictsInterface;
import fr.free.nrw.commons.wikidata.CommonsServiceFactory;
import fr.free.nrw.commons.wikidata.WikidataInterface;
import fr.free.nrw.commons.wikidata.cookies.CommonsCookieJar;
import fr.free.nrw.commons.wikidata.cookies.CommonsCookieStorage;
import java.io.File;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import javax.inject.Named;
import javax.inject.Singleton;
import okhttp3.Cache;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.logging.HttpLoggingInterceptor.Level;
import fr.free.nrw.commons.wikidata.model.WikiSite;
import fr.free.nrw.commons.wikidata.GsonUtil;
import timber.log.Timber;
@Module
@SuppressWarnings({"WeakerAccess", "unused"})
public class NetworkingModule {
private static final String WIKIDATA_SPARQL_QUERY_URL = "https://query.wikidata.org/sparql";
private static final String TOOLS_FORGE_URL = "https://tools.wmflabs.org/commons-android-app/tool-commons-android-app";
public static final long OK_HTTP_CACHE_SIZE = 10 * 1024 * 1024;
private static final String NAMED_WIKI_DATA_WIKI_SITE = "wikidata-wikisite";
private static final String NAMED_WIKI_PEDIA_WIKI_SITE = "wikipedia-wikisite";
public static final String NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE = "language-wikipedia-wikisite";
public static final String NAMED_COMMONS_CSRF = "commons-csrf";
public static final String NAMED_WIKI_CSRF = "wiki-csrf";
@Provides
@Singleton
public OkHttpClient provideOkHttpClient(Context context,
HttpLoggingInterceptor httpLoggingInterceptor) {
File dir = new File(context.getCacheDir(), "okHttpCache");
return new OkHttpClient.Builder()
.connectTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.addInterceptor(httpLoggingInterceptor)
.readTimeout(120, TimeUnit.SECONDS)
.cache(new Cache(dir, OK_HTTP_CACHE_SIZE))
.build();
}
@Provides
@Singleton
public CommonsServiceFactory serviceFactory(CommonsCookieJar cookieJar) {
return new CommonsServiceFactory(OkHttpConnectionFactory.getClient(cookieJar));
}
@Provides
@Singleton
public HttpLoggingInterceptor provideHttpLoggingInterceptor() {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(message -> {
Timber.tag("OkHttp").v(message);
});
httpLoggingInterceptor.setLevel(BuildConfig.DEBUG ? Level.BODY: Level.BASIC);
return httpLoggingInterceptor;
}
@Provides
@Singleton
public OkHttpJsonApiClient provideOkHttpJsonApiClient(OkHttpClient okHttpClient,
DepictsClient depictsClient,
@Named("tools_forge") HttpUrl toolsForgeUrl,
@Named("default_preferences") JsonKvStore defaultKvStore,
Gson gson) {
return new OkHttpJsonApiClient(okHttpClient,
depictsClient,
toolsForgeUrl,
WIKIDATA_SPARQL_QUERY_URL,
BuildConfig.WIKIMEDIA_CAMPAIGNS_URL,
gson);
}
@Provides
@Singleton
public CommonsCookieStorage provideCookieStorage(
@Named("default_preferences") JsonKvStore preferences) {
CommonsCookieStorage cookieStorage = new CommonsCookieStorage(preferences);
cookieStorage.load();
return cookieStorage;
}
@Provides
@Singleton
public CommonsCookieJar provideCookieJar(CommonsCookieStorage storage) {
return new CommonsCookieJar(storage);
}
@Named(NAMED_COMMONS_CSRF)
@Provides
@Singleton
public CsrfTokenClient provideCommonsCsrfTokenClient(SessionManager sessionManager,
@Named("commons-csrf-interface") CsrfTokenInterface tokenInterface, LoginClient loginClient, LogoutClient logoutClient) {
return new CsrfTokenClient(sessionManager, tokenInterface, loginClient, logoutClient);
}
/**
* Provides a singleton instance of CsrfTokenClient for Wikidata.
*
* @param sessionManager The session manager to manage user sessions.
* @param tokenInterface The interface for obtaining CSRF tokens.
* @param loginClient The client for handling login operations.
* @param logoutClient The client for handling logout operations.
* @return A singleton instance of CsrfTokenClient.
*/
@Named(NAMED_WIKI_CSRF)
@Provides
@Singleton
public CsrfTokenClient provideWikiCsrfTokenClient(SessionManager sessionManager,
@Named("wikidata-csrf-interface") CsrfTokenInterface tokenInterface, LoginClient loginClient, LogoutClient logoutClient) {
return new CsrfTokenClient(sessionManager, tokenInterface, loginClient, logoutClient);
}
/**
* Provides a singleton instance of CsrfTokenInterface for Wikidata.
*
* @param serviceFactory The factory used to create service interfaces.
* @return A singleton instance of CsrfTokenInterface for Wikidata.
*/
@Named("wikidata-csrf-interface")
@Provides
@Singleton
public CsrfTokenInterface provideWikidataCsrfTokenInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.WIKIDATA_URL, CsrfTokenInterface.class);
}
@Named("commons-csrf-interface")
@Provides
@Singleton
public CsrfTokenInterface provideCsrfTokenInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, CsrfTokenInterface.class);
}
@Provides
@Singleton
public LoginInterface provideLoginInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, LoginInterface.class);
}
@Provides
@Singleton
public LoginClient provideLoginClient(LoginInterface loginInterface) {
return new LoginClient(loginInterface);
}
@Provides
@Named("wikimedia_api_host")
@NonNull
@SuppressWarnings("ConstantConditions")
public String provideMwApiUrl() {
return BuildConfig.WIKIMEDIA_API_HOST;
}
@Provides
@Named("tools_forge")
@NonNull
@SuppressWarnings("ConstantConditions")
public HttpUrl provideToolsForgeUrl() {
return HttpUrl.parse(TOOLS_FORGE_URL);
}
@Provides
@Singleton
@Named(NAMED_WIKI_DATA_WIKI_SITE)
public WikiSite provideWikidataWikiSite() {
return new WikiSite(BuildConfig.WIKIDATA_URL);
}
/**
* Gson objects are very heavy. The app should ideally be using just one instance of it instead of creating new instances everywhere.
* @return returns a singleton Gson instance
*/
@Provides
@Singleton
public Gson provideGson() {
return GsonUtil.getDefaultGson();
}
@Provides
@Singleton
public ReviewInterface provideReviewInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, ReviewInterface.class);
}
@Provides
@Singleton
public DepictsInterface provideDepictsInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.WIKIDATA_URL, DepictsInterface.class);
}
@Provides
@Singleton
public WikiBaseInterface provideWikiBaseInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, WikiBaseInterface.class);
}
@Provides
@Singleton
public UploadInterface provideUploadInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, UploadInterface.class);
}
@Named("commons-page-edit-service")
@Provides
@Singleton
public PageEditInterface providePageEditService(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, PageEditInterface.class);
}
@Named("wikidata-page-edit-service")
@Provides
@Singleton
public PageEditInterface provideWikiDataPageEditService(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.WIKIDATA_URL, PageEditInterface.class);
}
@Named("commons-page-edit")
@Provides
@Singleton
public PageEditClient provideCommonsPageEditClient(@Named(NAMED_COMMONS_CSRF) CsrfTokenClient csrfTokenClient,
@Named("commons-page-edit-service") PageEditInterface pageEditInterface) {
return new PageEditClient(csrfTokenClient, pageEditInterface);
}
/**
* Provides a singleton instance of PageEditClient for Wikidata.
*
* @param csrfTokenClient The client used to manage CSRF tokens.
* @param pageEditInterface The interface for page edit operations.
* @return A singleton instance of PageEditClient for Wikidata.
*/
@Named("wikidata-page-edit")
@Provides
@Singleton
public PageEditClient provideWikidataPageEditClient(@Named(NAMED_WIKI_CSRF) CsrfTokenClient csrfTokenClient,
@Named("wikidata-page-edit-service") PageEditInterface pageEditInterface) {
return new PageEditClient(csrfTokenClient, pageEditInterface);
}
@Provides
@Singleton
public MediaInterface provideMediaInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, MediaInterface.class);
}
/**
* Add provider for WikidataMediaInterface
* It creates a retrofit service for the commons wiki site
* @param commonsWikiSite commonsWikiSite
* @return WikidataMediaInterface
*/
@Provides
@Singleton
public WikidataMediaInterface provideWikidataMediaInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BetaConstants.COMMONS_URL, WikidataMediaInterface.class);
}
@Provides
@Singleton
public MediaDetailInterface providesMediaDetailInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, MediaDetailInterface.class);
}
@Provides
@Singleton
public CategoryInterface provideCategoryInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, CategoryInterface.class);
}
@Provides
@Singleton
public ThanksInterface provideThanksInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, ThanksInterface.class);
}
@Provides
@Singleton
public NotificationInterface provideNotificationInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, NotificationInterface.class);
}
@Provides
@Singleton
public UserInterface provideUserInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.COMMONS_URL, UserInterface.class);
}
@Provides
@Singleton
public WikidataInterface provideWikidataInterface(CommonsServiceFactory serviceFactory) {
return serviceFactory.create(BuildConfig.WIKIDATA_URL, WikidataInterface.class);
}
/**
* Add provider for PageMediaInterface
* It creates a retrofit service for the wiki site using device's current language
*/
@Provides
@Singleton
public PageMediaInterface providePageMediaInterface(@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE) WikiSite wikiSite, CommonsServiceFactory serviceFactory) {
return serviceFactory.create(wikiSite.url(), PageMediaInterface.class);
}
@Provides
@Singleton
@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE)
public WikiSite provideLanguageWikipediaSite() {
return WikiSite.forLanguageCode(Locale.getDefault().getLanguage());
}
}

View file

@ -0,0 +1,316 @@
package fr.free.nrw.commons.di
import android.content.Context
import com.google.gson.Gson
import dagger.Module
import dagger.Provides
import fr.free.nrw.commons.BetaConstants
import fr.free.nrw.commons.BuildConfig
import fr.free.nrw.commons.OkHttpConnectionFactory
import fr.free.nrw.commons.actions.PageEditClient
import fr.free.nrw.commons.actions.PageEditInterface
import fr.free.nrw.commons.actions.ThanksInterface
import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.auth.csrf.CsrfTokenClient
import fr.free.nrw.commons.auth.csrf.CsrfTokenInterface
import fr.free.nrw.commons.auth.csrf.LogoutClient
import fr.free.nrw.commons.auth.login.LoginClient
import fr.free.nrw.commons.auth.login.LoginInterface
import fr.free.nrw.commons.category.CategoryInterface
import fr.free.nrw.commons.explore.depictions.DepictsClient
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.media.MediaDetailInterface
import fr.free.nrw.commons.media.MediaInterface
import fr.free.nrw.commons.media.PageMediaInterface
import fr.free.nrw.commons.media.WikidataMediaInterface
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient
import fr.free.nrw.commons.mwapi.UserInterface
import fr.free.nrw.commons.notification.NotificationInterface
import fr.free.nrw.commons.review.ReviewInterface
import fr.free.nrw.commons.upload.UploadInterface
import fr.free.nrw.commons.upload.WikiBaseInterface
import fr.free.nrw.commons.upload.depicts.DepictsInterface
import fr.free.nrw.commons.wikidata.CommonsServiceFactory
import fr.free.nrw.commons.wikidata.GsonUtil
import fr.free.nrw.commons.wikidata.WikidataInterface
import fr.free.nrw.commons.wikidata.cookies.CommonsCookieJar
import fr.free.nrw.commons.wikidata.cookies.CommonsCookieStorage
import fr.free.nrw.commons.wikidata.model.WikiSite
import okhttp3.Cache
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import okhttp3.logging.HttpLoggingInterceptor.Level
import timber.log.Timber
import java.io.File
import java.util.Locale
import java.util.concurrent.TimeUnit
import javax.inject.Named
import javax.inject.Singleton
@Module
@Suppress("unused")
class NetworkingModule {
@Provides
@Singleton
fun provideOkHttpClient(
context: Context,
httpLoggingInterceptor: HttpLoggingInterceptor
): OkHttpClient = OkHttpClient.Builder()
.connectTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.addInterceptor(httpLoggingInterceptor)
.readTimeout(120, TimeUnit.SECONDS)
.cache(Cache(File(context.cacheDir, "okHttpCache"), OK_HTTP_CACHE_SIZE))
.build()
@Provides
@Singleton
fun serviceFactory(cookieJar: CommonsCookieJar): CommonsServiceFactory =
CommonsServiceFactory(OkHttpConnectionFactory.getClient(cookieJar))
@Provides
@Singleton
fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor =
HttpLoggingInterceptor { message: String? ->
Timber.tag("OkHttp").v(message)
}.apply {
level = if (BuildConfig.DEBUG) Level.BODY else Level.BASIC
}
@Provides
@Singleton
fun provideOkHttpJsonApiClient(
okHttpClient: OkHttpClient,
depictsClient: DepictsClient,
@Named("tools_forge") toolsForgeUrl: HttpUrl,
gson: Gson
): OkHttpJsonApiClient = OkHttpJsonApiClient(
okHttpClient, depictsClient, toolsForgeUrl, WIKIDATA_SPARQL_QUERY_URL,
BuildConfig.WIKIMEDIA_CAMPAIGNS_URL, gson
)
@Provides
@Singleton
fun provideCookieStorage(
@Named("default_preferences") preferences: JsonKvStore
): CommonsCookieStorage = CommonsCookieStorage(preferences).also {
it.load()
}
@Provides
@Singleton
fun provideCookieJar(storage: CommonsCookieStorage): CommonsCookieJar =
CommonsCookieJar(storage)
@Named(NAMED_COMMONS_CSRF)
@Provides
@Singleton
fun provideCommonsCsrfTokenClient(
sessionManager: SessionManager,
@Named("commons-csrf-interface") tokenInterface: CsrfTokenInterface,
loginClient: LoginClient,
logoutClient: LogoutClient
): CsrfTokenClient = CsrfTokenClient(sessionManager, tokenInterface, loginClient, logoutClient)
/**
* Provides a singleton instance of CsrfTokenClient for Wikidata.
*
* @param sessionManager The session manager to manage user sessions.
* @param tokenInterface The interface for obtaining CSRF tokens.
* @param loginClient The client for handling login operations.
* @param logoutClient The client for handling logout operations.
* @return A singleton instance of CsrfTokenClient.
*/
@Named(NAMED_WIKI_CSRF)
@Provides
@Singleton
fun provideWikiCsrfTokenClient(
sessionManager: SessionManager,
@Named("wikidata-csrf-interface") tokenInterface: CsrfTokenInterface,
loginClient: LoginClient,
logoutClient: LogoutClient
): CsrfTokenClient = CsrfTokenClient(sessionManager, tokenInterface, loginClient, logoutClient)
/**
* Provides a singleton instance of CsrfTokenInterface for Wikidata.
*
* @param factory The factory used to create service interfaces.
* @return A singleton instance of CsrfTokenInterface for Wikidata.
*/
@Named("wikidata-csrf-interface")
@Provides
@Singleton
fun provideWikidataCsrfTokenInterface(factory: CommonsServiceFactory): CsrfTokenInterface =
factory.create(BuildConfig.WIKIDATA_URL)
@Named("commons-csrf-interface")
@Provides
@Singleton
fun provideCsrfTokenInterface(factory: CommonsServiceFactory): CsrfTokenInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideLoginInterface(factory: CommonsServiceFactory): LoginInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideLoginClient(loginInterface: LoginInterface): LoginClient =
LoginClient(loginInterface)
@Provides
@Named("tools_forge")
fun provideToolsForgeUrl(): HttpUrl = TOOLS_FORGE_URL.toHttpUrlOrNull()!!
@Provides
@Singleton
@Named(NAMED_WIKI_DATA_WIKI_SITE)
fun provideWikidataWikiSite(): WikiSite = WikiSite(BuildConfig.WIKIDATA_URL)
/**
* Gson objects are very heavy. The app should ideally be using just one instance of it instead of creating new instances everywhere.
* @return returns a singleton Gson instance
*/
@Provides
@Singleton
fun provideGson(): Gson = GsonUtil.getDefaultGson()
@Provides
@Singleton
fun provideReviewInterface(factory: CommonsServiceFactory): ReviewInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideDepictsInterface(factory: CommonsServiceFactory): DepictsInterface =
factory.create(BuildConfig.WIKIDATA_URL)
@Provides
@Singleton
fun provideWikiBaseInterface(factory: CommonsServiceFactory): WikiBaseInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideUploadInterface(factory: CommonsServiceFactory): UploadInterface =
factory.create(BuildConfig.COMMONS_URL)
@Named("commons-page-edit-service")
@Provides
@Singleton
fun providePageEditService(factory: CommonsServiceFactory): PageEditInterface =
factory.create(BuildConfig.COMMONS_URL)
@Named("wikidata-page-edit-service")
@Provides
@Singleton
fun provideWikiDataPageEditService(factory: CommonsServiceFactory): PageEditInterface =
factory.create(BuildConfig.WIKIDATA_URL)
@Named("commons-page-edit")
@Provides
@Singleton
fun provideCommonsPageEditClient(
@Named(NAMED_COMMONS_CSRF) csrfTokenClient: CsrfTokenClient,
@Named("commons-page-edit-service") pageEditInterface: PageEditInterface
): PageEditClient = PageEditClient(csrfTokenClient, pageEditInterface)
/**
* Provides a singleton instance of PageEditClient for Wikidata.
*
* @param csrfTokenClient The client used to manage CSRF tokens.
* @param pageEditInterface The interface for page edit operations.
* @return A singleton instance of PageEditClient for Wikidata.
*/
@Named("wikidata-page-edit")
@Provides
@Singleton
fun provideWikidataPageEditClient(
@Named(NAMED_WIKI_CSRF) csrfTokenClient: CsrfTokenClient,
@Named("wikidata-page-edit-service") pageEditInterface: PageEditInterface
): PageEditClient = PageEditClient(csrfTokenClient, pageEditInterface)
@Provides
@Singleton
fun provideMediaInterface(factory: CommonsServiceFactory): MediaInterface =
factory.create(BuildConfig.COMMONS_URL)
/**
* Add provider for WikidataMediaInterface
* It creates a retrofit service for the commons wiki site
* @param commonsWikiSite commonsWikiSite
* @return WikidataMediaInterface
*/
@Provides
@Singleton
fun provideWikidataMediaInterface(factory: CommonsServiceFactory): WikidataMediaInterface =
factory.create(BetaConstants.COMMONS_URL)
@Provides
@Singleton
fun providesMediaDetailInterface(factory: CommonsServiceFactory): MediaDetailInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideCategoryInterface(factory: CommonsServiceFactory): CategoryInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideThanksInterface(factory: CommonsServiceFactory): ThanksInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideNotificationInterface(factory: CommonsServiceFactory): NotificationInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideUserInterface(factory: CommonsServiceFactory): UserInterface =
factory.create(BuildConfig.COMMONS_URL)
@Provides
@Singleton
fun provideWikidataInterface(factory: CommonsServiceFactory): WikidataInterface =
factory.create(BuildConfig.WIKIDATA_URL)
/**
* Add provider for PageMediaInterface
* It creates a retrofit service for the wiki site using device's current language
*/
@Provides
@Singleton
fun providePageMediaInterface(
@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE) wikiSite: WikiSite,
factory: CommonsServiceFactory
): PageMediaInterface = factory.create(wikiSite.url())
@Provides
@Singleton
@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE)
fun provideLanguageWikipediaSite(): WikiSite {
return WikiSite.forLanguageCode(Locale.getDefault().language)
}
companion object {
private const val WIKIDATA_SPARQL_QUERY_URL = "https://query.wikidata.org/sparql"
private const val TOOLS_FORGE_URL =
"https://tools.wmflabs.org/commons-android-app/tool-commons-android-app"
const val OK_HTTP_CACHE_SIZE: Long = (10 * 1024 * 1024).toLong()
private const val NAMED_WIKI_DATA_WIKI_SITE = "wikidata-wikisite"
private const val NAMED_WIKI_PEDIA_WIKI_SITE = "wikipedia-wikisite"
const val NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE: String = "language-wikipedia-wikisite"
const val NAMED_COMMONS_CSRF: String = "commons-csrf"
const val NAMED_WIKI_CSRF: String = "wiki-csrf"
}
}

View file

@ -3,7 +3,10 @@ package fr.free.nrw.commons.mwapi;
import static fr.free.nrw.commons.category.CategoryClientKt.CATEGORY_PREFIX;
import com.google.gson.Gson;
import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.category.CategoryItem;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import io.reactivex.Single;
import java.util.ArrayList;
import java.util.Collections;
@ -11,14 +14,11 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import timber.log.Timber;
/**
@ -30,14 +30,11 @@ import timber.log.Timber;
public class CategoryApi {
private final OkHttpClient okHttpClient;
private final String commonsBaseUrl;
private final Gson gson;
@Inject
public CategoryApi(OkHttpClient okHttpClient, Gson gson,
@Named("wikimedia_api_host") String commonsBaseUrl) {
public CategoryApi(final OkHttpClient okHttpClient, final Gson gson) {
this.okHttpClient = okHttpClient;
this.commonsBaseUrl = commonsBaseUrl;
this.gson = gson;
}
@ -75,9 +72,9 @@ public class CategoryApi {
* @param coords Coordinates to build query with
* @return URL for API query
*/
private HttpUrl buildUrl(String coords) {
private HttpUrl buildUrl(final String coords) {
return HttpUrl
.parse(commonsBaseUrl)
.parse(BuildConfig.WIKIMEDIA_API_HOST)
.newBuilder()
.addQueryParameter("action", "query")
.addQueryParameter("prop", "categories|coordinates|pageprops")

View file

@ -8,7 +8,7 @@ import retrofit2.converter.gson.GsonConverterFactory
class CommonsServiceFactory(
private val okHttpClient: OkHttpClient,
) {
private val builder: Retrofit.Builder by lazy {
val builder: Retrofit.Builder by lazy {
// All instances of retrofit share this configuration, but create it lazily
Retrofit
.Builder()
@ -17,15 +17,11 @@ class CommonsServiceFactory(
.addConverterFactory(GsonConverterFactory.create(GsonUtil.getDefaultGson()))
}
private val retrofitCache: MutableMap<String, Retrofit> = mutableMapOf()
val retrofitCache: MutableMap<String, Retrofit> = mutableMapOf()
fun <T : Any> create(
baseUrl: String,
service: Class<T>,
): T =
retrofitCache
.getOrPut(baseUrl) {
// Cache instances of retrofit based on API backend
builder.baseUrl(baseUrl).build()
}.create(service)
inline fun <reified T: Any> create(baseUrl: String): T =
retrofitCache.getOrPut(baseUrl) {
// Cache instances of retrofit based on API backend
builder.baseUrl(baseUrl).build()
}.create(T::class.java)
}