[Settings] Update the locale to framework after user select a new

language

Bug: 391248193
Test: manual
Flag: EXEMPT refactor
Change-Id: I938fcc26cd1807f957334f2136dda39cc989829c
This commit is contained in:
Zoey Chen
2025-01-22 02:22:15 +00:00
parent 4943337ee3
commit afd4967ef3
2 changed files with 56 additions and 20 deletions

View File

@@ -16,10 +16,10 @@
package com.android.settings.localepicker; package com.android.settings.localepicker;
import static com.android.settings.localepicker.LocaleListEditor.EXTRA_RESULT_LOCALE;
import static com.android.settings.localepicker.RegionAndNumberingSystemPickerFragment.EXTRA_IS_NUMBERING_SYSTEM; import static com.android.settings.localepicker.RegionAndNumberingSystemPickerFragment.EXTRA_IS_NUMBERING_SYSTEM;
import android.app.Activity; import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.LocaleList; import android.os.LocaleList;
@@ -28,17 +28,21 @@ import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.internal.app.LocaleCollectorBase; import com.android.internal.app.LocaleCollectorBase;
import com.android.internal.app.LocaleHelper; import com.android.internal.app.LocaleHelper;
import com.android.internal.app.LocalePicker;
import com.android.internal.app.LocaleStore; import com.android.internal.app.LocaleStore;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.Instrumentable; import com.android.settingslib.core.instrumentation.Instrumentable;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -52,6 +56,7 @@ import java.util.stream.Collectors;
public abstract class LocalePickerBaseListPreferenceController extends public abstract class LocalePickerBaseListPreferenceController extends
BasePreferenceController implements LocaleListSearchCallback { BasePreferenceController implements LocaleListSearchCallback {
private static final String TAG = "LocalePickerBaseListPreference"; private static final String TAG = "LocalePickerBaseListPreference";
private static final String PARENT_FRAGMENT_NAME = "localeListEditor";
private static final String KEY_SUGGESTED = "suggested"; private static final String KEY_SUGGESTED = "suggested";
private static final String KEY_SUPPORTED = "supported"; private static final String KEY_SUPPORTED = "supported";
@@ -60,10 +65,12 @@ public abstract class LocalePickerBaseListPreferenceController extends
private List<LocaleStore.LocaleInfo> mLocaleOptions; private List<LocaleStore.LocaleInfo> mLocaleOptions;
private Map<String, Preference> mPreferences; private Map<String, Preference> mPreferences;
private String mPackageName; private String mPackageName;
private FragmentManager mFragmentManager;
private boolean mIsCountryMode; private boolean mIsCountryMode;
@Nullable @Nullable
private LocaleStore.LocaleInfo mParentLocale; private LocaleStore.LocaleInfo mParentLocale;
private boolean mIsSuggestedCategory; private boolean mIsSuggestedCategory;
private MetricsFeatureProvider mMetricsFeatureProvider;
public LocalePickerBaseListPreferenceController(@NonNull Context context, public LocalePickerBaseListPreferenceController(@NonNull Context context,
@NonNull String preferenceKey) { @NonNull String preferenceKey) {
@@ -72,6 +79,7 @@ public abstract class LocalePickerBaseListPreferenceController extends
false, false); false, false);
mLocaleOptions = new ArrayList<>(mLocaleList.size()); mLocaleOptions = new ArrayList<>(mLocaleList.size());
mPreferences = new ArrayMap<>(); mPreferences = new ArrayMap<>();
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
} }
@Override @Override
@@ -99,8 +107,8 @@ public abstract class LocalePickerBaseListPreferenceController extends
} }
result = getSortedLocaleList(mIsSuggestedCategory result = getSortedLocaleList(mIsSuggestedCategory
? getSuggestedLocaleList() ? getSuggestedLocaleList()
: getSupportedLocaleList()); : getSupportedLocaleList());
final Map<String, Preference> existingPreferences = mPreferences; final Map<String, Preference> existingPreferences = mPreferences;
mPreferences = new ArrayMap<>(); mPreferences = new ArrayMap<>();
@@ -252,23 +260,40 @@ public abstract class LocalePickerBaseListPreferenceController extends
private void switchFragment(LocaleStore.LocaleInfo localeInfo) { private void switchFragment(LocaleStore.LocaleInfo localeInfo) {
boolean shouldShowLocaleEditor = shouldShowLocaleEditor(localeInfo); boolean shouldShowLocaleEditor = shouldShowLocaleEditor(localeInfo);
String extraKey = shouldShowLocaleEditor ? LocaleListEditor.INTENT_LOCALE_KEY
: RegionAndNumberingSystemPickerFragment.EXTRA_TARGET_LOCALE;
String fragmentName = shouldShowLocaleEditor ? LocaleListEditor.class.getCanonicalName()
: RegionAndNumberingSystemPickerFragment.class.getCanonicalName();
final Bundle extra = new Bundle();
extra.putSerializable(extraKey, localeInfo);
extra.putBoolean(EXTRA_IS_NUMBERING_SYSTEM, localeInfo.hasNumberingSystems());
if (shouldShowLocaleEditor) { if (shouldShowLocaleEditor) {
extra.putBoolean(EXTRA_RESULT_LOCALE, true); List<LocaleStore.LocaleInfo> feedItemList = getUserLocaleList();
} feedItemList.add(localeInfo);
LocaleList localeList = new LocaleList(feedItemList.stream()
.map(LocaleStore.LocaleInfo::getLocale)
.toArray(Locale[]::new));
new SubSettingLauncher(mContext) LocaleList.setDefault(localeList);
.setDestination(fragmentName) LocalePicker.updateLocales(localeList);
.setSourceMetricsCategory(Instrumentable.METRICS_CATEGORY_UNKNOWN) mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ADD_LANGUAGE);
.setArguments(extra) returnToParentFrame();
.launch(); } else {
final Bundle extra = new Bundle();
extra.putSerializable(RegionAndNumberingSystemPickerFragment.EXTRA_TARGET_LOCALE,
localeInfo);
extra.putBoolean(EXTRA_IS_NUMBERING_SYSTEM, localeInfo.hasNumberingSystems());
new SubSettingLauncher(mContext)
.setDestination(RegionAndNumberingSystemPickerFragment.class.getCanonicalName())
.setSourceMetricsCategory(Instrumentable.METRICS_CATEGORY_UNKNOWN)
.setArguments(extra)
.launch();
}
((Activity) mContext).finish();
}
public void setFragmentManager(@NonNull FragmentManager fragmentManager) {
mFragmentManager = fragmentManager;
}
private void returnToParentFrame() {
if (mFragmentManager != null) {
mFragmentManager.popBackStack(PARENT_FRAGMENT_NAME,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
} }
private boolean shouldShowLocaleEditor(LocaleStore.LocaleInfo localeInfo) { private boolean shouldShowLocaleEditor(LocaleStore.LocaleInfo localeInfo) {
@@ -287,4 +312,13 @@ public abstract class LocalePickerBaseListPreferenceController extends
|| (isRegionLocale && !mayHaveDifferentNumberingSystem) || (isRegionLocale && !mayHaveDifferentNumberingSystem)
|| isNumberingMode(); || isNumberingMode();
} }
private List<LocaleStore.LocaleInfo> getUserLocaleList() {
final List<LocaleStore.LocaleInfo> result = new ArrayList<>();
final LocaleList localeList = LocalePicker.getLocales();
for (int i = 0; i < localeList.size(); i++) {
result.add(LocaleStore.getLocaleInfo(localeList.get(i)));
}
return result;
}
} }

