Skip to content

Commit

Permalink
Switch RepoDataFetcher backend to OkHttp
Browse files Browse the repository at this point in the history
This change adds caching to both repository and app metadata,
incidentally adding better offline support.

Closes #8
Closes #159
Partially resolves #150
Partially resolves #322
  • Loading branch information
lberrymage committed Jan 8, 2024
1 parent 6ea937f commit 8e71d76
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import android.content.Context
import app.accrescent.client.R
import app.accrescent.client.data.net.AppRepoData
import app.accrescent.client.data.net.RepoData
import app.accrescent.client.util.openHttpConnection
import app.accrescent.client.util.verifySignature
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.serialization.json.Json
import java.io.ByteArrayOutputStream
import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.IOException
import java.net.URL
import java.security.GeneralSecurityException
import javax.inject.Inject
Expand All @@ -17,6 +18,7 @@ private val format = Json { ignoreUnknownKeys = true }

class RepoDataFetcherImpl @Inject constructor(
@ApplicationContext private val context: Context,
private val okHttpClient: OkHttpClient,
) : RepoDataFetcher {
override fun fetchRepoData(): RepoData {
val repoDataUrl = "$REPOSITORY_URL/repodata.$PUBKEY_VERSION.json"
Expand All @@ -38,10 +40,12 @@ class RepoDataFetcherImpl @Inject constructor(
}

private fun fetchFileString(url: URL): String {
val outBuf = ByteArrayOutputStream()
val request = Request.Builder().url(url).build()

url.openHttpConnection().use { it.downloadTo(outBuf) }

return outBuf.toString()
return okHttpClient
.newCall(request)
.execute()
.use { it.body?.string() }
?: throw IOException("request body expected but not found")
}
}
31 changes: 31 additions & 0 deletions app/src/main/java/app/accrescent/client/di/OkHttpModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package app.accrescent.client.di

import android.content.Context
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import okhttp3.Cache
import okhttp3.OkHttpClient
import java.io.File
import javax.inject.Singleton

// The cache size in bytes
private const val CACHE_SIZE: Long = 50 * 1024 * 1024

@Module
@InstallIn(SingletonComponent::class)
object OkHttpModule {
@Provides
@Singleton
fun getOkHttpClient(@ApplicationContext context: Context) = OkHttpClient()
.newBuilder()
.cache(
Cache(
directory = File(context.cacheDir.toURI()),
maxSize = CACHE_SIZE,
)
)
.build()
}
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ ksp = "1.9.21-1.0.16"
lifecycle = "2.6.2"
material = "1.11.0"
nav-compose = "2.7.6"
okhttp = "4.12.0"
room = "2.6.1"
serialization = "1.6.2"
work = "2.9.0"
Expand All @@ -40,6 +41,7 @@ lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process",
lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
navcompose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "nav-compose" }
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
Expand Down

0 comments on commit 8e71d76

Please sign in to comment.