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

Commit 65a199ca authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Add SpacebarLanguageUtils class"

parents 1dc354be 9364d46a
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ import com.android.inputmethod.latin.define.ProductionFlag;
import com.android.inputmethod.latin.settings.DebugSettings;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.CoordinateUtils;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import com.android.inputmethod.latin.utils.SpacebarLanguageUtils;
import com.android.inputmethod.latin.utils.TypefaceUtils;
import com.android.inputmethod.latin.utils.UsabilityStudyLogUtils;
import com.android.inputmethod.research.ResearchLogger;
@@ -918,14 +918,13 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
    // Layout language name on spacebar.
    private String layoutLanguageOnSpacebar(final Paint paint,
            final InputMethodSubtype subtype, final int width) {

        // Choose appropriate language name to fit into the width.
        final String fullText = SubtypeLocaleUtils.getFullDisplayName(subtype);
        final String fullText = SpacebarLanguageUtils.getFullDisplayName(subtype);
        if (fitsTextIntoWidth(width, fullText, paint)) {
            return fullText;
        }

        final String middleText = SubtypeLocaleUtils.getMiddleDisplayName(subtype);
        final String middleText = SpacebarLanguageUtils.getMiddleDisplayName(subtype);
        if (fitsTextIntoWidth(width, middleText, paint)) {
            return middleText;
        }
+61 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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.inputmethod.latin.utils;

import android.view.inputmethod.InputMethodSubtype;

import java.util.Locale;

public final class SpacebarLanguageUtils {
    private SpacebarLanguageUtils() {
        // Intentional empty constructor for utility class.
    }

    // InputMethodSubtype's display name for spacebar text in its locale.
    //        isAdditionalSubtype (T=true, F=false)
    // locale layout  |  Middle      Full
    // ------ ------- - --------- ----------------------
    //  en_US qwerty  F  English   English (US)           exception
    //  en_GB qwerty  F  English   English (UK)           exception
    //  es_US spanish F  Español   Español (EE.UU.)       exception
    //  fr    azerty  F  Français  Français
    //  fr_CA qwerty  F  Français  Français (Canada)
    //  fr_CH swiss   F  Français  Français (Suisse)
    //  de    qwertz  F  Deutsch   Deutsch
    //  de_CH swiss   T  Deutsch   Deutsch (Schweiz)
    //  zz    qwerty  F  QWERTY    QWERTY
    //  fr    qwertz  T  Français  Français
    //  de    qwerty  T  Deutsch   Deutsch
    //  en_US azerty  T  English   English (US)
    //  zz    azerty  T  AZERTY    AZERTY
    // Get InputMethodSubtype's full display name in its locale.
    public static String getFullDisplayName(final InputMethodSubtype subtype) {
        if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
            return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype);
        }
        return SubtypeLocaleUtils.getSubtypeLocaleDisplayName(subtype.getLocale());
    }

    // Get InputMethodSubtype's middle display name in its locale.
    public static String getMiddleDisplayName(final InputMethodSubtype subtype) {
        if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
            return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype);
        }
        final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype);
        return SubtypeLocaleUtils.getSubtypeLocaleDisplayName(locale.getLanguage());
    }
}
+0 −35
Original line number Diff line number Diff line
@@ -292,41 +292,6 @@ public final class SubtypeLocaleUtils {
        return keyboardLayoutSet;
    }

    // InputMethodSubtype's display name for spacebar text in its locale.
    //        isAdditionalSubtype (T=true, F=false)
    // locale layout  |  Middle      Full
    // ------ ------- - --------- ----------------------
    //  en_US qwerty  F  English   English (US)           exception
    //  en_GB qwerty  F  English   English (UK)           exception
    //  es_US spanish F  Español   Español (EE.UU.)       exception
    //  fr    azerty  F  Français  Français
    //  fr_CA qwerty  F  Français  Français (Canada)
    //  fr_CH swiss   F  Français  Français (Suisse)
    //  de    qwertz  F  Deutsch   Deutsch
    //  de_CH swiss   T  Deutsch   Deutsch (Schweiz)
    //  zz    qwerty  F  QWERTY    QWERTY
    //  fr    qwertz  T  Français  Français
    //  de    qwerty  T  Deutsch   Deutsch
    //  en_US azerty  T  English   English (US)
    //  zz    azerty  T  AZERTY    AZERTY

    // Get InputMethodSubtype's full display name in its locale.
    public static String getFullDisplayName(final InputMethodSubtype subtype) {
        if (isNoLanguage(subtype)) {
            return getKeyboardLayoutSetDisplayName(subtype);
        }
        return getSubtypeLocaleDisplayName(subtype.getLocale());
    }

    // Get InputMethodSubtype's middle display name in its locale.
    public static String getMiddleDisplayName(final InputMethodSubtype subtype) {
        if (isNoLanguage(subtype)) {
            return getKeyboardLayoutSetDisplayName(subtype);
        }
        final Locale locale = getSubtypeLocale(subtype);
        return getSubtypeLocaleDisplayName(locale.getLanguage());
    }

    // TODO: Get this information from the framework instead of maintaining here by ourselves.
    // Sorted list of known Right-To-Left language codes.
    private static final String[] SORTED_RTL_LANGUAGES = {
+251 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2011 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.inputmethod.latin.utils;

import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;

import com.android.inputmethod.latin.RichInputMethodManager;

import java.util.ArrayList;
import java.util.Locale;

@SmallTest
public class SpacebarLanguagetUtilsTests extends AndroidTestCase {
    // All input method subtypes of LatinIME.
    private final ArrayList<InputMethodSubtype> mSubtypesList = CollectionUtils.newArrayList();

    private RichInputMethodManager mRichImm;
    private Resources mRes;

    InputMethodSubtype EN_US;
    InputMethodSubtype EN_GB;
    InputMethodSubtype ES_US;
    InputMethodSubtype FR;
    InputMethodSubtype FR_CA;
    InputMethodSubtype FR_CH;
    InputMethodSubtype DE;
    InputMethodSubtype DE_CH;
    InputMethodSubtype ZZ;
    InputMethodSubtype DE_QWERTY;
    InputMethodSubtype FR_QWERTZ;
    InputMethodSubtype EN_US_AZERTY;
    InputMethodSubtype EN_UK_DVORAK;
    InputMethodSubtype ES_US_COLEMAK;
    InputMethodSubtype ZZ_AZERTY;
    InputMethodSubtype ZZ_PC;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        final Context context = getContext();
        RichInputMethodManager.init(context);
        mRichImm = RichInputMethodManager.getInstance();
        mRes = context.getResources();
        SubtypeLocaleUtils.init(context);

        final InputMethodInfo imi = mRichImm.getInputMethodInfoOfThisIme();
        final int subtypeCount = imi.getSubtypeCount();
        for (int index = 0; index < subtypeCount; index++) {
            final InputMethodSubtype subtype = imi.getSubtypeAt(index);
            mSubtypesList.add(subtype);
        }

        EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                Locale.US.toString(), "qwerty");
        EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                Locale.UK.toString(), "qwerty");
        ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                "es_US", "spanish");
        FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                Locale.FRENCH.toString(), "azerty");
        FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                Locale.CANADA_FRENCH.toString(), "qwerty");
        FR_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                "fr_CH", "swiss");
        DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                Locale.GERMAN.toString(), "qwertz");
        DE_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                "de_CH", "swiss");
        ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
                SubtypeLocaleUtils.NO_LANGUAGE, "qwerty");
        DE_QWERTY = AdditionalSubtypeUtils.createAdditionalSubtype(
                Locale.GERMAN.toString(), "qwerty", null);
        FR_QWERTZ = AdditionalSubtypeUtils.createAdditionalSubtype(
                Locale.FRENCH.toString(), "qwertz", null);
        EN_US_AZERTY = AdditionalSubtypeUtils.createAdditionalSubtype(
                Locale.US.toString(), "azerty", null);
        EN_UK_DVORAK = AdditionalSubtypeUtils.createAdditionalSubtype(
                Locale.UK.toString(), "dvorak", null);
        ES_US_COLEMAK = AdditionalSubtypeUtils.createAdditionalSubtype(
                "es_US", "colemak", null);
        ZZ_AZERTY = AdditionalSubtypeUtils.createAdditionalSubtype(
                SubtypeLocaleUtils.NO_LANGUAGE, "azerty", null);
        ZZ_PC = AdditionalSubtypeUtils.createAdditionalSubtype(
                SubtypeLocaleUtils.NO_LANGUAGE, "pcqwerty", null);
    }

    public void testAllFullDisplayNameForSpacebar() {
        for (final InputMethodSubtype subtype : mSubtypesList) {
            final String subtypeName = SubtypeLocaleUtils
                    .getSubtypeDisplayNameInSystemLocale(subtype);
            final String spacebarText = SpacebarLanguageUtils.getFullDisplayName(subtype);
            final String languageName = SubtypeLocaleUtils
                    .getSubtypeLocaleDisplayName(subtype.getLocale());
            if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
                assertFalse(subtypeName, spacebarText.contains(languageName));
            } else {
                assertTrue(subtypeName, spacebarText.contains(languageName));
            }
        }
    }

   public void testAllMiddleDisplayNameForSpacebar() {
        for (final InputMethodSubtype subtype : mSubtypesList) {
            final String subtypeName = SubtypeLocaleUtils
                    .getSubtypeDisplayNameInSystemLocale(subtype);
            final String spacebarText = SpacebarLanguageUtils.getMiddleDisplayName(subtype);
            if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
                assertEquals(subtypeName,
                        SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype), spacebarText);
            } else {
                final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype);
                assertEquals(subtypeName,
                        SubtypeLocaleUtils.getSubtypeLocaleDisplayName(locale.getLanguage()),
                        spacebarText);
            }
        }
    }

    // InputMethodSubtype's display name for spacebar text in its locale.
    //        isAdditionalSubtype (T=true, F=false)
    // locale layout  |  Middle     Full
    // ------ ------- - --------- ----------------------
    //  en_US qwerty  F  English   English (US)           exception
    //  en_GB qwerty  F  English   English (UK)           exception
    //  es_US spanish F  Español   Español (EE.UU.)       exception
    //  fr    azerty  F  Français  Français
    //  fr_CA qwerty  F  Français  Français (Canada)
    //  fr_CH swiss   F  Français  Français (Suisse)
    //  de    qwertz  F  Deutsch   Deutsch
    //  de_CH swiss   F  Deutsch   Deutsch (Schweiz)
    //  zz    qwerty  F  QWERTY    QWERTY
    //  fr    qwertz  T  Français  Français
    //  de    qwerty  T  Deutsch   Deutsch
    //  en_US azerty  T  English   English (US)
    //  zz    azerty  T  AZERTY    AZERTY

    private final RunInLocale<Void> testsPredefinedSubtypesForSpacebar = new RunInLocale<Void>() {
        @Override
        protected Void job(final Resources res) {
            assertEquals("en_US", "English (US)",
                    SpacebarLanguageUtils.getFullDisplayName(EN_US));
            assertEquals("en_GB", "English (UK)",
                    SpacebarLanguageUtils.getFullDisplayName(EN_GB));
            assertEquals("es_US", "Español (EE.UU.)",
                    SpacebarLanguageUtils.getFullDisplayName(ES_US));
            assertEquals("fr", "Français",
                    SpacebarLanguageUtils.getFullDisplayName(FR));
            assertEquals("fr_CA", "Français (Canada)",
                    SpacebarLanguageUtils.getFullDisplayName(FR_CA));
            assertEquals("fr_CH", "Français (Suisse)",
                    SpacebarLanguageUtils.getFullDisplayName(FR_CH));
            assertEquals("de", "Deutsch",
                    SpacebarLanguageUtils.getFullDisplayName(DE));
            assertEquals("de_CH", "Deutsch (Schweiz)",
                    SpacebarLanguageUtils.getFullDisplayName(DE_CH));
            assertEquals("zz", "QWERTY",
                    SpacebarLanguageUtils.getFullDisplayName(ZZ));

            assertEquals("en_US", "English",
                    SpacebarLanguageUtils.getMiddleDisplayName(EN_US));
            assertEquals("en_GB", "English",
                    SpacebarLanguageUtils.getMiddleDisplayName(EN_GB));
            assertEquals("es_US", "Español",
                    SpacebarLanguageUtils.getMiddleDisplayName(ES_US));
            assertEquals("fr", "Français",
                    SpacebarLanguageUtils.getMiddleDisplayName(FR));
            assertEquals("fr_CA", "Français",
                    SpacebarLanguageUtils.getMiddleDisplayName(FR_CA));
            assertEquals("fr_CH", "Français",
                    SpacebarLanguageUtils.getMiddleDisplayName(FR_CH));
            assertEquals("de", "Deutsch",
                    SpacebarLanguageUtils.getMiddleDisplayName(DE));
            assertEquals("de_CH", "Deutsch",
                    SpacebarLanguageUtils.getMiddleDisplayName(DE_CH));
            assertEquals("zz", "QWERTY",
                    SpacebarLanguageUtils.getMiddleDisplayName(ZZ));
            return null;
        }
    };

    private final RunInLocale<Void> testsAdditionalSubtypesForSpacebar = new RunInLocale<Void>() {
        @Override
        protected Void job(final Resources res) {
            assertEquals("fr qwertz", "Français",
                    SpacebarLanguageUtils.getFullDisplayName(FR_QWERTZ));
            assertEquals("de qwerty", "Deutsch",
                    SpacebarLanguageUtils.getFullDisplayName(DE_QWERTY));
            assertEquals("en_US azerty", "English (US)",
                    SpacebarLanguageUtils.getFullDisplayName(EN_US_AZERTY));
            assertEquals("en_UK dvorak", "English (UK)",
                    SpacebarLanguageUtils.getFullDisplayName(EN_UK_DVORAK));
            assertEquals("es_US colemak", "Español (EE.UU.)",
                    SpacebarLanguageUtils.getFullDisplayName(ES_US_COLEMAK));
            assertEquals("zz azerty", "AZERTY",
                    SpacebarLanguageUtils.getFullDisplayName(ZZ_AZERTY));
            assertEquals("zz pc", "PC",
                    SpacebarLanguageUtils.getFullDisplayName(ZZ_PC));

            assertEquals("fr qwertz", "Français",
                    SpacebarLanguageUtils.getMiddleDisplayName(FR_QWERTZ));
            assertEquals("de qwerty", "Deutsch",
                    SpacebarLanguageUtils.getMiddleDisplayName(DE_QWERTY));
            assertEquals("en_US azerty", "English",
                    SpacebarLanguageUtils.getMiddleDisplayName(EN_US_AZERTY));
            assertEquals("en_UK dvorak", "English",
                    SpacebarLanguageUtils.getMiddleDisplayName(EN_UK_DVORAK));
            assertEquals("es_US colemak", "Español",
                    SpacebarLanguageUtils.getMiddleDisplayName(ES_US_COLEMAK));
            assertEquals("zz azerty", "AZERTY",
                    SpacebarLanguageUtils.getMiddleDisplayName(ZZ_AZERTY));
            assertEquals("zz pc", "PC",
                    SpacebarLanguageUtils.getMiddleDisplayName(ZZ_PC));
            return null;
        }
    };

    public void testPredefinedSubtypesForSpacebarInEnglish() {
        testsPredefinedSubtypesForSpacebar.runInLocale(mRes, Locale.ENGLISH);
    }

    public void testAdditionalSubtypeForSpacebarInEnglish() {
        testsAdditionalSubtypesForSpacebar.runInLocale(mRes, Locale.ENGLISH);
    }

    public void testPredefinedSubtypesForSpacebarInFrench() {
        testsPredefinedSubtypesForSpacebar.runInLocale(mRes, Locale.FRENCH);
    }

    public void testAdditionalSubtypeForSpacebarInFrench() {
        testsAdditionalSubtypesForSpacebar.runInLocale(mRes, Locale.FRENCH);
    }
}
+33 −138

File changed.

Preview size limit exceeded, changes collapsed.