Show dialog when user chnages the region

1. show dialog
2. change the region of the top locale

Bug: 385047778
Flag: com.android.settings.flags.regional_preferences_api_enabled
Test: check hsv, atest
Change-Id: I9746cdec670899b3768dcd1e0aa59e1959dd7e06
This commit is contained in:
danielwbhuang
2024-12-20 20:43:48 +08:00
parent 1ef5e68927
commit 833a0e3c92
6 changed files with 258 additions and 24 deletions

View File

@@ -17,18 +17,19 @@
package com.android.settings.regionalpreferences;
import android.content.Context;
import android.os.LocaleList;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
import com.android.internal.annotations.Initializer;
import com.android.internal.app.LocaleCollectorBase;
import com.android.internal.app.LocaleHelper;
import com.android.internal.app.LocalePicker;
import com.android.internal.app.LocaleStore;
import com.android.internal.app.LocaleStore.LocaleInfo;
import com.android.settings.core.BasePreferenceController;
@@ -45,9 +46,12 @@ public abstract class RegionPickerBaseListPreferenceController extends BasePrefe
private static final String TAG = "RegionPickerBaseListPreferenceController";
private static final String KEY_SUGGESTED = "suggested";
private static final String TAG_DIALOG_CHANGE_REGION = "dialog_change_region";
private PreferenceCategory mPreferenceCategory;
private Set<LocaleInfo> mLocaleList;
private ArrayList<LocaleInfo> mLocaleOptions;
private Fragment mParent;
private FragmentManager mFragmentManager;
public RegionPickerBaseListPreferenceController(@NonNull Context context,
@NonNull String preferenceKey) {
@@ -58,6 +62,10 @@ public abstract class RegionPickerBaseListPreferenceController extends BasePrefe
mLocaleOptions.ensureCapacity(mLocaleList.size());
}
public void setFragment(@NonNull Fragment parent) {
mParent = parent;
}
@Override
@Initializer
public void displayPreference(@NonNull PreferenceScreen screen) {
@@ -156,28 +164,14 @@ public abstract class RegionPickerBaseListPreferenceController extends BasePrefe
if (localeInfo.getLocale().equals(Locale.getDefault())) {
return;
}
updateRegion(localeInfo.getLocale().toLanguageTag());
updatePreferences();
}
private void updateRegion(String selectedLanguageTag) {
LocaleList localeList = LocaleList.getDefault();
Locale systemLocale = Locale.getDefault();
Set<Character> extensionKeys = systemLocale.getExtensionKeys();
Locale selectedLocale = Locale.forLanguageTag(selectedLanguageTag);
Locale.Builder builder = new Locale.Builder();
builder.setLocale(selectedLocale);
if (!extensionKeys.isEmpty()) {
for (Character extKey : extensionKeys) {
builder.setExtension(extKey, systemLocale.getExtension(extKey));
}
}
Locale newLocale = builder.build();
Locale[] resultLocales = new Locale[localeList.size()];
resultLocales[0] = newLocale;
for (int i = 1; i < localeList.size(); i++) {
resultLocales[i] = localeList.get(i);
}
LocalePicker.updateLocales(new LocaleList(resultLocales));
mFragmentManager = mParent.getChildFragmentManager();
Bundle args = new Bundle();
args.putInt(RegionDialogFragment.ARG_DIALOG_TYPE,
RegionDialogFragment.DIALOG_CHANGE_LOCALE_REGION);
args.putSerializable(RegionDialogFragment.ARG_TARGET_LOCALE, localeInfo);
RegionDialogFragment regionDialogFragment = RegionDialogFragment.newInstance();
regionDialogFragment.setArguments(args);
regionDialogFragment.show(mFragmentManager, TAG_DIALOG_CHANGE_REGION);
}
}