mirror of
https://github.com/mediathekview/zapp.git
synced 2024-09-19 20:02:17 +02:00
Add in app language picker #327
This commit is contained in:
parent
556952693a
commit
7637755cea
@ -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'
|
||||
|
@ -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" />
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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(","))
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user