From d68e04ff04e4b39a25b81a1cd216034405f8596c Mon Sep 17 00:00:00 2001 From: tom hsu Date: Mon, 6 Feb 2023 22:24:16 +0800 Subject: [PATCH] [Regional Preference] Append unicode tags to new system language. -When the user adds a new system language, this new language can not have the current unicode tags. Hence, it shall append current unicode tags to the new system language. Bug: b/268025290 Test: Manual test passed. Test: make RunSettingsRoboTests ROBOTEST_FILTER=LocaleListEditorTest Change-Id: I76671908ad01dcb8b04714aa3ca44d3614a0428b --- .../localepicker/LocaleListEditor.java | 27 +++++++++++++++++-- .../localepicker/LocaleListEditorTest.java | 14 ++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java index 8fcfefc3131..89efe53b4ff 100644 --- a/src/com/android/settings/localepicker/LocaleListEditor.java +++ b/src/com/android/settings/localepicker/LocaleListEditor.java @@ -26,6 +26,8 @@ import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.os.LocaleList; +import android.provider.Settings; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -178,15 +180,36 @@ public class LocaleListEditor extends RestrictedSettingsFragment { public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_LOCALE_PICKER && resultCode == Activity.RESULT_OK && data != null) { - final LocaleStore.LocaleInfo locale = + final LocaleStore.LocaleInfo localeInfo = (LocaleStore.LocaleInfo) data.getSerializableExtra( INTENT_LOCALE_KEY); - mAdapter.addLocale(locale); + + String preferencesTags = Settings.System.getString( + getContext().getContentResolver(), Settings.System.LOCALE_PREFERENCES); + + mAdapter.addLocale(mayAppendUnicodeTags(localeInfo, preferencesTags)); updateVisibilityOfRemoveMenu(); } super.onActivityResult(requestCode, resultCode, data); } + @VisibleForTesting + static LocaleStore.LocaleInfo mayAppendUnicodeTags( + LocaleStore.LocaleInfo localeInfo, String recordTags) { + if (TextUtils.isEmpty(recordTags) || TextUtils.equals("und", recordTags)) { + // No recorded tag, return inputted LocaleInfo. + return localeInfo; + } + Locale recordLocale = Locale.forLanguageTag(recordTags); + Locale.Builder builder = new Locale.Builder() + .setLocale(localeInfo.getLocale()); + recordLocale.getUnicodeLocaleKeys().forEach(key -> + builder.setUnicodeLocaleKeyword(key, recordLocale.getUnicodeLocaleType(key))); + LocaleStore.LocaleInfo newLocaleInfo = LocaleStore.fromLocale(builder.build()); + newLocaleInfo.setTranslated(localeInfo.isTranslated()); + return newLocaleInfo; + } + private void setRemoveMode(boolean mRemoveMode) { this.mRemoveMode = mRemoveMode; mAdapter.setRemoveMode(mRemoveMode); diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java index f9b1543f9a7..111ee5a7571 100644 --- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java @@ -28,6 +28,7 @@ import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; +import com.android.internal.app.LocaleStore; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; @@ -44,6 +45,8 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; +import java.util.Locale; + @RunWith(RobolectricTestRunner.class) @Config(shadows = ShadowAlertDialogCompat.class) public class LocaleListEditorTest { @@ -160,4 +163,15 @@ public class LocaleListEditorTest { assertThat(shadowDialog.getMessage()).isNull(); } + + @Test + public void mayAppendUnicodeTags_appendUnicodeTags_success() { + LocaleStore.LocaleInfo localeInfo = LocaleStore.fromLocale(Locale.forLanguageTag("en-US")); + + LocaleStore.LocaleInfo result = + LocaleListEditor.mayAppendUnicodeTags(localeInfo, "und-u-fw-wed-mu-celsius"); + + assertThat(result.getLocale().getUnicodeLocaleType("fw")).isEqualTo("wed"); + assertThat(result.getLocale().getUnicodeLocaleType("mu")).isEqualTo("celsius"); + } }