0
0
mirror of https://github.com/mediathekview/zapp.git synced 2024-09-20 04:12:14 +02:00

Add in app language picker #327

This commit is contained in:
Christine Coenen 2022-12-15 17:17:20 +01:00
parent 556952693a
commit 7637755cea
9 changed files with 91 additions and 2 deletions

View File

@ -110,7 +110,7 @@ dependencies {
// support
implementation "androidx.fragment:fragment-ktx:$fragment_version"
implementation 'androidx.activity:activity-ktx:1.6.1'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'androidx.appcompat:appcompat:1.6.0-rc01'
implementation 'com.google.android.material:material:1.7.0'
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation 'androidx.cardview:cardview:1.0.0'

View File

@ -123,6 +123,15 @@
android:exported="false"
android:foregroundServiceType="mediaPlayback" />
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>
<receiver
android:name=".app.mediathek.controller.downloads.RetryDownloadBroadcastReceiver"
android:exported="false" />

View File

@ -3,6 +3,7 @@ package de.christinecoenen.code.zapp.app.settings.ui
import android.content.Context
import android.os.Bundle
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
import androidx.navigation.fragment.findNavController
import androidx.preference.ListPreference
import androidx.preference.Preference
@ -10,6 +11,7 @@ import androidx.preference.PreferenceFragmentCompat
import de.christinecoenen.code.zapp.R
import de.christinecoenen.code.zapp.app.settings.helper.ShortcutPreference
import de.christinecoenen.code.zapp.app.settings.repository.SettingsRepository
import de.christinecoenen.code.zapp.utils.system.LanguageHelper
class SettingsFragment : PreferenceFragmentCompat() {
@ -17,6 +19,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
private const val PREF_SHORTCUTS = "pref_shortcuts"
private const val PREF_UI_MODE = "pref_ui_mode"
private const val PREF_LANGUAGE = "pref_key_language"
private const val PREF_CHANNEL_SELECTION = "pref_key_channel_selection"
}
@ -24,6 +27,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
private lateinit var settingsRepository: SettingsRepository
private lateinit var shortcutPreference: ShortcutPreference
private lateinit var uiModePreference: ListPreference
private lateinit var languagePreference: ListPreference
private lateinit var channelSelectionPreference: Preference
private val uiModeChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
@ -32,6 +36,14 @@ class SettingsFragment : PreferenceFragmentCompat() {
true
}
private val languageChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
val languageTag = newValue as String
val appLocale = LocaleListCompat.forLanguageTags(languageTag)
AppCompatDelegate.setApplicationLocales(appLocale)
true
}
override fun onAttach(context: Context) {
super.onAttach(context)
@ -43,8 +55,14 @@ class SettingsFragment : PreferenceFragmentCompat() {
shortcutPreference = preferenceScreen.findPreference(PREF_SHORTCUTS)!!
uiModePreference = preferenceScreen.findPreference(PREF_UI_MODE)!!
languagePreference = preferenceScreen.findPreference(PREF_LANGUAGE)!!
channelSelectionPreference = preferenceScreen.findPreference(PREF_CHANNEL_SELECTION)!!
val languages = LanguageHelper.getAvailableLanguages(requireContext())
languagePreference.value = LanguageHelper.getCurrentLanguageTag()
languagePreference.entries = languages.values.toTypedArray()
languagePreference.entryValues = languages.keys.toTypedArray()
channelSelectionPreference.setOnPreferenceClickListener {
val direction =
SettingsFragmentDirections.toChannelSelectionFragment()
@ -58,6 +76,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
shortcutPreference.onPreferenceChangeListener = shortcutPreference
uiModePreference.onPreferenceChangeListener = uiModeChangeListener
languagePreference.onPreferenceChangeListener = languageChangeListener
}
override fun onPause() {
@ -65,5 +84,6 @@ class SettingsFragment : PreferenceFragmentCompat() {
shortcutPreference.onPreferenceChangeListener = null
uiModePreference.onPreferenceChangeListener = null
languagePreference.onPreferenceChangeListener = null
}
}

View File

@ -0,0 +1,46 @@
package de.christinecoenen.code.zapp.utils.system
import android.content.Context
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
import de.christinecoenen.code.zapp.R
import org.xmlpull.v1.XmlPullParser
object LanguageHelper {
/**
* @return iso language code (without region)
*/
fun getCurrentLanguageTag(): String {
return AppCompatDelegate.getApplicationLocales()[0]?.language ?: "de"
}
/**
* @return iso langage code mapped to a human readable language label
*/
fun getAvailableLanguages(context: Context): Map<String, String> {
val localeList = getLocaleListFromXml(context)
val localeMap = mutableMapOf<String, String>()
for (i in 0 until localeList.size()) {
val locale = localeList[i]!!
localeMap[locale.toLanguageTag()] = locale.getDisplayName(locale)
}
return localeMap
}
private fun getLocaleListFromXml(context: Context): LocaleListCompat {
val tagsList = mutableListOf<CharSequence>()
val xmlParser = context.resources.getXml(R.xml.locales_config)
while (xmlParser.eventType != XmlPullParser.END_DOCUMENT) {
if (xmlParser.eventType == XmlPullParser.START_TAG && xmlParser.name == "locale") {
tagsList.add(xmlParser.getAttributeValue(0))
}
xmlParser.next()
}
return LocaleListCompat.forLanguageTags(tagsList.joinToString(","))
}
}

View File

@ -1,5 +1,6 @@
# v-next
* Unterstützung für Android 13 (Monochromes Icon, Per-App Sprachauswahl)
* Sprachauswahl in den Einstellungen
* Keine Unterstützung mehr für Android 7
* Nullwerte bei der Anzahl der Sucherergebnisse repariert
* Android TV erhält aktuelle Live-Stream-Adressen

View File

@ -111,10 +111,13 @@
<string name="player_zoom_state_boxed">Original</string>
<!-- preferences -->
<string name="pref_header_design">Design</string>
<string name="pref_header_network">Network</string>
<string name="pref_header_channels">Channels</string>
<string name="pref_header_data">Data</string>
<string name="pref_language_title">Language</string>
<string name="pref_detail_landscape_title">Videos always in landscape mode</string>
<string name="pref_detail_landscape_summary">Locks the app in landscape mode as long as a video is playing</string>

View File

@ -2,6 +2,7 @@
<resources>
<string name="pref_key_ui_mode">pref_ui_mode</string>
<string name="pref_key_language">pref_key_language</string>
<string name="pref_key_detail_landscape">pref_detail_landscape</string>
<string name="pref_key_download_over_unmetered_network_only">pref_download_wifi_only</string>
<string name="pref_key_stream_quality_over_metered_network">pref_key_stream_quality_cellular</string>

View File

@ -111,10 +111,13 @@
<string name="player_zoom_state_boxed">Original</string>
<!-- preferences -->
<string name="pref_header_design">Design</string>
<string name="pref_header_network">Netzwerk</string>
<string name="pref_header_channels">Sender</string>
<string name="pref_header_data">Daten</string>
<string name="pref_language_title">Sprache</string>
<string name="pref_detail_landscape_title">Videos immer im Querformat</string>
<string name="pref_detail_landscape_summary">Sperrt die App im Querformat, solange ein Video läuft</string>

View File

@ -11,7 +11,13 @@
android:entries="@array/pref_ui_mode_names"
android:entryValues="@array/pref_ui_mode_values"
android:key="@string/pref_key_ui_mode"
android:title="Design"
android:title="@string/pref_header_design"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:defaultValue="de"
android:key="@string/pref_key_language"
android:title="@string/pref_language_title"
app:useSimpleSummaryProvider="true" />
<SwitchPreference