-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRetrofitModule.kt
More file actions
179 lines (156 loc) · 5.69 KB
/
Copy pathRetrofitModule.kt
File metadata and controls
179 lines (156 loc) · 5.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package com.runnect.runnect.di
import com.google.android.gms.auth.api.Auth
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.runnect.runnect.BuildConfig
import com.runnect.runnect.application.ApplicationClass
import com.runnect.runnect.data.network.calladapter.ResultCallAdapterFactory
import com.runnect.runnect.data.network.calladapter.flow.FlowCallAdapterFactory
import com.runnect.runnect.data.network.interceptor.ResponseInterceptor
import com.runnect.runnect.data.repository.*
import com.runnect.runnect.data.service.*
import com.runnect.runnect.data.source.remote.*
import com.runnect.runnect.domain.*
import com.runnect.runnect.util.ApiLogger
import com.runnect.runnect.util.NetworkSecurityUtil
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Qualifier
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object RetrofitModule {
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class Runnect
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class RetrofitV2
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class RetrofitFlow
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class Tmap
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class HttpClient
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class HttpClientV2
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class Auth
@Provides
@Singleton
@HttpClient
fun provideOkHttpClient(
logger: HttpLoggingInterceptor,
@Auth authInterceptor: Interceptor
): OkHttpClient = NetworkSecurityUtil.createSecureOkHttpClient()
.addInterceptor(logger)
.addInterceptor(authInterceptor)
.build()
@Provides
@Singleton
@HttpClientV2
fun provideOkHttpClientV2(
logger: HttpLoggingInterceptor,
@Auth authInterceptor: Interceptor,
responseInterceptor: ResponseInterceptor,
): OkHttpClient = NetworkSecurityUtil.createSecureOkHttpClient()
.addInterceptor(logger)
.addInterceptor(authInterceptor)
.addInterceptor(responseInterceptor)
.build()
@Provides
@Singleton
fun provideLogger(): HttpLoggingInterceptor = HttpLoggingInterceptor(ApiLogger()).apply {
level = HttpLoggingInterceptor.Level.BODY
}
@Provides
@Singleton
@Auth
fun provideAuthInterceptor(interceptor: AuthInterceptor): Interceptor = interceptor
@Provides
@Singleton
fun provideResponseInterceptor(): ResponseInterceptor = ResponseInterceptor()
@OptIn(ExperimentalSerializationApi::class, InternalCoroutinesApi::class)
@Provides
@Singleton
@Runnect
fun provideRunnectRetrofit(json: Json, @HttpClient client: OkHttpClient): Retrofit {
kotlinx.coroutines.internal.synchronized(this) {
val baseUrl = ApplicationClass.getBaseUrl()
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(
json.asConverterFactory("application/json".toMediaType())
).build()
return retrofit ?: throw RuntimeException("Retrofit creation failed.")
}
}
@OptIn(ExperimentalSerializationApi::class, InternalCoroutinesApi::class)
@Provides
@Singleton
@RetrofitV2
fun provideRunnectRetrofitV2(
@HttpClientV2 client: OkHttpClient
): Retrofit {
val baseUrl = ApplicationClass.getBaseUrl()
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(ResultCallAdapterFactory.create())
.build()
return retrofit ?: throw RuntimeException("Retrofit creation failed.")
}
@OptIn(ExperimentalSerializationApi::class, InternalCoroutinesApi::class)
@Provides
@Singleton
@RetrofitFlow
fun provideRunnectRetrofitFlow(
@HttpClientV2 client: OkHttpClient
): Retrofit {
val baseUrl = ApplicationClass.getBaseUrl()
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(FlowCallAdapterFactory.create())
.build()
return retrofit ?: throw RuntimeException("Retrofit creation failed.")
}
@OptIn(ExperimentalSerializationApi::class, InternalCoroutinesApi::class)
@Provides
@Singleton
@Tmap
fun provideTmapRetrofit(json: Json, @HttpClientV2 client: OkHttpClient): Retrofit {
kotlinx.coroutines.internal.synchronized(this) {
val retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.TMAP_BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(ResultCallAdapterFactory.create())
.build()
return retrofit ?: throw RuntimeException("Retrofit creation failed.")
}
}
@Provides
@Singleton
fun provideJson(): Json = Json {
ignoreUnknownKeys = true
}
}