Merge changes from topic "regional_preference_metrics" into udc-dev

* changes:
  [Regional Pref] Remove Calendar controller and related Fragement
  [Regional Pref] 1. Add metrics for user changes the First day of week 2. Refactor to Settings design
  [Regional Pref] 1. Add metrics for user changes the Temperature unit 2. Refactor to Settings design
This commit is contained in:
Zoey Chen
2023-04-25 02:59:27 +00:00
committed by Android (Google) Code Review
20 changed files with 781 additions and 436 deletions

View File

@@ -1389,20 +1389,6 @@
<item>sat</item> <item>sat</item>
</string-array> </string-array>
<!-- A list for all supported calendar types. [DO NOT TRANSLATE] -->
<string-array name="calendar_type">
<item>default</item>
<item>chinese</item>
<item>dangi</item>
<item>hebrew</item>
<item>indian</item>
<item>islamic</item>
<item>islamic-rgsa</item>
<item>islamic-tbla</item>
<item>islamic-umalqura</item>
<item>persian</item>
</string-array>
<!-- Screen flash notification color when activating --> <!-- Screen flash notification color when activating -->
<array name="screen_flash_notification_preset_opacity_colors"> <array name="screen_flash_notification_preset_opacity_colors">
<item>@color/screen_flash_preset_opacity_color_01</item> <item>@color/screen_flash_preset_opacity_color_01</item>

View File

@@ -401,8 +401,6 @@
<string name="regional_preferences_option_page_sub_title">Apps will use your regional preferences where possible.</string> <string name="regional_preferences_option_page_sub_title">Apps will use your regional preferences where possible.</string>
<!-- The title of menu entry of Temperature unit preference. [CHAR LIMIT=50] --> <!-- The title of menu entry of Temperature unit preference. [CHAR LIMIT=50] -->
<string name="temperature_preferences_title">Temperature</string> <string name="temperature_preferences_title">Temperature</string>
<!-- The title of the menu entry of Calendar type preference. [CHAR LIMIT=50] -->
<string name="calendar_preferences_title">Calendar</string>
<!-- The title of the menu entry of First day of week preference. [CHAR LIMIT=50] --> <!-- The title of the menu entry of First day of week preference. [CHAR LIMIT=50] -->
<string name="first_day_of_week_preferences_title">First day of week</string> <string name="first_day_of_week_preferences_title">First day of week</string>
<!-- The title of the menu entry of Numbers system preference. [CHAR LIMIT=50] --> <!-- The title of the menu entry of Numbers system preference. [CHAR LIMIT=50] -->

View File

@@ -27,29 +27,18 @@
android:title="@string/temperature_preferences_title" android:title="@string/temperature_preferences_title"
android:summary="@string/default_string_of_regional_preference" android:summary="@string/default_string_of_regional_preference"
settings:controller="com.android.settings.regionalpreferences.TemperatureUnitController" settings:controller="com.android.settings.regionalpreferences.TemperatureUnitController"
settings:fragment="com.android.settings.regionalpreferences.RegionalPreferencesFragment"> settings:fragment="com.android.settings.regionalpreferences.TemperatureUnitFragment">
<extra <extra
android:name="arg_key_regional_preference" android:name="arg_key_regional_preference"
android:value="mu" /> android:value="mu" />
</Preference> </Preference>
<Preference
android:key="key_calendar_type"
android:title="@string/calendar_preferences_title"
android:summary="@string/default_string_of_regional_preference"
settings:controller="com.android.settings.regionalpreferences.CalendarTypeController"
settings:fragment="com.android.settings.regionalpreferences.RegionalPreferencesFragment">
<extra
android:name="arg_key_regional_preference"
android:value="ca" />
</Preference>
<Preference <Preference
android:key="key_first_day_of_week" android:key="key_first_day_of_week"
android:title="@string/first_day_of_week_preferences_title" android:title="@string/first_day_of_week_preferences_title"
android:summary="@string/default_string_of_regional_preference" android:summary="@string/default_string_of_regional_preference"
settings:controller="com.android.settings.regionalpreferences.FirstDayOfWeekController" settings:controller="com.android.settings.regionalpreferences.FirstDayOfWeekController"
settings:fragment="com.android.settings.regionalpreferences.RegionalPreferencesFragment"> settings:fragment="com.android.settings.regionalpreferences.FirstDayOfWeekItemFragment">
<extra <extra
android:name="arg_key_regional_preference" android:name="arg_key_regional_preference"
android:value="fw" /> android:value="fw" />

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/first_day_of_week_preferences_title">
<com.android.settingslib.widget.TopIntroPreference
android:title="@string/regional_preferences_option_page_sub_title"
android:persistent="false" />
<PreferenceCategory
android:key="first_day_of_week_item_category"
android:title="@string/summary_placeholder"
android:layout="@layout/preference_category_no_label"
settings:controller="com.android.settings.regionalpreferences.FirstDayOfWeekItemCategoryController"/>
</PreferenceScreen>

