add koin, retrofit and setup retrofit boilerplate

This commit is contained in:
Owen LeJeune
2022-02-09 21:12:28 -05:00
parent be7eca362a
commit b5db7422d0
12 changed files with 152 additions and 3 deletions

View File

@@ -2,7 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.owenlejeune.tvtime">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".TvTimeApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"

View File

@@ -0,0 +1,30 @@
package com.owenlejeune.tvtime
import android.app.Application
import com.facebook.stetho.Stetho
import com.owenlejeune.tvtime.di.modules.networkModule
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
import org.koin.core.logger.Level
class TvTimeApplication: Application() {
override fun onCreate() {
super.onCreate()
// start koin
startKoin {
androidLogger(
if (BuildConfig.DEBUG) Level.ERROR else Level.NONE
)
androidContext(this@TvTimeApplication)
modules(networkModule)
}
if (BuildConfig.DEBUG) {
Stetho.initializeWithDefaults(this)
}
}
}

View File

@@ -0,0 +1,32 @@
package com.owenlejeune.tvtime.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: Converter 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.tvtime.api
import retrofit2.Converter
interface Converter {
fun get(): Converter.Factory
}

View File

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

View File

@@ -0,0 +1,13 @@
package com.owenlejeune.tvtime.api
import com.google.gson.GsonBuilder
import retrofit2.converter.gson.GsonConverterFactory
class GsonConverter: Converter {
override fun get(): retrofit2.Converter.Factory {
val gson = GsonBuilder()
.create()
return GsonConverterFactory.create(gson)
}
}

View File

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

View File

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

View File

@@ -0,0 +1,11 @@
package com.owenlejeune.tvtime.di.modules
import com.owenlejeune.tvtime.BuildConfig
import com.owenlejeune.tvtime.api.*
import org.koin.dsl.module
val networkModule = module {
single { if (BuildConfig.DEBUG) DebugHttpClient() else ProdHttpClient() }
single<Converter> { GsonConverter() }
single { (baseUrl: String) -> Client(baseUrl) }
}