diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/Client.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/Client.kt similarity index 95% rename from app/src/main/java/com/owenlejeune/tvtime/api/Client.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/Client.kt index c69a584..5b80c46 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/Client.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/Client.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import okhttp3.Interceptor import org.koin.core.component.KoinComponent diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/ConverterFactoryFactory.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/ConverterFactoryFactory.kt similarity index 70% rename from app/src/main/java/com/owenlejeune/tvtime/api/ConverterFactoryFactory.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/ConverterFactoryFactory.kt index aa6bb48..6be1c24 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/ConverterFactoryFactory.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/ConverterFactoryFactory.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import retrofit2.Converter diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/DateTypeAdapter.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/DateTypeAdapter.kt similarity index 96% rename from app/src/main/java/com/owenlejeune/tvtime/api/DateTypeAdapter.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/DateTypeAdapter.kt index 724206e..2dda9f3 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/DateTypeAdapter.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/DateTypeAdapter.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/DebugHttpClient.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/DebugHttpClient.kt similarity index 90% rename from app/src/main/java/com/owenlejeune/tvtime/api/DebugHttpClient.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/DebugHttpClient.kt index 2bcf3bc..73345bc 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/DebugHttpClient.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/DebugHttpClient.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/GsonConverter.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/GsonConverter.kt similarity index 77% rename from app/src/main/java/com/owenlejeune/tvtime/api/GsonConverter.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/GsonConverter.kt index 30ab9dc..20ee822 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/GsonConverter.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/GsonConverter.kt @@ -1,8 +1,6 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import com.google.gson.Gson -import com.google.gson.GsonBuilder -import com.google.gson.JsonDeserializer import org.koin.core.component.KoinComponent import org.koin.core.component.inject import retrofit2.Converter diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/HttpClient.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/HttpClient.kt similarity index 67% rename from app/src/main/java/com/owenlejeune/tvtime/api/HttpClient.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/HttpClient.kt index cd147e8..e15aacb 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/HttpClient.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/HttpClient.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import okhttp3.OkHttpClient diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/LoadingState.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/LoadingState.kt similarity index 69% rename from app/src/main/java/com/owenlejeune/tvtime/api/LoadingState.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/LoadingState.kt index 4e0d583..0e16da1 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/LoadingState.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/LoadingState.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common enum class LoadingState { diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/ProdHttpClient.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/ProdHttpClient.kt similarity index 77% rename from app/src/main/java/com/owenlejeune/tvtime/api/ProdHttpClient.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/ProdHttpClient.kt index 2519f59..f53f6f3 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/ProdHttpClient.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/ProdHttpClient.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import okhttp3.OkHttpClient diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/QueryParam.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/QueryParam.kt similarity index 75% rename from app/src/main/java/com/owenlejeune/tvtime/api/QueryParam.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/QueryParam.kt index 901c6a4..25e6dfc 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/QueryParam.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/QueryParam.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common class QueryParam(val key: String, val param: String) { diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/ServiceUtils.kt b/app/src/main/java/com/owenlejeune/tvtime/api/common/ServiceUtils.kt similarity index 92% rename from app/src/main/java/com/owenlejeune/tvtime/api/ServiceUtils.kt rename to app/src/main/java/com/owenlejeune/tvtime/api/common/ServiceUtils.kt index 9e0cd31..89f89f3 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/ServiceUtils.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/common/ServiceUtils.kt @@ -1,7 +1,6 @@ -package com.owenlejeune.tvtime.api +package com.owenlejeune.tvtime.api.common import androidx.compose.runtime.MutableState -import kotlinx.coroutines.delay import retrofit2.Response infix fun Response.storedIn(body: (T) -> Unit) { diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesApi.kt b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesApi.kt new file mode 100644 index 0000000..88c091a --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesApi.kt @@ -0,0 +1,12 @@ +package com.owenlejeune.tvtime.api.gotquotes + +import com.owenlejeune.tvtime.api.gotquotes.model.GotQuote +import retrofit2.Response +import retrofit2.http.GET + +interface GotQuotesApi { + + @GET("random/5") + suspend fun getRandomQuotes(): Response> + +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesClient.kt b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesClient.kt new file mode 100644 index 0000000..c1dc176 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesClient.kt @@ -0,0 +1,20 @@ +package com.owenlejeune.tvtime.api.gotquotes + +import com.owenlejeune.tvtime.api.common.Client +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject +import org.koin.core.parameter.parametersOf + +class GotQuotesClient: KoinComponent { + + companion object { + private const val BASE_URL = "https://api.gameofthronesquotes.xyz/v1/" + } + + private val client: Client by inject { parametersOf(BASE_URL) } + + fun createQuotesApi(): GotQuotesApi { + return client.create(GotQuotesApi::class.java) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesService.kt new file mode 100644 index 0000000..1f922fd --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/GotQuotesService.kt @@ -0,0 +1,24 @@ +package com.owenlejeune.tvtime.api.gotquotes + +import androidx.compose.runtime.mutableStateListOf +import com.owenlejeune.tvtime.api.gotquotes.model.GotQuote +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class GotQuotesService: KoinComponent { + + private val api: GotQuotesApi by inject() + + val quotes = mutableStateListOf() + + suspend fun getRandomQuotes() { + quotes.clear() + val response = api.getRandomQuotes() + if (response.isSuccessful) { + response.body()?.let { + quotes.addAll(it) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/model/GotQuote.kt b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/model/GotQuote.kt new file mode 100644 index 0000000..5fed189 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/gotquotes/model/GotQuote.kt @@ -0,0 +1,19 @@ +package com.owenlejeune.tvtime.api.gotquotes.model + +import com.google.gson.annotations.SerializedName + +class GotQuote( + @SerializedName("sentence") val quote: String, + @SerializedName("character") val character: GotCharacter +) + +class GotCharacter( + @SerializedName("name") val name: String, + @SerializedName("slug") val slug: String, + @SerializedName("house") val house: GotHouse +) + +class GotHouse( + @SerializedName("name") val name: String, + @SerializedName("slug") val slug: String +) \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUClient.kt b/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUClient.kt index ceca3fa..2899b8d 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUClient.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUClient.kt @@ -1,6 +1,6 @@ package com.owenlejeune.tvtime.api.nextmcu -import com.owenlejeune.tvtime.api.Client +import com.owenlejeune.tvtime.api.common.Client import org.koin.core.component.KoinComponent import org.koin.core.component.inject import org.koin.core.parameter.parametersOf diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUService.kt index 76f70e9..50c3351 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/nextmcu/NextMCUService.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.nextmcu import androidx.compose.runtime.mutableStateOf -import com.owenlejeune.tvtime.api.LoadingState +import com.owenlejeune.tvtime.api.common.LoadingState import com.owenlejeune.tvtime.api.nextmcu.model.NextMCU import org.koin.core.component.KoinComponent import org.koin.core.component.inject 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 4a11217..9ffa497 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 @@ -2,10 +2,9 @@ package com.owenlejeune.tvtime.api.tmdb import android.annotation.SuppressLint import androidx.compose.ui.text.intl.Locale -import androidx.lifecycle.viewmodel.viewModelFactory import com.owenlejeune.tvtime.BuildConfig -import com.owenlejeune.tvtime.api.Client -import com.owenlejeune.tvtime.api.QueryParam +import com.owenlejeune.tvtime.api.common.Client +import com.owenlejeune.tvtime.api.common.QueryParam import com.owenlejeune.tvtime.api.tmdb.api.v3.AccountApi import com.owenlejeune.tvtime.api.tmdb.api.v3.AuthenticationApi import com.owenlejeune.tvtime.api.tmdb.api.v3.ConfigurationApi @@ -18,7 +17,6 @@ import com.owenlejeune.tvtime.api.tmdb.api.v4.AccountV4Api import com.owenlejeune.tvtime.api.tmdb.api.v4.AuthenticationV4Api import com.owenlejeune.tvtime.api.tmdb.api.v4.ListV4Api import com.owenlejeune.tvtime.extensions.addQueryParams -import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.ui.viewmodel.ConfigurationViewModel import com.owenlejeune.tvtime.utils.SessionManager import okhttp3.Interceptor diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt index 35c12de..8a1db54 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt @@ -4,8 +4,8 @@ import android.util.Log import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.paging.PagingData -import com.owenlejeune.tvtime.api.LoadingState -import com.owenlejeune.tvtime.api.loadRemoteData +import com.owenlejeune.tvtime.api.common.LoadingState +import com.owenlejeune.tvtime.api.common.loadRemoteData import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AccountStates import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastMember import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CrewMember diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt index df1637b..1a6f7d7 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt @@ -2,8 +2,8 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3 import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf -import com.owenlejeune.tvtime.api.LoadingState -import com.owenlejeune.tvtime.api.loadRemoteData +import com.owenlejeune.tvtime.api.common.LoadingState +import com.owenlejeune.tvtime.api.common.loadRemoteData import com.owenlejeune.tvtime.api.tmdb.TmdbClient import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailCast import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailCrew diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt index 58ea2fa..63b74fb 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt @@ -4,8 +4,8 @@ import android.util.Log import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.paging.PagingData -import com.owenlejeune.tvtime.api.LoadingState -import com.owenlejeune.tvtime.api.loadRemoteData +import com.owenlejeune.tvtime.api.common.LoadingState +import com.owenlejeune.tvtime.api.common.loadRemoteData import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AccountStates import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastMember import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CrewMember 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 32fbdb1..4dfa141 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 @@ -2,7 +2,14 @@ package com.owenlejeune.tvtime.di.modules import com.google.gson.GsonBuilder import com.owenlejeune.tvtime.BuildConfig -import com.owenlejeune.tvtime.api.* +import com.owenlejeune.tvtime.api.common.Client +import com.owenlejeune.tvtime.api.common.ConverterFactoryFactory +import com.owenlejeune.tvtime.api.common.DateTypeAdapter +import com.owenlejeune.tvtime.api.common.DebugHttpClient +import com.owenlejeune.tvtime.api.common.GsonConverter +import com.owenlejeune.tvtime.api.common.ProdHttpClient +import com.owenlejeune.tvtime.api.gotquotes.GotQuotesClient +import com.owenlejeune.tvtime.api.gotquotes.GotQuotesService import com.owenlejeune.tvtime.api.nextmcu.NextMCUClient import com.owenlejeune.tvtime.api.nextmcu.NextMCUService import com.owenlejeune.tvtime.api.tmdb.TmdbClient @@ -76,6 +83,10 @@ val networkModule = module { single { get().createNextMcuService() } single { NextMCUService() } + single { GotQuotesClient() } + single { get().createQuotesApi() } + single { GotQuotesService() } + single, Any>> { mapOf( ListItem::class.java to ListItemDeserializer(), diff --git a/app/src/main/java/com/owenlejeune/tvtime/extensions/InterceptorExtensions.kt b/app/src/main/java/com/owenlejeune/tvtime/extensions/InterceptorExtensions.kt index 736b5fb..22547bf 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/extensions/InterceptorExtensions.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/extensions/InterceptorExtensions.kt @@ -1,8 +1,7 @@ package com.owenlejeune.tvtime.extensions -import com.owenlejeune.tvtime.api.QueryParam +import com.owenlejeune.tvtime.api.common.QueryParam import okhttp3.HttpUrl -import okhttp3.Request fun HttpUrl.Builder.addQueryParams(vararg queryParams: QueryParam?): HttpUrl.Builder { return apply { diff --git a/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt b/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt index 92785c8..5cd1e2d 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt @@ -39,6 +39,7 @@ class AppPreferences(context: Context) { private val STORED_TEST_ROUTE = "stored_test_route" private val FLOATING_BOTTOM_BAR = "floating_bottom_bar" private val RECENT_SEARCHES = "recent_searches" + private val SHOW_GOT_QUOTES = "show_got_quotes" } private val preferences: SharedPreferences = context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE) @@ -138,17 +139,22 @@ class AppPreferences(context: Context) { get() = preferences.getBoolean(SHOW_BACKDROP_GALLERY, showBackdropGalleryDefault) set(value) { preferences.put(SHOW_BACKDROP_GALLERY, value) } - /******** Special Features Preferences ********/ - val showNextMcuProductionDefault: Boolean = false - var showNextMcuProduction: Boolean - get() = preferences.getBoolean(SHOW_NEXT_MCU, showNextMcuProductionDefault) - set(value) { preferences.put(SHOW_NEXT_MCU, value) } - val storedTestRouteDefault: String = "" var storedTestRoute: String get() = preferences.getString(STORED_TEST_ROUTE, storedTestRouteDefault) ?: storedTestRouteDefault set(value) { preferences.put(STORED_TEST_ROUTE, value) } + /******** Special Features Preferences ********/ + val showNextMcuProductionDefault: Boolean = true + var showNextMcuProduction: Boolean + get() = preferences.getBoolean(SHOW_NEXT_MCU, showNextMcuProductionDefault) + set(value) { preferences.put(SHOW_NEXT_MCU, value) } + + val showGotQuotesDefault: Boolean = true + var showGotQuotes: Boolean + get() = preferences.getBoolean(SHOW_GOT_QUOTES, showGotQuotesDefault) + set(value) { preferences.put(SHOW_GOT_QUOTES, value) } + /******** General Storage ********/ var recentSearches: MutableList get() = preferences.getStringSet(RECENT_SEARCHES, emptySet())?.toMutableList() ?: emptySet().toMutableList() diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Actions.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Actions.kt index e6076a8..1f9371d 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Actions.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Actions.kt @@ -29,14 +29,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import com.owenlejeune.tvtime.api.LoadingState -import com.owenlejeune.tvtime.extensions.isIn -import com.owenlejeune.tvtime.extensions.shimmerBackground import com.owenlejeune.tvtime.ui.theme.FavoriteSelected import com.owenlejeune.tvtime.ui.theme.RatingSelected import com.owenlejeune.tvtime.ui.theme.WatchlistSelected import com.owenlejeune.tvtime.ui.viewmodel.AccountViewModel -import com.owenlejeune.tvtime.ui.viewmodel.ApplicationViewModel import com.owenlejeune.tvtime.ui.viewmodel.MainViewModel import com.owenlejeune.tvtime.utils.types.MediaViewType import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Cards.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Cards.kt index 5c1333a..1d648ed 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Cards.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Cards.kt @@ -62,6 +62,28 @@ fun ContentCard( } } +@Composable +fun ContentCard( + modifier: Modifier = Modifier, + heading: (@Composable () -> Unit)? = null, + backgroundColor: Color = MaterialTheme.colorScheme.surfaceVariant, + content: @Composable () -> Unit = {} +) { + Card( + modifier = modifier + .fillMaxWidth() + .wrapContentHeight(), + shape = RoundedCornerShape(10.dp), + elevation = CardDefaults.cardElevation(defaultElevation = 8.dp), + colors = CardDefaults.cardColors(containerColor = backgroundColor) + ) { + Column(modifier = Modifier.fillMaxSize()) { + heading?.invoke() + content() + } + } +} + @Composable fun ExpandableContentCard( modifier: Modifier = Modifier, diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt index 7f18092..2f31acc 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt @@ -52,7 +52,7 @@ import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.rememberPagerState import com.owenlejeune.tvtime.R -import com.owenlejeune.tvtime.api.LoadingState +import com.owenlejeune.tvtime.api.common.LoadingState import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Episode import com.owenlejeune.tvtime.api.tmdb.api.v3.model.EpisodeCastMember import com.owenlejeune.tvtime.api.tmdb.api.v3.model.EpisodeCrewMember diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Posters.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Posters.kt index eaa94b5..d77877a 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Posters.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Posters.kt @@ -37,7 +37,6 @@ import androidx.paging.compose.LazyPagingItems import coil.compose.AsyncImage import coil.request.CachePolicy import coil.request.ImageRequest -import com.owenlejeune.tvtime.api.LoadingState import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePagePerson import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TmdbItem import com.owenlejeune.tvtime.extensions.header diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt index c589f73..3b23c2c 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt @@ -70,7 +70,7 @@ import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.rememberPagerState import com.owenlejeune.tvtime.R -import com.owenlejeune.tvtime.api.LoadingState +import com.owenlejeune.tvtime.api.common.LoadingState import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedItem import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedMovie import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedTv @@ -92,7 +92,6 @@ import com.owenlejeune.tvtime.ui.components.AdditionalDetailItem import com.owenlejeune.tvtime.ui.components.AvatarImage import com.owenlejeune.tvtime.ui.components.BackButton import com.owenlejeune.tvtime.ui.components.CastCard -import com.owenlejeune.tvtime.ui.components.CastCrewCard import com.owenlejeune.tvtime.ui.components.ChipDefaults import com.owenlejeune.tvtime.ui.components.ChipGroup import com.owenlejeune.tvtime.ui.components.ChipInfo @@ -118,6 +117,7 @@ import com.owenlejeune.tvtime.ui.theme.Typography import com.owenlejeune.tvtime.ui.viewmodel.ApplicationViewModel import com.owenlejeune.tvtime.ui.viewmodel.MainViewModel import com.owenlejeune.tvtime.ui.viewmodel.SpecialFeaturesViewModel +import com.owenlejeune.tvtime.ui.views.extras.SpecialFeaturesViews import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.TmdbUtils import com.owenlejeune.tvtime.utils.types.MediaViewType @@ -386,6 +386,8 @@ fun MediaViewContent( NextMcuProjectCard(itemId = itemId, appNavController = appNavController) } + SpecialFeaturesViews.viewsMap[itemId]?.invoke() + if (windowSize != WindowSizeClass.Expanded) { ReviewsCard(itemId = itemId, type = type, mainViewModel = mainViewModel, windowSize = windowSize) } diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt index e7fd71a..6334c70 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt @@ -458,6 +458,15 @@ fun SpecialFeaturePreferences() { settingsViewModel.toggleShowNextMcuProduction() } ) + + SwitchPreference( + titleText = "Show Game of Thrones Quotes", + subtitleText = "Show random quotes from Game of Thrones on the show", + checkState = settingsViewModel.showGotQuotes.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleShowGotQuotes() + } + ) } } diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/MainViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/MainViewModel.kt index 7d7b08a..fb83204 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/MainViewModel.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/MainViewModel.kt @@ -3,11 +3,10 @@ package com.owenlejeune.tvtime.ui.viewmodel import android.annotation.SuppressLint import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.lifecycle.ViewModel import androidx.paging.PagingData -import com.owenlejeune.tvtime.api.LoadingState +import com.owenlejeune.tvtime.api.common.LoadingState import com.owenlejeune.tvtime.api.tmdb.api.createPagingFlow import com.owenlejeune.tvtime.api.tmdb.api.v3.MoviesService import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleService @@ -16,7 +15,6 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AccountStates import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastMember import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CrewMember import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedItem -import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Episode import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Keyword @@ -31,7 +29,6 @@ import com.owenlejeune.tvtime.utils.types.MediaViewType import com.owenlejeune.tvtime.utils.types.TimeWindow import com.owenlejeune.tvtime.utils.types.ViewableMediaTypeException import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.cancellable import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SettingsViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SettingsViewModel.kt index 2137090..de5b4cb 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SettingsViewModel.kt @@ -20,11 +20,12 @@ class SettingsViewModel: ViewModel() { private val _chromaMultiplier = MutableStateFlow(preferences.chromaMultiplier) private val _selectedColor = MutableStateFlow(preferences.selectedColor) private val _showBottomTabLabels = MutableStateFlow(preferences.showBottomTabLabels) + private val _showFloatingBottomBar = MutableStateFlow(preferences.floatingBottomBar) private val _showPosterTitles = MutableStateFlow(preferences.showPosterTitles) private val _firstLaunchTesting = MutableStateFlow(preferences.firstLaunchTesting) private val _showBackdropGallery = MutableStateFlow(preferences.showBackdropGallery) private val _showNextMcuProduction = MutableStateFlow(preferences.showNextMcuProduction) - private val _showFloatingBottomBar = MutableStateFlow(preferences.floatingBottomBar) + private val _showGotQuotes = MutableStateFlow(preferences.showGotQuotes) } val showSearchBar = _showSearchBar.asStateFlow() @@ -34,12 +35,13 @@ class SettingsViewModel: ViewModel() { val useSystemColors = _useSystemColors.asStateFlow() val chromaMultiplier = _chromaMultiplier.asStateFlow() val selectedColor = _selectedColor.asStateFlow() + val showFloatingBottomBar = _showFloatingBottomBar.asStateFlow() val showBottomTabLabels = _showBottomTabLabels.asStateFlow() val showPosterTitles = _showPosterTitles.asStateFlow() val firstLaunchTesting = _firstLaunchTesting.asStateFlow() val showBackdropGallery = _showBackdropGallery.asStateFlow() val showNextMcuProduction = _showNextMcuProduction.asStateFlow() - val showFloatingBottomBar = _showFloatingBottomBar.asStateFlow() + val showGotQuotes = _showGotQuotes.asStateFlow() fun toggleShowSearchBar() { _showSearchBar.value = _showSearchBar.value.not() @@ -156,4 +158,14 @@ class SettingsViewModel: ViewModel() { preferences.floatingBottomBar = value } + fun toggleShowGotQuotes() { + _showGotQuotes.value = _showGotQuotes.value.not() + preferences.showGotQuotes = _showGotQuotes.value + } + + fun setShowGotQuotes(value: Boolean) { + _showGotQuotes.value = value + preferences.showGotQuotes = value + } + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SpecialFeaturesViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SpecialFeaturesViewModel.kt index bd27d42..451bd27 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SpecialFeaturesViewModel.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SpecialFeaturesViewModel.kt @@ -1,6 +1,7 @@ package com.owenlejeune.tvtime.ui.viewmodel import androidx.lifecycle.ViewModel +import com.owenlejeune.tvtime.api.gotquotes.GotQuotesService import com.owenlejeune.tvtime.api.nextmcu.NextMCUService import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -8,8 +9,10 @@ import org.koin.core.component.inject class SpecialFeaturesViewModel: ViewModel(), KoinComponent { private val mcuService: NextMCUService by inject() + private val gotQuotesService: GotQuotesService by inject() val nextMcuProject = mcuService.nextMcuProject + val gotQuotes = gotQuotesService.quotes suspend fun getNextMcuProject(force: Boolean = false) { if (nextMcuProject.value == null || force) { @@ -17,4 +20,8 @@ class SpecialFeaturesViewModel: ViewModel(), KoinComponent { } } + suspend fun getGotQuotes() { + gotQuotesService.getRandomQuotes() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/views/extras/SpecialFeaturesViews.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/views/extras/SpecialFeaturesViews.kt new file mode 100644 index 0000000..8378abb --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/views/extras/SpecialFeaturesViews.kt @@ -0,0 +1,112 @@ +package com.owenlejeune.tvtime.ui.views.extras + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Refresh +import androidx.compose.material3.Divider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.owenlejeune.tvtime.R +import com.owenlejeune.tvtime.preferences.AppPreferences +import com.owenlejeune.tvtime.ui.components.ContentCard +import com.owenlejeune.tvtime.ui.viewmodel.SpecialFeaturesViewModel +import kotlinx.coroutines.launch +import org.koin.java.KoinJavaComponent.get + +object SpecialFeaturesViews { + + val viewsMap: Map Unit> = mapOf( + 206584 to { GotQuotesView() }, + 1399 to { GotQuotesView() } + ) + +} + +@Composable +fun GotQuotesView( + appPreferences: AppPreferences = get(AppPreferences::class.java) +) { + if (appPreferences.showGotQuotes) { + val scope = rememberCoroutineScope() + + val viewModel = viewModel() + LaunchedEffect(Unit) { + viewModel.getGotQuotes() + } + + val quotes = remember { viewModel.gotQuotes } + if (quotes.isNotEmpty()) { + ContentCard( + heading = { + Row( + modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp) + ) { + Text( + text = stringResource(R.string.quotes_title), + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(modifier = Modifier.weight(1f)) + IconButton( + modifier = Modifier.offset(x = 8.dp, y = (-8).dp), + onClick = { + scope.launch { viewModel.getGotQuotes() } + } + ) { + Icon( + imageVector = Icons.Outlined.Refresh, + contentDescription = null + ) + } + } + } + ) { + Column( + verticalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier + .padding(horizontal = 16.dp) + .offset(y = (-12).dp) + ) { + quotes.forEachIndexed { index, quote -> + Column { + Text( + text = quote.quote, + color = MaterialTheme.colorScheme.primary + ) + Text( + text = " - ${quote.character.name}", + color = MaterialTheme.colorScheme.onSurfaceVariant, + fontStyle = FontStyle.Italic + ) + } + + if (index != quotes.size - 1) { + Divider( + modifier = Modifier.padding(vertical = 8.dp), + color = MaterialTheme.colorScheme.surface + ) + } + } + Spacer(modifier = Modifier.height(1.dp)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b0d695..c806afe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -267,4 +267,5 @@ Your rating: %1$d/10 Uncredited Clear search query + Quotes \ No newline at end of file