From a5ddcb9cee290d78b2f18e4fd8411bfaee6029c4 Mon Sep 17 00:00:00 2001 From: VSeryi Date: Sun, 14 Apr 2024 00:28:59 +0200 Subject: [PATCH] Add text translations by country --- .../showly2/ui/main/MainViewModel.kt | 2 +- .../showly2/ui/main/cases/MainInitialsCase.kt | 6 +- .../java/com/michaldrabik/common/Config.kt | 4 +- .../database/dao/EpisodeTranslationsDao.kt | 11 +- .../database/dao/MovieTranslationsDao.kt | 11 +- .../database/dao/ShowTranslationsDao.kt | 11 +- .../database/migrations/Migrations.kt | 15 ++- .../database/model/EpisodeTranslation.kt | 3 + .../database/model/MovieTranslation.kt | 3 + .../database/model/ShowTranslation.kt | 3 + .../EpisodeTranslationsLocalDataSource.kt | 6 +- .../MovieTranslationsLocalDataSource.kt | 6 +- .../ShowTranslationsLocalDataSource.kt | 6 +- .../repository/PeopleRepository.kt | 4 +- .../repository/TranslationsRepository.kt | 112 +++++++++++------- .../repository/mappers/TranslationMapper.kt | 15 ++- .../repository/settings/SettingsRepository.kt | 23 +++- .../michaldrabik/ui_base/common/AppCountry.kt | 2 +- .../ui_base/dates/DateFormatProvider.kt | 2 +- .../schedulers/MovieAnnouncementScheduler.kt | 2 +- .../schedulers/ShowAnnouncementScheduler.kt | 2 +- .../cases/DiscoverMoviesCase.kt | 4 +- .../ui_discover/cases/DiscoverShowsCase.kt | 2 +- .../ui_model/SeasonTranslation.kt | 1 + .../com/michaldrabik/ui_model/Translation.kt | 5 +- .../cases/MovieDetailsCollectionMoviesCase.kt | 4 +- .../MovieDetailsCollectionTranslationsCase.kt | 2 +- .../cases/PersonDetailsTranslationsCase.kt | 4 +- .../history/usecases/GetHistoryItemsCase.kt | 4 +- .../cases/SearchSuggestionsCaseTest.kt | 16 +-- .../ui_settings/helpers/AppLanguage.kt | 2 +- .../general/cases/SettingsGeneralMainCase.kt | 27 +++-- .../episodes/ShowDetailsEpisodesViewModel.kt | 2 +- .../ui_statistics/StatisticsViewModel.kt | 2 +- 34 files changed, 208 insertions(+), 116 deletions(-) diff --git a/app/src/main/java/com/michaldrabik/showly2/ui/main/MainViewModel.kt b/app/src/main/java/com/michaldrabik/showly2/ui/main/MainViewModel.kt index c5c428ae24..c0a5a88f4f 100644 --- a/app/src/main/java/com/michaldrabik/showly2/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/michaldrabik/showly2/ui/main/MainViewModel.kt @@ -92,7 +92,7 @@ class MainViewModel @Inject constructor( private fun checkApi13Locale(isInitialRun: Boolean) { if (!isInitialRun && !settingsRepository.isLocaleInitialised) { settingsRepository.isLocaleInitialised = true - val locale = LocaleListCompat.forLanguageTags(settingsRepository.language) + val locale = LocaleListCompat.forLanguageTags(settingsRepository.languageCode) AppCompatDelegate.setApplicationLocales(locale) } } diff --git a/app/src/main/java/com/michaldrabik/showly2/ui/main/cases/MainInitialsCase.kt b/app/src/main/java/com/michaldrabik/showly2/ui/main/cases/MainInitialsCase.kt index 2b8acd274c..98bf93ac01 100644 --- a/app/src/main/java/com/michaldrabik/showly2/ui/main/cases/MainInitialsCase.kt +++ b/app/src/main/java/com/michaldrabik/showly2/ui/main/cases/MainInitialsCase.kt @@ -77,7 +77,7 @@ class MainInitialsCase @Inject constructor( } fun setLanguage(appLanguage: AppLanguage) { - settingsRepository.language = appLanguage.code + settingsRepository.languageCode = appLanguage.code val locales = LocaleListCompat.forLanguageTags(appLanguage.code) AppCompatDelegate.setApplicationLocales(locales) } @@ -98,7 +98,7 @@ class MainInitialsCase @Inject constructor( val languagesCodes = arrayOf(locales[0], locales[1]) .filterNotNull() .map { it.language.lowercase() } - if (languagesCodes.any { it != Locale(Config.DEFAULT_LANGUAGE).language }) { + if (languagesCodes.any { it != Locale(Config.DEFAULT_LANGUAGE_CODE).language }) { val languageCodes = appLanguages.map { it.code } languagesCodes.forEach { language -> if (language in languageCodes) { @@ -106,7 +106,7 @@ class MainInitialsCase @Inject constructor( } } appLanguages - .filter { it.code != Config.DEFAULT_LANGUAGE } + .filter { it.code != Config.DEFAULT_LANGUAGE_CODE } .forEach { appLanguage -> if (appLanguage.code in languagesCodes) { return appLanguage diff --git a/common/src/main/java/com/michaldrabik/common/Config.kt b/common/src/main/java/com/michaldrabik/common/Config.kt index 1a368c5cbc..172361c484 100644 --- a/common/src/main/java/com/michaldrabik/common/Config.kt +++ b/common/src/main/java/com/michaldrabik/common/Config.kt @@ -33,13 +33,15 @@ object Config { const val SEARCH_RECENTS_AMOUNT = 5 const val FANART_GALLERY_IMAGES_LIMIT = 20 const val PULL_TO_REFRESH_COOLDOWN_MS = 10_000 - const val DEFAULT_LANGUAGE = "en" + const val DEFAULT_LANGUAGE_CODE = "en" const val DEFAULT_COUNTRY = "us" const val DEFAULT_DATE_FORMAT = "DEFAULT_24" const val DEFAULT_LIST_VIEW_MODE = "LIST_NORMAL" const val DEFAULT_LISTS_GRID_SPAN = 2 const val HOST_ACTIVITY_NAME = "com.michaldrabik.showly2.ui.main.MainActivity" + val DEFAULT_LANGUAGE by lazy { Pair(DEFAULT_LANGUAGE_CODE, DEFAULT_COUNTRY)} + const val SHOW_WHATS_NEW = true const val SHOW_TIPS_DEBUG = false diff --git a/data-local/src/main/java/com/michaldrabik/data_local/database/dao/EpisodeTranslationsDao.kt b/data-local/src/main/java/com/michaldrabik/data_local/database/dao/EpisodeTranslationsDao.kt index 11ae2c163e..2a8d4b3648 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/database/dao/EpisodeTranslationsDao.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/database/dao/EpisodeTranslationsDao.kt @@ -10,15 +10,18 @@ import com.michaldrabik.data_local.sources.EpisodeTranslationsLocalDataSource @Dao interface EpisodeTranslationsDao : BaseDao, EpisodeTranslationsLocalDataSource { - @Query("SELECT * FROM episodes_translations WHERE id_trakt == :traktEpisodeId AND id_trakt_show == :traktShowId AND language == :language") - override suspend fun getById(traktEpisodeId: Long, traktShowId: Long, language: String): EpisodeTranslation? + @Query("SELECT * FROM episodes_translations WHERE id_trakt == :traktEpisodeId AND id_trakt_show == :traktShowId AND language == :language AND country == :country") + override suspend fun getById(traktEpisodeId: Long, traktShowId: Long, language: String, country: String): EpisodeTranslation? - @Query("SELECT * FROM episodes_translations WHERE id_trakt IN (:traktEpisodeIds) AND id_trakt_show == :traktShowId AND language == :language") - override suspend fun getByIds(traktEpisodeIds: List, traktShowId: Long, language: String): List + @Query("SELECT * FROM episodes_translations WHERE id_trakt IN (:traktEpisodeIds) AND id_trakt_show == :traktShowId AND language == :language AND country == :country") + override suspend fun getByIds(traktEpisodeIds: List, traktShowId: Long, language: String, country: String): List @Insert(onConflict = OnConflictStrategy.REPLACE) override suspend fun insertSingle(translation: EpisodeTranslation) @Query("DELETE FROM episodes_translations WHERE language IN (:languages)") override suspend fun deleteByLanguage(languages: List) + + @Query("DELETE FROM episodes_translations WHERE country IN (:countries)") + override suspend fun deleteByCountry(countries: List) } diff --git a/data-local/src/main/java/com/michaldrabik/data_local/database/dao/MovieTranslationsDao.kt b/data-local/src/main/java/com/michaldrabik/data_local/database/dao/MovieTranslationsDao.kt index e683accea3..393c883202 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/database/dao/MovieTranslationsDao.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/database/dao/MovieTranslationsDao.kt @@ -10,15 +10,18 @@ import com.michaldrabik.data_local.sources.MovieTranslationsLocalDataSource @Dao interface MovieTranslationsDao : BaseDao, MovieTranslationsLocalDataSource { - @Query("SELECT * FROM movies_translations WHERE id_trakt == :traktId AND language == :language") - override suspend fun getById(traktId: Long, language: String): MovieTranslation? + @Query("SELECT * FROM movies_translations WHERE id_trakt == :traktId AND language == :language AND country == :country") + override suspend fun getById(traktId: Long, language: String, country: String): MovieTranslation? - @Query("SELECT * FROM movies_translations WHERE language == :language") - override suspend fun getAll(language: String): List + @Query("SELECT * FROM movies_translations WHERE language == :language AND country == :country") + override suspend fun getAll(language: String, country: String): List @Insert(onConflict = OnConflictStrategy.REPLACE) override suspend fun insertSingle(translation: MovieTranslation) @Query("DELETE FROM movies_translations WHERE language IN (:languages)") override suspend fun deleteByLanguage(languages: List) + + @Query("DELETE FROM movies_translations WHERE country IN (:countries)") + override suspend fun deleteByCountry(countries: List) } diff --git a/data-local/src/main/java/com/michaldrabik/data_local/database/dao/ShowTranslationsDao.kt b/data-local/src/main/java/com/michaldrabik/data_local/database/dao/ShowTranslationsDao.kt index 89b0867e62..bb79694260 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/database/dao/ShowTranslationsDao.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/database/dao/ShowTranslationsDao.kt @@ -10,15 +10,18 @@ import com.michaldrabik.data_local.sources.ShowTranslationsLocalDataSource @Dao interface ShowTranslationsDao : BaseDao, ShowTranslationsLocalDataSource { - @Query("SELECT * FROM shows_translations WHERE id_trakt == :traktId AND language == :language") - override suspend fun getById(traktId: Long, language: String): ShowTranslation? + @Query("SELECT * FROM shows_translations WHERE id_trakt == :traktId AND language == :language AND country == :country") + override suspend fun getById(traktId: Long, language: String, country: String): ShowTranslation? - @Query("SELECT * FROM shows_translations WHERE language == :language") - override suspend fun getAll(language: String): List + @Query("SELECT * FROM shows_translations WHERE language == :language AND country == :country") + override suspend fun getAll(language: String, country: String): List @Insert(onConflict = REPLACE) override suspend fun insertSingle(translation: ShowTranslation) @Query("DELETE FROM shows_translations WHERE language IN (:languages)") override suspend fun deleteByLanguage(languages: List) + + @Query("DELETE FROM shows_translations WHERE country IN (:countries)") + override suspend fun deleteByCountry(countries: List) } diff --git a/data-local/src/main/java/com/michaldrabik/data_local/database/migrations/Migrations.kt b/data-local/src/main/java/com/michaldrabik/data_local/database/migrations/Migrations.kt index b45fda3543..86d96ebb9b 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/database/migrations/Migrations.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/database/migrations/Migrations.kt @@ -5,7 +5,7 @@ import android.content.Context.MODE_PRIVATE import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -const val DATABASE_VERSION = 41 +const val DATABASE_VERSION = 42 const val DATABASE_NAME = "SHOWLY2_DB_2" class Migrations(context: Context) { @@ -770,6 +770,16 @@ class Migrations(context: Context) { } } + private val migration42 = object : Migration(41, 42) { + override fun migrate(database: SupportSQLiteDatabase) { + with(database) { + execSQL("ALTER TABLE movies_translations ADD COLUMN country TEXT") + execSQL("ALTER TABLE shows_translations ADD COLUMN country TEXT") + execSQL("ALTER TABLE episodes_translations ADD COLUMN country TEXT") + } + } + } + fun getAll() = listOf( migration2, migration3, @@ -810,6 +820,7 @@ class Migrations(context: Context) { migration38, migration39, migration40, - migration41 + migration41, + migration42 ) } diff --git a/data-local/src/main/java/com/michaldrabik/data_local/database/model/EpisodeTranslation.kt b/data-local/src/main/java/com/michaldrabik/data_local/database/model/EpisodeTranslation.kt index fbd650e708..425832a3b0 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/database/model/EpisodeTranslation.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/database/model/EpisodeTranslation.kt @@ -27,6 +27,7 @@ data class EpisodeTranslation( @ColumnInfo(name = "id_trakt_show") val idTraktShow: Long, @ColumnInfo(name = "title") val title: String, @ColumnInfo(name = "language") val language: String, + @ColumnInfo(name = "country") val country: String, @ColumnInfo(name = "overview") val overview: String, @ColumnInfo(name = "created_at") val createdAt: Long, @ColumnInfo(name = "updated_at") val updatedAt: Long @@ -38,6 +39,7 @@ data class EpisodeTranslation( traktShowId: Long, title: String, language: String, + country: String, overview: String, createdAt: Long ) = @@ -46,6 +48,7 @@ data class EpisodeTranslation( idTraktShow = traktShowId, title = title, language = language, + country = country, overview = overview, createdAt = createdAt, updatedAt = createdAt diff --git a/data-local/src/main/java/com/michaldrabik/data_local/database/model/MovieTranslation.kt b/data-local/src/main/java/com/michaldrabik/data_local/database/model/MovieTranslation.kt index ee0302f874..59e4eb603f 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/database/model/MovieTranslation.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/database/model/MovieTranslation.kt @@ -23,6 +23,7 @@ data class MovieTranslation( @ColumnInfo(name = "id_trakt") val idTrakt: Long, @ColumnInfo(name = "title") val title: String, @ColumnInfo(name = "language") val language: String, + @ColumnInfo(name = "country") val country: String, @ColumnInfo(name = "overview") val overview: String, @ColumnInfo(name = "created_at") val createdAt: Long, @ColumnInfo(name = "updated_at") val updatedAt: Long @@ -33,6 +34,7 @@ data class MovieTranslation( traktId: Long, title: String, language: String, + country: String, overview: String, createdAt: Long ) = @@ -40,6 +42,7 @@ data class MovieTranslation( idTrakt = traktId, title = title, language = language, + country = country, overview = overview, createdAt = createdAt, updatedAt = createdAt diff --git a/data-local/src/main/java/com/michaldrabik/data_local/database/model/ShowTranslation.kt b/data-local/src/main/java/com/michaldrabik/data_local/database/model/ShowTranslation.kt index aff6a3984e..9a8f5a6874 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/database/model/ShowTranslation.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/database/model/ShowTranslation.kt @@ -23,6 +23,7 @@ data class ShowTranslation( @ColumnInfo(name = "id_trakt") val idTrakt: Long, @ColumnInfo(name = "title") val title: String, @ColumnInfo(name = "language") val language: String, + @ColumnInfo(name = "country") val country: String, @ColumnInfo(name = "overview") val overview: String, @ColumnInfo(name = "created_at") val createdAt: Long, @ColumnInfo(name = "updated_at") val updatedAt: Long @@ -33,6 +34,7 @@ data class ShowTranslation( traktId: Long, title: String, language: String, + country: String, overview: String, createdAt: Long ) = @@ -40,6 +42,7 @@ data class ShowTranslation( idTrakt = traktId, title = title, language = language, + country = country, overview = overview, createdAt = createdAt, updatedAt = createdAt diff --git a/data-local/src/main/java/com/michaldrabik/data_local/sources/EpisodeTranslationsLocalDataSource.kt b/data-local/src/main/java/com/michaldrabik/data_local/sources/EpisodeTranslationsLocalDataSource.kt index 55e5bcd2c2..fc44d83c91 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/sources/EpisodeTranslationsLocalDataSource.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/sources/EpisodeTranslationsLocalDataSource.kt @@ -4,11 +4,13 @@ import com.michaldrabik.data_local.database.model.EpisodeTranslation interface EpisodeTranslationsLocalDataSource { - suspend fun getById(traktEpisodeId: Long, traktShowId: Long, language: String): EpisodeTranslation? + suspend fun getById(traktEpisodeId: Long, traktShowId: Long, language: String, country: String): EpisodeTranslation? - suspend fun getByIds(traktEpisodeIds: List, traktShowId: Long, language: String): List + suspend fun getByIds(traktEpisodeIds: List, traktShowId: Long, language: String, country: String): List suspend fun insertSingle(translation: EpisodeTranslation) suspend fun deleteByLanguage(languages: List) + + suspend fun deleteByCountry(countries: List) } diff --git a/data-local/src/main/java/com/michaldrabik/data_local/sources/MovieTranslationsLocalDataSource.kt b/data-local/src/main/java/com/michaldrabik/data_local/sources/MovieTranslationsLocalDataSource.kt index fbdf636cfb..ea59648671 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/sources/MovieTranslationsLocalDataSource.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/sources/MovieTranslationsLocalDataSource.kt @@ -4,11 +4,13 @@ import com.michaldrabik.data_local.database.model.MovieTranslation interface MovieTranslationsLocalDataSource { - suspend fun getById(traktId: Long, language: String): MovieTranslation? + suspend fun getById(traktId: Long, language: String, country: String): MovieTranslation? - suspend fun getAll(language: String): List + suspend fun getAll(language: String, country: String): List suspend fun insertSingle(translation: MovieTranslation) suspend fun deleteByLanguage(languages: List) + + suspend fun deleteByCountry(countries: List) } diff --git a/data-local/src/main/java/com/michaldrabik/data_local/sources/ShowTranslationsLocalDataSource.kt b/data-local/src/main/java/com/michaldrabik/data_local/sources/ShowTranslationsLocalDataSource.kt index f16ccf4ffc..b3f902e10b 100644 --- a/data-local/src/main/java/com/michaldrabik/data_local/sources/ShowTranslationsLocalDataSource.kt +++ b/data-local/src/main/java/com/michaldrabik/data_local/sources/ShowTranslationsLocalDataSource.kt @@ -4,11 +4,13 @@ import com.michaldrabik.data_local.database.model.ShowTranslation interface ShowTranslationsLocalDataSource { - suspend fun getById(traktId: Long, language: String): ShowTranslation? + suspend fun getById(traktId: Long, language: String, country: String): ShowTranslation? - suspend fun getAll(language: String): List + suspend fun getAll(language: String, country: String): List suspend fun insertSingle(translation: ShowTranslation) suspend fun deleteByLanguage(languages: List) + + suspend fun deleteByCountry(countries: List) } diff --git a/repository/src/main/java/com/michaldrabik/repository/PeopleRepository.kt b/repository/src/main/java/com/michaldrabik/repository/PeopleRepository.kt index a51ce878f6..e731b02016 100644 --- a/repository/src/main/java/com/michaldrabik/repository/PeopleRepository.kt +++ b/repository/src/main/java/com/michaldrabik/repository/PeopleRepository.kt @@ -44,10 +44,10 @@ class PeopleRepository @Inject constructor( return mappers.person.fromDatabase(local, person.characters) } - val language = settingsRepository.language + val language = settingsRepository.languageCode val remotePerson = remoteSource.tmdb.fetchPersonDetails(person.ids.tmdb.id) var bioTranslation: String? = null - if (language != Config.DEFAULT_LANGUAGE) { + if (language != Config.DEFAULT_LANGUAGE_CODE) { val translations = remoteSource.tmdb.fetchPersonTranslations(person.ids.tmdb.id) bioTranslation = translations[language]?.biography } diff --git a/repository/src/main/java/com/michaldrabik/repository/TranslationsRepository.kt b/repository/src/main/java/com/michaldrabik/repository/TranslationsRepository.kt index b7b491598e..734d6ed3c3 100644 --- a/repository/src/main/java/com/michaldrabik/repository/TranslationsRepository.kt +++ b/repository/src/main/java/com/michaldrabik/repository/TranslationsRepository.kt @@ -1,6 +1,8 @@ package com.michaldrabik.repository import android.content.SharedPreferences +import com.michaldrabik.common.Config.DEFAULT_LANGUAGE_CODE +import com.michaldrabik.common.Config.DEFAULT_COUNTRY import com.michaldrabik.common.Config.DEFAULT_LANGUAGE import com.michaldrabik.common.ConfigVariant import com.michaldrabik.common.extensions.nowUtcMillis @@ -11,8 +13,10 @@ import com.michaldrabik.data_local.database.model.ShowTranslation import com.michaldrabik.data_local.database.model.TranslationsMoviesSyncLog import com.michaldrabik.data_local.database.model.TranslationsSyncLog import com.michaldrabik.data_remote.RemoteDataSource +import com.michaldrabik.data_remote.trakt.model.Translation as TraktTranslation import com.michaldrabik.repository.mappers.Mappers -import com.michaldrabik.repository.settings.SettingsRepository.Key.LANGUAGE +import com.michaldrabik.repository.settings.SettingsRepository.Key.COUNTRY +import com.michaldrabik.repository.settings.SettingsRepository.Key.LANGUAGE_CODE import com.michaldrabik.ui_model.Episode import com.michaldrabik.ui_model.IdTrakt import com.michaldrabik.ui_model.Movie @@ -23,7 +27,6 @@ import com.michaldrabik.ui_model.Translation import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton -import com.michaldrabik.data_remote.trakt.model.Translation as TranslationRemote @Singleton class TranslationsRepository @Inject constructor( @@ -33,17 +36,20 @@ class TranslationsRepository @Inject constructor( private val mappers: Mappers, ) { - fun getLanguage() = miscPreferences.getString(LANGUAGE, DEFAULT_LANGUAGE) ?: DEFAULT_LANGUAGE + fun getLanguage() = Pair(getLanguageCode(), getCountry()) - suspend fun loadAllShowsLocal(language: String = DEFAULT_LANGUAGE): Map { - val local = localSource.showTranslations.getAll(language) + fun getCountry() = miscPreferences.getString(COUNTRY, DEFAULT_COUNTRY) ?: DEFAULT_COUNTRY + fun getLanguageCode() = miscPreferences.getString(LANGUAGE_CODE, DEFAULT_LANGUAGE_CODE) ?: DEFAULT_LANGUAGE_CODE + + suspend fun loadAllShowsLocal(language: Pair = DEFAULT_LANGUAGE): Map { + val local = localSource.showTranslations.getAll(language.first, language.second) return local.associate { Pair(it.idTrakt, mappers.translation.fromDatabase(it)) } } - suspend fun loadAllMoviesLocal(language: String = DEFAULT_LANGUAGE): Map { - val local = localSource.movieTranslations.getAll(language) + suspend fun loadAllMoviesLocal(language: Pair = DEFAULT_LANGUAGE): Map { + val local = localSource.movieTranslations.getAll(language.first, language.second) return local.associate { Pair(it.idTrakt, mappers.translation.fromDatabase(it)) } @@ -51,10 +57,13 @@ class TranslationsRepository @Inject constructor( suspend fun loadTranslation( show: Show, - language: String = DEFAULT_LANGUAGE, + language: Pair = DEFAULT_LANGUAGE, onlyLocal: Boolean = false, ): Translation? { - val local = localSource.showTranslations.getById(show.traktId, language) + val code = language.first + val country = language.second + + val local = localSource.showTranslations.getById(show.traktId, code, country) local?.let { return mappers.translation.fromDatabase(it) } @@ -66,9 +75,8 @@ class TranslationsRepository @Inject constructor( } val remoteTranslation = try { - remoteSource.trakt.fetchShowTranslations(show.traktId, language) - .firstOrNull { chineseLanguagePredicate(it) && frenchLanguagePredicate(it) } - } catch (error: Throwable) { + findTranslation(remoteSource.trakt.fetchShowTranslations(show.traktId, code), code, country) + } catch (_: Throwable) { null } @@ -76,7 +84,8 @@ class TranslationsRepository @Inject constructor( val translationDb = ShowTranslation.fromTraktId( show.traktId, translation.title, - language, + code, + country, translation.overview, nowUtcMillis() ) @@ -91,10 +100,13 @@ class TranslationsRepository @Inject constructor( suspend fun loadTranslation( movie: Movie, - language: String = DEFAULT_LANGUAGE, + language: Pair = DEFAULT_LANGUAGE, onlyLocal: Boolean = false, ): Translation? { - val local = localSource.movieTranslations.getById(movie.traktId, language) + val code = language.first + val country = language.second + + val local = localSource.movieTranslations.getById(movie.traktId, code, country) local?.let { return mappers.translation.fromDatabase(it) } @@ -106,8 +118,7 @@ class TranslationsRepository @Inject constructor( } val remoteTranslation = try { - remoteSource.trakt.fetchMovieTranslations(movie.traktId, language) - .firstOrNull { chineseLanguagePredicate(it) && frenchLanguagePredicate(it) } + findTranslation(remoteSource.trakt.fetchMovieTranslations(movie.traktId, code), code, country) } catch (error: Throwable) { null } @@ -116,7 +127,8 @@ class TranslationsRepository @Inject constructor( val translationDb = MovieTranslation.fromTraktId( movie.traktId, translation.title, - language, + code, + country, translation.overview, nowUtcMillis() ) @@ -132,11 +144,14 @@ class TranslationsRepository @Inject constructor( suspend fun loadTranslation( episode: Episode, showId: IdTrakt, - language: String = DEFAULT_LANGUAGE, + language: Pair = DEFAULT_LANGUAGE, onlyLocal: Boolean = false, ): Translation? { + val code = language.first + val country = language.second + val nowMillis = nowUtcMillis() - val local = localSource.episodesTranslations.getById(episode.ids.trakt.id, showId.id, language) + val local = localSource.episodesTranslations.getById(episode.ids.trakt.id, showId.id, code, country) local?.let { val isCacheValid = nowMillis - it.updatedAt < ConfigVariant.TRANSLATION_SYNC_EPISODE_COOLDOWN if (it.title.isNotBlank() && it.overview.isNotBlank()) { @@ -149,7 +164,7 @@ class TranslationsRepository @Inject constructor( if (onlyLocal) return null - val remoteTranslations = remoteSource.trakt.fetchSeasonTranslations(showId.id, episode.season, language) + val remoteTranslations = remoteSource.trakt.fetchSeasonTranslations(showId.id, episode.season, code) .map { mappers.translation.fromNetwork(it) } remoteTranslations @@ -159,16 +174,16 @@ class TranslationsRepository @Inject constructor( traktShowId = showId.id, title = item.title, overview = item.overview, - language = language, + language = code, + country = country, createdAt = nowMillis ) localSource.episodesTranslations.insertSingle(dbItem) } - remoteTranslations - .find { it.ids.trakt == episode.ids.trakt } + findTranslation(episode.ids.trakt.id, remoteTranslations, code, country) ?.let { - return Translation(it.title, it.overview, it.language) + return Translation(it.title, it.overview, it.language, it.country) } return null @@ -177,16 +192,19 @@ class TranslationsRepository @Inject constructor( suspend fun loadTranslations( season: Season, showId: IdTrakt, - language: String = DEFAULT_LANGUAGE + language: Pair = DEFAULT_LANGUAGE, ): List { + val code = language.first + val country = language.second + val episodes = season.episodes.toList() val episodesIds = season.episodes.map { it.ids.trakt.id } - val local = localSource.episodesTranslations.getByIds(episodesIds, showId.id, language) + val local = localSource.episodesTranslations.getByIds(episodesIds, showId.id, code, country) val hasAllTranslated = local.isNotEmpty() && local.all { it.title.isNotBlank() && it.overview.isNotBlank() } val isCacheValid = local.isNotEmpty() && nowUtcMillis() - local.first().updatedAt < ConfigVariant.TRANSLATION_SYNC_EPISODE_COOLDOWN - if (hasAllTranslated || (!hasAllTranslated && isCacheValid)) { + if (hasAllTranslated || isCacheValid) { return episodes.map { episode -> val translation = local.find { it.idTrakt == episode.ids.trakt.id } SeasonTranslation( @@ -195,13 +213,14 @@ class TranslationsRepository @Inject constructor( overview = translation?.overview ?: "", seasonNumber = season.number, episodeNumber = episode.number, - language = language, + language = code, + country = country, isLocal = true ) } } - val remoteTranslation = remoteSource.trakt.fetchSeasonTranslations(showId.id, season.number, language) + val remoteTranslation = remoteSource.trakt.fetchSeasonTranslations(showId.id, season.number, code) .map { mappers.translation.fromNetwork(it) } remoteTranslation @@ -210,7 +229,8 @@ class TranslationsRepository @Inject constructor( item.ids.trakt.id, showId.id, item.title, - language, + code, + country, item.overview, nowUtcMillis() ) @@ -218,30 +238,36 @@ class TranslationsRepository @Inject constructor( } return episodes.map { episode -> - val translation = remoteTranslation.find { it.ids.trakt.id == episode.ids.trakt.id } + val translation = findTranslation(episode.ids.trakt.id, remoteTranslation, code, country) SeasonTranslation( ids = episode.ids.copy(), title = translation?.title ?: "", overview = translation?.overview ?: "", seasonNumber = season.number, episodeNumber = episode.number, - language = language, + language = code, + country = country, isLocal = true ) } } - private fun chineseLanguagePredicate(translation: TranslationRemote) = - if (translation.language?.lowercase() != "zh") { - true - } else { - translation.country?.equals("cn", ignoreCase = true) == true + private fun findTranslation(translations: List, code: String, country: String): TraktTranslation? { + var fallback: TraktTranslation? = null + for (t in translations) { + if (t.country.equals(country, true)) return t + if (fallback == null && t.language.equals(code, true)) fallback = t } + return fallback + } - private fun frenchLanguagePredicate(translation: TranslationRemote) = - if (translation.language?.lowercase() != "fr") { - true - } else { - translation.country?.equals("fr", ignoreCase = true) == true + private fun findTranslation(episodeId: Long, translations: List, code: String, country: String): SeasonTranslation? { + var fallback: SeasonTranslation? = null + for (t in translations) { + if (t.ids.trakt.id != episodeId) continue + if (t.country.equals(country, true)) return t + if (fallback == null && t.language.equals(code, true)) fallback = t } + return fallback + } } diff --git a/repository/src/main/java/com/michaldrabik/repository/mappers/TranslationMapper.kt b/repository/src/main/java/com/michaldrabik/repository/mappers/TranslationMapper.kt index 8aa0b7af8c..243cada587 100644 --- a/repository/src/main/java/com/michaldrabik/repository/mappers/TranslationMapper.kt +++ b/repository/src/main/java/com/michaldrabik/repository/mappers/TranslationMapper.kt @@ -17,7 +17,8 @@ class TranslationMapper @Inject constructor( Translation( title = value?.title ?: "", overview = value?.overview ?: "", - language = value?.language ?: "" + language = value?.language ?: "", + country = value?.country ?: "", ) fun fromNetwork(value: SeasonTranslationNetwork?) = @@ -27,27 +28,31 @@ class TranslationMapper @Inject constructor( episodeNumber = value?.number ?: -1, title = value?.translations?.firstOrNull()?.title ?: "", overview = value?.translations?.firstOrNull()?.overview ?: "", - language = value?.translations?.firstOrNull()?.language ?: "" + language = value?.translations?.firstOrNull()?.language ?: "", + country = value?.translations?.firstOrNull()?.country ?: "" ) fun fromDatabase(value: ShowTranslation?) = Translation( title = value?.title ?: "", overview = value?.overview ?: "", - language = value?.language ?: "" + language = value?.language ?: "", + country = value?.country ?: "" ) fun fromDatabase(value: MovieTranslation?) = Translation( title = value?.title ?: "", overview = value?.overview ?: "", - language = value?.language ?: "" + language = value?.language ?: "", + country = value?.country ?: "" ) fun fromDatabase(value: EpisodeTranslation?) = Translation( title = value?.title ?: "", overview = value?.overview ?: "", - language = value?.language ?: "" + language = value?.language ?: "", + country = value?.country ?: "" ) } diff --git a/repository/src/main/java/com/michaldrabik/repository/settings/SettingsRepository.kt b/repository/src/main/java/com/michaldrabik/repository/settings/SettingsRepository.kt index 900345e4b2..0e7be34b07 100644 --- a/repository/src/main/java/com/michaldrabik/repository/settings/SettingsRepository.kt +++ b/repository/src/main/java/com/michaldrabik/repository/settings/SettingsRepository.kt @@ -4,7 +4,7 @@ import android.content.SharedPreferences import androidx.core.content.edit import com.michaldrabik.common.Config.DEFAULT_COUNTRY import com.michaldrabik.common.Config.DEFAULT_DATE_FORMAT -import com.michaldrabik.common.Config.DEFAULT_LANGUAGE +import com.michaldrabik.common.Config.DEFAULT_LANGUAGE_CODE import com.michaldrabik.common.Mode import com.michaldrabik.common.dispatchers.CoroutineDispatchers import com.michaldrabik.data_local.LocalDataSource @@ -40,9 +40,9 @@ class SettingsRepository @Inject constructor( ) { companion object Key { - const val LANGUAGE = "KEY_LANGUAGE" + const val LANGUAGE_CODE = "KEY_LANGUAGE_CODE" internal const val PREMIUM = "KEY_PREMIUM" - private const val COUNTRY = "KEY_COUNTRY" + const val COUNTRY = "KEY_COUNTRY" private const val DATE_FORMAT = "KEY_DATE_FORMAT" private const val MODE = "KEY_MOVIES_MODE" private const val MOVIES_ENABLED = "KEY_MOVIES_ENABLED" @@ -83,7 +83,7 @@ class SettingsRepository @Inject constructor( var streamingsEnabled by BooleanPreference(preferences, STREAMINGS_ENABLED, true) var isMoviesEnabled by BooleanPreference(preferences, MOVIES_ENABLED, true) var isTwitterAdEnabled by BooleanPreference(preferences, TWITTER_AD_ENABLED, true) - var language by StringPreference(preferences, LANGUAGE, DEFAULT_LANGUAGE) + var languageCode by StringPreference(preferences, LANGUAGE_CODE, DEFAULT_LANGUAGE_CODE) var country by StringPreference(preferences, COUNTRY, DEFAULT_COUNTRY) var dateFormat by StringPreference(preferences, DATE_FORMAT, DEFAULT_DATE_FORMAT) @@ -93,6 +93,8 @@ class SettingsRepository @Inject constructor( var progressNextEpisodeType by EnumPreference(preferences, PROGRESS_NEXT_EPISODE_TYPE, LAST_WATCHED, ProgressNextEpisodeType::class.java) var isLocaleInitialised by BooleanPreference(preferences, LOCALE_INITIALISED, false) + var language: Pair = Pair(languageCode, country) + var mode: Mode get() { val default = Mode.SHOWS.name @@ -126,7 +128,7 @@ class SettingsRepository @Inject constructor( } } - suspend fun clearUnusedTranslations(input: List) { + suspend fun clearUnusedTranslationsByLanguage(input: List) { with(localSource) { transactions.withTransaction { showTranslations.deleteByLanguage(input) @@ -136,4 +138,15 @@ class SettingsRepository @Inject constructor( } } } + + suspend fun clearUnusedTranslationsByCountry(input: List) { + with(localSource) { + transactions.withTransaction { + showTranslations.deleteByCountry(input) + movieTranslations.deleteByCountry(input) + episodesTranslations.deleteByCountry(input) + people.deleteTranslations() + } + } + } } diff --git a/ui-base/src/main/java/com/michaldrabik/ui_base/common/AppCountry.kt b/ui-base/src/main/java/com/michaldrabik/ui_base/common/AppCountry.kt index 052f43aaa8..f7d81f321c 100644 --- a/ui-base/src/main/java/com/michaldrabik/ui_base/common/AppCountry.kt +++ b/ui-base/src/main/java/com/michaldrabik/ui_base/common/AppCountry.kt @@ -55,6 +55,6 @@ enum class AppCountry( VENEZUELA("ve", "Venezuela", "buscar"); companion object { - fun fromCode(code: String) = values().first { it.code == code } + fun fromCode(code: String) = entries.first { it.code.equals(code, ignoreCase = true)} } } diff --git a/ui-base/src/main/java/com/michaldrabik/ui_base/dates/DateFormatProvider.kt b/ui-base/src/main/java/com/michaldrabik/ui_base/dates/DateFormatProvider.kt index f9df22be25..72bf258da9 100644 --- a/ui-base/src/main/java/com/michaldrabik/ui_base/dates/DateFormatProvider.kt +++ b/ui-base/src/main/java/com/michaldrabik/ui_base/dates/DateFormatProvider.kt @@ -87,7 +87,7 @@ class DateFormatProvider @Inject constructor( } private fun createDateFormat(pattern: String): DateTimeFormatter { - val language = settingsRepository.language + val language = settingsRepository.languageCode if (language == "zh") { return DateTimeFormatter.ofPattern(pattern.appendChineseDay()) } diff --git a/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/MovieAnnouncementScheduler.kt b/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/MovieAnnouncementScheduler.kt index caa60c77fb..8c0e787ec2 100644 --- a/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/MovieAnnouncementScheduler.kt +++ b/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/MovieAnnouncementScheduler.kt @@ -43,7 +43,7 @@ class MovieAnnouncementScheduler @Inject constructor( suspend fun scheduleAnnouncement( context: Context, movie: Movie, - language: String, + language: Pair ) { var translation: Translation? = null if (language != Config.DEFAULT_LANGUAGE) { diff --git a/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/ShowAnnouncementScheduler.kt b/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/ShowAnnouncementScheduler.kt index 0b11ceaf10..c003fdc30c 100644 --- a/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/ShowAnnouncementScheduler.kt +++ b/ui-base/src/main/java/com/michaldrabik/ui_base/notifications/schedulers/ShowAnnouncementScheduler.kt @@ -46,7 +46,7 @@ class ShowAnnouncementScheduler @Inject constructor( episodeSeasonNumber: Int, episodeDate: ZonedDateTime, delay: NotificationDelay, - language: String, + language: Pair ) { val show = mappers.show.fromDatabase(showDb) diff --git a/ui-discover-movies/src/main/java/com/michaldrabik/ui_discover_movies/cases/DiscoverMoviesCase.kt b/ui-discover-movies/src/main/java/com/michaldrabik/ui_discover_movies/cases/DiscoverMoviesCase.kt index c483694e42..8b0ae052b3 100644 --- a/ui-discover-movies/src/main/java/com/michaldrabik/ui_discover_movies/cases/DiscoverMoviesCase.kt +++ b/ui-discover-movies/src/main/java/com/michaldrabik/ui_discover_movies/cases/DiscoverMoviesCase.kt @@ -76,7 +76,7 @@ internal class DiscoverMoviesCase @Inject constructor( watchlistMoviesIds: List, hiddenMoviesIds: List, filters: DiscoverFilters?, - language: String + language: Pair ) = coroutineScope { val collectionIds = myMoviesIds + watchlistMoviesIds movies @@ -104,7 +104,7 @@ internal class DiscoverMoviesCase @Inject constructor( .toList() } - private suspend fun loadTranslation(language: String, itemType: ImageType, movie: Movie) = + private suspend fun loadTranslation(language: Pair, itemType: ImageType, movie: Movie) = if (language == Config.DEFAULT_LANGUAGE || itemType == POSTER) null else translationsRepository.loadTranslation(movie, language, true) diff --git a/ui-discover/src/main/java/com/michaldrabik/ui_discover/cases/DiscoverShowsCase.kt b/ui-discover/src/main/java/com/michaldrabik/ui_discover/cases/DiscoverShowsCase.kt index fefb4440fb..76714286e5 100644 --- a/ui-discover/src/main/java/com/michaldrabik/ui_discover/cases/DiscoverShowsCase.kt +++ b/ui-discover/src/main/java/com/michaldrabik/ui_discover/cases/DiscoverShowsCase.kt @@ -135,7 +135,7 @@ internal class DiscoverShowsCase @Inject constructor( } } - private suspend fun loadTranslation(language: String, itemType: ImageType, show: Show) = + private suspend fun loadTranslation(language: Pair, itemType: ImageType, show: Show) = if (language == Config.DEFAULT_LANGUAGE || itemType == ImageType.POSTER) null else translationsRepository.loadTranslation(show, language, true) diff --git a/ui-model/src/main/java/com/michaldrabik/ui_model/SeasonTranslation.kt b/ui-model/src/main/java/com/michaldrabik/ui_model/SeasonTranslation.kt index 8cd7f8f6ea..6b967b4c0b 100644 --- a/ui-model/src/main/java/com/michaldrabik/ui_model/SeasonTranslation.kt +++ b/ui-model/src/main/java/com/michaldrabik/ui_model/SeasonTranslation.kt @@ -7,5 +7,6 @@ data class SeasonTranslation( val episodeNumber: Int, val overview: String, val language: String, + val country: String, val isLocal: Boolean = false ) diff --git a/ui-model/src/main/java/com/michaldrabik/ui_model/Translation.kt b/ui-model/src/main/java/com/michaldrabik/ui_model/Translation.kt index c231d243f2..53df9711e9 100644 --- a/ui-model/src/main/java/com/michaldrabik/ui_model/Translation.kt +++ b/ui-model/src/main/java/com/michaldrabik/ui_model/Translation.kt @@ -3,11 +3,12 @@ package com.michaldrabik.ui_model data class Translation( val title: String, val overview: String, - val language: String + val language: String, + val country: String ) { companion object { - val EMPTY = Translation("", "", "") + val EMPTY = Translation("", "", "", "") } val hasTitle = title.isNotBlank() diff --git a/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionMoviesCase.kt b/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionMoviesCase.kt index 5b8f66c00b..abca75529b 100644 --- a/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionMoviesCase.kt +++ b/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionMoviesCase.kt @@ -32,7 +32,7 @@ class MovieDetailsCollectionMoviesCase @Inject constructor( suspend fun loadCollectionMovies( collectionId: IdTrakt, - language: String + language: Pair ): List = withContext(dispatchers.IO) { val movies = collectionsRepository.loadCollectionItems(collectionId) movies.mapIndexed { index, movie -> @@ -51,7 +51,7 @@ class MovieDetailsCollectionMoviesCase @Inject constructor( }.awaitAll() } - private suspend fun loadTranslation(movie: Movie, language: String): Translation? { + private suspend fun loadTranslation(movie: Movie, language: Pair): Translation? { if (language == DEFAULT_LANGUAGE) return null return translationsRepository.loadTranslation( movie = movie, diff --git a/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionTranslationsCase.kt b/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionTranslationsCase.kt index a8bcb9b64c..b34587ca9f 100644 --- a/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionTranslationsCase.kt +++ b/ui-movie/src/main/java/com/michaldrabik/ui_movie/sections/collections/details/cases/MovieDetailsCollectionTranslationsCase.kt @@ -17,7 +17,7 @@ class MovieDetailsCollectionTranslationsCase @Inject constructor( suspend fun loadMissingTranslation( item: MovieDetailsCollectionItem.MovieItem, - language: String + language: Pair ) = withContext(dispatchers.IO) { try { val translation = translationsRepository.loadTranslation(item.movie, language) ?: Translation.EMPTY diff --git a/ui-people/src/main/java/com/michaldrabik/ui_people/details/cases/PersonDetailsTranslationsCase.kt b/ui-people/src/main/java/com/michaldrabik/ui_people/details/cases/PersonDetailsTranslationsCase.kt index 4ccd5fd192..ec6f07cf7c 100644 --- a/ui-people/src/main/java/com/michaldrabik/ui_people/details/cases/PersonDetailsTranslationsCase.kt +++ b/ui-people/src/main/java/com/michaldrabik/ui_people/details/cases/PersonDetailsTranslationsCase.kt @@ -12,7 +12,7 @@ class PersonDetailsTranslationsCase @Inject constructor( private val translationsRepository: TranslationsRepository, ) { - suspend fun loadMissingTranslation(item: PersonDetailsItem.CreditsShowItem, language: String) = + suspend fun loadMissingTranslation(item: PersonDetailsItem.CreditsShowItem, language: Pair) = try { val translation = translationsRepository.loadTranslation(item.show, language) ?: Translation.EMPTY item.copy(isLoading = false, translation = translation) @@ -21,7 +21,7 @@ class PersonDetailsTranslationsCase @Inject constructor( item.copy(isLoading = false, translation = Translation.EMPTY) } - suspend fun loadMissingTranslation(item: PersonDetailsItem.CreditsMovieItem, language: String) = + suspend fun loadMissingTranslation(item: PersonDetailsItem.CreditsMovieItem, language: Pair) = try { val translation = translationsRepository.loadTranslation(item.movie, language) ?: Translation.EMPTY item.copy(isLoading = false, translation = translation) diff --git a/ui-progress/src/main/java/com/michaldrabik/ui_progress/history/usecases/GetHistoryItemsCase.kt b/ui-progress/src/main/java/com/michaldrabik/ui_progress/history/usecases/GetHistoryItemsCase.kt index 54ea0b0fdf..57de16dec0 100644 --- a/ui-progress/src/main/java/com/michaldrabik/ui_progress/history/usecases/GetHistoryItemsCase.kt +++ b/ui-progress/src/main/java/com/michaldrabik/ui_progress/history/usecases/GetHistoryItemsCase.kt @@ -123,7 +123,7 @@ internal class GetHistoryItemsCase @Inject constructor( val searchItems = filterByQuery(searchQuery, dateFormat, items) val groupedItems = grouper.groupByDay( items = searchItems, - language = language, + language = language.first, ) filtersItem + groupedItems } @@ -146,7 +146,7 @@ internal class GetHistoryItemsCase @Inject constructor( } private suspend fun getTranslation( - language: String, + language: Pair, show: Show, episode: EpisodeUi ): TranslationsBundle? { diff --git a/ui-search/src/test/java/com.michaldrabik.ui_search/cases/SearchSuggestionsCaseTest.kt b/ui-search/src/test/java/com.michaldrabik.ui_search/cases/SearchSuggestionsCaseTest.kt index daac2c44b5..94efe7abe9 100644 --- a/ui-search/src/test/java/com.michaldrabik.ui_search/cases/SearchSuggestionsCaseTest.kt +++ b/ui-search/src/test/java/com.michaldrabik.ui_search/cases/SearchSuggestionsCaseTest.kt @@ -43,7 +43,7 @@ class SearchSuggestionsCaseTest : BaseMockTest() { super.setUp() coEvery { settingsRepository.isMoviesEnabled } returns true - coEvery { translationsRepository.getLanguage() } returns "en" + coEvery { translationsRepository.getLanguage() } returns Pair("en","us") coEvery { database.shows } returns showsDao coEvery { database.movies } returns moviesDao @@ -102,7 +102,7 @@ class SearchSuggestionsCaseTest : BaseMockTest() { @Test fun `Should skip preload local movies translations cache if not default language but movies are disabled`() = runTest { - coEvery { translationsRepository.getLanguage() } returns "br" + coEvery { translationsRepository.getLanguage() } returns Pair("pt","br") coEvery { settingsRepository.isMoviesEnabled } returns false SUT.preloadCache() @@ -118,12 +118,12 @@ class SearchSuggestionsCaseTest : BaseMockTest() { @Test fun `Should preload local translations cache`() = runTest { - coEvery { translationsRepository.getLanguage() } returns "br" + coEvery { translationsRepository.getLanguage() } returns Pair("pt","br") SUT.preloadCache() - coVerify(exactly = 1) { translationsRepository.loadAllShowsLocal("br") } - coVerify(exactly = 1) { translationsRepository.loadAllMoviesLocal("br") } + coVerify(exactly = 1) { translationsRepository.loadAllShowsLocal(Pair("pt","br")) } + coVerify(exactly = 1) { translationsRepository.loadAllMoviesLocal(Pair("pt","br"))} } @Test @@ -137,7 +137,7 @@ class SearchSuggestionsCaseTest : BaseMockTest() { @Test fun `Should clear local caches properly`() = runTest { - coEvery { translationsRepository.getLanguage() } returns "br" + coEvery { translationsRepository.getLanguage() } returns Pair("pt","br") SUT.preloadCache() SUT.clearCache() @@ -145,7 +145,7 @@ class SearchSuggestionsCaseTest : BaseMockTest() { coVerify(exactly = 2) { showsDao.getAll() } coVerify(exactly = 2) { moviesDao.getAll() } - coVerify(exactly = 2) { translationsRepository.loadAllShowsLocal("br") } - coVerify(exactly = 2) { translationsRepository.loadAllMoviesLocal("br") } + coVerify(exactly = 2) { translationsRepository.loadAllShowsLocal(Pair("pt","br")) } + coVerify(exactly = 2) { translationsRepository.loadAllMoviesLocal(Pair("pt","br")) } } } diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/helpers/AppLanguage.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/helpers/AppLanguage.kt index 56d3b678e1..6e5abe1e5d 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/helpers/AppLanguage.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/helpers/AppLanguage.kt @@ -24,6 +24,6 @@ enum class AppLanguage( CHINESE("zh", "Chinese Simplified", R.string.textLanguageChinese); companion object { - fun fromCode(code: String) = values().first { it.code == code } + fun fromCode(code: String) = values().first { it.code.equals(code, ignoreCase = true)} } } diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/general/cases/SettingsGeneralMainCase.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/general/cases/SettingsGeneralMainCase.kt index d8757d24a2..051daa2481 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/general/cases/SettingsGeneralMainCase.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/general/cases/SettingsGeneralMainCase.kt @@ -74,30 +74,39 @@ class SettingsGeneralMainCase @Inject constructor( if (!locales.isEmpty) { val locale = locales.get(0)!!.language val language = AppLanguage.fromCode(locale) - if (settingsRepository.language != locale) { + if (settingsRepository.languageCode != locale) { setLanguage(language) } return language } } - return AppLanguage.fromCode(settingsRepository.language) + return AppLanguage.fromCode(settingsRepository.languageCode) } suspend fun setLanguage(language: AppLanguage) { settingsRepository.run { - this.language = language.code - val unused = AppLanguage.values() - .filter { it.code != Config.DEFAULT_LANGUAGE && it != language } + this.languageCode = language.code + val unused = AppLanguage.entries + .filter { it.code != Config.DEFAULT_LANGUAGE_CODE && it != language } .map { it.code } - clearUnusedTranslations(unused) + clearUnusedTranslationsByLanguage(unused) clearLanguageLogs() } } - fun getCountry() = AppCountry.fromCode(settingsRepository.country) + fun getCountry(): AppCountry { + return AppCountry.fromCode(settingsRepository.country) + } - fun setCountry(country: AppCountry) { - settingsRepository.country = country.code + suspend fun setCountry(country: AppCountry) { + settingsRepository.run { + this.country = country.code + val unused = AppCountry.entries + .filter { it.code != Config.DEFAULT_COUNTRY && it != country } + .map { it.code } + clearUnusedTranslationsByCountry(unused) + clearLanguageLogs() + } } fun getProgressType() = settingsRepository.progressNextEpisodeType diff --git a/ui-show/src/main/java/com/michaldrabik/ui_show/episodes/ShowDetailsEpisodesViewModel.kt b/ui-show/src/main/java/com/michaldrabik/ui_show/episodes/ShowDetailsEpisodesViewModel.kt index abddc97f8f..3464d11b92 100644 --- a/ui-show/src/main/java/com/michaldrabik/ui_show/episodes/ShowDetailsEpisodesViewModel.kt +++ b/ui-show/src/main/java/com/michaldrabik/ui_show/episodes/ShowDetailsEpisodesViewModel.kt @@ -141,7 +141,7 @@ class ShowDetailsEpisodesViewModel @Inject constructor( val episode = episodes.find { it.id == translation.ids.trakt.id } episode?.let { ep -> if (translation.title.isNotBlank() || translation.overview.isNotBlank()) { - val t = Translation(translation.title, translation.overview, translation.language) + val t = Translation(translation.title, translation.overview, translation.language, translation. country) val withTranslation = ep.copy(translation = t) episodes.findReplace(withTranslation) { it.id == withTranslation.id } } diff --git a/ui-statistics/src/main/java/com/michaldrabik/ui_statistics/StatisticsViewModel.kt b/ui-statistics/src/main/java/com/michaldrabik/ui_statistics/StatisticsViewModel.kt index bd769d1ac6..5ff42c3689 100644 --- a/ui-statistics/src/main/java/com/michaldrabik/ui_statistics/StatisticsViewModel.kt +++ b/ui-statistics/src/main/java/com/michaldrabik/ui_statistics/StatisticsViewModel.kt @@ -146,7 +146,7 @@ class StatisticsViewModel @Inject constructor( .toList() .filterNotNull() - private suspend fun loadTranslation(language: String, show: Show) = + private suspend fun loadTranslation(language: Pair, show: Show) = if (language == Config.DEFAULT_LANGUAGE) null else translationsRepository.loadTranslation(show, language, true)