Add a symbol keyboard.
- Add a symbol layout. - Let it change the layout between qwerty and symbol on KEYCODE_MODE_CHANGE. - Adjust key-sizes of the last row in the qwerty keyboard to make it 100% Bug: 132636760 Test: test manually Change-Id: I33bd70dc47498ad3f6d255641c9edf48113c053d
This commit is contained in:
@@ -67,12 +67,12 @@
|
|||||||
|
|
||||||
<Row android:rowEdgeFlags="bottom">
|
<Row android:rowEdgeFlags="bottom">
|
||||||
<Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done"
|
<Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done"
|
||||||
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
android:keyWidth="15%p" android:keyEdgeFlags="left"/>
|
||||||
<Key android:codes="-2" android:keyLabel="123" android:keyWidth="10%p"/>
|
<Key android:codes="-2" android:keyLabel="123" android:keyWidth="10%p"/>
|
||||||
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
android:keyWidth="40%p" android:isRepeatable="true"/>
|
android:keyWidth="40%p" android:isRepeatable="true"/>
|
||||||
<Key android:codes="46,44" android:keyLabel=". ,"
|
<Key android:codes="46,44" android:keyLabel=". ,"
|
||||||
android:keyWidth="20%p"/>
|
android:keyWidth="15%p"/>
|
||||||
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
</Row>
|
</Row>
|
||||||
|
|||||||
79
samples/MultiClientInputMethod/res/xml/symbols.xml
Executable file
79
samples/MultiClientInputMethod/res/xml/symbols.xml
Executable file
@@ -0,0 +1,79 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright (C) 2019 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="50dip"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="50" android:keyLabel="2"/>
|
||||||
|
<Key android:codes="51" android:keyLabel="3"/>
|
||||||
|
<Key android:codes="52" android:keyLabel="4"/>
|
||||||
|
<Key android:codes="53" android:keyLabel="5"/>
|
||||||
|
<Key android:codes="54" android:keyLabel="6"/>
|
||||||
|
<Key android:codes="55" android:keyLabel="7"/>
|
||||||
|
<Key android:codes="56" android:keyLabel="8"/>
|
||||||
|
<Key android:codes="57" android:keyLabel="9"/>
|
||||||
|
<Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="64" android:keyLabel="\@" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="35" android:keyLabel="\#"/>
|
||||||
|
<Key android:codes="36" android:keyLabel="$"/>
|
||||||
|
<Key android:codes="37" android:keyLabel="%"/>
|
||||||
|
<Key android:codes="38" android:keyLabel="&"/>
|
||||||
|
<Key android:codes="42" android:keyLabel="*"/>
|
||||||
|
<Key android:codes="45" android:keyLabel="-"/>
|
||||||
|
<Key android:codes="61" android:keyLabel="="/>
|
||||||
|
<Key android:codes="40" android:keyLabel="("/>
|
||||||
|
<Key android:codes="41" android:keyLabel=")" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="33" android:keyLabel="!" />
|
||||||
|
<Key android:codes="34" android:keyLabel="""/>
|
||||||
|
<Key android:codes="39" android:keyLabel="\'"/>
|
||||||
|
<Key android:codes="58" android:keyLabel=":"/>
|
||||||
|
<Key android:codes="59" android:keyLabel=";"/>
|
||||||
|
<Key android:codes="47" android:keyLabel="/" />
|
||||||
|
<Key android:codes="63" android:keyLabel="\?"/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done"
|
||||||
|
android:keyWidth="15%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="-2" android:keyLabel="ABC" android:keyWidth="10%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:keyWidth="40%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46,44" android:keyLabel=". ,"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
||||||
@@ -36,7 +36,10 @@ final class SoftInputWindow extends Dialog {
|
|||||||
private static final String TAG = "SoftInputWindow";
|
private static final String TAG = "SoftInputWindow";
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
private final KeyboardView mQwerty;
|
private final KeyboardView mKeyboardView;
|
||||||
|
|
||||||
|
private final Keyboard mQwertygKeyboard;
|
||||||
|
private final Keyboard mSymbolKeyboard;
|
||||||
|
|
||||||
private int mClientId = MultiClientInputMethodServiceDelegate.INVALID_CLIENT_ID;
|
private int mClientId = MultiClientInputMethodServiceDelegate.INVALID_CLIENT_ID;
|
||||||
private int mTargetWindowHandle = MultiClientInputMethodServiceDelegate.INVALID_WINDOW_HANDLE;
|
private int mTargetWindowHandle = MultiClientInputMethodServiceDelegate.INVALID_WINDOW_HANDLE;
|
||||||
@@ -68,10 +71,12 @@ final class SoftInputWindow extends Dialog {
|
|||||||
final LinearLayout layout = new LinearLayout(context);
|
final LinearLayout layout = new LinearLayout(context);
|
||||||
layout.setOrientation(LinearLayout.VERTICAL);
|
layout.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
|
||||||
mQwerty = (KeyboardView) getLayoutInflater().inflate(R.layout.input, null);
|
mKeyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.input, null);
|
||||||
mQwerty.setKeyboard(new Keyboard(context, R.xml.qwerty));
|
mQwertygKeyboard = new Keyboard(context, R.xml.qwerty);
|
||||||
mQwerty.setOnKeyboardActionListener(sNoopListener);
|
mSymbolKeyboard = new Keyboard(context, R.xml.symbols);
|
||||||
layout.addView(mQwerty);
|
mKeyboardView.setKeyboard(mQwertygKeyboard);
|
||||||
|
mKeyboardView.setOnKeyboardActionListener(sNoopListener);
|
||||||
|
layout.addView(mKeyboardView);
|
||||||
|
|
||||||
setContentView(layout, new ViewGroup.LayoutParams(
|
setContentView(layout, new ViewGroup.LayoutParams(
|
||||||
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
||||||
@@ -88,8 +93,12 @@ final class SoftInputWindow extends Dialog {
|
|||||||
return mTargetWindowHandle;
|
return mTargetWindowHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isQwerty() {
|
||||||
|
return mKeyboardView.getKeyboard() == mQwertygKeyboard;
|
||||||
|
}
|
||||||
|
|
||||||
void onFinishClient() {
|
void onFinishClient() {
|
||||||
mQwerty.setOnKeyboardActionListener(sNoopListener);
|
mKeyboardView.setOnKeyboardActionListener(sNoopListener);
|
||||||
mClientId = MultiClientInputMethodServiceDelegate.INVALID_CLIENT_ID;
|
mClientId = MultiClientInputMethodServiceDelegate.INVALID_CLIENT_ID;
|
||||||
mTargetWindowHandle = MultiClientInputMethodServiceDelegate.INVALID_WINDOW_HANDLE;
|
mTargetWindowHandle = MultiClientInputMethodServiceDelegate.INVALID_WINDOW_HANDLE;
|
||||||
}
|
}
|
||||||
@@ -99,7 +108,7 @@ final class SoftInputWindow extends Dialog {
|
|||||||
Log.v(TAG, "onDummyStartInput clientId=" + clientId
|
Log.v(TAG, "onDummyStartInput clientId=" + clientId
|
||||||
+ " targetWindowHandle=" + targetWindowHandle);
|
+ " targetWindowHandle=" + targetWindowHandle);
|
||||||
}
|
}
|
||||||
mQwerty.setOnKeyboardActionListener(sNoopListener);
|
mKeyboardView.setOnKeyboardActionListener(sNoopListener);
|
||||||
mClientId = clientId;
|
mClientId = clientId;
|
||||||
mTargetWindowHandle = targetWindowHandle;
|
mTargetWindowHandle = targetWindowHandle;
|
||||||
}
|
}
|
||||||
@@ -111,7 +120,7 @@ final class SoftInputWindow extends Dialog {
|
|||||||
}
|
}
|
||||||
mClientId = clientId;
|
mClientId = clientId;
|
||||||
mTargetWindowHandle = targetWindowHandle;
|
mTargetWindowHandle = targetWindowHandle;
|
||||||
mQwerty.setOnKeyboardActionListener(new NoopKeyboardActionListener() {
|
mKeyboardView.setOnKeyboardActionListener(new NoopKeyboardActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onKey(int primaryCode, int[] keyCodes) {
|
public void onKey(int primaryCode, int[] keyCodes) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
@@ -128,10 +137,11 @@ final class SoftInputWindow extends Dialog {
|
|||||||
inputConnection.sendKeyEvent(
|
inputConnection.sendKeyEvent(
|
||||||
new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
|
new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
|
||||||
break;
|
break;
|
||||||
|
case Keyboard.KEYCODE_MODE_CHANGE:
|
||||||
|
handleSwitchKeyboard();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (Character.isLetter(primaryCode)) {
|
|
||||||
inputConnection.commitText(String.valueOf((char) primaryCode), 1);
|
inputConnection.commitText(String.valueOf((char) primaryCode), 1);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -148,4 +158,13 @@ final class SoftInputWindow extends Dialog {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handleSwitchKeyboard() {
|
||||||
|
if (isQwerty()) {
|
||||||
|
mKeyboardView.setKeyboard(mSymbolKeyboard);
|
||||||
|
} else {
|
||||||
|
mKeyboardView.setKeyboard(mQwertygKeyboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user