diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 5da148f5..9f83a1c6 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -28,4 +28,6 @@ dependencies { implementation(platform(libs.okhttp.bom)) implementation(libs.okhttp) implementation(libs.okhttp.logging.interceptor) + implementation(libs.retrofit) + implementation(libs.retrofit2.kotlinx.serialization.converter) } diff --git a/core/network/src/main/kotlin/xyz/ksharma/krail/network/di/NetworkModule.kt b/core/network/src/main/kotlin/xyz/ksharma/krail/network/di/NetworkModule.kt index 6ec7d900..62ca404f 100644 --- a/core/network/src/main/kotlin/xyz/ksharma/krail/network/di/NetworkModule.kt +++ b/core/network/src/main/kotlin/xyz/ksharma/krail/network/di/NetworkModule.kt @@ -1,18 +1,23 @@ package xyz.ksharma.krail.network.di +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit import xyz.ksharma.krail.network.BuildConfig import xyz.ksharma.krail.network.interceptor.AuthInterceptor import java.util.concurrent.TimeUnit @Module @InstallIn(SingletonComponent::class) -class NetworkModule { +object NetworkModule { @Provides fun provideOkHttpClient(): OkHttpClient { @@ -34,7 +39,24 @@ class NetworkModule { return okhttpBuilder.build() } - companion object { - const val BASE_URL = "https://api.transport.nsw.gov.au" + @OptIn(ExperimentalSerializationApi::class) + @Provides + fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit { + val json = Json { ignoreUnknownKeys = true } + + val retrofit: Retrofit = Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addConverterFactory( + json.asConverterFactory( + "application/json; charset=UTF8".toMediaType() + ) + ) + .build() + return retrofit } + + fun service(retrofit: Retrofit, clazz: Class): T = retrofit.create(clazz) + + const val BASE_URL = "https://api.transport.nsw.gov.au" } diff --git a/feature/sydney-trains/network/real/src/main/kotlin/xyz/ksharma/krail/sydney/trains/network/real/RealSydneyTrainsService.kt b/feature/sydney-trains/network/real/src/main/kotlin/xyz/ksharma/krail/sydney/trains/network/real/RealSydneyTrainsService.kt index dfdd154f..ade4df20 100644 --- a/feature/sydney-trains/network/real/src/main/kotlin/xyz/ksharma/krail/sydney/trains/network/real/RealSydneyTrainsService.kt +++ b/feature/sydney-trains/network/real/src/main/kotlin/xyz/ksharma/krail/sydney/trains/network/real/RealSydneyTrainsService.kt @@ -7,7 +7,7 @@ import okhttp3.Response import xyz.ksharma.krail.coroutines.ext.safeResult import xyz.ksharma.krail.di.AppDispatchers import xyz.ksharma.krail.di.Dispatcher -import xyz.ksharma.krail.network.di.NetworkModule.Companion.BASE_URL +import xyz.ksharma.krail.network.di.NetworkModule.BASE_URL import xyz.ksharma.krail.network.interceptor.AuthInterceptor.Companion.API_KEY import xyz.ksharma.krail.sydney.trains.network.api.SydneyTrainsService import javax.inject.Inject diff --git a/feature/trip-planner/network/api/build.gradle.kts b/feature/trip-planner/network/api/build.gradle.kts index 959ba952..a8cab0a7 100644 --- a/feature/trip-planner/network/api/build.gradle.kts +++ b/feature/trip-planner/network/api/build.gradle.kts @@ -1,5 +1,6 @@ plugins { alias(libs.plugins.krail.android.library) + alias(libs.plugins.krail.android.hilt) } android { diff --git a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip.planner/network/api/ServiceModule.kt b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip.planner/network/api/ServiceModule.kt new file mode 100644 index 00000000..0dd72859 --- /dev/null +++ b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip.planner/network/api/ServiceModule.kt @@ -0,0 +1,20 @@ +package xyz.ksharma.krail.trip.planner.network.api + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import retrofit2.Retrofit +import xyz.ksharma.krail.network.di.NetworkModule +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +interface ServiceModule { + + @Provides + @Singleton + fun provideTripPlanningService(retrofit: Retrofit): TripPlanningService { + return NetworkModule.service(retrofit, TripPlanningService::class.java) + } +} diff --git a/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip.planner/network/api/SydneyTrainsService.kt b/feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip.planner/network/api/TripPlanningService.kt similarity index 100% rename from feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip.planner/network/api/SydneyTrainsService.kt rename to feature/trip-planner/network/api/src/main/kotlin/xyz/ksharma/krail/trip.planner/network/api/TripPlanningService.kt diff --git a/feature/trip-planner/network/real/build.gradle.kts b/feature/trip-planner/network/real/build.gradle.kts index cf53b4f8..816d7d2c 100644 --- a/feature/trip-planner/network/real/build.gradle.kts +++ b/feature/trip-planner/network/real/build.gradle.kts @@ -13,4 +13,5 @@ dependencies { implementation(platform(libs.okhttp.bom)) implementation(libs.okhttp) + implementation(libs.retrofit) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 214c3385..360d1e77 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,6 +20,7 @@ ksp = "2.0.0-1.0.22" opencsv = "5.5.2" paparazzi = "1.3.2" retrofit = "2.9.0" +retrofit2KotlinxSerializationConverter = "0.8.0" sqldelight = "2.0.2" sqliteAndroidDriver = "2.0.2" wire = "5.0.0" @@ -41,6 +42,7 @@ lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtim lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "android-lifecycle" } lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "android-lifecycle" } opencsv = { module = "com.opencsv:opencsv", version.ref = "opencsv" } +retrofit2-kotlinx-serialization-converter = { module = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter", version.ref = "retrofit2KotlinxSerializationConverter" } timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } #Compose