From 906c586da888491702a753820c4b84126abe86c1 Mon Sep 17 00:00:00 2001 From: Owen LeJeune Date: Mon, 12 Jun 2023 14:05:40 -0400 Subject: [PATCH] implement configuration endpoint --- .../com/owenlejeune/tvtime/MainActivity.kt | 5 + .../owenlejeune/tvtime/api/tmdb/TmdbClient.kt | 4 + .../api/tmdb/api/v3/ConfigurationApi.kt | 31 +++++ .../tmdb/api/v3/model/ConfigurationCountry.kt | 12 ++ .../tmdb/api/v3/model/ConfigurationDetails.kt | 33 +++++ .../api/tmdb/api/v3/model/ConfigurationJob.kt | 10 ++ .../api/v3/model/ConfigurationLanguage.kt | 12 ++ .../api/v3/model/ConfigurationTimezone.kt | 10 ++ .../owenlejeune/tvtime/di/modules/modules.kt | 1 + .../ui/viewmodel/ConfigurationViewModel.kt | 118 ++++++++++++++++++ 10 files changed, 236 insertions(+) create mode 100644 app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/ConfigurationApi.kt create mode 100644 app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationCountry.kt create mode 100644 app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationDetails.kt create mode 100644 app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationJob.kt create mode 100644 app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationLanguage.kt create mode 100644 app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationTimezone.kt create mode 100644 app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/ConfigurationViewModel.kt diff --git a/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt b/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt index 650ae9c..3bb5ed6 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt @@ -8,12 +8,14 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.rememberNavController import com.kieronquinn.monetcompat.app.MonetCompatActivity import com.owenlejeune.tvtime.extensions.rememberWindowSizeClass import com.owenlejeune.tvtime.ui.navigation.AppNavigationHost import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem import com.owenlejeune.tvtime.ui.theme.TVTimeTheme +import com.owenlejeune.tvtime.ui.viewmodel.ConfigurationViewModel import com.owenlejeune.tvtime.utils.KeyboardManager import com.owenlejeune.tvtime.utils.SessionManager import kotlinx.coroutines.CoroutineScope @@ -34,6 +36,9 @@ class MainActivity : MonetCompatActivity() { lifecycleScope.launchWhenCreated { monet.awaitMonetReady() setContent { + val configurationViewModel = viewModel() + configurationViewModel.getConfigurations() + AppKeyboardFocusManager() TVTimeTheme(monetCompat = monet) { val windowSize = rememberWindowSizeClass() diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt index 9fdf65e..79ebf36 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt @@ -61,6 +61,10 @@ class TmdbClient: KoinComponent { return client.create(AccountApi::class.java) } + fun createConfigurationService(): ConfigurationApi { + return client.create(ConfigurationApi::class.java) + } + fun createV4AccountService(): AccountV4Api { return clientV4.create(AccountV4Api::class.java) } diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/ConfigurationApi.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/ConfigurationApi.kt new file mode 100644 index 0000000..13314db --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/ConfigurationApi.kt @@ -0,0 +1,31 @@ +package com.owenlejeune.tvtime.api.tmdb.api.v3 + +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationCountry +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationDetails +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationJob +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationLanguage +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationTimezone +import retrofit2.Response +import retrofit2.http.GET + +interface ConfigurationApi { + + @GET("configuration") + suspend fun getDetailsConfiguration(): Response + + @GET("configuration/countries") + suspend fun getCountriesConfiguration(): Response> + + @GET("configuration/jobs") + suspend fun getJobsConfiguration(): Response> + + @GET("configuration/languages") + suspend fun getLanguagesConfiguration(): Response> + + @GET("configuration/primary_translations") + suspend fun getPrimaryTranslationsConfiguration(): Response> + + @GET("configuration/timezones") + suspend fun getTimezonesConfiguration(): Response> + +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationCountry.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationCountry.kt new file mode 100644 index 0000000..6133d56 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationCountry.kt @@ -0,0 +1,12 @@ +package com.owenlejeune.tvtime.api.tmdb.api.v3.model + +import com.google.gson.annotations.SerializedName + +data class ConfigurationCountry( + @SerializedName("iso_3166_1") + val iso_3166_1: String, + @SerializedName("english_name") + val englishName: String, + @SerializedName("native_name") + val nativeName: String +) \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationDetails.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationDetails.kt new file mode 100644 index 0000000..26b489d --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationDetails.kt @@ -0,0 +1,33 @@ +package com.owenlejeune.tvtime.api.tmdb.api.v3.model + +import com.google.gson.annotations.SerializedName + +data class ConfigurationDetails( + @SerializedName("images") + val images: ImagesConfiguration +) { + companion object { + val Empty = ConfigurationDetails(ImagesConfiguration.Empty) + } +} + +data class ImagesConfiguration( + @SerializedName("base_url") + val baseUrl: String, + @SerializedName("secure_base_url") + val secureBaseUrl: String, + @SerializedName("backdrop_sizes") + val backdropSizes: List, + @SerializedName("logo_sizes") + val logoSizes: List, + @SerializedName("poster_sizes") + val posterSizes: List, + @SerializedName("profile_sizes") + val profileSizes: List, + @SerializedName("still_sizes") + val stillSizes: List +) { + companion object { + val Empty = ImagesConfiguration("", "", emptyList(), emptyList(), emptyList(), emptyList(), emptyList()) + } +} diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationJob.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationJob.kt new file mode 100644 index 0000000..11e98c1 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationJob.kt @@ -0,0 +1,10 @@ +package com.owenlejeune.tvtime.api.tmdb.api.v3.model + +import com.google.gson.annotations.SerializedName + +data class ConfigurationJob( + @SerializedName("department") + val department: String, + @SerializedName("jobs") + val jobs: List +) \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationLanguage.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationLanguage.kt new file mode 100644 index 0000000..6df473b --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationLanguage.kt @@ -0,0 +1,12 @@ +package com.owenlejeune.tvtime.api.tmdb.api.v3.model + +import com.google.gson.annotations.SerializedName + +data class ConfigurationLanguage( + @SerializedName("iso_639_1") + val iso_639_1: String, + @SerializedName("english_name") + val englishName: String, + @SerializedName("name") + val name: String +) \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationTimezone.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationTimezone.kt new file mode 100644 index 0000000..a90669d --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ConfigurationTimezone.kt @@ -0,0 +1,10 @@ +package com.owenlejeune.tvtime.api.tmdb.api.v3.model + +import com.google.gson.annotations.SerializedName + +data class ConfigurationTimezone( + @SerializedName("iso_3166_1") + val iso_3166_1: String, + @SerializedName("zones") + val zones: List +) \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/di/modules/modules.kt b/app/src/main/java/com/owenlejeune/tvtime/di/modules/modules.kt index 1f97e85..e2c17e7 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/di/modules/modules.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/di/modules/modules.kt @@ -33,6 +33,7 @@ val networkModule = module { single { get().createPeopleService() } single { get().createSearchService() } single { get().createTvService() } + single { get().createConfigurationService() } single { AccountService() } single { AccountV4Service() } diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/ConfigurationViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/ConfigurationViewModel.kt new file mode 100644 index 0000000..26c8688 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/ConfigurationViewModel.kt @@ -0,0 +1,118 @@ +package com.owenlejeune.tvtime.ui.viewmodel + +import android.util.Log +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import com.owenlejeune.tvtime.api.tmdb.api.v3.ConfigurationApi +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationCountry +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationDetails +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationJob +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationLanguage +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ConfigurationTimezone +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject +import retrofit2.Response + +class ConfigurationViewModel: ViewModel(), KoinComponent { + + companion object { + private const val TAG = "ConfigurationViewModel" + } + + private val service: ConfigurationApi by inject() + + val detailsConfiguration = mutableStateOf(ConfigurationDetails.Empty) + val countriesConfiguration = mutableStateListOf() + val jobsConfiguration = mutableStateListOf() + val languagesConfiguration = mutableStateListOf() + val primaryTranslationsConfiguration = mutableStateListOf() + val timezonesConfiguration = mutableStateListOf() + + fun getConfigurations() { + getDetailsConfiguration() + getCountriesConfiguration() + getJobsConfiguration() + getLanguagesConfiguration() + getPrimaryTranslationsConfiguration() + getTimezonesConfiguration() + } + + fun getDetailsConfiguration() { + getConfiguration( + { service.getDetailsConfiguration() }, + { detailsConfiguration.value = it } + ) + } + + fun getCountriesConfiguration() { + getConfiguration( + { service.getCountriesConfiguration() }, + { + countriesConfiguration.clear() + countriesConfiguration.addAll(it) + } + ) + } + + fun getJobsConfiguration() { + getConfiguration( + { service.getJobsConfiguration() }, + { + jobsConfiguration.clear() + jobsConfiguration.addAll(it) + } + ) + } + + fun getLanguagesConfiguration() { + getConfiguration( + { service.getLanguagesConfiguration() }, + { + languagesConfiguration.clear() + languagesConfiguration.addAll(it) + } + ) + } + + fun getPrimaryTranslationsConfiguration() { + getConfiguration( + { service.getPrimaryTranslationsConfiguration() }, + { + primaryTranslationsConfiguration.clear() + primaryTranslationsConfiguration.addAll(it) + } + ) + } + + fun getTimezonesConfiguration() { + getConfiguration( + { service.getTimezonesConfiguration() }, + { + timezonesConfiguration.clear() + timezonesConfiguration.addAll(it) + } + ) + } + + private fun getConfiguration( + fetcher: suspend () -> Response, + bodyHandler: (T) -> Unit + ) { + CoroutineScope(Dispatchers.IO).launch { + val response = fetcher() + if (response.isSuccessful) { + response.body()?.let { + Log.d(TAG, "Successfully got configuration: $it") + bodyHandler(it) + } + } else { + Log.e(TAG, "Issue getting configuration") + } + } + } + +} \ No newline at end of file