View File

@@ -13,10 +13,20 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/temperature_preferences_title">
<com.android.settingslib.widget.TopIntroPreference <com.android.settingslib.widget.TopIntroPreference
android:key="key_option_page_sub_title"
android:title="@string/regional_preferences_option_page_sub_title" android:title="@string/regional_preferences_option_page_sub_title"
android:persistent="false" /> android:persistent="false" />
<PreferenceCategory
android:key="temperature_unit_category"
android:title="@string/summary_placeholder"
android:layout="@layout/preference_category_no_label"
settings:controller="com.android.settings.regionalpreferences.TemperatureUnitCategoryController"/>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -1,71 +0,0 @@
/*
* Copyright (C) 2022 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.os.SystemProperties;
import android.provider.Settings;
import com.android.settings.core.BasePreferenceController;
import java.util.Locale;
/**
* A controller for the entry of Calendar types' page
*/
public class CalendarTypeController extends BasePreferenceController {
private static final String CALENDAR_FEATURE_PROPERTY =
"i18n-feature-locale-preference-calendar";
private static final String TAG = CalendarTypeController.class.getSimpleName();
public CalendarTypeController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
/**
* @return {@link AvailabilityStatus} for the Setting. This status is used to determine if the
* Setting should be shown or disabled in Settings. Further, it can be used to produce
* appropriate error / warning Slice in the case of unavailability.
* </p>
* The status is used for the convenience methods: {@link #isAvailable()}, {@link
* #isSupported()}
* </p>
* The inherited class doesn't need to check work profile if android:forWork="true" is set in
* preference xml.
*/
@Override
public int getAvailabilityStatus() {
return SystemProperties.getBoolean(CALENDAR_FEATURE_PROPERTY, false)
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public CharSequence getSummary() {
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
String result = "";
if (record != null) {
result = LocalePreferences.getCalendarType(Locale.forLanguageTag(record), false);
}
if (result.isEmpty()) {
result = LocalePreferences.getCalendarType(false);
}
String inputStr = result.isEmpty() ? RegionalPreferencesDataUtils.DEFAULT_VALUE : result;
return RegionalPreferencesDataUtils.calendarConverter(mContext, inputStr);
}
}

View File

@@ -0,0 +1,61 @@
/**
* 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.util.Log;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
import com.android.settings.widget.PreferenceCategoryController;
/** Category preference controller for first day of week preferences. */
public class FirstDayOfWeekItemCategoryController extends PreferenceCategoryController {
private static final String LOG_TAG = "FirstDayOfWeekItemCategoryController";
private static final String KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM =
"first_day_of_week_item_category";
private static final String KEY_PREFERENCE_FIRST_DAY_OF_WEEK_ITEM =
"first_day_of_week_item_list";
private PreferenceCategory mPreferenceCategory;
private FirstDayOfWeekItemListController mFirstDayOfWeekItemListController;
public FirstDayOfWeekItemCategoryController(Context context, String key) {
super(context, key);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceCategory = screen.findPreference(KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM);
if (mPreferenceCategory == null) {
Log.d(LOG_TAG, "displayPreference(), Can not find the category.");
return;
}
mPreferenceCategory.setVisible(isAvailable());
mFirstDayOfWeekItemListController = new FirstDayOfWeekItemListController(mContext,
KEY_PREFERENCE_FIRST_DAY_OF_WEEK_ITEM);
mFirstDayOfWeekItemListController.displayPreference(screen);
}
}

View File

@@ -0,0 +1,64 @@
/**
* 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.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
/** Main fragment to display first day of week. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class FirstDayOfWeekItemFragment extends DashboardFragment {
private static final String LOG_TAG = "FirstDayOfWeekItemFragment";
private static final String KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM =
"first_day_of_week_item_category";
@Override
protected int getPreferenceScreenResId() {
return R.xml.regional_preferences_first_day_of_week;
}
@Override
public int getMetricsCategory() {
return SettingsEnums.FIRST_DAY_OF_WEEK_PREFERENCE;
}
@Override
protected String getLogTag() {
return LOG_TAG;
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new FirstDayOfWeekItemCategoryController(context,
KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM));
return controllers;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.regional_preferences_first_day_of_week);
}

View File

@@ -0,0 +1,66 @@
/**
* 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.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
/** A controller for handling all first day of week preferences. */
public class FirstDayOfWeekItemListController extends
RegionalPreferenceListBasePreferenceController {
private static final String KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM =
"first_day_of_week_item_category";
private static final String KEY_PREFERENCE_FIRST_DAY_OF_WEEK_ITEM =
"first_day_of_week_item_list";
public FirstDayOfWeekItemListController(Context context, String key) {
super(context, key);
}
@Override
protected String getPreferenceTitle(String item) {
return RegionalPreferencesDataUtils.dayConverter(mContext, item);
}
@Override
protected String getPreferenceCategoryKey() {
return KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM;
}
@Override
public String getPreferenceKey() {
return KEY_PREFERENCE_FIRST_DAY_OF_WEEK_ITEM;
}
@Override
protected String getExtensionTypes() {
return ExtensionTypes.FIRST_DAY_OF_WEEK;
}
@Override
protected String[] getUnitValues() {
return mContext.getResources().getStringArray(R.array.first_day_of_week);
}
@Override
protected int getMetricsActionKey() {
return SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK;
}
}

View File

@@ -0,0 +1,7 @@
allenwtsu@google.com
calvinpan@google.com
danielwbhuang@google.com
goldmanj@google.com
joshhou@google.com
zoeychen@google.com
tomhsu@google.com

View File

@@ -0,0 +1,103 @@
/**
* 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.app.settings.SettingsEnums;
import android.content.Context;
import android.util.Log;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.TickButtonPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/** A base controller for handling all regional preferences controllers. */
public abstract class RegionalPreferenceListBasePreferenceController extends
BasePreferenceController {
private final MetricsFeatureProvider mMetricsFeatureProvider;
private PreferenceCategory mPreferenceCategory;
public RegionalPreferenceListBasePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceCategory = screen.findPreference(getPreferenceCategoryKey());
initPreferences();
}
private void initPreferences() {
if (mPreferenceCategory == null) {
return;
}
String[] unitValues = getUnitValues();
for (int i = 0; i < unitValues.length; i++) {
TickButtonPreference pref = new TickButtonPreference(mContext);
mPreferenceCategory.addPreference(pref);
final String item = unitValues[i];
pref.setTitle(getPreferenceTitle(item));
pref.setKey(item);
pref.setOnPreferenceClickListener(clickedPref -> {
setSelected(pref);
RegionalPreferencesDataUtils.savePreference(mContext, getExtensionTypes(), item);
mMetricsFeatureProvider.action(mContext, getMetricsActionKey(), item);
return true;
});
String value = RegionalPreferencesDataUtils.getDefaultUnicodeExtensionData(mContext,
getExtensionTypes());
pref.setSelected(!value.isEmpty() && item.equals(value));
}
}
private void setSelected(TickButtonPreference preference) {
for (int i = 0; i < mPreferenceCategory.getPreferenceCount(); i++) {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(i);
if (pref.getKey().equals(preference.getKey())) {
pref.setSelected(true);
continue;
}
pref.setSelected(false);
}
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
protected abstract String getPreferenceTitle(String item);
protected abstract String getPreferenceCategoryKey();
protected abstract String getExtensionTypes();
protected abstract String[] getUnitValues();
protected abstract int getMetricsActionKey();
}

View File

@@ -29,7 +29,6 @@ import java.util.Locale;
/** Provides utils for regional preferences. */ /** Provides utils for regional preferences. */
public class RegionalPreferencesDataUtils { public class RegionalPreferencesDataUtils {
static final String DISPLAY_KEYWORD_OF_CALENDAR = "calendar";
static final String DEFAULT_VALUE = "default"; static final String DEFAULT_VALUE = "default";
static String getDefaultUnicodeExtensionData(Context contxt, String type) { static String getDefaultUnicodeExtensionData(Context contxt, String type) {
@@ -86,18 +85,6 @@ public class RegionalPreferencesDataUtils {
return addUnicodeKeywordToLocale(Locale.forLanguageTag(languageTag), type, value); return addUnicodeKeywordToLocale(Locale.forLanguageTag(languageTag), type, value);
} }
static String calendarConverter(Context context, String calendarType) {
if (calendarType.equals(DEFAULT_VALUE)) {
return context.getString(R.string.default_string_of_regional_preference);
}
Locale locale = new Locale.Builder()
.setUnicodeLocaleKeyword(ExtensionTypes.CALENDAR, calendarType)
.build();
return ULocale.getDisplayKeywordValue(locale.toLanguageTag(), DISPLAY_KEYWORD_OF_CALENDAR,
ULocale.forLocale(Locale.getDefault(Locale.Category.FORMAT)));
}
static String temperatureUnitsConverter(Context context, String unit) { static String temperatureUnitsConverter(Context context, String unit) {
switch (unit) { switch (unit) {
case LocalePreferences.TemperatureUnit.CELSIUS: case LocalePreferences.TemperatureUnit.CELSIUS:

View File

@@ -1,143 +0,0 @@
/*
* 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.app.settings.SettingsEnums;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.widget.TickButtonPreference;
/** A fragment to include each kind of regional preferences. */
public class RegionalPreferencesFragment extends SettingsPreferenceFragment {
private static final String TAG = RegionalPreferencesFragment.class.getSimpleName();
private PreferenceScreen mPreferenceScreen;
private String mTitle = "";
@VisibleForTesting
String mType = "";
private String[] initializeUIdata(String type) {
switch(type) {
case ExtensionTypes.TEMPERATURE_UNIT:
mTitle = getPrefContext().getString(R.string.temperature_preferences_title);
return getPrefContext().getResources().getStringArray(R.array.temperature_units);
case ExtensionTypes.CALENDAR:
mTitle = getPrefContext().getString(R.string.calendar_preferences_title);
return getPrefContext().getResources().getStringArray(R.array.calendar_type);
case ExtensionTypes.FIRST_DAY_OF_WEEK:
mTitle = getPrefContext().getString(R.string.first_day_of_week_preferences_title);
return getPrefContext().getResources().getStringArray(R.array.first_day_of_week);
default:
mTitle = getPrefContext().getString(R.string.regional_preferences_title);
return new String[0];
}
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
// The first preference is TopIntroPreference
for (int i = 1; i < mPreferenceScreen.getPreferenceCount(); i++) {
TickButtonPreference pref = (TickButtonPreference) mPreferenceScreen.getPreference(i);
Log.i(TAG, "[onPreferenceClick] key is " + pref.getKey());
if (pref.getKey().equals(preference.getKey())) {
pref.setSelected(true);
RegionalPreferencesDataUtils.savePreference(
getPrefContext(),
mType,
preference.getKey().equals(
RegionalPreferencesDataUtils.DEFAULT_VALUE)
? null : preference.getKey());
continue;
}
pref.setSelected(false);
}
return true;
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Bundle bundle = getArguments();
String type = bundle.getString(
RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE, "");
if (type.isEmpty()) {
Log.w(TAG, "There is no type name.");
finish();
}
mType = type;
addPreferencesFromResource(R.xml.regional_preference_content_page);
mPreferenceScreen = getPreferenceScreen();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String[] uiData = initializeUIdata(mType);
for (String item : uiData) {
TickButtonPreference pref = new TickButtonPreference(getPrefContext());
if (mType.equals(ExtensionTypes.FIRST_DAY_OF_WEEK)) {
pref.setTitle(RegionalPreferencesDataUtils.dayConverter(
getPrefContext(), item));
} else if (mType.equals(ExtensionTypes.TEMPERATURE_UNIT)) {
pref.setTitle(RegionalPreferencesDataUtils.temperatureUnitsConverter(
getPrefContext(), item));
} else if (mType.equals(ExtensionTypes.CALENDAR)) {
pref.setTitle(RegionalPreferencesDataUtils.calendarConverter(
getPrefContext(), item));
} else {
Log.d(TAG, "Finish this page due to no suitable type.");
finish();
}
String value = RegionalPreferencesDataUtils.getDefaultUnicodeExtensionData(
getPrefContext(), mType);
pref.setKey(item);
pref.setSelected(!value.isEmpty() && item.equals(value));
mPreferenceScreen.addPreference(pref);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
getActivity().setTitle(mTitle);
}
@Override
public int getMetricsCategory() {
switch(mType) {
case ExtensionTypes.CALENDAR:
return SettingsEnums.CALENDAR_PREFERENCE;
case ExtensionTypes.FIRST_DAY_OF_WEEK:
return SettingsEnums.FIRST_DAY_OF_WEEK_PREFERENCE;
default:
return SettingsEnums.TEMPERATURE_PREFERENCE;
}
}
}

View File

@@ -0,0 +1,60 @@
/**
* 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.util.Log;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
import com.android.settings.widget.PreferenceCategoryController;
/** Category preference controller for temperature preferences. */
public class TemperatureUnitCategoryController extends PreferenceCategoryController {
private static final String LOG_TAG = "TemperatureUnitCategoryController";
private static final String KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT =
"temperature_unit_category";
private static final String KEY_PREFERENCE_TEMPERATURE_UNIT = "temperature_unit_list";
private PreferenceCategory mPreferenceCategory;
private TemperatureUnitListController mTemperatureUnitListController;
public TemperatureUnitCategoryController(Context context, String key) {
super(context, key);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceCategory = screen.findPreference(KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT);
if (mPreferenceCategory == null) {
Log.d(LOG_TAG, "displayPreference(), Can not find the category.");
return;
}
mPreferenceCategory.setVisible(isAvailable());
mTemperatureUnitListController = new TemperatureUnitListController(mContext,
KEY_PREFERENCE_TEMPERATURE_UNIT);
mTemperatureUnitListController.displayPreference(screen);
}
}

View File

@@ -0,0 +1,64 @@
/**
* 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.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
/** Main fragment to display temperature preferences. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class TemperatureUnitFragment extends DashboardFragment {
private static final String LOG_TAG = "TemperatureUnitFragment";
private static final String KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT =
"temperature_unit_category";
@Override
protected int getPreferenceScreenResId() {
return R.xml.regional_preferences_temperature;
}
@Override
public int getMetricsCategory() {
return SettingsEnums.TEMPERATURE_PREFERENCE;
}
@Override
protected String getLogTag() {
return LOG_TAG;
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new TemperatureUnitCategoryController(context,
KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT));
return controllers;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.regional_preferences_temperature);
}

View File

@@ -0,0 +1,64 @@
/**
* 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.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
/** A controller for handling all temperature preferences. */
public class TemperatureUnitListController extends RegionalPreferenceListBasePreferenceController {
private static final String KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT =
"temperature_unit_category";
private static final String KEY_PREFERENCE_TEMPERATURE_UNIT = "temperature_unit_list";
public TemperatureUnitListController(Context context, String key) {
super(context, key);
}
@Override
protected String getPreferenceTitle(String item) {
return RegionalPreferencesDataUtils.temperatureUnitsConverter(mContext, item);
}
@Override
protected String getPreferenceCategoryKey() {
return KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT;
}
@Override
public String getPreferenceKey() {
return KEY_PREFERENCE_TEMPERATURE_UNIT;
}
@Override
protected String getExtensionTypes() {
return ExtensionTypes.TEMPERATURE_UNIT;
}
@Override
protected String[] getUnitValues() {
return mContext.getResources().getStringArray(R.array.temperature_units);
}
@Override
protected int getMetricsActionKey() {
return SettingsEnums.ACTION_SET_TEMPERATURE_UNIT;
}
}

View File

@@ -1,107 +0,0 @@
/*
* Copyright (C) 2022 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 static org.junit.Assert.assertEquals;
import android.content.Context;
import android.icu.util.ULocale;
import android.provider.Settings;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.testutils.ResourcesUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Locale;
public class CalendarTypeControllerTest {
private Context mApplicationContext;
private CalendarTypeController mController;
private String mCacheProviderContent = "";
private Locale mCacheLocale;
@Before
public void setUp() throws Exception {
mApplicationContext = ApplicationProvider.getApplicationContext();
mController = new CalendarTypeController(mApplicationContext, "key");
mCacheProviderContent = Settings.System.getString(
mApplicationContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
mCacheLocale = Locale.getDefault(Locale.Category.FORMAT);
}
@After
public void tearDown() throws Exception {
RegionalPreferenceTestUtils.setSettingsProviderContent(
mApplicationContext, mCacheProviderContent);
Locale.setDefault(mCacheLocale);
}
@Test
public void getSummary_hasProviderValue_resultIsChineseCalendar() {
RegionalPreferenceTestUtils.setSettingsProviderContent(
mApplicationContext, "und-u-ca-chinese");
String summary = mController.getSummary().toString();
assertEquals(getDisplayKeywordValue(LocalePreferences.CalendarType.CHINESE), summary);
}
@Test
public void getSummary_hasProviderValue_resultIsDangiCalendar() {
RegionalPreferenceTestUtils.setSettingsProviderContent(
mApplicationContext, "und-u-ca-dangi");
String summary = mController.getSummary().toString();
assertEquals(getDisplayKeywordValue(LocalePreferences.CalendarType.DANGI), summary);
}
@Test
public void getSummary_noProviderValueButHasDefaultLocaleWithSubtag_resultIsChineseCalendar() {
RegionalPreferenceTestUtils.setSettingsProviderContent(mApplicationContext, "");
Locale.setDefault(Locale.forLanguageTag("en-US-u-ca-chinese"));
String summary = mController.getSummary().toString();
assertEquals(getDisplayKeywordValue(LocalePreferences.CalendarType.CHINESE), summary);
}
@Test
public void getSummary_noProviderValueAndDefaultLocaleWithoutSubtag_resultIsEmpty() {
RegionalPreferenceTestUtils.setSettingsProviderContent(mApplicationContext, "");
Locale.setDefault(Locale.forLanguageTag("en-US"));
String summary = mController.getSummary().toString();
assertEquals(ResourcesUtils.getResourcesString(
mApplicationContext, "default_string_of_regional_preference"), summary);
}
private static String getDisplayKeywordValue(String value) {
String languageTag = new Locale.Builder()
.setUnicodeLocaleKeyword(
ExtensionTypes.CALENDAR, value).build().toLanguageTag();
return ULocale.getDisplayKeywordValue(
languageTag,
RegionalPreferencesDataUtils.DISPLAY_KEYWORD_OF_CALENDAR,
ULocale.forLocale(Locale.getDefault(Locale.Category.FORMAT)));
}
}

View File

@@ -0,0 +1,124 @@
/**
* 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 static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.content.Context;
import android.os.LocaleList;
import android.os.Looper;
import android.provider.Settings;
import com.android.internal.app.LocalePicker;
import com.android.settings.widget.TickButtonPreference;
import androidx.preference.PreferenceManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import java.util.Locale;
@RunWith(AndroidJUnit4.class)
public class FirstDayOfWeekItemListControllerTest {
private static final String KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM =
"first_day_of_week_item_category";
private static final String KEY_PREFERENCE_FIRST_DAY_OF_WEEK_ITEM =
"first_day_of_week_item_list";
private Context mContext;
private PreferenceManager mPreferenceManager;
private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen;
private FirstDayOfWeekItemListController mController;
private LocaleList mCacheLocaleList;
private Locale mCacheLocale;
private String mCacheProviderContent = "";
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
if (Looper.myLooper() == null) {
Looper.prepare();
}
mPreferenceManager = new PreferenceManager(mContext);
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_PREFERENCE_CATEGORY_FIRST_DAY_OF_WEEK_ITEM);
mPreferenceScreen.addPreference(mPreferenceCategory);
mController = new FirstDayOfWeekItemListController(mContext,
KEY_PREFERENCE_FIRST_DAY_OF_WEEK_ITEM);
mController.displayPreference(mPreferenceScreen);
mCacheProviderContent = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
mCacheLocale = Locale.getDefault(Locale.Category.FORMAT);
mCacheLocaleList = LocaleList.getDefault();
}
@After
public void tearDown() throws Exception {
RegionalPreferenceTestUtils.setSettingsProviderContent(
mContext, mCacheProviderContent);
Locale.setDefault(mCacheLocale);
LocalePicker.updateLocales(mCacheLocaleList);
}
@Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsDefault() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0);
pref.performClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
assertThat(pref.getKey()).isEqualTo("default");
assertThat(record).contains("default");
}
@Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsSunday() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1);
pref.performClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
assertThat(pref.getKey()).isEqualTo("sun");
assertThat(record).contains("sun");
}
@Test
public void displayPreference_setSelectPreferredFirstDayOfWeekIsMonday() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2);
pref.performClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
assertThat(pref.getKey()).isEqualTo("mon");
assertThat(record).contains("mon");
}
}

View File

@@ -1,70 +0,0 @@
/*
* 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 static org.junit.Assert.assertEquals;
import android.app.settings.SettingsEnums;
import android.os.Looper;
import androidx.test.annotation.UiThreadTest;
import org.junit.Before;
import org.junit.Test;
public class RegionalPreferencesFragmentTest {
private RegionalPreferencesFragment mFragment;
@Before
@UiThreadTest
public void setUp() throws Exception {
if (Looper.myLooper() == null) {
Looper.prepare();
}
mFragment = new RegionalPreferencesFragment();
}
@Test
@UiThreadTest
public void getMetricsCategory_typeIsCa_resultIsCalendarPreference() {
mFragment.mType = ExtensionTypes.CALENDAR;
int result = mFragment.getMetricsCategory();
assertEquals(SettingsEnums.CALENDAR_PREFERENCE, result);
}
@Test
@UiThreadTest
public void getMetricsCategory_typeIsFw_resultIsFirstDayOfWeekPreference() {
mFragment.mType = ExtensionTypes.FIRST_DAY_OF_WEEK;
int result = mFragment.getMetricsCategory();
assertEquals(SettingsEnums.FIRST_DAY_OF_WEEK_PREFERENCE, result);
}
@Test
@UiThreadTest
public void getMetricsCategory_typeIsMu_resultIsTemperaturePreference() {
mFragment.mType = ExtensionTypes.TEMPERATURE_UNIT;
int result = mFragment.getMetricsCategory();
assertEquals(SettingsEnums.TEMPERATURE_PREFERENCE, result);
}
}

View File

@@ -0,0 +1,121 @@
/**
* 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 static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.content.Context;
import android.os.LocaleList;
import android.os.Looper;
import android.provider.Settings;
import com.android.internal.app.LocalePicker;
import com.android.settings.widget.TickButtonPreference;
import androidx.preference.PreferenceManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import java.util.Locale;
@RunWith(AndroidJUnit4.class)
public class TemperatureUnitListControllerTest {
private static final String KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT =
"temperature_unit_category";
private static final String KEY_PREFERENCE_TEMPERATURE_UNIT = "temperature_unit_list";
private Context mContext;
private PreferenceManager mPreferenceManager;
private PreferenceCategory mPreferenceCategory;
private PreferenceScreen mPreferenceScreen;
private TemperatureUnitListController mController;
private LocaleList mCacheLocaleList;
private Locale mCacheLocale;
private String mCacheProviderContent = "";
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
if (Looper.myLooper() == null) {
Looper.prepare();
}
mPreferenceManager = new PreferenceManager(mContext);
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreferenceCategory = new PreferenceCategory(mContext);
mPreferenceCategory.setKey(KEY_PREFERENCE_CATEGORY_TEMPERATURE_UNIT);
mPreferenceScreen.addPreference(mPreferenceCategory);
mController = new TemperatureUnitListController(mContext, KEY_PREFERENCE_TEMPERATURE_UNIT);
mController.displayPreference(mPreferenceScreen);
mCacheProviderContent = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
mCacheLocale = Locale.getDefault(Locale.Category.FORMAT);
mCacheLocaleList = LocaleList.getDefault();
}
@After
public void tearDown() throws Exception {
RegionalPreferenceTestUtils.setSettingsProviderContent(
mContext, mCacheProviderContent);
Locale.setDefault(mCacheLocale);
LocalePicker.updateLocales(mCacheLocaleList);
}
@Test
public void displayPreference_setSelectPreferredTemperatureUnitIsDefault() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(0);
pref.performClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
assertThat(pref.getKey()).isEqualTo("default");
assertThat(record).contains("default");
}
@Test
public void displayPreference_setSelectPreferredTemperatureUnitIsCelsius() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(1);
pref.performClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
assertThat(pref.getKey()).isEqualTo("celsius");
assertThat(record).contains("celsius");
}
@Test
public void displayPreference_setSelectPreferredTemperatureUnitIsFahrenhe() {
TickButtonPreference pref = (TickButtonPreference) mPreferenceCategory.getPreference(2);
pref.performClick();
String record = Settings.System.getString(
mContext.getContentResolver(), Settings.System.LOCALE_PREFERENCES);
assertThat(pref.getKey()).isEqualTo("fahrenhe");
assertThat(record).contains("fahrenhe");
}
}