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

View File

@@ -35,4 +35,16 @@ object Dependencies {
const val kotlinGradle = "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}"
const val extensions = "org.jetbrains.kotlin:kotlin-android-extensions:${Versions.kotlin}"
}
object Network {
const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"
const val retrofitGson = "com.squareup.retrofit2:converter-gson:${Versions.retrofit}"
const val gson = "com.google.code.gson:gson:${Versions.gson}"
const val stetho = "com.facebook.stetho:stetho:${Versions.stetho}"
const val stethoOkHttp = "com.facebook.stetho:stetho-okhttp3:${Versions.stetho}"
}
object DI {
const val koin = "io.insert-koin:koin-android:${Versions.koin}"
}
}

View File

@@ -2,7 +2,6 @@ package com.owenlejeune.tvtime.buildsrc
object Versions {
const val ktlint = "0.43.2"
const val compose = "1.1.0-rc03"
const val compose_material3 = "1.0.0-alpha04"
const val compose_accompanist = "0.22.1-rc"
@@ -15,7 +14,10 @@ object Versions {
const val androidx = "1.4.1"
const val core_ktx = "1.7.0"
const val activity_compose = "1.4.0"
const val navigation = "2.4.0"
const val lifecycle_runtime = "2.4.0"
const val retrofit = "2.9.0"
const val stetho = "1.6.0"
const val gson = "2.8.7"
const val koin = "3.1.4"
}