forked from upstream-mirrors/OpenTracks
Settings: add custom language/locale chooser (SDK33+).
Corsican was not available using Android's per-app-language-chooser. Fixes #1974.
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
package de.dennisguse.opentracks.settings;
|
||||
|
||||
import android.app.LocaleConfig;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.LocaleList;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.core.os.LocaleListCompat;
|
||||
import androidx.preference.ListPreference;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.Locale;
|
||||
|
||||
import de.dennisguse.opentracks.R;
|
||||
|
||||
public class LocalePreference extends ListPreference {
|
||||
|
||||
public LocalePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public LocalePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public LocalePreference(@NonNull Context context, @Nullable AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public LocalePreference(@NonNull Context context) {
|
||||
super(context);
|
||||
init(context);
|
||||
}
|
||||
|
||||
private void init(Context context) {
|
||||
setPersistent(false);
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
setEnabled(false);
|
||||
return;
|
||||
}
|
||||
LocaleItem systemDefaultLocale = new LocaleItem("", context.getString(R.string.settings_locale_system_default));
|
||||
|
||||
LocaleItem currentLocale = new LocaleItem(Locale.getDefault().toLanguageTag(), Locale.getDefault().getDisplayName());
|
||||
|
||||
// All available options
|
||||
LocaleList supportedLocales = LocaleConfig.fromContextIgnoringOverride(context).getSupportedLocales();
|
||||
ArrayList<LocaleItem> localeItemsSorting = new ArrayList<>();
|
||||
for (int i = 0; i < supportedLocales.size(); i++) {
|
||||
Locale current = supportedLocales.get(i);
|
||||
localeItemsSorting.add(new LocaleItem(current.toLanguageTag(), current.getDisplayName()));
|
||||
}
|
||||
|
||||
localeItemsSorting.removeIf(current -> current.languageTag.equals(currentLocale.languageTag));
|
||||
localeItemsSorting.sort(Comparator.comparing(o -> o.displayName));
|
||||
|
||||
ArrayList<LocaleItem> localeItemList = new ArrayList<>();
|
||||
localeItemList.add(systemDefaultLocale);
|
||||
localeItemList.add(currentLocale);
|
||||
localeItemList.addAll(localeItemsSorting);
|
||||
|
||||
ArrayList<String> entries = new ArrayList<>();
|
||||
ArrayList<String> entryValues = new ArrayList<>();
|
||||
|
||||
for (LocaleItem current : localeItemList) {
|
||||
entries.add(current.displayName);
|
||||
entryValues.add(current.languageTag);
|
||||
}
|
||||
|
||||
setEntries(entries.toArray(new String[]{}));
|
||||
setEntryValues(entryValues.toArray(new String[]{}));
|
||||
|
||||
if (AppCompatDelegate.getApplicationLocales().equals(LocaleListCompat.getEmptyLocaleList())) {
|
||||
setValue(systemDefaultLocale.languageTag);
|
||||
} else {
|
||||
setValue(currentLocale.languageTag);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOnPreferenceChangeListener(@Nullable OnPreferenceChangeListener onPreferenceChangeListener) {
|
||||
super.setOnPreferenceChangeListener(onPreferenceChangeListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean callChangeListener(Object newValue) {
|
||||
LocaleListCompat newLocale = LocaleListCompat.getEmptyLocaleList();
|
||||
if (!newValue.equals("")) {
|
||||
newLocale = LocaleListCompat.forLanguageTags((String) newValue);
|
||||
}
|
||||
AppCompatDelegate.setApplicationLocales(newLocale);
|
||||
return super.callChangeListener(newValue);
|
||||
}
|
||||
|
||||
record LocaleItem(
|
||||
String languageTag,
|
||||
String displayName
|
||||
) {
|
||||
}
|
||||
}
|
||||
@@ -278,6 +278,9 @@
|
||||
<string name="settings_ui_dynamic_colors_key" translatable="false">uiDynamicColors</string>
|
||||
<bool name="settings_ui_dynamic_colors_default" translatable="false">false</bool>
|
||||
|
||||
<!-- androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode() -->
|
||||
<string name="locale_key" translatable="false">localeKey</string>
|
||||
|
||||
<!-- androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode() -->
|
||||
<string name="night_mode_key" translatable="false">nightMode</string>
|
||||
<string name="night_mode_default" translatable="false">@string/night_mode_system_value</string>
|
||||
|
||||
@@ -370,6 +370,9 @@ limitations under the License.
|
||||
<string name="settings_recording_track_name_number_option">Number</string>
|
||||
<string name="settings_recording_track_name_title">Default track name</string>
|
||||
<string name="settings_recording_idle_timeout_title">Idle threshold</string>
|
||||
<string name="settings_locale_title">Language</string>
|
||||
<string name="settings_locale_system_default">System default</string>
|
||||
|
||||
<string name="settings_night_mode_title">UI Theme</string>
|
||||
<string name="settings_night_mode_option_system">System</string>
|
||||
<string name="settings_night_mode_option_day">Day</string>
|
||||
|
||||
@@ -4,6 +4,12 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/settings_ui_title">
|
||||
|
||||
<de.dennisguse.opentracks.settings.LocalePreference
|
||||
android:key="@string/locale_key"
|
||||
android:persistent="false"
|
||||
android:title="@string/settings_locale_title"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="@string/night_mode_default"
|
||||
android:entries="@array/night_mode_options"
|
||||
|
||||
Reference in New Issue
Block a user