Loading app/src/main/java/foundation/e/apps/api/fdroid/FdroidApiInterface.kt 0 → 100644 +18 −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. */ 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 app/src/main/java/foundation/e/apps/api/fdroid/FdroidDao.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import foundation.e.apps.api.fdroid.models.FdroidEntity /** * Dao interface for storing Fdroid info in DB. */ @Dao interface FdroidDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun saveFdroidEntity(fdroidEntity: FdroidEntity) @Query("SELECT * FROM FdroidEntity where packageName is :packageName") suspend fun getFdroidEntityFromPackageName(packageName: String): FdroidEntity? } No newline at end of file app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt 0 → 100644 +28 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid import foundation.e.apps.api.fdroid.models.FdroidEntity import javax.inject.Inject import javax.inject.Singleton @Singleton class FdroidRepository @Inject constructor( private val fdroidApi: FdroidApiInterface, private val fdroidDao: FdroidDao, ) { /** * Get Fdroid entity from DB is present. * If not present then make an API call, store the fetched result and return the result. * * Result may be null. */ suspend fun getFdroidInfo(packageName: String): FdroidEntity? { return fdroidDao.getFdroidEntityFromPackageName(packageName) ?: fdroidApi.getFdroidInfoForPackage(packageName)?.let { FdroidEntity(packageName, it.authorName).also { fdroidDao.saveFdroidEntity(it) } } } } No newline at end of file app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidApiModel.kt 0 → 100644 +27 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid.models import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonProperty /** * Data class for requests to F-droid API. * https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/<package_name>.yml * * An empty constructor is required to allow parsing by Jackson. * https://facingissuesonit.com/2019/07/17/com-fasterxml-jackson-databind-exc-invaliddefinitionexception-cannot-construct-instance-of-xyz-no-creators-like-default-construct-exist-cannot-deserialize-from-object-value-no-delega/ * * Jackson annotations can be found here: * https://github.com/FasterXML/jackson-annotations * * Currently only being used to fetch author name. */ @JsonIgnoreProperties(ignoreUnknown = true) class FdroidApiModel() { var authorName: String = "" @JsonCreator constructor(@JsonProperty("AuthorName") AuthorName: String?): this(){ this.authorName = AuthorName ?: "" } } No newline at end of file app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidEntity.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid.models import androidx.room.Entity import androidx.room.PrimaryKey /** * Store the contents from api in DB to prevent further network calls. * This is also the model used for views. */ @Entity class FdroidEntity(@PrimaryKey val packageName: String, authorName: String) { companion object { val DEFAULT_FDROID_AUTHOR_NAME = "F-Droid" } var authorName: String = DEFAULT_FDROID_AUTHOR_NAME init { if (authorName.isNotBlank()) this.authorName = authorName } } No newline at end of file Loading
app/src/main/java/foundation/e/apps/api/fdroid/FdroidApiInterface.kt 0 → 100644 +18 −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. */ 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
app/src/main/java/foundation/e/apps/api/fdroid/FdroidDao.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import foundation.e.apps.api.fdroid.models.FdroidEntity /** * Dao interface for storing Fdroid info in DB. */ @Dao interface FdroidDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun saveFdroidEntity(fdroidEntity: FdroidEntity) @Query("SELECT * FROM FdroidEntity where packageName is :packageName") suspend fun getFdroidEntityFromPackageName(packageName: String): FdroidEntity? } No newline at end of file
app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt 0 → 100644 +28 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid import foundation.e.apps.api.fdroid.models.FdroidEntity import javax.inject.Inject import javax.inject.Singleton @Singleton class FdroidRepository @Inject constructor( private val fdroidApi: FdroidApiInterface, private val fdroidDao: FdroidDao, ) { /** * Get Fdroid entity from DB is present. * If not present then make an API call, store the fetched result and return the result. * * Result may be null. */ suspend fun getFdroidInfo(packageName: String): FdroidEntity? { return fdroidDao.getFdroidEntityFromPackageName(packageName) ?: fdroidApi.getFdroidInfoForPackage(packageName)?.let { FdroidEntity(packageName, it.authorName).also { fdroidDao.saveFdroidEntity(it) } } } } No newline at end of file
app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidApiModel.kt 0 → 100644 +27 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid.models import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonProperty /** * Data class for requests to F-droid API. * https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/<package_name>.yml * * An empty constructor is required to allow parsing by Jackson. * https://facingissuesonit.com/2019/07/17/com-fasterxml-jackson-databind-exc-invaliddefinitionexception-cannot-construct-instance-of-xyz-no-creators-like-default-construct-exist-cannot-deserialize-from-object-value-no-delega/ * * Jackson annotations can be found here: * https://github.com/FasterXML/jackson-annotations * * Currently only being used to fetch author name. */ @JsonIgnoreProperties(ignoreUnknown = true) class FdroidApiModel() { var authorName: String = "" @JsonCreator constructor(@JsonProperty("AuthorName") AuthorName: String?): this(){ this.authorName = AuthorName ?: "" } } No newline at end of file
app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidEntity.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package foundation.e.apps.api.fdroid.models import androidx.room.Entity import androidx.room.PrimaryKey /** * Store the contents from api in DB to prevent further network calls. * This is also the model used for views. */ @Entity class FdroidEntity(@PrimaryKey val packageName: String, authorName: String) { companion object { val DEFAULT_FDROID_AUTHOR_NAME = "F-Droid" } var authorName: String = DEFAULT_FDROID_AUTHOR_NAME init { if (authorName.isNotBlank()) this.authorName = authorName } } No newline at end of file