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

@@ -22,6 +22,8 @@ android {
vectorDrawables {
useSupportLibrary true
}
buildConfigField("String", "TMDB_ApiKey", TMDB_ApiKey)
}
buildTypes {
@@ -53,14 +55,25 @@ android {
dependencies {
implementation Dependencies.AndroidX.ktxCore
implementation Dependencies.Compose.ui
implementation Dependencies.Compose.material3
implementation Dependencies.Compose.material
implementation Dependencies.Compose.uiToolingPreview
implementation Dependencies.Lifecycle.runtime
implementation Dependencies.Compose.activity
implementation Dependencies.Compose.accompanistSystemUi
implementation Dependencies.Compose.navigation
implementation Dependencies.Lifecycle.runtime
implementation Dependencies.Network.retrofit
implementation Dependencies.Network.retrofitGson
implementation Dependencies.Network.gson
implementation Dependencies.Network.stetho
implementation Dependencies.Network.stethoOkHttp
implementation Dependencies.DI.koin
testImplementation Dependencies.Testing.junit
androidTestImplementation Dependencies.Testing.androidXJunit
androidTestImplementation Dependencies.Testing.espressoCore

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) }
}