diff --git a/app/src/main/java/fr/free/nrw/commons/actions/ThanksClient.kt b/app/src/main/java/fr/free/nrw/commons/actions/ThanksClient.kt index af305c9c6..1dcf93edf 100644 --- a/app/src/main/java/fr/free/nrw/commons/actions/ThanksClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/actions/ThanksClient.kt @@ -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 diff --git a/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java b/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java deleted file mode 100644 index 6aef8d323..000000000 --- a/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java +++ /dev/null @@ -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()); - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.kt b/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.kt new file mode 100644 index 000000000..5ecc04120 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.kt @@ -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" + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java index f810d0480..f587893c5 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java @@ -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") diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/CommonsServiceFactory.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/CommonsServiceFactory.kt index 39dbf0cad..ca523a21f 100644 --- a/app/src/main/java/fr/free/nrw/commons/wikidata/CommonsServiceFactory.kt +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/CommonsServiceFactory.kt @@ -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 = mutableMapOf() + val retrofitCache: MutableMap = mutableMapOf() - fun create( - baseUrl: String, - service: Class, - ): T = - retrofitCache - .getOrPut(baseUrl) { - // Cache instances of retrofit based on API backend - builder.baseUrl(baseUrl).build() - }.create(service) + inline fun create(baseUrl: String): T = + retrofitCache.getOrPut(baseUrl) { + // Cache instances of retrofit based on API backend + builder.baseUrl(baseUrl).build() + }.create(T::class.java) }