/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.regionalpreferences; import android.content.Context; import android.icu.util.ULocale; import android.os.LocaleList; import android.provider.Settings; import android.text.TextUtils; import androidx.core.text.util.LocalePreferences; import com.android.internal.app.LocalePicker; import com.android.settings.R; import java.util.Locale; /** Provides utils for regional preferences. */ public class RegionalPreferencesDataUtils { static final String DEFAULT_VALUE = "default"; static String getDefaultUnicodeExtensionData(Context contxt, String type) { // 1. Check cache data in Settings provider. String record = Settings.System.getString( contxt.getContentResolver(), Settings.System.LOCALE_PREFERENCES); String result = ""; if (!TextUtils.isEmpty(record)) { result = Locale.forLanguageTag(record).getUnicodeLocaleType(type); } // 2. Check cache data in default Locale(ICU lib). if (TextUtils.isEmpty(result)) { result = Locale.getDefault(Locale.Category.FORMAT).getUnicodeLocaleType(type); } return result == null ? DEFAULT_VALUE : result; } static void savePreference(Context context, String type, String value) { saveToSettingsProvider(context, type, value); saveToSystem(type, value); } private static void saveToSettingsProvider(Context context, String type, String value) { String record = Settings.System.getString( context.getContentResolver(), Settings.System.LOCALE_PREFERENCES); record = record == null ? "" : record; Settings.System.putString( context.getContentResolver(), Settings.System.LOCALE_PREFERENCES, addUnicodeKeywordToLocale(record, type, value).toLanguageTag()); } private static void saveToSystem(String type, String value) { LocaleList localeList = LocaleList.getDefault(); Locale[] resultLocales = new Locale[localeList.size()]; for (int i = 0; i < localeList.size(); i++) { resultLocales[i] = addUnicodeKeywordToLocale(localeList.get(i), type, value); } LocalePicker.updateLocales(new LocaleList(resultLocales)); } private static Locale addUnicodeKeywordToLocale(Locale locale, String type, String value) { return new Locale.Builder() .setLocale(locale) .setUnicodeLocaleKeyword(type, value) .build(); } private static Locale addUnicodeKeywordToLocale(String languageTag, String type, String value) { return addUnicodeKeywordToLocale(Locale.forLanguageTag(languageTag), type, value); } static String temperatureUnitsConverter(Context context, String unit) { switch (unit) { case LocalePreferences.TemperatureUnit.CELSIUS: return context.getString(R.string.celsius_temperature_unit); case LocalePreferences.TemperatureUnit.FAHRENHEIT: return context.getString(R.string.fahrenheit_temperature_unit); default: return context.getString(R.string.default_string_of_regional_preference); } } static String dayConverter(Context context, String day) { switch (day) { case LocalePreferences.FirstDayOfWeek.MONDAY: return context.getString(R.string.monday_first_day_of_week); case LocalePreferences.FirstDayOfWeek.TUESDAY: return context.getString(R.string.tuesday_first_day_of_week); case LocalePreferences.FirstDayOfWeek.WEDNESDAY: return context.getString(R.string.wednesday_first_day_of_week); case LocalePreferences.FirstDayOfWeek.THURSDAY: return context.getString(R.string.thursday_first_day_of_week); case LocalePreferences.FirstDayOfWeek.FRIDAY: return context.getString(R.string.friday_first_day_of_week); case LocalePreferences.FirstDayOfWeek.SATURDAY: return context.getString(R.string.saturday_first_day_of_week); case LocalePreferences.FirstDayOfWeek.SUNDAY: return context.getString(R.string.sunday_first_day_of_week); default: return context.getString(R.string.default_string_of_regional_preference); } } }