feat: Add A13 per-app language preference compatibility with the existing language chooser
This commit is contained in:
parent
4e557fffae
commit
e483038b6c
11 changed files with 113 additions and 45 deletions
|
@ -8,8 +8,8 @@ import androidx.fragment.app.FragmentActivity
|
|||
|
||||
fun Context.setUpMediaRouteButton(menu: Menu) {}
|
||||
|
||||
fun FragmentActivity.installLanguageAndRecreate(code: String) {
|
||||
recreate()
|
||||
fun FragmentActivity.installLanguageAndRecreate(code: String, onInstallComplete: () -> Unit) {
|
||||
onInstallComplete()
|
||||
}
|
||||
|
||||
fun Context.goToProVersion() {}
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
android:enableOnBackInvokedCallback="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:localeConfig="@xml/locales_config"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:restoreAnyVersion="true"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
|
@ -328,6 +329,16 @@
|
|||
<meta-data
|
||||
android:name="com.google.android.gms.car.notification.SmallIcon"
|
||||
android:resource="@drawable/ic_notification" />
|
||||
|
||||
<!-- For auto-storage of locale on Android 12 and lower -->
|
||||
<service
|
||||
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
|
||||
android:enabled="false"
|
||||
android:exported="false">
|
||||
<meta-data
|
||||
android:name="autoStoreLocales"
|
||||
android:value="true" />
|
||||
</service>
|
||||
</application>
|
||||
|
||||
<!--
|
||||
|
|
|
@ -96,6 +96,7 @@ const val ALBUM_COVER_STYLE = "album_cover_style_id"
|
|||
const val ALBUM_COVER_TRANSFORM = "album_cover_transform"
|
||||
const val TAB_TEXT_MODE = "tab_text_mode"
|
||||
const val LANGUAGE_NAME = "language_name"
|
||||
const val LOCALE_AUTO_STORE_ENABLED = "locale_auto_store_enabled"
|
||||
const val SLEEP_TIMER_FINISH_SONG = "sleep_timer_finish_song"
|
||||
const val ALBUM_GRID_STYLE = "album_grid_style_home"
|
||||
const val ARTIST_GRID_STYLE = "artist_grid_style_home"
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
package code.name.monkey.retromusic
|
||||
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.os.LocaleList
|
||||
import code.name.monkey.appthemehelper.util.VersionUtils.hasNougat
|
||||
import java.util.*
|
||||
|
||||
class LanguageContextWrapper(base: Context?) : ContextWrapper(base) {
|
||||
companion object {
|
||||
fun wrap(context: Context?, newLocale: Locale?): LanguageContextWrapper {
|
||||
if (context == null) return LanguageContextWrapper(context)
|
||||
val configuration = context.resources.configuration
|
||||
if (hasNougat()) {
|
||||
configuration.setLocale(newLocale)
|
||||
val localeList = LocaleList(newLocale)
|
||||
LocaleList.setDefault(localeList)
|
||||
configuration.setLocales(localeList)
|
||||
} else {
|
||||
configuration.setLocale(newLocale)
|
||||
}
|
||||
return LanguageContextWrapper(context.createConfigurationContext(configuration))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -15,29 +15,28 @@
|
|||
package code.name.monkey.retromusic.activities.base
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.KeyEvent
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode
|
||||
import androidx.core.os.ConfigurationCompat
|
||||
import androidx.core.os.LocaleListCompat
|
||||
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
|
||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||
import code.name.monkey.retromusic.LanguageContextWrapper
|
||||
import code.name.monkey.retromusic.R
|
||||
import code.name.monkey.retromusic.extensions.*
|
||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||
import code.name.monkey.retromusic.util.maybeShowAnnoyingToasts
|
||||
import code.name.monkey.retromusic.util.theme.getNightMode
|
||||
import code.name.monkey.retromusic.util.theme.getThemeResValue
|
||||
import java.util.*
|
||||
|
||||
abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
|
||||
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
updateLocale()
|
||||
updateTheme()
|
||||
hideStatusBar()
|
||||
super.onCreate(savedInstanceState)
|
||||
|
@ -62,6 +61,14 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
|
|||
}
|
||||
}
|
||||
|
||||
private fun updateLocale() {
|
||||
val localeCode = PreferenceUtil.languageCode
|
||||
if (PreferenceUtil.isLocaleAutoStorageEnabled) {
|
||||
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(localeCode))
|
||||
PreferenceUtil.isLocaleAutoStorageEnabled = true
|
||||
}
|
||||
}
|
||||
|
||||
override fun onWindowFocusChanged(hasFocus: Boolean) {
|
||||
super.onWindowFocusChanged(hasFocus)
|
||||
if (hasFocus) {
|
||||
|
@ -96,14 +103,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
|
|||
}
|
||||
|
||||
override fun attachBaseContext(newBase: Context?) {
|
||||
val code = PreferenceUtil.languageCode
|
||||
val locale = if (code == "auto") {
|
||||
// Get the device default locale
|
||||
ConfigurationCompat.getLocales(Resources.getSystem().configuration)[0]
|
||||
} else {
|
||||
Locale.forLanguageTag(code)
|
||||
}
|
||||
super.attachBaseContext(LanguageContextWrapper.wrap(newBase, locale))
|
||||
super.attachBaseContext(newBase)
|
||||
installSplitCompat()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import android.content.Context
|
|||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import androidx.annotation.IntRange
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.content.pm.PackageInfoCompat
|
||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||
import code.name.monkey.retromusic.util.PreferenceUtil.isAdaptiveColor
|
||||
|
@ -106,6 +107,6 @@ class DeviceInfo(context: Context) {
|
|||
baseTheme = PreferenceUtil.baseTheme
|
||||
nowPlayingTheme = context.getString(nowPlayingScreen.titleRes)
|
||||
isAdaptive = isAdaptiveColor
|
||||
selectedLang = languageCode
|
||||
selectedLang = AppCompatDelegate.getApplicationLocales().toLanguageTags()
|
||||
}
|
||||
}
|
|
@ -16,6 +16,8 @@ package code.name.monkey.retromusic.fragments.settings
|
|||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.os.LocaleListCompat
|
||||
import androidx.preference.Preference
|
||||
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference
|
||||
import code.name.monkey.retromusic.LANGUAGE_NAME
|
||||
|
@ -24,6 +26,7 @@ import code.name.monkey.retromusic.R
|
|||
import code.name.monkey.retromusic.extensions.installLanguageAndRecreate
|
||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||
import code.name.monkey.retromusic.fragments.ReloadType.HomeSections
|
||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||
import org.koin.androidx.viewmodel.ext.android.activityViewModel
|
||||
|
||||
/**
|
||||
|
@ -42,6 +45,8 @@ class OtherSettingsFragment : AbsSettingsFragment() {
|
|||
}
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
PreferenceUtil.languageCode =
|
||||
AppCompatDelegate.getApplicationLocales().toLanguageTags().ifEmpty { "auto" }
|
||||
addPreferencesFromResource(R.xml.pref_advanced)
|
||||
}
|
||||
|
||||
|
@ -56,7 +61,18 @@ class OtherSettingsFragment : AbsSettingsFragment() {
|
|||
val languagePreference: Preference? = findPreference(LANGUAGE_NAME)
|
||||
languagePreference?.setOnPreferenceChangeListener { prefs, newValue ->
|
||||
setSummary(prefs, newValue)
|
||||
requireActivity().installLanguageAndRecreate(newValue.toString())
|
||||
if (newValue as? String == "auto") {
|
||||
AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList())
|
||||
} else {
|
||||
// Install the languages from Play Store first and then set the application locale
|
||||
requireActivity().installLanguageAndRecreate(newValue.toString()) {
|
||||
AppCompatDelegate.setApplicationLocales(
|
||||
LocaleListCompat.forLanguageTags(
|
||||
newValue as? String
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ package code.name.monkey.retromusic.glide
|
|||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.util.Log
|
||||
import code.name.monkey.retromusic.glide.artistimage.ArtistImage
|
||||
import code.name.monkey.retromusic.glide.artistimage.Factory
|
||||
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
|
||||
|
@ -25,6 +26,7 @@ import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
|
|||
import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreview
|
||||
import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreviewLoader
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.GlideBuilder
|
||||
import com.bumptech.glide.Registry
|
||||
import com.bumptech.glide.annotation.GlideModule
|
||||
import com.bumptech.glide.module.AppGlideModule
|
||||
|
@ -33,7 +35,11 @@ import java.io.InputStream
|
|||
@GlideModule
|
||||
class RetroMusicGlideModule : AppGlideModule() {
|
||||
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
|
||||
registry.prepend(PlaylistPreview::class.java, Bitmap::class.java, PlaylistPreviewLoader.Factory(context))
|
||||
registry.prepend(
|
||||
PlaylistPreview::class.java,
|
||||
Bitmap::class.java,
|
||||
PlaylistPreviewLoader.Factory(context)
|
||||
)
|
||||
registry.prepend(
|
||||
AudioFileCover::class.java,
|
||||
InputStream::class.java,
|
||||
|
|
|
@ -98,7 +98,20 @@ object PreferenceUtil {
|
|||
}
|
||||
}
|
||||
|
||||
val languageCode: String get() = sharedPreferences.getString(LANGUAGE_NAME, "auto") ?: "auto"
|
||||
var languageCode: String
|
||||
get() = sharedPreferences.getString(LANGUAGE_NAME, "auto") ?: "auto"
|
||||
set(value) = sharedPreferences.edit {
|
||||
putString(LANGUAGE_NAME, value)
|
||||
}
|
||||
|
||||
var isLocaleAutoStorageEnabled: Boolean
|
||||
get() = sharedPreferences.getBoolean(
|
||||
LOCALE_AUTO_STORE_ENABLED,
|
||||
false
|
||||
)
|
||||
set(value) = sharedPreferences.edit {
|
||||
putBoolean(LOCALE_AUTO_STORE_ENABLED, value)
|
||||
}
|
||||
|
||||
var Fragment.userName
|
||||
get() = sharedPreferences.getString(
|
||||
|
|
45
app/src/main/res/xml/locales_config.xml
Normal file
45
app/src/main/res/xml/locales_config.xml
Normal file
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<locale android:name="en" />
|
||||
<locale android:name="ar-SA" />
|
||||
<locale android:name="eu-ES" />
|
||||
<locale android:name="my-MM" />
|
||||
<locale android:name="zh-CN" />
|
||||
<locale android:name="zh-HK" />
|
||||
<locale android:name="zh-TW" />
|
||||
<locale android:name="hr" />
|
||||
<locale android:name="cs-cz" />
|
||||
<locale android:name="da-DK" />
|
||||
<locale android:name="nl-NL" />
|
||||
<locale android:name="en" />
|
||||
<locale android:name="fil-PH" />
|
||||
<locale android:name="fr" />
|
||||
<locale android:name="de" />
|
||||
<locale android:name="el" />
|
||||
<locale android:name="hi" />
|
||||
<locale android:name="hu" />
|
||||
<locale android:name="in" />
|
||||
<locale android:name="it" />
|
||||
<locale android:name="ja" />
|
||||
<locale android:name="kn" />
|
||||
<locale android:name="ko" />
|
||||
<locale android:name="kmr-TR" />
|
||||
<locale android:name="lv-LV" />
|
||||
<locale android:name="ml" />
|
||||
<locale android:name="fa" />
|
||||
<locale android:name="pl" />
|
||||
<locale android:name="pt-BR" />
|
||||
<locale android:name="pt-PT" />
|
||||
<locale android:name="ro" />
|
||||
<locale android:name="ru" />
|
||||
<locale android:name="sr" />
|
||||
<locale android:name="es" />
|
||||
<locale android:name="es-419" />
|
||||
<locale android:name="sv" />
|
||||
<locale android:name="ta" />
|
||||
<locale android:name="te" />
|
||||
<locale android:name="th-TH" />
|
||||
<locale android:name="tr" />
|
||||
<locale android:name="uk" />
|
||||
<locale android:name="vi" />
|
||||
</locale-config>
|
|
@ -19,7 +19,7 @@ fun Context.setUpMediaRouteButton(menu: Menu) {
|
|||
CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.action_cast)
|
||||
}
|
||||
|
||||
fun FragmentActivity.installLanguageAndRecreate(code: String) {
|
||||
fun FragmentActivity.installLanguageAndRecreate(code: String, onInstallComplete: () -> Unit) {
|
||||
var mySessionId = 0
|
||||
|
||||
val manager = SplitInstallManagerFactory.create(this)
|
||||
|
@ -27,7 +27,7 @@ fun FragmentActivity.installLanguageAndRecreate(code: String) {
|
|||
override fun onStateUpdate(state: SplitInstallSessionState) {
|
||||
// Restart the activity if the language is installed (sessionId is same and status is installed)
|
||||
if (state.sessionId() == mySessionId && state.status() == SplitInstallSessionStatus.INSTALLED) {
|
||||
recreate()
|
||||
onInstallComplete()
|
||||
manager.unregisterListener(this)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue