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

Commit 43dcc5c8 authored by Sayantan Roychowdhury's avatar Sayantan Roychowdhury
Browse files

App lounge: (issue_4427) Create models for F-Droid, API and Dao

parent 58162954
Loading
Loading
Loading
Loading
+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
+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
+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
+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
+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