diff --git a/app/build.gradle b/app/build.gradle
index dc93b5e1f65e207606bc8e864e0c4b45b6d9de56..50b88b1675aac51492ffb040328e75e6d1a1430f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -219,6 +219,7 @@ dependencies {
implementation "com.squareup.moshi:moshi-kotlin:1.13.0"
// implementation "com.squareup.moshi:moshi-adapters:1.5.0"
implementation "com.squareup.okhttp3:okhttp:4.9.2"
+ implementation "com.squareup.okhttp3:logging-interceptor:4.9.2"
// JSON Converter
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
diff --git a/app/src/main/java/foundation/e/apps/data/ageRating/AgeGroupApi.kt b/app/src/main/java/foundation/e/apps/data/ageRating/AgeGroupApi.kt
deleted file mode 100644
index 9a3d04694d775fa277161fb51443ca9f1f70c927..0000000000000000000000000000000000000000
--- a/app/src/main/java/foundation/e/apps/data/ageRating/AgeGroupApi.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright MURENA SAS 2024
- * Apps Quickly and easily install Android apps onto your device!
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- */
-
-package foundation.e.apps.data.ageRating
-
-import foundation.e.apps.data.blockedApps.ContentRatingGroup
-import retrofit2.Response
-import retrofit2.http.GET
-
-interface AgeGroupApi {
-
- companion object {
- const val BASE_URL = "https://gitlab.e.foundation/e/os/app-lounge-content-ratings/-/raw/main/"
- }
-
- @GET("content_ratings.json?ref_type=heads")
- suspend fun getDefinedAgeGroups(): Response>
-
-}
diff --git a/app/src/main/java/foundation/e/apps/data/ageRating/FDroidMonitorApi.kt b/app/src/main/java/foundation/e/apps/data/ageRating/FDroidMonitorApi.kt
deleted file mode 100644
index ed9de21855f501612e93f2c589075bfb14aae431..0000000000000000000000000000000000000000
--- a/app/src/main/java/foundation/e/apps/data/ageRating/FDroidMonitorApi.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright MURENA SAS 2024
- * Apps Quickly and easily install Android apps onto your device!
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- */
-
-package foundation.e.apps.data.ageRating
-
-import retrofit2.Response
-import retrofit2.http.GET
-
-interface FDroidMonitorApi {
-
- companion object {
- const val BASE_URL = "https://f-droid.org/repo/"
- }
-
- @GET("status/update.json")
- suspend fun getMonitorData(): Response
-
-}
diff --git a/app/src/main/java/foundation/e/apps/data/ageRating/FDroidMonitorData.kt b/app/src/main/java/foundation/e/apps/data/ageRating/FDroidMonitorData.kt
deleted file mode 100644
index 762e6021335de4b761d2aa42a79f6dfe61d7227b..0000000000000000000000000000000000000000
--- a/app/src/main/java/foundation/e/apps/data/ageRating/FDroidMonitorData.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright MURENA SAS 2024
- * Apps Quickly and easily install Android apps onto your device!
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- */
-
-package foundation.e.apps.data.ageRating
-
-import com.squareup.moshi.Json
-
-data class FDroidMonitorData(
- val antiFeatures: AntiFeatures
-) {
- fun getNSFWApps() = antiFeatures.nsfw.apps
-}
-
-data class AntiFeatures(
- @Json(name = "NSFW") val nsfw: NSFW
-)
-
-data class NSFW(
- val apps: List
-)
diff --git a/app/src/main/java/foundation/e/apps/data/blockedApps/ContentRatingsRepository.kt b/app/src/main/java/foundation/e/apps/data/blockedApps/ContentRatingsRepository.kt
index 7804d09483d9a4d0cb5fa1de67ec146c0e9525fa..b09fbb43cab0b7411dd6a47277c1f905e3967429 100644
--- a/app/src/main/java/foundation/e/apps/data/blockedApps/ContentRatingsRepository.kt
+++ b/app/src/main/java/foundation/e/apps/data/blockedApps/ContentRatingsRepository.kt
@@ -1,30 +1,27 @@
/*
- * Copyright MURENA SAS 2024
- * Apps Quickly and easily install Android apps onto your device!
+ * Copyright (C) 2024 MURENA SAS
*
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
*
*/
package foundation.e.apps.data.blockedApps
import com.aurora.gplayapi.data.models.ContentRating
-import com.aurora.gplayapi.helpers.ContentRatingHelper
-import foundation.e.apps.data.ageRating.AgeGroupApi
-import foundation.e.apps.data.ageRating.FDroidMonitorApi
+import foundation.e.apps.data.parentalcontrol.AgeGroupApi
+import foundation.e.apps.data.parentalcontrol.FDroidMonitorApi
import foundation.e.apps.data.handleNetworkResult
-import foundation.e.apps.data.login.AuthenticatorRepository
import foundation.e.apps.data.playstore.PlayStoreRepository
import javax.inject.Inject
import javax.inject.Singleton
diff --git a/app/src/main/java/foundation/e/apps/data/fdroid/FdroidApiInterface.kt b/app/src/main/java/foundation/e/apps/data/fdroid/FdroidApiInterface.kt
index 0480873f13dbdd22f8cb35482510aba7f32194eb..120064d8e99ab7640bb36093afbb790204fffe01 100644
--- a/app/src/main/java/foundation/e/apps/data/fdroid/FdroidApiInterface.kt
+++ b/app/src/main/java/foundation/e/apps/data/fdroid/FdroidApiInterface.kt
@@ -1,3 +1,21 @@
+/*
+ * Copyright (C) 2024 MURENA SAS
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package foundation.e.apps.data.fdroid
import foundation.e.apps.data.fdroid.models.FdroidApiModel
@@ -7,7 +25,7 @@ import retrofit2.http.Path
/**
* Interface for retrofit calls.
- * Created from [foundation.e.apps.data.cleanapk.RetrofitModule.provideFdroidApi].
+ * Created from [foundation.e.apps.di.network.RetrofitApiModule.provideFdroidApi].
*/
interface FdroidApiInterface {
diff --git a/app/src/main/java/foundation/e/apps/data/parentalcontrol/AgeGroupApi.kt b/app/src/main/java/foundation/e/apps/data/parentalcontrol/AgeGroupApi.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7ccc0055081443bc8cd7fb9f5fe29e15fad776d4
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/data/parentalcontrol/AgeGroupApi.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 MURENA SAS
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+package foundation.e.apps.data.parentalcontrol
+
+import foundation.e.apps.data.blockedApps.ContentRatingGroup
+import retrofit2.Response
+import retrofit2.http.GET
+
+interface AgeGroupApi {
+
+ companion object {
+ const val BASE_URL = "https://gitlab.e.foundation/e/os/app-lounge-content-ratings/-/raw/main/"
+ }
+
+ @GET("content_ratings.json?ref_type=heads")
+ suspend fun getDefinedAgeGroups(): Response>
+
+}
diff --git a/app/src/main/java/foundation/e/apps/data/parentalcontrol/FDroidMonitorApi.kt b/app/src/main/java/foundation/e/apps/data/parentalcontrol/FDroidMonitorApi.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2d36c5d05b9825175b136c4b5af41c93f7d97e9d
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/data/parentalcontrol/FDroidMonitorApi.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 MURENA SAS
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+package foundation.e.apps.data.parentalcontrol
+
+import retrofit2.Response
+import retrofit2.http.GET
+
+interface FDroidMonitorApi {
+
+ companion object {
+ const val BASE_URL = "https://f-droid.org/repo/"
+ }
+
+ @GET("status/update.json")
+ suspend fun getMonitorData(): Response
+
+}
diff --git a/app/src/main/java/foundation/e/apps/data/parentalcontrol/FDroidMonitorData.kt b/app/src/main/java/foundation/e/apps/data/parentalcontrol/FDroidMonitorData.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b30c617943ea16867b9705e228f4a1f6cde842f0
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/data/parentalcontrol/FDroidMonitorData.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2024 MURENA SAS
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+package foundation.e.apps.data.parentalcontrol
+
+import com.squareup.moshi.Json
+
+data class FDroidMonitorData(
+ val antiFeatures: AntiFeatures
+) {
+ fun getNSFWApps() = antiFeatures.nsfw.apps
+}
+
+data class AntiFeatures(
+ @Json(name = "NSFW") val nsfw: NSFW
+)
+
+data class NSFW(
+ val apps: List
+)
diff --git a/app/src/main/java/foundation/e/apps/di/AgeRatingModule.kt b/app/src/main/java/foundation/e/apps/di/AgeRatingModule.kt
deleted file mode 100644
index b47981ec992c270896142449b2f69863c9b7f1cc..0000000000000000000000000000000000000000
--- a/app/src/main/java/foundation/e/apps/di/AgeRatingModule.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright MURENA SAS 2024
- * Apps Quickly and easily install Android apps onto your device!
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- */
-
-package foundation.e.apps.di
-
-import com.squareup.moshi.Moshi
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.components.SingletonComponent
-import foundation.e.apps.data.ageRating.AgeGroupApi
-import foundation.e.apps.data.ageRating.FDroidMonitorApi
-import javax.inject.Singleton
-import okhttp3.OkHttpClient
-import retrofit2.Retrofit
-import retrofit2.converter.moshi.MoshiConverterFactory
-
-@Module
-@InstallIn(SingletonComponent::class)
-object AgeRatingModule {
-
- @Singleton
- @Provides
- fun provideAgeGroupApi(okHttpClient: OkHttpClient, moshi: Moshi): AgeGroupApi {
- return Retrofit.Builder()
- .baseUrl(AgeGroupApi.BASE_URL)
- .client(okHttpClient)
- .addConverterFactory(MoshiConverterFactory.create(moshi))
- .build()
- .create(AgeGroupApi::class.java)
- }
-
- @Singleton
- @Provides
- fun provideFDroidMonitorApi(okHttpClient: OkHttpClient, moshi: Moshi): FDroidMonitorApi {
- return Retrofit.Builder()
- .baseUrl(FDroidMonitorApi.BASE_URL)
- .client(okHttpClient)
- .addConverterFactory(MoshiConverterFactory.create(moshi))
- .build()
- .create(FDroidMonitorApi::class.java)
- }
-}
diff --git a/app/src/main/java/foundation/e/apps/di/network/InterceptorModule.kt b/app/src/main/java/foundation/e/apps/di/network/InterceptorModule.kt
new file mode 100644
index 0000000000000000000000000000000000000000..476e5f7d8d3612043a94dca4a25cb6bfe78f3370
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/di/network/InterceptorModule.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2024 MURENA SAS
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+package foundation.e.apps.di.network
+
+import android.os.Build
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import foundation.e.apps.BuildConfig
+import okhttp3.Interceptor
+import okhttp3.logging.HttpLoggingInterceptor
+import java.util.Locale
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+class InterceptorModule {
+
+ companion object {
+ private const val HEADER_USER_AGENT = "User-Agent"
+ private const val HEADER_ACCEPT_LANGUAGE = "Accept-Language"
+ }
+
+ @Singleton
+ @Provides
+ fun provideInterceptor(): Interceptor {
+ return Interceptor { chain ->
+ val builder =
+ chain
+ .request()
+ .newBuilder()
+ .header(
+ HEADER_USER_AGENT,
+ "Dalvik/2.1.0 (Linux; U; Android ${Build.VERSION.RELEASE};)")
+ .header(HEADER_ACCEPT_LANGUAGE, Locale.getDefault().language)
+
+ val response = chain.proceed(builder.build())
+
+ return@Interceptor response
+ }
+ }
+
+ @Provides
+ @Singleton
+ fun provideLoggingInterceptor(): HttpLoggingInterceptor {
+ return HttpLoggingInterceptor().apply {
+ level = when {
+ BuildConfig.DEBUG -> HttpLoggingInterceptor.Level.BODY
+ else -> HttpLoggingInterceptor.Level.NONE
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/foundation/e/apps/di/network/NetworkModule.kt b/app/src/main/java/foundation/e/apps/di/network/NetworkModule.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6fbf75e992aecfa62bbfd5070412e21312e9db57
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/di/network/NetworkModule.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021-2024 MURENA SAS
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+package foundation.e.apps.di.network
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.squareup.moshi.Moshi
+import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import foundation.e.apps.data.cleanapk.ApplicationDeserializer
+import foundation.e.apps.data.cleanapk.data.app.Application
+import okhttp3.Cache
+import okhttp3.Interceptor
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.converter.jackson.JacksonConverterFactory
+import java.util.concurrent.TimeUnit
+import javax.inject.Named
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object NetworkModule {
+
+ private const val HTTP_TIMEOUT_IN_SECOND = 10L
+
+ @Singleton
+ @Provides
+ fun getMoshi(): Moshi {
+ return Moshi.Builder()
+ .add(KotlinJsonAdapterFactory())
+ .build()
+ }
+
+ @Singleton
+ @Provides
+ @Named("gsonCustomAdapter")
+ fun getGson(): Gson {
+ return GsonBuilder()
+ .registerTypeAdapter(Application::class.java, ApplicationDeserializer())
+ .enableComplexMapKeySerialization()
+ .create()
+ }
+
+ /**
+ * Used in [RetrofitApiModule.provideFdroidApi].
+ * Reference: https://stackoverflow.com/a/69859687
+ */
+ @Singleton
+ @Provides
+ @Named("yamlFactory")
+ fun getYamlFactory(): JacksonConverterFactory {
+ return JacksonConverterFactory.create(ObjectMapper(YAMLFactory()))
+ }
+
+ @Singleton
+ @Provides
+ fun provideOkHttpClient(
+ cache: Cache,
+ interceptor: Interceptor,
+ httpLoggingInterceptor: HttpLoggingInterceptor
+ ): OkHttpClient {
+ return OkHttpClient.Builder()
+ .addInterceptor(interceptor)
+ .addInterceptor(httpLoggingInterceptor) // Put logging interceptor last
+ .callTimeout(HTTP_TIMEOUT_IN_SECOND, TimeUnit.SECONDS)
+ .cache(cache)
+ .build()
+ }
+}
diff --git a/app/src/main/java/foundation/e/apps/data/cleanapk/RetrofitModule.kt b/app/src/main/java/foundation/e/apps/di/network/RetrofitApiModule.kt
similarity index 57%
rename from app/src/main/java/foundation/e/apps/data/cleanapk/RetrofitModule.kt
rename to app/src/main/java/foundation/e/apps/di/network/RetrofitApiModule.kt
index 3a2d832d82af8673c0d4bf8206cfe30c1bfedb85..f76699090746b8f6d26d103a56ac8aea9a150916 100644
--- a/app/src/main/java/foundation/e/apps/data/cleanapk/RetrofitModule.kt
+++ b/app/src/main/java/foundation/e/apps/di/network/RetrofitApiModule.kt
@@ -1,181 +1,134 @@
-/*
- * Apps Quickly and easily install Android apps onto your device!
- * Copyright (C) 2021 E FOUNDATION
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package foundation.e.apps.data.cleanapk
-
-import android.os.Build
-import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
-import com.google.gson.Gson
-import com.google.gson.GsonBuilder
-import com.squareup.moshi.Moshi
-import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.components.SingletonComponent
-import foundation.e.apps.data.ageRating.AgeGroupApi
-import foundation.e.apps.data.cleanapk.data.app.Application
-import foundation.e.apps.data.ecloud.EcloudApiInterface
-import foundation.e.apps.data.exodus.ExodusTrackerApi
-import foundation.e.apps.data.fdroid.FdroidApiInterface
-import okhttp3.Cache
-import okhttp3.Interceptor
-import okhttp3.OkHttpClient
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import retrofit2.converter.jackson.JacksonConverterFactory
-import retrofit2.converter.moshi.MoshiConverterFactory
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-import javax.inject.Named
-import javax.inject.Singleton
-
-@Module
-@InstallIn(SingletonComponent::class)
-object RetrofitModule {
-
- private const val HTTP_TIMEOUT_IN_SECOND = 10L
-
- /**
- * Provides an instance of Retrofit to work with CleanAPK API
- * @return instance of [CleanApkRetrofit]
- */
- @Singleton
- @Provides
- fun provideCleanAPKInterface(okHttpClient: OkHttpClient, moshi: Moshi): CleanApkRetrofit {
- return Retrofit.Builder()
- .baseUrl(CleanApkRetrofit.BASE_URL)
- .client(okHttpClient)
- .addConverterFactory(MoshiConverterFactory.create(moshi))
- .build()
- .create(CleanApkRetrofit::class.java)
- }
-
- /**
- * Provides an instance of Retrofit to work with CleanAPK API
- * @return instance of [CleanApkAppDetailsRetrofit]
- */
- @Singleton
- @Provides
- fun provideCleanAPKDetailApi(
- okHttpClient: OkHttpClient,
- @Named("gsonCustomAdapter") gson: Gson
- ): CleanApkAppDetailsRetrofit {
- return Retrofit.Builder()
- .baseUrl(CleanApkRetrofit.BASE_URL)
- .client(okHttpClient)
- .addConverterFactory(GsonConverterFactory.create(gson))
- .build()
- .create(CleanApkAppDetailsRetrofit::class.java)
- }
-
- @Singleton
- @Provides
- fun provideExodusApi(okHttpClient: OkHttpClient, moshi: Moshi): ExodusTrackerApi {
- return Retrofit.Builder()
- .baseUrl(ExodusTrackerApi.BASE_URL)
- .client(okHttpClient)
- .addConverterFactory(MoshiConverterFactory.create(moshi))
- .build()
- .create(ExodusTrackerApi::class.java)
- }
-
- /**
- * The fdroid api returns results in .yaml format.
- * Hence we need a yaml convertor.
- * Convertor is being provided by [getYamlFactory].
- */
- @Singleton
- @Provides
- fun provideFdroidApi(
- okHttpClient: OkHttpClient,
- @Named("yamlFactory") yamlFactory: JacksonConverterFactory
- ): FdroidApiInterface {
- return Retrofit.Builder()
- .baseUrl(FdroidApiInterface.BASE_URL)
- .client(okHttpClient)
- .addConverterFactory(yamlFactory)
- .build()
- .create(FdroidApiInterface::class.java)
- }
-
- @Singleton
- @Provides
- fun provideEcloudApi(okHttpClient: OkHttpClient, moshi: Moshi): EcloudApiInterface {
- return Retrofit.Builder()
- .baseUrl(EcloudApiInterface.BASE_URL)
- .client(okHttpClient)
- .addConverterFactory(MoshiConverterFactory.create(moshi))
- .build()
- .create(EcloudApiInterface::class.java)
- }
-
- @Singleton
- @Provides
- fun getMoshi(): Moshi {
- return Moshi.Builder()
- .add(KotlinJsonAdapterFactory())
- .build()
- }
-
- @Singleton
- @Provides
- @Named("gsonCustomAdapter")
- fun getGson(): Gson {
- return GsonBuilder()
- .registerTypeAdapter(Application::class.java, ApplicationDeserializer())
- .enableComplexMapKeySerialization()
- .create()
- }
-
- /**
- * Used in above [provideFdroidApi].
- * Reference: https://stackoverflow.com/a/69859687
- */
- @Singleton
- @Provides
- @Named("yamlFactory")
- fun getYamlFactory(): JacksonConverterFactory {
- return JacksonConverterFactory.create(ObjectMapper(YAMLFactory()))
- }
-
- @Singleton
- @Provides
- fun provideInterceptor(): Interceptor {
- return Interceptor { chain ->
- val builder = chain.request().newBuilder()
- builder.header(
- "User-Agent",
- "Dalvik/2.1.0 (Linux; U; Android ${Build.VERSION.RELEASE};)"
- ).header("Accept-Language", Locale.getDefault().language)
-
- return@Interceptor chain.proceed(builder.build())
- }
- }
-
- @Singleton
- @Provides
- fun provideOkHttpClient(cache: Cache, interceptor: Interceptor): OkHttpClient {
- return OkHttpClient.Builder()
- .addInterceptor(interceptor)
- .callTimeout(HTTP_TIMEOUT_IN_SECOND, TimeUnit.SECONDS)
- .cache(cache)
- .build()
- }
-}
+/*
+ * Copyright (C) 2024 MURENA SAS
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+package foundation.e.apps.di.network
+
+import com.google.gson.Gson
+import com.squareup.moshi.Moshi
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import foundation.e.apps.data.cleanapk.CleanApkAppDetailsRetrofit
+import foundation.e.apps.data.cleanapk.CleanApkRetrofit
+import foundation.e.apps.data.ecloud.EcloudApiInterface
+import foundation.e.apps.data.exodus.ExodusTrackerApi
+import foundation.e.apps.data.fdroid.FdroidApiInterface
+import foundation.e.apps.di.network.NetworkModule.getYamlFactory
+import foundation.e.apps.data.parentalcontrol.AgeGroupApi
+import foundation.e.apps.data.parentalcontrol.FDroidMonitorApi
+import okhttp3.OkHttpClient
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import retrofit2.converter.jackson.JacksonConverterFactory
+import retrofit2.converter.moshi.MoshiConverterFactory
+import javax.inject.Named
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+class RetrofitApiModule {
+ @Singleton
+ @Provides
+ fun provideCleanApkApi(okHttpClient: OkHttpClient, moshi: Moshi): CleanApkRetrofit {
+ return Retrofit.Builder()
+ .baseUrl(CleanApkRetrofit.BASE_URL)
+ .client(okHttpClient)
+ .addConverterFactory(MoshiConverterFactory.create(moshi))
+ .build()
+ .create(CleanApkRetrofit::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideCleanApkAppDetailsApi(
+ okHttpClient: OkHttpClient,
+ @Named("gsonCustomAdapter") gson: Gson
+ ): CleanApkAppDetailsRetrofit {
+ return Retrofit.Builder()
+ .baseUrl(CleanApkRetrofit.BASE_URL)
+ .client(okHttpClient)
+ .addConverterFactory(GsonConverterFactory.create(gson))
+ .build()
+ .create(CleanApkAppDetailsRetrofit::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideExodusApi(okHttpClient: OkHttpClient, moshi: Moshi): ExodusTrackerApi {
+ return Retrofit.Builder()
+ .baseUrl(ExodusTrackerApi.BASE_URL)
+ .client(okHttpClient)
+ .addConverterFactory(MoshiConverterFactory.create(moshi))
+ .build()
+ .create(ExodusTrackerApi::class.java)
+ }
+
+ /**
+ * The fdroid api returns results in .yaml format.
+ * Hence we need a yaml convertor.
+ * Convertor is being provided by [getYamlFactory].
+ */
+ @Singleton
+ @Provides
+ fun provideFdroidApi(
+ okHttpClient: OkHttpClient,
+ @Named("yamlFactory") yamlFactory: JacksonConverterFactory
+ ): FdroidApiInterface {
+ return Retrofit.Builder()
+ .baseUrl(FdroidApiInterface.BASE_URL)
+ .client(okHttpClient)
+ .addConverterFactory(yamlFactory)
+ .build()
+ .create(FdroidApiInterface::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideEcloudApi(okHttpClient: OkHttpClient, moshi: Moshi): EcloudApiInterface {
+ return Retrofit.Builder()
+ .baseUrl(EcloudApiInterface.BASE_URL)
+ .client(okHttpClient)
+ .addConverterFactory(MoshiConverterFactory.create(moshi))
+ .build()
+ .create(EcloudApiInterface::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideAgeGroupApi(okHttpClient: OkHttpClient, moshi: Moshi): AgeGroupApi {
+ return Retrofit.Builder()
+ .baseUrl(AgeGroupApi.BASE_URL)
+ .client(okHttpClient)
+ .addConverterFactory(MoshiConverterFactory.create(moshi))
+ .build()
+ .create(AgeGroupApi::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideFDroidMonitorApi(okHttpClient: OkHttpClient, moshi: Moshi): FDroidMonitorApi {
+ return Retrofit.Builder()
+ .baseUrl(FDroidMonitorApi.BASE_URL)
+ .client(okHttpClient)
+ .addConverterFactory(MoshiConverterFactory.create(moshi))
+ .build()
+ .create(FDroidMonitorApi::class.java)
+ }
+
+}