Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 881e8ac5 authored by tom hsu's avatar tom hsu
Browse files

Remove Numbering System preference if no corresponding locale.

 - If locale has no multiple numbering systems, it shall not
   show the locale on list.
 - If there is no locale with numberung system, remove the entry of
   numbering system preference on UI.

Bug: b/274053189
Test: atest passed
Test: Manual test passed
Change-Id: If61c7e233630644e2d6245c5efd75d15d52cf94b
parent fced4027
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -27,9 +27,19 @@ public class LocaleFeatureProviderImpl implements LocaleFeatureProvider {
    @Override
    public String getLocaleNames() {
        final LocaleList locales = LocalePicker.getLocales();
        Locale[] arrLocalesWithoutExtension = new Locale[locales.size()];
        for (int i = 0; i < locales.size(); i++) {
            arrLocalesWithoutExtension[i] = locales.get(i).stripExtensions();
        return getLocaleNames(locales);
    }

    /**
     * Returns displayable string of inputted locales.
     */
    public String getLocaleNames(LocaleList inputLocales) {
        if (inputLocales.isEmpty()) {
            return "";
        }
        Locale[] arrLocalesWithoutExtension = new Locale[inputLocales.size()];
        for (int i = 0; i < inputLocales.size(); i++) {
            arrLocalesWithoutExtension[i] = inputLocales.get(i).stripExtensions();
        }
        final Locale displayLocale = Locale.getDefault();
        return LocaleHelper.toSentenceCase(
+32 −2
Original line number Diff line number Diff line
@@ -17,16 +17,26 @@
package com.android.settings.regionalpreferences;

import android.content.Context;
import android.os.LocaleList;

import com.android.internal.app.LocaleStore;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.localepicker.LocaleFeatureProviderImpl;

import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

/** A controller for the entry of Numbering System's page */
public class NumberingSystemController extends BasePreferenceController {
    private static final String TAG = NumberingSystemController.class.getSimpleName();

    private LocaleList mLocaleList;
    public NumberingSystemController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        // Initialize the supported languages to LocaleInfos
        LocaleStore.fillCache(context);
        mLocaleList = getNumberingSystemLocale();
    }

    /**
@@ -42,11 +52,31 @@ public class NumberingSystemController extends BasePreferenceController {
     */
    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
        return mLocaleList.isEmpty() ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
    }

    private static LocaleList getNumberingSystemLocale() {
        LocaleList localeList = LocaleList.getDefault();
        Set<Locale> 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 convertToLocaleList(localesHasNumberingSystems);
    }

    private static LocaleList convertToLocaleList(Set<Locale> locales) {
        if (locales.isEmpty()) {
            return LocaleList.getEmptyLocaleList();
        }
        return new LocaleList(locales.stream().toArray(Locale[]::new));
    }

    @Override
    public CharSequence getSummary() {
        return new LocaleFeatureProviderImpl().getLocaleNames();
        return new LocaleFeatureProviderImpl().getLocaleNames(getNumberingSystemLocale());
    }
}
+8 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import androidx.preference.PreferenceScreen;

import com.android.internal.app.LocaleHelper;
import com.android.internal.app.LocalePicker;
import com.android.internal.app.LocaleStore;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
@@ -52,6 +53,8 @@ public class NumberingSystemItemController extends BasePreferenceController {

    public NumberingSystemItemController(Context context, Bundle argument) {
        super(context, "no_key");
        // Initialize the supported languages to LocaleInfos
        LocaleStore.fillCache(context);
        mOption = argument.getString(
                RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE, "");
        mSelectedLanguage = argument.getString(
@@ -111,8 +114,12 @@ public class NumberingSystemItemController extends BasePreferenceController {
        // Get current system language list to show on screen.
        LocaleList localeList = LocaleList.getDefault();
        for (int i = 0; i < localeList.size(); i++) {
            Preference pref = new Preference(mContext);
            Locale locale = localeList.get(i);
            LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(locale);
            if (!localeInfo.hasNumberingSystems()) {
                continue;
            }
            Preference pref = new Preference(mContext);
            pref.setTitle(LocaleHelper.getDisplayName(locale.stripExtensions(), locale, true));
            pref.setKey(locale.toLanguageTag());
            pref.setSummary(getNumberingSystem(locale));
+0 −4
Original line number Diff line number Diff line
@@ -19,18 +19,15 @@ package com.android.settings.regionalpreferences;
import static org.junit.Assert.assertEquals;

import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
import android.os.Looper;

import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;

import org.junit.Before;
import org.junit.Test;

public class NumberingPreferencesFragmentTest {
    private Context mApplicationContext;
    private NumberingPreferencesFragment mFragment;

    @Before
@@ -39,7 +36,6 @@ public class NumberingPreferencesFragmentTest {
        if (Looper.myLooper() == null) {
            Looper.prepare();
        }
        mApplicationContext = ApplicationProvider.getApplicationContext();
        mFragment = new NumberingPreferencesFragment();
    }

+61 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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 com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;

import static org.junit.Assert.assertEquals;

import android.content.Context;
import android.os.LocaleList;

import androidx.test.core.app.ApplicationProvider;

import org.junit.Before;
import org.junit.Test;

public class NumberingSystemControllerTest {
    private Context mApplicationContext;
    private NumberingSystemController mController;

    @Before
    public void setUp() throws Exception {
        mApplicationContext = ApplicationProvider.getApplicationContext();
    }

    @Test
    public void getAvailabilityStatus_noLocale_unavailable() {
        LocaleList.setDefault(LocaleList.forLanguageTags("en-US,zh-Hant-TW"));
        mController = new NumberingSystemController(mApplicationContext, "key");

        int result = mController.getAvailabilityStatus();

        assertEquals(CONDITIONALLY_UNAVAILABLE, result);
    }

    @Test
    public void getAvailabilityStatus_hasLocaleWithNumberingSystems_available() {
        // ar-JO has different numbering system.
        LocaleList.setDefault(LocaleList.forLanguageTags("en-US,zh-Hant-TW,ar-JO"));
        mController = new NumberingSystemController(mApplicationContext, "key");

        int result = mController.getAvailabilityStatus();

        assertEquals(AVAILABLE, result);
    }
}
Loading