Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 5f060a2

Browse files
authoredJun 5, 2019
Pinyin keyboard fixes (#1272)
* Improve pinyin punctuation and autocompletion * Improve autocompletion view layouts * Add tangerine color
1 parent 18753ac commit 5f060a2

10 files changed

+183
-24
lines changed
 

‎app/src/common/shared/org/mozilla/vrbrowser/ui/keyboards/ChinesePinyinKeyboard.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.mozilla.vrbrowser.utils.StringUtils;
1313

1414
import java.util.ArrayList;
15+
import java.util.Arrays;
1516
import java.util.Collections;
1617
import java.util.HashMap;
1718
import java.util.List;
@@ -27,6 +28,9 @@ public class ChinesePinyinKeyboard extends BaseKeyboard {
2728
private DBHelper mDB;
2829
private HashMap<String, KeyMap> mKeymaps = new HashMap<>();
2930
private HashMap<String, KeyMap> mExtraKeymaps = new HashMap<>();
31+
private List<Character> mAutocompleteEndings = Arrays.asList(
32+
' ', ',', '。','!','?','ー'
33+
);
3034

3135
public ChinesePinyinKeyboard(Context aContext) {
3236
super(aContext);
@@ -36,7 +40,7 @@ public ChinesePinyinKeyboard(Context aContext) {
3640
@Override
3741
public CustomKeyboard getAlphabeticKeyboard() {
3842
if (mKeyboard == null) {
39-
mKeyboard = new CustomKeyboard(mContext.getApplicationContext(), R.xml.keyboard_qwerty);
43+
mKeyboard = new CustomKeyboard(mContext.getApplicationContext(), R.xml.keyboard_qwerty_pinyin);
4044
loadDatabase();
4145
}
4246
return mKeyboard;
@@ -45,12 +49,13 @@ public CustomKeyboard getAlphabeticKeyboard() {
4549
@Nullable
4650
@Override
4751
public CandidatesResult getCandidates(String aComposingText) {
48-
if (aComposingText == null) {
52+
if (StringUtils.isEmpty(aComposingText)) {
4953
return null;
5054
}
5155

52-
// Autocomplete when space is clicked
53-
boolean endsWithSpace = aComposingText.endsWith(" ");
56+
// Autocomplete when special characters are clicked
57+
char lastChar = aComposingText.charAt(aComposingText.length() - 1);
58+
boolean autocomponse = mAutocompleteEndings.indexOf(lastChar) >= 0;
5459

5560
aComposingText = aComposingText.replaceAll("\\s","");
5661
if (aComposingText.isEmpty()) {
@@ -107,7 +112,7 @@ public CandidatesResult getCandidates(String aComposingText) {
107112

108113
CandidatesResult result = new CandidatesResult();
109114
result.words = words;
110-
result.action = endsWithSpace ? CandidatesResult.Action.AUTO_COMPOSE : CandidatesResult.Action.SHOW_CANDIDATES;
115+
result.action = autocomponse ? CandidatesResult.Action.AUTO_COMPOSE : CandidatesResult.Action.SHOW_CANDIDATES;
111116
result.composing = aComposingText;
112117
if (result.words.size() > 0) {
113118
String codeWithoutSpaces = StringUtils.removeSpaces(result.words.get(0).code);

‎app/src/common/shared/org/mozilla/vrbrowser/ui/views/AutoCompletionView.java

+23-7
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ public class AutoCompletionView extends FrameLayout {
2727
private LinearLayout mExtendContent;
2828
private ScrollView mScrollView;
2929
private View mSeparator;
30-
private int mKeyWidth;
30+
private View mExtendButtonSeparator;
31+
private int mMinKeyWidth;
3132
private int mKeyHeight;
3233
private int mLineWidth;
3334
private int mLineHeight;
35+
private int mItemPadding;
3436
private UIButton mExtendButton;
3537
private int mExtendedHeight;
3638
private ArrayList<Words> mExtraItems = new ArrayList<>();
@@ -61,6 +63,7 @@ private void initialize(Context aContext) {
6163
inflate(aContext, R.layout.autocompletion_bar, this);
6264
mFirstLine = findViewById(R.id.autoCompletionFirstLine);
6365
mSeparator = findViewById(R.id.autoCompletionSeparator);
66+
mExtendButtonSeparator = findViewById(R.id.extendButtonSeparator);
6467
mScrollView = findViewById(R.id.autoCompletionScroll);
6568
mExtendButton = findViewById(R.id.extendButton);
6669
mExtendButton.setTintColorList(R.drawable.main_button_icon_color);
@@ -72,9 +75,11 @@ private void initialize(Context aContext) {
7275
enterExtend();
7376
}
7477
});
75-
mKeyWidth = mKeyHeight = WidgetPlacement.pixelDimension(getContext(), R.dimen.autocompletion_widget_button_size);
78+
mMinKeyWidth = WidgetPlacement.pixelDimension(getContext(), R.dimen.autocompletion_widget_min_item_width);
79+
mKeyHeight = WidgetPlacement.pixelDimension(getContext(), R.dimen.autocompletion_widget_item_height);
7680
mLineWidth = WidgetPlacement.pixelDimension(getContext(), R.dimen.autocompletion_widget_line_width);
7781
mLineHeight = WidgetPlacement.pixelDimension(getContext(), R.dimen.autocompletion_widget_line_height);
82+
mItemPadding = WidgetPlacement.pixelDimension(getContext(), R.dimen.autocompletion_widget_item_padding);
7883
mExtendedHeight = mLineHeight * 6;
7984
setFocusable(false);
8085
}
@@ -90,15 +95,15 @@ public void setDelegate(AutoCompletionView.Delegate aDelegate) {
9095
private UITextButton createButton(Words aWords, OnClickListener aHandler) {
9196
UITextButton key = new UITextButton(getContext());
9297
key.setTintColorList(R.drawable.main_button_icon_color);
93-
key.setBackground(getContext().getDrawable(R.drawable.keyboard_key_background));
98+
key.setBackground(getContext().getDrawable(R.drawable.autocompletion_item_background));
9499
if (aHandler != null) {
95100
key.setOnClickListener(aHandler);
96101
}
97102
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mKeyHeight);
98-
key.setMinWidth(mKeyWidth);
103+
key.setMinWidth(mMinKeyWidth);
99104
params.gravity = CENTER_VERTICAL;
100105
key.setLayoutParams(params);
101-
key.setPadding(10, 20, 10, 0);
106+
key.setPadding(mItemPadding, 20, mItemPadding, 0);
102107
key.setIncludeFontPadding(false);
103108
key.setText(aWords.value);
104109
key.setTextAlignment(TEXT_ALIGNMENT_CENTER);
@@ -121,18 +126,24 @@ public void setItems(List<Words> aItems) {
121126
if (aItems == null || aItems.size() == 0) {
122127
exitExtend();
123128
mExtendButton.setVisibility(View.GONE);
129+
mExtendButtonSeparator.setVisibility(View.GONE);
124130
return;
125131
}
126132

127133
int n = 0;
128134
int currentWidth = 0;
135+
int extendButtonWidth = mExtendButton.getWidth();
129136

130137
for (Words item : aItems) {
131138
UITextButton textBtn = createButton(item, clickHandler);
139+
if (n == 0) {
140+
textBtn.setBackground(getContext().getDrawable(R.drawable.autocompletion_item_background_first));
141+
textBtn.setTintColorList(R.drawable.autocompletion_item_active_color);
142+
}
132143
textBtn.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
133144
currentWidth += textBtn.getMeasuredWidth();
134145

135-
if (currentWidth < mLineWidth) {
146+
if (currentWidth < (mLineWidth - extendButtonWidth)) {
136147
mFirstLine.addView(textBtn);
137148
} else {
138149
mExtraItems.add(item);
@@ -141,6 +152,7 @@ public void setItems(List<Words> aItems) {
141152
}
142153

143154
mExtendButton.setVisibility(currentWidth >= mLineWidth ? View.VISIBLE : View.GONE);
155+
mExtendButtonSeparator.setVisibility(mExtendButton.getVisibility());
144156
}
145157

146158
public boolean isExtended() {
@@ -161,13 +173,14 @@ private void layoutExtendedItems() {
161173
int index = 0;
162174
int currentWidth = 0;
163175
LinearLayout current = createRow();
176+
int padding = mScrollView.getPaddingStart() + mScrollView.getPaddingEnd();
164177

165178
for (Words item: mExtraItems) {
166179
UITextButton textBtn = createButton(item, clickHandler);
167180
textBtn.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
168181
currentWidth += textBtn.getMeasuredWidth();
169182

170-
if (currentWidth < mLineWidth) {
183+
if (currentWidth < (mLineWidth - padding)) {
171184
current.addView(textBtn);
172185
index++;
173186
} else {
@@ -193,6 +206,8 @@ private void enterExtend() {
193206
layoutExtendedItems();
194207
}
195208

209+
mExtendButton.setScaleY(-1);
210+
196211
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams();
197212
params.height = mExtendedHeight;
198213
setLayoutParams(params);
@@ -208,6 +223,7 @@ private void exitExtend() {
208223
mIsExtended = false;
209224
mScrollView.setVisibility(View.GONE);
210225
mSeparator.setVisibility(View.GONE);
226+
mExtendButton.setScaleY(1);
211227
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams();
212228
params.height = WidgetPlacement.pixelDimension(getContext(), R.dimen.autocompletion_widget_line_height);
213229
setLayoutParams(params);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
2+
<item android:color="@color/tangerine"/>
3+
</selector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:state_pressed="true">
4+
<shape android:shape="rectangle">
5+
<solid android:color="@color/void_color"/>
6+
</shape>
7+
</item>
8+
<item android:state_hovered="true">
9+
<shape android:shape="rectangle">
10+
<solid android:color="@color/fog"/>
11+
</shape>
12+
</item>
13+
<item android:state_hovered="false" android:drawable="@null">
14+
<shape android:shape="rectangle">
15+
<solid android:color="@color/asphalt"/>
16+
</shape>
17+
</item>
18+
</selector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:state_pressed="true">
4+
<shape android:shape="rectangle">
5+
<corners android:topLeftRadius="@dimen/keyboard_key_rounded_corner" android:bottomLeftRadius="@dimen/keyboard_key_rounded_corner"/>
6+
<solid android:color="@color/void_color"/>
7+
</shape>
8+
</item>
9+
<item android:state_hovered="true">
10+
<shape android:shape="rectangle">
11+
<corners android:topLeftRadius="@dimen/keyboard_key_rounded_corner" android:bottomLeftRadius="@dimen/keyboard_key_rounded_corner"/>
12+
<solid android:color="@color/fog"/>
13+
</shape>
14+
</item>
15+
<item android:state_hovered="false" android:drawable="@null">
16+
<shape android:shape="rectangle">
17+
<corners android:topLeftRadius="@dimen/keyboard_key_rounded_corner" android:bottomLeftRadius="@dimen/keyboard_key_rounded_corner"/>
18+
<solid android:color="@color/asphalt"/>
19+
</shape>
20+
</item>
21+
</selector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:state_pressed="true">
4+
<shape android:shape="rectangle">
5+
<corners android:topRightRadius="@dimen/keyboard_key_rounded_corner" android:bottomRightRadius="@dimen/keyboard_key_rounded_corner"/>
6+
<solid android:color="@color/void_color"/>
7+
</shape>
8+
</item>
9+
<item android:state_hovered="true">
10+
<shape android:shape="rectangle">
11+
<corners android:topRightRadius="@dimen/keyboard_key_rounded_corner" android:bottomRightRadius="@dimen/keyboard_key_rounded_corner"/>
12+
<solid android:color="@color/fog"/>
13+
</shape>
14+
</item>
15+
<item android:state_hovered="false" android:drawable="@null">
16+
<shape android:shape="rectangle">
17+
<corners android:topRightRadius="@dimen/keyboard_key_rounded_corner" android:bottomRightRadius="@dimen/keyboard_key_rounded_corner"/>
18+
<solid android:color="@color/asphalt"/>
19+
</shape>
20+
</item>
21+
</selector>

‎app/src/main/res/layout/autocompletion_bar.xml

+20-10
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
<LinearLayout
1111
android:layout_width="match_parent"
1212
android:layout_height="@dimen/autocompletion_widget_line_height"
13-
android:paddingStart="20dp"
14-
android:paddingEnd="20dp"
1513
android:layout_gravity="center_vertical"
1614
android:orientation="horizontal">
1715
<ScrollView
@@ -22,22 +20,34 @@
2220
<LinearLayout
2321
android:id="@+id/autoCompletionFirstLine"
2422
android:layout_width="wrap_content"
25-
android:layout_height="wrap_content"
23+
android:layout_height="@dimen/autocompletion_widget_line_height"
2624
android:layout_gravity="center_vertical"
2725
android:orientation="horizontal">
2826
</LinearLayout>
2927
</ScrollView>
28+
<View
29+
android:id="@+id/extendButtonSeparator"
30+
android:layout_width="0.5dp"
31+
android:layout_height="match_parent"
32+
android:layout_marginTop="1dp"
33+
android:layout_marginBottom="1dp"
34+
android:background="@color/iron"
35+
android:visibility="gone"/>
3036
<org.mozilla.vrbrowser.ui.views.UIButton
3137
android:id="@+id/extendButton"
32-
android:layout_width="50dp"
33-
android:layout_height="27dp"
38+
android:layout_width="@dimen/autocompletion_widget_extend_button_width"
39+
android:layout_height="match_parent"
3440
android:scaleType="fitCenter"
3541
android:layout_gravity="center_vertical"
36-
android:padding="5dp"
37-
android:layout_marginStart="10dp"
42+
android:paddingTop="10dp"
43+
android:paddingBottom="10dp"
44+
android:layout_marginTop="1dp"
45+
android:layout_marginBottom="1dp"
46+
android:paddingStart="@dimen/autocompletion_widget_item_padding"
47+
android:paddingEnd="@dimen/autocompletion_widget_item_padding"
3848
android:src="@drawable/ic_arrow_down"
3949
android:visibility="gone"
40-
android:background="@drawable/keyboard_featured_key_background"/>
50+
android:background="@drawable/autocompletion_item_background_last"/>
4151
</LinearLayout>
4252
<View
4353
android:id="@+id/autoCompletionSeparator"
@@ -49,10 +59,10 @@
4959
<ScrollView
5060
android:id="@+id/autoCompletionScroll"
5161
android:layout_width="match_parent"
52-
android:paddingStart="20dp"
53-
android:paddingEnd="20dp"
5462
android:paddingTop="12dp"
5563
android:paddingBottom="12dp"
64+
android:paddingStart="1dp"
65+
android:paddingEnd="5dp"
5666
android:layout_height="0dp"
5767
android:layout_weight="100"
5868
android:visibility="gone">

‎app/src/main/res/values/colors.xml

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<color name="grass">#8dc63f</color>
2626
<color name="dessert">#ef4136</color>
2727
<color name="blackberry">#25003e</color>
28+
<color name="tangerine">#ff921e</color>
2829
<color name="iron">#5d5d5d</color>
2930
<color name="rhino">#8c898a</color>
3031
<color name="geranium">#d73e5a</color>

‎app/src/main/res/values/dimen.xml

+5-2
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,14 @@
107107
<dimen name="no_internet_z_distance" format="float" type="dimen">2.5</dimen>
108108

109109
<!-- Autocompletion Widget -->
110-
<dimen name="autocompletion_widget_line_width">530dp</dimen>
110+
<dimen name="autocompletion_widget_line_width">674dp</dimen>
111111
<dimen name="autocompletion_widget_line_height">36dp</dimen>
112112
<dimen name="autocompletion_widget_extended_height">160dp</dimen>
113113
<dimen name="autocompletion_widget_margin">4dp</dimen>
114-
<dimen name="autocompletion_widget_button_size">34dp</dimen>
114+
<dimen name="autocompletion_widget_min_item_width">56dp</dimen>
115+
<dimen name="autocompletion_widget_item_height">36dp</dimen>
116+
<dimen name="autocompletion_widget_extend_button_width">74dp</dimen>
117+
<dimen name="autocompletion_widget_item_padding">20dp</dimen>
115118

116119
<!-- Tray -->
117120
<item name="tray_world_y" format="float" type="dimen">0.1</item>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:horizontalGap="@dimen/keyboard_horizontal_gap"
4+
android:verticalGap="@dimen/keyboard_vertical_gap"
5+
android:keyWidth="@dimen/keyboard_key_width"
6+
android:keyHeight="@dimen/keyboard_key_height">
7+
<Row>
8+
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:popupKeyboard="@xml/keyboard_popup" android:popupCharacters="@string/keyboard_popup_q" />
9+
<Key android:codes="119" android:keyLabel="w" android:popupCharacters="@string/keyboard_popup_w" android:popupKeyboard="@xml/keyboard_popup" />
10+
<Key android:codes="101" android:keyLabel="e" android:popupCharacters="@string/keyboard_popup_e" android:popupKeyboard="@xml/keyboard_popup" />
11+
<Key android:codes="114" android:keyLabel="r" android:popupCharacters="@string/keyboard_popup_r" android:popupKeyboard="@xml/keyboard_popup" />
12+
<Key android:codes="116" android:keyLabel="t" android:popupCharacters="@string/keyboard_popup_t" android:popupKeyboard="@xml/keyboard_popup" />
13+
<Key android:codes="121" android:keyLabel="y" android:popupCharacters="@string/keyboard_popup_y" android:popupKeyboard="@xml/keyboard_popup" />
14+
<Key android:codes="117" android:keyLabel="u" android:popupCharacters="@string/keyboard_popup_u" android:popupKeyboard="@xml/keyboard_popup" />
15+
<Key android:codes="105" android:keyLabel="i" android:popupCharacters="@string/keyboard_popup_i" android:popupKeyboard="@xml/keyboard_popup" />
16+
<Key android:codes="111" android:keyLabel="o" android:popupCharacters="@string/keyboard_popup_o" android:popupKeyboard="@xml/keyboard_popup" />
17+
<Key android:codes="112" android:keyLabel="p" android:popupCharacters="@string/keyboard_popup_p" android:popupKeyboard="@xml/keyboard_popup" />
18+
<Key android:codes="95" android:keyLabel="_"/>
19+
<Key android:codes="-5" android:keyIcon="@drawable/ic_icon_keyboard_backspace" android:isRepeatable="true" android:keyWidth="@dimen/keyboard_key_backspace_width" />
20+
</Row>
21+
22+
<Row>
23+
<Key android:codes="97" android:keyLabel="a" android:popupCharacters="@string/keyboard_popup_a" android:popupKeyboard="@xml/keyboard_popup" android:keyEdgeFlags="left" android:horizontalGap="@dimen/keyboard_left_margin" />
24+
<Key android:codes="115" android:keyLabel="s" android:popupCharacters="@string/keyboard_popup_s" android:popupKeyboard="@xml/keyboard_popup" />
25+
<Key android:codes="100" android:keyLabel="d" android:popupCharacters="@string/keyboard_popup_d" android:popupKeyboard="@xml/keyboard_popup"/>
26+
<Key android:codes="102" android:keyLabel="f" android:popupCharacters="@string/keyboard_popup_f" android:popupKeyboard="@xml/keyboard_popup" />
27+
<Key android:codes="103" android:keyLabel="g" android:popupCharacters="@string/keyboard_popup_g" android:popupKeyboard="@xml/keyboard_popup"/>
28+
<Key android:codes="104" android:keyLabel="h" android:popupCharacters="@string/keyboard_popup_h" android:popupKeyboard="@xml/keyboard_popup"/>
29+
<Key android:codes="106" android:keyLabel="j" android:popupCharacters="@string/keyboard_popup_j" android:popupKeyboard="@xml/keyboard_popup"/>
30+
<Key android:codes="107" android:keyLabel="k" android:popupCharacters="@string/keyboard_popup_k" android:popupKeyboard="@xml/keyboard_popup"/>
31+
<Key android:codes="108" android:keyLabel="l" android:popupCharacters="@string/keyboard_popup_l" android:popupKeyboard="@xml/keyboard_popup" />
32+
<Key android:keyOutputText="" android:keyLabel=""/>
33+
<Key android:codes="-4" android:keyLabel="@string/keyboard_enter_label" android:keyWidth="@dimen/keyboard_key_enter_width" />
34+
</Row>
35+
36+
<Row>
37+
<Key android:codes="-1" android:keyIcon="@drawable/ic_icon_keyboard_shift_off" android:keyEdgeFlags="left"/>
38+
<Key android:codes="122" android:keyLabel="z" android:popupCharacters="@string/keyboard_popup_z" android:popupKeyboard="@xml/keyboard_popup"/>
39+
<Key android:codes="120" android:keyLabel="x" android:popupCharacters="@string/keyboard_popup_x" android:popupKeyboard="@xml/keyboard_popup"/>
40+
<Key android:codes="99" android:keyLabel="c" android:popupCharacters="@string/keyboard_popup_c" android:popupKeyboard="@xml/keyboard_popup"/>
41+
<Key android:codes="118" android:keyLabel="v" android:popupCharacters="@string/keyboard_popup_v" android:popupKeyboard="@xml/keyboard_popup" />
42+
<Key android:codes="98" android:keyLabel="b" android:popupCharacters="@string/keyboard_popup_b" android:popupKeyboard="@xml/keyboard_popup" />
43+
<Key android:codes="110" android:keyLabel="n" android:popupCharacters="@string/keyboard_popup_n" android:popupKeyboard="@xml/keyboard_popup" />
44+
<Key android:codes="109" android:keyLabel="m" android:popupCharacters="@string/keyboard_popup_m" android:popupKeyboard="@xml/keyboard_popup" />
45+
<Key android:codes="45" android:keyLabel="-" />
46+
<Key android:codes="43" android:keyLabel="+" />
47+
<Key android:codes="47" android:keyLabel="/" />
48+
<Key android:codes="-1" android:keyIcon="@drawable/ic_icon_keyboard_shift_off" />
49+
</Row>
50+
51+
<Row>
52+
<Key android:codes="-2" android:keyLabel="@string/keyboard_symbol" android:keyEdgeFlags="left"/>
53+
<Key android:codes="-12" android:keyIcon="@drawable/ic_icon_keyboard_globe" />
54+
<Key android:codes="32" android:keyLabel="" android:keyWidth="@dimen/keyboard_key_space_width" android:isRepeatable="true"/>
55+
<Key android:keyOutputText="" android:keyLabel=""/>
56+
<Key android:keyOutputText="" android:keyLabel=""/>
57+
<Key android:codes="33" android:keyLabel="!" android:popupCharacters="" android:popupKeyboard="@xml/keyboard_popup" />
58+
<Key android:codes="63" android:keyLabel="\?" android:popupCharacters="\?¿" android:popupKeyboard="@xml/keyboard_popup" />
59+
<Key android:codes="64" android:keyLabel="\@"/>
60+
</Row>
61+
</Keyboard>

0 commit comments

Comments
 (0)
This repository has been archived.