Loading app/build.gradle +4 −0 Original line number Diff line number Diff line Loading @@ -116,10 +116,14 @@ dependencies { def retrofit_version = "2.9.0" implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" implementation "com.squareup.retrofit2:converter-jackson:$retrofit_version" 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" // YAML factory implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.2" // Navigation Components def navigation_version = "2.3.5" implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" Loading app/src/main/java/foundation/e/apps/FdroidFetchViewModel.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line package foundation.e.apps import android.widget.TextView import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.api.fdroid.FdroidRepository import foundation.e.apps.api.fdroid.models.FdroidEntity import foundation.e.apps.api.fused.data.FusedApp import foundation.e.apps.utils.enums.Origin import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject /** * */ @HiltViewModel class FdroidFetchViewModel @Inject constructor( private val fdroidRepository: FdroidRepository ): ViewModel() { private val fdroidEntries = mutableMapOf<String, FdroidEntity?>() fun setAuthorNameIfNeeded(textView: TextView, fusedApp: FusedApp) { viewModelScope.launch { var authorNameToDisplay = textView.text withContext(Dispatchers.Default) { fusedApp.run { try { if (author == "unknown" && origin == Origin.CLEANAPK) { withContext(Dispatchers.Main) { textView.text = FdroidEntity.DEFAULT_FDROID_AUTHOR_NAME } var result = fdroidEntries[package_name] if (result == null) { result = fdroidRepository.getFdroidInfo(package_name)?.also { fdroidEntries[package_name] = it } } result?.authorName?.let { authorNameToDisplay = it } } } catch (e: Exception) { e.printStackTrace() } } } withContext(Dispatchers.Main) { textView.text = authorNameToDisplay } } } } No newline at end of file app/src/main/java/foundation/e/apps/api/cleanapk/RetrofitModule.kt +35 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ package foundation.e.apps.api.cleanapk import android.os.Build import android.util.Log import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.dataformat.yaml.YAMLFactory import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import dagger.Module Loading @@ -27,6 +29,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import foundation.e.apps.api.exodus.ExodusTrackerApi import foundation.e.apps.api.fdroid.FdroidApiInterface import okhttp3.Cache import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaTypeOrNull Loading @@ -35,8 +38,10 @@ import okhttp3.Protocol import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import retrofit2.Retrofit import retrofit2.converter.jackson.JacksonConverterFactory import retrofit2.converter.moshi.MoshiConverterFactory import java.net.ConnectException import javax.inject.Named import javax.inject.Singleton @Module Loading Loading @@ -69,6 +74,25 @@ object RetrofitModule { .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 getMoshi(): Moshi { Loading @@ -77,6 +101,17 @@ object RetrofitModule { .build() } /** * 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 { Loading app/src/main/java/foundation/e/apps/api/database/AppDatabase.kt +5 −2 Original line number Diff line number Diff line Loading @@ -6,14 +6,17 @@ import androidx.room.Room import androidx.room.RoomDatabase import foundation.e.apps.api.exodus.Tracker import foundation.e.apps.api.exodus.TrackerDao import foundation.e.apps.api.fdroid.FdroidDao import foundation.e.apps.api.fdroid.models.FdroidEntity @Database( entities = [Tracker::class], version = 1, entities = [Tracker::class, FdroidEntity::class], version = 2, exportSchema = false ) abstract class AppDatabase : RoomDatabase() { abstract fun trackerDao(): TrackerDao abstract fun fdroidDao(): FdroidDao companion object { private lateinit var INSTANCE: AppDatabase Loading app/src/main/java/foundation/e/apps/api/fdroid/FdroidApiInterface.kt 0 → 100644 +19 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid import foundation.e.apps.api.fdroid.models.FdroidApiModel import retrofit2.http.GET import retrofit2.http.Path /** * Interface for retrofit calls. * Created from [foundation.e.apps.api.cleanapk.RetrofitModule.provideFdroidApi]. */ interface FdroidApiInterface { companion object { const val BASE_URL = "https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/" } @GET("{packageName}.yml") suspend fun getFdroidInfoForPackage(@Path("packageName") packageName: String): FdroidApiModel? } No newline at end of file Loading
app/build.gradle +4 −0 Original line number Diff line number Diff line Loading @@ -116,10 +116,14 @@ dependencies { def retrofit_version = "2.9.0" implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" implementation "com.squareup.retrofit2:converter-jackson:$retrofit_version" 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" // YAML factory implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.2" // Navigation Components def navigation_version = "2.3.5" implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" Loading
app/src/main/java/foundation/e/apps/FdroidFetchViewModel.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line package foundation.e.apps import android.widget.TextView import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.api.fdroid.FdroidRepository import foundation.e.apps.api.fdroid.models.FdroidEntity import foundation.e.apps.api.fused.data.FusedApp import foundation.e.apps.utils.enums.Origin import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject /** * */ @HiltViewModel class FdroidFetchViewModel @Inject constructor( private val fdroidRepository: FdroidRepository ): ViewModel() { private val fdroidEntries = mutableMapOf<String, FdroidEntity?>() fun setAuthorNameIfNeeded(textView: TextView, fusedApp: FusedApp) { viewModelScope.launch { var authorNameToDisplay = textView.text withContext(Dispatchers.Default) { fusedApp.run { try { if (author == "unknown" && origin == Origin.CLEANAPK) { withContext(Dispatchers.Main) { textView.text = FdroidEntity.DEFAULT_FDROID_AUTHOR_NAME } var result = fdroidEntries[package_name] if (result == null) { result = fdroidRepository.getFdroidInfo(package_name)?.also { fdroidEntries[package_name] = it } } result?.authorName?.let { authorNameToDisplay = it } } } catch (e: Exception) { e.printStackTrace() } } } withContext(Dispatchers.Main) { textView.text = authorNameToDisplay } } } } No newline at end of file
app/src/main/java/foundation/e/apps/api/cleanapk/RetrofitModule.kt +35 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ package foundation.e.apps.api.cleanapk import android.os.Build import android.util.Log import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.dataformat.yaml.YAMLFactory import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import dagger.Module Loading @@ -27,6 +29,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import foundation.e.apps.api.exodus.ExodusTrackerApi import foundation.e.apps.api.fdroid.FdroidApiInterface import okhttp3.Cache import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaTypeOrNull Loading @@ -35,8 +38,10 @@ import okhttp3.Protocol import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import retrofit2.Retrofit import retrofit2.converter.jackson.JacksonConverterFactory import retrofit2.converter.moshi.MoshiConverterFactory import java.net.ConnectException import javax.inject.Named import javax.inject.Singleton @Module Loading Loading @@ -69,6 +74,25 @@ object RetrofitModule { .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 getMoshi(): Moshi { Loading @@ -77,6 +101,17 @@ object RetrofitModule { .build() } /** * 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 { Loading
app/src/main/java/foundation/e/apps/api/database/AppDatabase.kt +5 −2 Original line number Diff line number Diff line Loading @@ -6,14 +6,17 @@ import androidx.room.Room import androidx.room.RoomDatabase import foundation.e.apps.api.exodus.Tracker import foundation.e.apps.api.exodus.TrackerDao import foundation.e.apps.api.fdroid.FdroidDao import foundation.e.apps.api.fdroid.models.FdroidEntity @Database( entities = [Tracker::class], version = 1, entities = [Tracker::class, FdroidEntity::class], version = 2, exportSchema = false ) abstract class AppDatabase : RoomDatabase() { abstract fun trackerDao(): TrackerDao abstract fun fdroidDao(): FdroidDao companion object { private lateinit var INSTANCE: AppDatabase Loading
app/src/main/java/foundation/e/apps/api/fdroid/FdroidApiInterface.kt 0 → 100644 +19 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid import foundation.e.apps.api.fdroid.models.FdroidApiModel import retrofit2.http.GET import retrofit2.http.Path /** * Interface for retrofit calls. * Created from [foundation.e.apps.api.cleanapk.RetrofitModule.provideFdroidApi]. */ interface FdroidApiInterface { companion object { const val BASE_URL = "https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/" } @GET("{packageName}.yml") suspend fun getFdroidInfoForPackage(@Path("packageName") packageName: String): FdroidApiModel? } No newline at end of file