setup retrofit client

This commit is contained in:
Owen LeJeune
2022-09-14 16:16:56 -04:00
parent aaa70ef2d5
commit 2b3fd54ac7
10 changed files with 132 additions and 5 deletions

View File

@@ -3,6 +3,8 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.owenlejeune.mydex">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"

View File

@@ -3,6 +3,8 @@ package com.owenlejeune.mydex
import android.app.Application
import com.facebook.stetho.Stetho
import com.kieronquinn.monetcompat.core.MonetCompat
import com.owenlejeune.mydex.di.Modules
import com.owenlejeune.mydex.di.networkModule
import com.owenlejeune.mydex.di.preferencesModule
import com.owenlejeune.mydex.preferences.AppPreferences
import org.koin.android.ext.android.inject
@@ -24,9 +26,7 @@ class MYDexApplication: Application() {
if (BuildConfig.DEBUG) Level.ERROR else Level.NONE
)
androidContext(this@MYDexApplication)
modules(
preferencesModule
)
modules(Modules)
}
MonetCompat.enablePaletteCompat()

View File

@@ -0,0 +1,32 @@
package com.owenlejeune.mydex.api
import okhttp3.Interceptor
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import retrofit2.Retrofit
class Client(baseUrl: String): KoinComponent {
private val converter: ConverterFactoryFactory by inject()
private val client: HttpClient by inject()
private var retrofit: Retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.client(client.httpClient)
.addConverterFactory(converter.get())
.build()
fun <T> create(service: Class<T>): T {
return retrofit.create(service)
}
fun addInterceptor(interceptor: Interceptor) {
val iClient = client.httpClient.newBuilder()
.addInterceptor(interceptor)
.build()
retrofit = retrofit.newBuilder()
.client(iClient)
.build()
}
}

View File

@@ -0,0 +1,9 @@
package com.owenlejeune.mydex.api
import retrofit2.Converter
interface ConverterFactoryFactory {
fun get(): Converter.Factory
}

View File

@@ -0,0 +1,11 @@
package com.owenlejeune.mydex.api
import com.facebook.stetho.okhttp3.StethoInterceptor
import okhttp3.OkHttpClient
class DebugHttpClient: HttpClient {
override val httpClient: OkHttpClient
get() = OkHttpClient.Builder()
.addNetworkInterceptor(StethoInterceptor())
.build()
}

View File

@@ -0,0 +1,17 @@
package com.owenlejeune.mydex.api
import com.google.gson.Gson
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import retrofit2.Converter
import retrofit2.converter.gson.GsonConverterFactory
class GsonConverter: ConverterFactoryFactory, KoinComponent {
private val gson: Gson by inject()
override fun get(): Converter.Factory {
return GsonConverterFactory.create(gson)
}
}

View File

@@ -0,0 +1,7 @@
package com.owenlejeune.mydex.api
import okhttp3.OkHttpClient
interface HttpClient {
val httpClient: OkHttpClient
}

View File

@@ -0,0 +1,8 @@
package com.owenlejeune.mydex.api
import okhttp3.OkHttpClient
class ProdHttpClient: HttpClient {
override val httpClient: OkHttpClient
get() = OkHttpClient.Builder().build()
}

View File

@@ -1,4 +1,20 @@
package com.owenlejeune.mydex.api.pokeapi
class PokeApiClient {
import com.owenlejeune.mydex.api.Client
import com.owenlejeune.mydex.preferences.AppPreferences
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.parameter.parametersOf
class PokeApiClient: KoinComponent {
companion object {
const val BASE_URL = "https://pokeapi.co/api/v2/"
}
private val client: Client by inject { parametersOf(BASE_URL) }
private val preferences: AppPreferences by inject()
}

View File

@@ -1,8 +1,33 @@
package com.owenlejeune.mydex.di
import com.google.gson.GsonBuilder
import com.google.gson.TypeAdapterFactory
import com.owenlejeune.mydex.BuildConfig
import com.owenlejeune.mydex.api.*
import com.owenlejeune.mydex.api.pokeapi.PokeApiClient
import com.owenlejeune.mydex.preferences.AppPreferences
import org.koin.dsl.module
val networkModule = module {
single { if (BuildConfig.DEBUG) DebugHttpClient() else ProdHttpClient() }
single<ConverterFactoryFactory> { GsonConverter() }
factory { (baseUrl: String) -> Client(baseUrl) }
single<List<TypeAdapterFactory>> {
listOf(FlattenTypeAdapterFactory())
}
single {
GsonBuilder().apply {
get<List<TypeAdapterFactory>>().forEach { taf -> registerTypeAdapterFactory(taf) }
}
}
single { PokeApiClient() }
}
val preferencesModule = module {
single { AppPreferences(get()) }
}
}
val Modules = listOf(networkModule, preferencesModule)