Fix locale changing

master
Koitharu 1 year ago
parent 30d1d47cdc
commit e98f5b9d54
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -1,10 +1,16 @@
package org.koitharu.kotatsu.core.ui package org.koitharu.kotatsu.core.ui
import android.content.Context
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleService import androidx.lifecycle.LifecycleService
import leakcanary.AppWatcher import leakcanary.AppWatcher
abstract class BaseService : LifecycleService() { abstract class BaseService : LifecycleService() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(ContextCompat.getContextForLanguage(newBase))
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
AppWatcher.objectWatcher.watch( AppWatcher.objectWatcher.watch(

@ -6,6 +6,7 @@ import android.os.Build
import android.provider.SearchRecentSuggestions import android.provider.SearchRecentSuggestions
import android.text.Html import android.text.Html
import androidx.collection.arraySetOf import androidx.collection.arraySetOf
import androidx.core.content.ContextCompat
import androidx.room.InvalidationTracker import androidx.room.InvalidationTracker
import androidx.work.WorkManager import androidx.work.WorkManager
import coil3.ImageLoader import coil3.ImageLoader
@ -76,6 +77,12 @@ interface AppModule {
companion object { companion object {
@Provides
@LocalizedAppContext
fun provideLocalizedContext(
@ApplicationContext context: Context,
): Context = ContextCompat.getContextForLanguage(context)
@Provides @Provides
@Singleton @Singleton
fun provideNetworkState( fun provideNetworkState(

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.core
import javax.inject.Qualifier
@Qualifier
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER,
AnnotationTarget.VALUE_PARAMETER,
AnnotationTarget.FIELD,
)
annotation class LocalizedAppContext

@ -19,11 +19,11 @@ import coil3.size.Scale
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.ErrorReporterReceiver import org.koitharu.kotatsu.core.ErrorReporterReceiver
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.core.model.LocalMangaSource import org.koitharu.kotatsu.core.model.LocalMangaSource
import org.koitharu.kotatsu.core.nav.AppRouter import org.koitharu.kotatsu.core.nav.AppRouter
import org.koitharu.kotatsu.core.util.ext.getDrawableOrThrow import org.koitharu.kotatsu.core.util.ext.getDrawableOrThrow
@ -43,7 +43,7 @@ private const val CHANNEL_ID_SILENT = "download_bg"
private const val GROUP_ID = "downloads" private const val GROUP_ID = "downloads"
class DownloadNotificationFactory @AssistedInject constructor( class DownloadNotificationFactory @AssistedInject constructor(
@ApplicationContext private val context: Context, @LocalizedAppContext private val context: Context,
private val workManager: WorkManager, private val workManager: WorkManager,
private val coil: ImageLoader, private val coil: ImageLoader,
@Assisted private val uuid: UUID, @Assisted private val uuid: UUID,

@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.onStart
import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.core.db.dao.MangaSourcesDao import org.koitharu.kotatsu.core.db.dao.MangaSourcesDao
import org.koitharu.kotatsu.core.db.entity.MangaSourceEntity import org.koitharu.kotatsu.core.db.entity.MangaSourceEntity
@ -42,7 +43,7 @@ import javax.inject.Singleton
@Singleton @Singleton
class MangaSourcesRepository @Inject constructor( class MangaSourcesRepository @Inject constructor(
@ApplicationContext private val context: Context, @LocalizedAppContext private val context: Context,
private val db: MangaDatabase, private val db: MangaDatabase,
private val settings: AppSettings, private val settings: AppSettings,
) { ) {

@ -7,6 +7,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.core.ui.BaseViewModel import org.koitharu.kotatsu.core.ui.BaseViewModel
import org.koitharu.kotatsu.core.util.LocaleComparator import org.koitharu.kotatsu.core.util.LocaleComparator
import org.koitharu.kotatsu.core.util.ext.mapSortedByCount import org.koitharu.kotatsu.core.util.ext.mapSortedByCount
@ -25,7 +26,7 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class WelcomeViewModel @Inject constructor( class WelcomeViewModel @Inject constructor(
private val repository: MangaSourcesRepository, private val repository: MangaSourcesRepository,
@ApplicationContext context: Context, @LocalizedAppContext context: Context,
) : BaseViewModel() { ) : BaseViewModel() {
private val allSources = repository.allMangaSources private val allSources = repository.allMangaSources

@ -28,6 +28,7 @@ import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okio.use import okio.use
import org.jetbrains.annotations.Blocking import org.jetbrains.annotations.Blocking
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.core.image.BitmapDecoderCompat import org.koitharu.kotatsu.core.image.BitmapDecoderCompat
import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.core.network.CommonHeaders
import org.koitharu.kotatsu.core.network.MangaHttpClient import org.koitharu.kotatsu.core.network.MangaHttpClient
@ -71,7 +72,7 @@ import kotlin.coroutines.CoroutineContext
@ActivityRetainedScoped @ActivityRetainedScoped
class PageLoader @Inject constructor( class PageLoader @Inject constructor(
@ApplicationContext private val context: Context, @LocalizedAppContext private val context: Context,
lifecycle: ActivityRetainedLifecycle, lifecycle: ActivityRetainedLifecycle,
@MangaHttpClient private val okHttp: OkHttpClient, @MangaHttpClient private val okHttp: OkHttpClient,
private val cache: PagesCache, private val cache: PagesCache,

@ -25,6 +25,7 @@ import okio.buffer
import okio.openZip import okio.openZip
import okio.sink import okio.sink
import okio.source import okio.source
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.core.image.BitmapDecoderCompat import org.koitharu.kotatsu.core.image.BitmapDecoderCompat
import org.koitharu.kotatsu.core.os.OpenDocumentTreeHelper import org.koitharu.kotatsu.core.os.OpenDocumentTreeHelper
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
@ -46,7 +47,7 @@ import kotlin.coroutines.resume
class PageSaveHelper @AssistedInject constructor( class PageSaveHelper @AssistedInject constructor(
@Assisted activityResultCaller: ActivityResultCaller, @Assisted activityResultCaller: ActivityResultCaller,
@ApplicationContext private val context: Context, @LocalizedAppContext private val context: Context,
private val settings: AppSettings, private val settings: AppSettings,
private val pageLoaderProvider: Provider<PageLoader>, private val pageLoaderProvider: Provider<PageLoader>,
) : ActivityResultCallback<Uri?> { ) : ActivityResultCallback<Uri?> {

@ -10,6 +10,7 @@ import androidx.preference.get
import dagger.Reusable import dagger.Reusable
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.settings.AppearanceSettingsFragment import org.koitharu.kotatsu.settings.AppearanceSettingsFragment
import org.koitharu.kotatsu.settings.DownloadsSettingsFragment import org.koitharu.kotatsu.settings.DownloadsSettingsFragment
import org.koitharu.kotatsu.settings.NetworkSettingsFragment import org.koitharu.kotatsu.settings.NetworkSettingsFragment
@ -28,7 +29,7 @@ import javax.inject.Inject
@Reusable @Reusable
@SuppressLint("RestrictedApi") @SuppressLint("RestrictedApi")
class SettingsSearchHelper @Inject constructor( class SettingsSearchHelper @Inject constructor(
@ApplicationContext private val context: Context, @LocalizedAppContext private val context: Context,
) { ) {
fun inflatePreferences(): List<SettingsItem> { fun inflatePreferences(): List<SettingsItem> {

@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.core.db.TABLE_SOURCES import org.koitharu.kotatsu.core.db.TABLE_SOURCES
import org.koitharu.kotatsu.core.model.getTitle import org.koitharu.kotatsu.core.model.getTitle
import org.koitharu.kotatsu.core.model.isNsfw import org.koitharu.kotatsu.core.model.isNsfw
@ -31,7 +32,7 @@ import javax.inject.Inject
@ViewModelScoped @ViewModelScoped
class SourcesListProducer @Inject constructor( class SourcesListProducer @Inject constructor(
lifecycle: ViewModelLifecycle, lifecycle: ViewModelLifecycle,
@ApplicationContext private val context: Context, @LocalizedAppContext private val context: Context,
private val repository: MangaSourcesRepository, private val repository: MangaSourcesRepository,
private val settings: AppSettings, private val settings: AppSettings,
) : InvalidationTracker.Observer(TABLE_SOURCES) { ) : InvalidationTracker.Observer(TABLE_SOURCES) {

@ -16,6 +16,7 @@ import coil3.ImageLoader
import coil3.request.ImageRequest import coil3.request.ImageRequest
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.LocalizedAppContext
import org.koitharu.kotatsu.core.nav.AppRouter import org.koitharu.kotatsu.core.nav.AppRouter
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.util.ext.checkNotificationPermission import org.koitharu.kotatsu.core.util.ext.checkNotificationPermission
@ -26,7 +27,7 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter
import javax.inject.Inject import javax.inject.Inject
class TrackerNotificationHelper @Inject constructor( class TrackerNotificationHelper @Inject constructor(
@ApplicationContext private val applicationContext: Context, @LocalizedAppContext private val applicationContext: Context,
private val settings: AppSettings, private val settings: AppSettings,
private val coil: ImageLoader, private val coil: ImageLoader,
) { ) {

@ -1,5 +1,12 @@
package org.koitharu.kotatsu.core.ui package org.koitharu.kotatsu.core.ui
import android.content.Context
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleService import androidx.lifecycle.LifecycleService
abstract class BaseService : LifecycleService() abstract class BaseService : LifecycleService() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(ContextCompat.getContextForLanguage(newBase))
}
}

@ -1,5 +1,12 @@
package org.koitharu.kotatsu.core.ui package org.koitharu.kotatsu.core.ui
import android.content.Context
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleService import androidx.lifecycle.LifecycleService
abstract class BaseService : LifecycleService() abstract class BaseService : LifecycleService() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(ContextCompat.getContextForLanguage(newBase))
}
}

Loading…
Cancel
Save