View File

@@ -295,11 +295,11 @@ public class SystemLocalePickerFragment extends DashboardFragment implements
@Override @Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getSettingsLifecycle()); return buildPreferenceControllers(context);
} }
private List<AbstractPreferenceController> buildPreferenceControllers( private List<AbstractPreferenceController> buildPreferenceControllers(
@NonNull Context context, @Nullable Lifecycle lifecycle) { @NonNull Context context) {
LocaleList explicitLocales = null; LocaleList explicitLocales = null;
if (isDeviceDemoMode()) { if (isDeviceDemoMode()) {
Bundle bundle = getIntent().getExtras(); Bundle bundle = getIntent().getExtras();
@@ -314,6 +314,8 @@ public class SystemLocalePickerFragment extends DashboardFragment implements
mSystemLocaleAllListPreferenceController = new SystemLocaleAllListPreferenceController( mSystemLocaleAllListPreferenceController = new SystemLocaleAllListPreferenceController(
context, KEY_PREFERENCE_SYSTEM_LOCALE_LIST, explicitLocales); context, KEY_PREFERENCE_SYSTEM_LOCALE_LIST, explicitLocales);
final List<AbstractPreferenceController> controllers = new ArrayList<>(); final List<AbstractPreferenceController> controllers = new ArrayList<>();
mSuggestedListPreferenceController.setFragmentManager(getFragmentManager());
mSystemLocaleAllListPreferenceController.setFragmentManager(getFragmentManager());
controllers.add(mSuggestedListPreferenceController); controllers.add(mSuggestedListPreferenceController);
controllers.add(mSystemLocaleAllListPreferenceController); controllers.add(mSystemLocaleAllListPreferenceController);