TurKurT656
5/6/2019 - 10:36 AM

NetworkModule.kt

package io.omido.tabrizonline.di

import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import okhttp3.Cache
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module.module
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import timber.log.Timber
import java.io.File
import java.util.concurrent.TimeUnit

private const val LOGGING_INTERCEPTOR = "Logging Interceptor"
private const val API_INTERCEPTOR = "API Interceptor"
private const val USER_AGENT_INTERCEPTOR = "User Agent Interceptor"
private const val CACHE_FILE = "Cache File"
private const val CACHE_NAME = "okhttp_cache"
private const val CACHE_SIZE = (5 * 1024 * 1024L)
//private const val BASE_URL = "http://10.0.2.2/TabrizOnline/Web/tabriz-online/public/api/"
private const val BASE_URL = "http://app.anilaserv.ir/api/"
private const val API_KEY = "X-API-KEY"
private const val API_KEY_VALUE = "4B2530DB288AD727084BE9E91E0CEC32C4298C84"
private const val USER_AGENT = "User-Agent"
private const val USER_AGENT_VALUE = "Android Client"

val networkModule = module {

    factory(CACHE_FILE) {
        File(androidContext().cacheDir, CACHE_NAME).apply {
            if (!exists()) mkdir()
        }
    }

    factory { Cache(get(CACHE_FILE), CACHE_SIZE) }

    factory<Interceptor>(LOGGING_INTERCEPTOR) {
        HttpLoggingInterceptor { log ->
            Timber.d(log)
        }.apply {
            level = HttpLoggingInterceptor.Level.BODY
        }
    }

    factory(API_INTERCEPTOR) {
        Interceptor { chain ->
            val request = chain.request().newBuilder()
                .addHeader(API_KEY, API_KEY_VALUE)
                .build()
            return@Interceptor chain.proceed(request)
        }
    }

    factory(USER_AGENT_INTERCEPTOR) {
        Interceptor { chain ->
            val request = chain.request().newBuilder()
                .addHeader(USER_AGENT, USER_AGENT_VALUE)
                .build()
            return@Interceptor chain.proceed(request)
        }
    }

    single<OkHttpClient> {
        OkHttpClient.Builder()
            .addInterceptor(get(API_INTERCEPTOR))
            .addInterceptor(get(USER_AGENT_INTERCEPTOR))
            .addInterceptor(get(LOGGING_INTERCEPTOR))
            .cache(get())
            .callTimeout(15, TimeUnit.SECONDS)
            .writeTimeout(15, TimeUnit.SECONDS)
            .connectTimeout(15, TimeUnit.SECONDS)
            .readTimeout(15, TimeUnit.SECONDS)
            .build()
    }

    single<Retrofit> {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(get())
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

}