From 4e1bf7db926e293d2bc21aae996fb13f6c94dc7f Mon Sep 17 00:00:00 2001 From: danielwbhuang Date: Wed, 25 Dec 2024 20:26:49 +0800 Subject: [PATCH] [Update] Expose the regional preferences pages 1. Link ACTION_MEASUREMENT_SYSTEM_SETTINGS to MeasurementSystemItemFragment 2. Link ACTION_NUMBERING_SYSTEM_SETTINGS to NumberingPreferencesFragment 3. Link ACTION_REGION_SETTINGS to RegionPickerFragment 4. Deprecate NumberingPreferencesFragment Bug: 381038747 Flag: android.provider.system_regional_preferences_api_enabled Test: use test app to try intent ACTION, atest Change-Id: Id76e589ce25ae5dfc3443948300c6c21ab30672c --- AndroidManifest.xml | 48 ++++++++ res/xml/language_and_region_settings.xml | 2 +- src/com/android/settings/Settings.java | 3 + .../core/gateway/SettingsGateway.java | 6 + .../NumberingPreferencesFragment.java | 10 +- ...umberingSystemFormatSelectionFragment.java | 82 ++++++++++++++ .../NumberingSystemItemController.java | 10 +- .../NumberingSystemLocaleListFragment.java | 107 ++++++++++++++++++ 8 files changed, 263 insertions(+), 5 deletions(-) create mode 100644 src/com/android/settings/regionalpreferences/NumberingSystemFormatSelectionFragment.java create mode 100644 src/com/android/settings/regionalpreferences/NumberingSystemLocaleListFragment.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d9e759b8366..32f786a12e2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1117,6 +1117,54 @@ android:value="true"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + settings:fragment="com.android.settings.regionalpreferences.NumberingSystemLocaleListFragment"> diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index aa52a2ad152..e373ccccd1d 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -100,9 +100,12 @@ public class Settings extends SettingsActivity { public static class LocalePickerActivity extends SettingsActivity { /* empty */ } public static class LanguageSettingsActivity extends SettingsActivity { /* empty */ } /** Activity for the regional preferences settings. */ + public static class RegionSettingsActivity extends SettingsActivity { /* empty */ } public static class RegionalPreferencesActivity extends SettingsActivity { /* empty */ } public static class TemperatureUnitSettingsActivity extends SettingsActivity { /* empty */ } public static class FirstDayOfWeekSettingsActivity extends SettingsActivity { /* empty */ } + public static class MeasurementSystemSettingsActivity extends SettingsActivity { /* empty */ } + public static class NumberingSystemSettingsActivity extends SettingsActivity { /* empty */ } public static class KeyboardSettingsActivity extends SettingsActivity { /* empty */ } /** Activity for the navigation mode settings. */ public static class NavigationModeSettingsActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index eeecdd54844..bc2ab68764c 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -183,6 +183,9 @@ import com.android.settings.privatespace.delete.PrivateSpaceDeleteFragment; import com.android.settings.privatespace.delete.PrivateSpaceDeletionProgressFragment; import com.android.settings.privatespace.onelock.PrivateSpaceBiometricSettings; import com.android.settings.regionalpreferences.FirstDayOfWeekItemFragment; +import com.android.settings.regionalpreferences.MeasurementSystemItemFragment; +import com.android.settings.regionalpreferences.NumberingSystemLocaleListFragment; +import com.android.settings.regionalpreferences.RegionPickerFragment; import com.android.settings.regionalpreferences.RegionalPreferencesEntriesFragment; import com.android.settings.regionalpreferences.TemperatureUnitFragment; import com.android.settings.safetycenter.MoreSecurityPrivacyFragment; @@ -396,9 +399,12 @@ public class SettingsGateway { ColorAndMotionFragment.class.getName(), ColorContrastFragment.class.getName(), LongBackgroundTasksDetails.class.getName(), + RegionPickerFragment.class.getName(), RegionalPreferencesEntriesFragment.class.getName(), TemperatureUnitFragment.class.getName(), FirstDayOfWeekItemFragment.class.getName(), + MeasurementSystemItemFragment.class.getName(), + NumberingSystemLocaleListFragment.class.getName(), BatteryInfoFragment.class.getName(), UserAspectRatioDetails.class.getName(), ScreenTimeoutSettings.class.getName(), diff --git a/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java b/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java index 1c5015fe7b0..8a9840f9f87 100644 --- a/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java +++ b/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java @@ -32,8 +32,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; -/** Provides options of numbering system to each language. */ -public class NumberingPreferencesFragment extends DashboardFragment { +/** + * Provides options of numbering system to each language. + * + * @deprecated Use {@link NumberingSystemLocaleListFragment} instead. + */ +@Deprecated +public class NumberingPreferencesFragment extends DashboardFragment { + /** Initializes variables. */ @VisibleForTesting String initTitle() { diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemFormatSelectionFragment.java b/src/com/android/settings/regionalpreferences/NumberingSystemFormatSelectionFragment.java new file mode 100644 index 00000000000..bbe14b6a4ad --- /dev/null +++ b/src/com/android/settings/regionalpreferences/NumberingSystemFormatSelectionFragment.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2024 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.os.Bundle; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.android.internal.app.LocaleHelper; +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settingslib.core.AbstractPreferenceController; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** Provides options of numbering system to each language. */ +public class NumberingSystemFormatSelectionFragment extends DashboardFragment { + + @Override + public void onCreate(@NonNull Bundle icicle) { + super.onCreate(icicle); + getActivity().setTitle(initTitle()); + } + + /** + * Get a list of {@link AbstractPreferenceController} for this fragment. + */ + @Override + protected List createPreferenceControllers(Context context) { + NumberingSystemItemController controller = + new NumberingSystemItemController(context, getArguments()); + controller.setParentFragment(this); + List listControllers = new ArrayList<>(); + listControllers.add(controller); + return listControllers; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.regional_preference_numbering_system_page; + } + + @Override + protected String getLogTag() { + return NumberingSystemFormatSelectionFragment.class.getSimpleName(); + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.NUMBERING_SYSTEM_NUMBER_FORMAT_SELECTION_PREFERENCE; + } + + private String initTitle() { + String selectedLanguage = getArguments().getString( + NumberingSystemItemController.KEY_SELECTED_LANGUAGE, ""); + if (selectedLanguage.isEmpty()) { + Log.w(getLogTag(), "No selected language."); + return ""; + } + Locale locale = Locale.forLanguageTag(selectedLanguage); + return LocaleHelper.getDisplayName(locale.stripExtensions(), locale, true); + } +} diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java index 9f0c4041ebf..fe0a088f8bf 100644 --- a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java +++ b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java @@ -34,6 +34,7 @@ import com.android.internal.app.LocaleStore; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.flags.Flags; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.widget.SelectorWithWidgetPreference; @@ -158,10 +159,15 @@ public class NumberingSystemItemController extends BasePreferenceController { extra.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE, ARG_VALUE_NUMBERING_SYSTEM_SELECT); extra.putString(KEY_SELECTED_LANGUAGE, selectedLanguage); + + String destinationFragment = NumberingPreferencesFragment.class.getName(); + if (Flags.regionalPreferencesApiEnabled()) { + destinationFragment = NumberingSystemFormatSelectionFragment.class.getName(); + } new SubSettingLauncher(preference.getContext()) - .setDestination(NumberingPreferencesFragment.class.getName()) + .setDestination(destinationFragment) .setSourceMetricsCategory( - SettingsEnums.NUMBERING_SYSTEM_LANGUAGE_SELECTION_PREFERENCE) + SettingsEnums.NUMBERING_SYSTEM_LANGUAGE_SELECTION_PREFERENCE) .setArguments(extra) .launch(); } diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemLocaleListFragment.java b/src/com/android/settings/regionalpreferences/NumberingSystemLocaleListFragment.java new file mode 100644 index 00000000000..6a39b23241c --- /dev/null +++ b/src/com/android/settings/regionalpreferences/NumberingSystemLocaleListFragment.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2024 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 android.provider.Settings.ACTION_NUMBERING_SYSTEM_SETTINGS; + +import android.app.Activity; +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.os.Bundle; +import android.os.LocaleList; + +import androidx.annotation.NonNull; + +import com.android.internal.app.LocaleStore; +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settingslib.core.AbstractPreferenceController; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +/** Provides locale list for numbering system settings. */ +public class NumberingSystemLocaleListFragment extends DashboardFragment { + + @Override + public void onCreate(@NonNull Bundle icicle) { + super.onCreate(icicle); + + if (isEmptyNumberingSystemLocale()) { + getActivity().setResult(Activity.RESULT_CANCELED); + finish(); + } + + if (getIntent().getAction().equals(ACTION_NUMBERING_SYSTEM_SETTINGS)) { + // TODO: Generically log action. + } + + getActivity().setTitle(R.string.numbers_preferences_title); + getActivity().setResult(Activity.RESULT_OK); + } + + /** + * Get a list of {@link AbstractPreferenceController} for this fragment. + */ + @Override + protected List createPreferenceControllers(Context context) { + NumberingSystemItemController controller = + new NumberingSystemItemController(context, getExtraData()); + controller.setParentFragment(this); + List listControllers = new ArrayList<>(); + listControllers.add(controller); + return listControllers; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.regional_preference_numbering_system_page; + } + + @Override + protected String getLogTag() { + return NumberingSystemLocaleListFragment.class.getSimpleName(); + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.NUMBERING_SYSTEM_LANGUAGE_SELECTION_PREFERENCE; + } + + private static boolean isEmptyNumberingSystemLocale() { + LocaleList localeList = LocaleList.getDefault(); + Set localesHasNumberingSystems = new HashSet<>(); + for (int i = 0; i < localeList.size(); i++) { + Locale locale = localeList.get(i); + LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(locale); + if (localeInfo.hasNumberingSystems()) { + localesHasNumberingSystems.add(locale); + } + } + return localesHasNumberingSystems.isEmpty(); + } + + private static Bundle getExtraData() { + Bundle extra = new Bundle(); + extra.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE, + NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT); + return extra; + } +}