feat: Add A13 per-app language preference compatibility with the existing language chooser

This commit is contained in:
Prathamesh More 2023-03-18 15:50:50 +05:30
parent 4e557fffae
commit e483038b6c
11 changed files with 113 additions and 45 deletions

View file

@ -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() {}

View file

@ -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>
<!--

View file

@ -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"

View file

@ -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))
}
}
}

View file

@ -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()
}
}

View file

@ -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()
}
}

View file

@ -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
}
}

View file

@ -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,

View file

@ -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(

View 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>

View file

@ -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)
}
}