[Regional Pref] 1. Add metrics for user changes the First day of week 2.

Refactor to Settings design

Bug: 275003276
Bug: 264483854
Change-Id: Ibea987b6e51fd76c89a0ff5269da6e99171f6b1c
This commit is contained in:
Zoey Chen
2023-04-20 15:42:55 +00:00
parent 5d2ce38d3a
commit 4aa05e58bb
7 changed files with 351 additions and 10 deletions

View File

@@ -49,7 +49,7 @@
android:title="@string/first_day_of_week_preferences_title"
android:summary="@string/default_string_of_regional_preference"
settings:controller="com.android.settings.regionalpreferences.FirstDayOfWeekController"
settings:fragment="com.android.settings.regionalpreferences.RegionalPreferencesFragment">
settings:fragment="com.android.settings.regionalpreferences.FirstDayOfWeekItemFragment">
<extra
android:name="arg_key_regional_preference"
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

@@ -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

@@ -45,9 +45,6 @@ public class RegionalPreferencesFragment extends SettingsPreferenceFragment {
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];
@@ -96,10 +93,7 @@ public class RegionalPreferencesFragment extends SettingsPreferenceFragment {
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.CALENDAR)) {
if (mType.equals(ExtensionTypes.CALENDAR)) {
pref.setTitle(RegionalPreferencesDataUtils.calendarConverter(
getPrefContext(), item));
} else {
@@ -124,11 +118,11 @@ public class RegionalPreferencesFragment extends SettingsPreferenceFragment {
@Override
public int getMetricsCategory() {
switch(mType) {
switch (mType) {
case ExtensionTypes.CALENDAR:
return SettingsEnums.CALENDAR_PREFERENCE;
default:
return SettingsEnums.FIRST_DAY_OF_WEEK_PREFERENCE;
return SettingsEnums.CALENDAR_PREFERENCE;
}
}

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");
}
}