[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:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user