diff --git a/java/res/xml/keyboard_layout_set_qwerty.xml b/java/res/xml/keyboard_layout_set_qwerty.xml index 1aa6f010a..7c9a1403e 100644 --- a/java/res/xml/keyboard_layout_set_qwerty.xml +++ b/java/res/xml/keyboard_layout_set_qwerty.xml @@ -24,7 +24,7 @@ latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_qwerty" latin:enableProximityCharsCorrection="true" - latin:supportsSplitLayout="false" /> + latin:supportsSplitLayout="true" /> diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java index 43c61443e..f9cf3535e 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java @@ -77,8 +77,7 @@ public final class KeyboardId { private final int mHashCode; - public KeyboardId(final int elementId, final KeyboardLayoutSet.Params params, - boolean isSplitLayout) { + public KeyboardId(final int elementId, final KeyboardLayoutSet.Params params) { mSubtype = params.mSubtype; mLocale = SubtypeLocaleUtils.getSubtypeLocale(mSubtype); mWidth = params.mKeyboardWidth; @@ -91,7 +90,7 @@ public final class KeyboardId { mCustomActionLabel = (mEditorInfo.actionLabel != null) ? mEditorInfo.actionLabel.toString() : null; mHasShortcutKey = params.mVoiceInputKeyEnabled; - mIsSplitLayout = isSplitLayout; + mIsSplitLayout = params.mIsSplitLayoutEnabled; mHashCode = computeHashCode(this); } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java index 1dbecdc81..47fb7b320 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java @@ -115,6 +115,12 @@ public final class KeyboardLayoutSet { int mKeyboardWidth; int mKeyboardHeight; int mScriptId = ScriptUtils.SCRIPT_LATIN; + // Indicates if the user has enabled the split-layout preference + // and the required ProductionFlags are enabled. + boolean mIsSplitLayoutEnabledByUser; + // Indicates if split layout is actually enabled, taking into account + // whether the user has enabled it, and the keyboard layout supports it. + boolean mIsSplitLayoutEnabled; // Sparse array of KeyboardLayoutSet element parameters indexed by element's id. final SparseArray mKeyboardLayoutSetElementIdToParamsMap = new SparseArray<>(); @@ -170,9 +176,9 @@ public final class KeyboardLayoutSet { // specified as an elementKeyboard attribute in the file. // The KeyboardId is an internal key for a Keyboard object. - // TODO: AND mSupportsSplitLayout with the user preference that forces a split. - final KeyboardId id = new KeyboardId(keyboardLayoutSetElementId, mParams, - elementParams.mSupportsSplitLayout); + mParams.mIsSplitLayoutEnabled = mParams.mIsSplitLayoutEnabledByUser + && elementParams.mSupportsSplitLayout; + final KeyboardId id = new KeyboardId(keyboardLayoutSetElementId, mParams); try { return getKeyboard(elementParams, id); } catch (final RuntimeException e) { @@ -290,12 +296,19 @@ public final class KeyboardLayoutSet { return this; } - public void disableTouchPositionCorrectionData() { + public Builder disableTouchPositionCorrectionData() { mParams.mDisableTouchPositionCorrectionDataForTest = true; + return this; } - public void setScriptId(final int scriptId) { + public Builder setScriptId(final int scriptId) { mParams.mScriptId = scriptId; + return this; + } + + public Builder setSplitLayoutEnabledByUser(final boolean enabled) { + mParams.mIsSplitLayoutEnabledByUser = enabled; + return this; } public KeyboardLayoutSet build() { diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 6cd7955ce..246d11bac 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -36,6 +36,7 @@ import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.RichInputMethodManager; import com.android.inputmethod.latin.SubtypeSwitcher; import com.android.inputmethod.latin.WordComposer; +import com.android.inputmethod.latin.define.ProductionFlags; import com.android.inputmethod.latin.settings.Settings; import com.android.inputmethod.latin.settings.SettingsValues; import com.android.inputmethod.latin.utils.ResourceUtils; @@ -114,6 +115,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { builder.setSubtype(mSubtypeSwitcher.getCurrentSubtype()); builder.setVoiceInputKeyEnabled(settingsValues.mShowsVoiceInputKey); builder.setLanguageSwitchKeyEnabled(mLatinIME.shouldShowLanguageSwitchKey()); + builder.setSplitLayoutEnabledByUser(ProductionFlags.IS_SPLIT_KEYBOARD_SUPPORTED + && settingsValues.mIsSplitKeyboardEnabled); mKeyboardLayoutSet = builder.build(); try { mState.onLoadKeyboard(currentAutoCapsState, currentRecapitalizeState); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index fa4192790..2056a0b9d 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -674,15 +674,18 @@ public class KeyboardBuilder { R.styleable.Keyboard_Case_languageCode, id.mLocale.getLanguage()); final boolean countryCodeMatched = matchString(caseAttr, R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry()); + final boolean splitLayoutMatched = matchBoolean(caseAttr, + R.styleable.Keyboard_Case_isSplitLayout, id.mIsSplitLayout); final boolean selected = keyboardLayoutSetMatched && keyboardLayoutSetElementMatched && keyboardThemeMacthed && modeMatched && navigateNextMatched && navigatePreviousMatched && passwordInputMatched && clobberSettingsKeyMatched && hasShortcutKeyMatched && languageSwitchKeyEnabledMatched && isMultiLineMatched && imeActionMatched && isIconDefinedMatched - && localeCodeMatched && languageCodeMatched && countryCodeMatched; + && localeCodeMatched && languageCodeMatched && countryCodeMatched + && splitLayoutMatched; if (DEBUG) { - startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE, + startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE, textAttr(caseAttr.getString( R.styleable.Keyboard_Case_keyboardLayoutSet), "keyboardLayoutSet"), textAttr(caseAttr.getString( @@ -707,6 +710,8 @@ public class KeyboardBuilder { "languageSwitchKeyEnabled"), booleanAttr(caseAttr, R.styleable.Keyboard_Case_isMultiLine, "isMultiLine"), + booleanAttr(caseAttr, R.styleable.Keyboard_Case_isSplitLayout, + "splitLayout"), textAttr(caseAttr.getString(R.styleable.Keyboard_Case_isIconDefined), "isIconDefined"), textAttr(caseAttr.getString(R.styleable.Keyboard_Case_localeCode), diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java index b64ab8c80..5bca2dc7c 100644 --- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java +++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java @@ -117,12 +117,12 @@ public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase { protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, final EditorInfo editorInfo) { return createKeyboardLayoutSet(subtype, editorInfo, false /* voiceInputKeyEnabled */, - false /* languageSwitchKeyEnabled */); + false /* languageSwitchKeyEnabled */, false /* splitLayoutEnabled */); } protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, final EditorInfo editorInfo, final boolean voiceInputKeyEnabled, - final boolean languageSwitchKeyEnabled) { + final boolean languageSwitchKeyEnabled, final boolean splitLayoutEnabled) { final Context context = getContext(); final Resources res = context.getResources(); final int keyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res); @@ -131,7 +131,8 @@ public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase { builder.setKeyboardGeometry(keyboardWidth, keyboardHeight) .setSubtype(new RichInputMethodSubtype(subtype)) .setVoiceInputKeyEnabled(voiceInputKeyEnabled) - .setLanguageSwitchKeyEnabled(languageSwitchKeyEnabled); + .setLanguageSwitchKeyEnabled(languageSwitchKeyEnabled) + .setSplitLayoutEnabledByUser(splitLayoutEnabled); return builder.build(); } } diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishSplitCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishSplitCustomizer.java new file mode 100644 index 000000000..b6d57d33a --- /dev/null +++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishSplitCustomizer.java @@ -0,0 +1,35 @@ +/* + * 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.keyboard.layout.tests; + +import com.android.inputmethod.keyboard.layout.LayoutBase; +import com.android.inputmethod.keyboard.layout.expected.ExpectedKey; + +import java.util.Locale; + +public class EnglishSplitCustomizer extends EnglishCustomizer { + + EnglishSplitCustomizer(Locale locale) { + super(locale); + } + + @Override + public ExpectedKey[] getSpaceKeys(final boolean isPhone) { + return LayoutBase.joinKeys( + LayoutBase.LANGUAGE_SWITCH_KEY, LayoutBase.SPACE_KEY, LayoutBase.SPACE_KEY); + } +} diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java index a22ed60ac..a8c4ac8fa 100644 --- a/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java +++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/LayoutTestsBase.java @@ -54,7 +54,8 @@ abstract class LayoutTestsBase extends KeyboardLayoutSetTestsBase { + (isPhone() ? "phone" : "tablet"); // TODO: Test with language switch key enabled and disabled. mKeyboardLayoutSet = createKeyboardLayoutSet(mSubtype, null /* editorInfo */, - true /* voiceInputKeyEnabled */, true /* languageSwitchKeyEnabled */); + true /* voiceInputKeyEnabled */, true /* languageSwitchKeyEnabled */, + false /* splitLayoutEnabled */); } @Override diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java index 37ca09238..b25b84674 100644 --- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java +++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java @@ -44,12 +44,13 @@ public class TestsDvorakEmail extends LayoutTestsBase { @Override protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, final EditorInfo editorInfo, final boolean voiceInputKeyEnabled, - final boolean languageSwitchKeyEnabled) { + final boolean languageSwitchKeyEnabled, final boolean splitLayoutEnabled) { final EditorInfo emailField = new EditorInfo(); emailField.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS; return super.createKeyboardLayoutSet( - subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled); + subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled, + splitLayoutEnabled); } private static class DvorakEmailCustomizer extends EnglishDvorakCustomizer { diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java index 3bcae0ce4..ba22f375d 100644 --- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java +++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java @@ -44,12 +44,13 @@ public class TestsDvorakUrl extends LayoutTestsBase { @Override protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, final EditorInfo editorInfo, final boolean voiceInputKeyEnabled, - final boolean languageSwitchKeyEnabled) { + final boolean languageSwitchKeyEnabled, final boolean splitLayoutEnabled) { final EditorInfo emailField = new EditorInfo(); emailField.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI; return super.createKeyboardLayoutSet( - subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled); + subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled, + splitLayoutEnabled); } private static class DvorakUrlCustomizer extends EnglishDvorakCustomizer { diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java index 8563d6933..f89863279 100644 --- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java +++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java @@ -42,12 +42,13 @@ public class TestsQwertyEmail extends LayoutTestsBase { @Override protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, final EditorInfo editorInfo, final boolean voiceInputKeyEnabled, - final boolean languageSwitchKeyEnabled) { + final boolean languageSwitchKeyEnabled, final boolean splitLayoutEnabled) { final EditorInfo emailField = new EditorInfo(); emailField.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS; return super.createKeyboardLayoutSet( - subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled); + subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled, + splitLayoutEnabled); } private static class EnglishEmailCustomizer extends EnglishCustomizer { diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java index 1c1a2bbbd..0b69c7bc2 100644 --- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java +++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java @@ -42,12 +42,13 @@ public class TestsQwertyUrl extends LayoutTestsBase { @Override protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, final EditorInfo editorInfo, final boolean voiceInputKeyEnabled, - final boolean languageSwitchKeyEnabled) { + final boolean languageSwitchKeyEnabled, final boolean splitLayoutEnabled) { final EditorInfo emailField = new EditorInfo(); emailField.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI; return super.createKeyboardLayoutSet( - subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled); + subtype, emailField, voiceInputKeyEnabled, languageSwitchKeyEnabled, + splitLayoutEnabled); } private static class EnglishUrlCustomizer extends EnglishCustomizer { diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSplitLayoutQwertyEnglishUS.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSplitLayoutQwertyEnglishUS.java new file mode 100644 index 000000000..b9e40e0e7 --- /dev/null +++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSplitLayoutQwertyEnglishUS.java @@ -0,0 +1,47 @@ +/* + * 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.keyboard.layout.tests; + +import android.test.suitebuilder.annotation.SmallTest; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.keyboard.KeyboardLayoutSet; +import com.android.inputmethod.keyboard.layout.LayoutBase; +import com.android.inputmethod.keyboard.layout.Qwerty; + +import java.util.Locale; + +/** + * en_US: English (United States)/qwerty - split layout + */ +@SmallTest +public class TestsSplitLayoutQwertyEnglishUS extends LayoutTestsBase { + private static final Locale LOCALE = new Locale("en", "US"); + private static final LayoutBase LAYOUT = new Qwerty(new EnglishSplitCustomizer(LOCALE)); + + @Override + protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype, + final EditorInfo editorInfo, final boolean voiceInputKeyEnabled, + final boolean languageSwitchKeyEnabled, final boolean splitLayoutEnabled) { + return super.createKeyboardLayoutSet(subtype, editorInfo, voiceInputKeyEnabled, + languageSwitchKeyEnabled, true /* splitLayoutEnabled */); + } + + @Override + LayoutBase getLayout() { return LAYOUT; } +}