Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c6168b42 authored by Sayantan Roychowdhury's avatar Sayantan Roychowdhury
Browse files

App lounge: Fetch and display author name from F-Droid, instead of displaying "unknown"

parent da1ba4f2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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"
+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
+35 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
@@ -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 {
@@ -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 {
+5 −2
Original line number Diff line number Diff line
@@ -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
+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