Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a57eeff2ae | ||
|
|
63b5f290e3 | ||
|
|
acc035d8ba | ||
|
|
0757a82e2b | ||
|
|
d05415fb65 | ||
|
|
b3afc8e7f2 | ||
|
|
5d94ae66ac | ||
|
|
0ed1761b8e | ||
|
|
e9cc575c31 | ||
|
|
4262862a1b | ||
|
|
1313101d70 | ||
|
|
643b7e5443 | ||
|
|
524b371c63 | ||
|
|
aebdadb0fa | ||
|
|
f54ec3e5b0 |
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
notes.txt
|
||||
/other
|
||||
/files
|
||||
/misc
|
||||
tmp/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
 LeanKeyKeyboard
|
||||
 LeanKeyKeyboard
|
||||
=========
|
||||
|
||||
[](https://www.mozilla.org/MPL/2.0/)
|
||||
@@ -37,8 +37,9 @@ __Standard installation via ADB__
|
||||
|
||||
### Screenshots:
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Why using it:
|
||||
* LeanKeyKeyboard provides possibility to enter text with any length.
|
||||
|
||||
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "org.liskovsoft.leankeykeyboard.pro"
|
||||
minSdkVersion project.properties.minSdkVersion
|
||||
targetSdkVersion project.properties.targetSdkVersion
|
||||
versionCode 53
|
||||
versionName "4.3.3"
|
||||
versionCode 59
|
||||
versionName "4.3.9"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<uses-feature android:name="android.hardware.microphone" android:required="false"/>
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
|
||||
<application android:banner="@drawable/banner_app" android:label="LeanKey Keyboard Pro" android:icon="@drawable/ic_launcher" tools:targetApi="21">
|
||||
<application android:banner="@drawable/banner_app" android:label="@string/ime_name" android:icon="@drawable/ic_launcher" tools:targetApi="21">
|
||||
<activity android:launchMode="singleTop" android:name="com.liskovsoft.inputchooser.SettingsActivity">
|
||||
<meta-data android:name="package" android:value="com.android.settings"/>
|
||||
<meta-data android:name="class" android:value="com.android.settings.Settings"/>
|
||||
@@ -15,7 +15,7 @@
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<service android:label="LeanKey Keyboard" android:name="com.google.leanback.ime.LeanbackImeService" android:permission="android.permission.BIND_INPUT_METHOD">
|
||||
<service android:label="@string/ime_service_name" android:name="com.google.leanback.ime.LeanbackImeService" android:permission="android.permission.BIND_INPUT_METHOD">
|
||||
<intent-filter>
|
||||
<action android:name="android.view.InputMethod"/>
|
||||
</intent-filter>
|
||||
|
||||
@@ -66,7 +66,6 @@ public class LeanbackKeyboardContainer {
|
||||
public static final int DIRECTION_LEFT = 1;
|
||||
public static final int DIRECTION_RIGHT = 4;
|
||||
private Keyboard mAbcKeyboard;
|
||||
private Keyboard mAbcKeyboardRU;
|
||||
private Button mActionButtonView;
|
||||
private final float mAlphaIn;
|
||||
private final float mAlphaOut;
|
||||
@@ -318,7 +317,9 @@ public class LeanbackKeyboardContainer {
|
||||
}
|
||||
|
||||
/**
|
||||
* All keyboard settings applied here
|
||||
* Init currently displayed keyboard<br/>
|
||||
* Note: all keyboard settings applied here<br/>
|
||||
* Note: this method is called constantly on new field
|
||||
* @param resources resources (not used)
|
||||
* @param info current ime attributes
|
||||
*/
|
||||
@@ -1120,6 +1121,7 @@ public class LeanbackKeyboardContainer {
|
||||
LeanbackKeyboardView keyboardView = mMainKeyboardView;
|
||||
Keyboard keyboard = mKeyboardManager.getNextKeyboard();
|
||||
mInitialMainKeyboard = keyboard;
|
||||
mAbcKeyboard = keyboard;
|
||||
keyboardView.setKeyboard(keyboard);
|
||||
|
||||
showRunOnceDialog();
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.graphics.Rect;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.inputmethodservice.Keyboard.Key;
|
||||
import android.os.Handler;
|
||||
import android.text.InputType;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
@@ -49,6 +50,7 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
private PointF mTempPoint;
|
||||
private LeanbackKeyboardController.TouchEventListener mTouchEventListener;
|
||||
private long prevTime;
|
||||
private boolean mShowInput;
|
||||
|
||||
public LeanbackKeyboardController(final InputMethodService context, final LeanbackKeyboardController.InputListener listener) {
|
||||
this(context, listener, new TouchNavSpaceTracker(), new LeanbackKeyboardContainer(context));
|
||||
@@ -681,23 +683,39 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
}
|
||||
}
|
||||
|
||||
public void onStartInput(EditorInfo var1) {
|
||||
if (this.mContainer != null) {
|
||||
this.mContainer.onStartInput(var1);
|
||||
this.initInputView();
|
||||
public void onStartInput(EditorInfo info) {
|
||||
if (mContainer != null) {
|
||||
mContainer.onStartInput(info);
|
||||
initInputView();
|
||||
}
|
||||
|
||||
//// prevent accidental kbd pop-up on FireTV devices
|
||||
//// more info: https://forum.xda-developers.com/fire-tv/general/guide-change-screen-keyboard-to-leankey-t3527675/page2
|
||||
//int maskAction = info.imeOptions & EditorInfo.IME_MASK_ACTION;
|
||||
//mShowInput = maskAction != 0;
|
||||
|
||||
mShowInput = info.inputType != InputType.TYPE_NULL;
|
||||
}
|
||||
|
||||
public boolean showInputView() {
|
||||
return mShowInput;
|
||||
}
|
||||
|
||||
private void onHideIme() {
|
||||
mContext.requestHideSelf(InputMethodService.BACK_DISPOSITION_DEFAULT);
|
||||
}
|
||||
|
||||
public void onStartInputView() {
|
||||
this.mKeyDownReceived = false;
|
||||
if (this.mContainer != null) {
|
||||
this.mContainer.onStartInputView();
|
||||
mKeyDownReceived = false;
|
||||
|
||||
if (mContainer != null) {
|
||||
mContainer.onStartInputView();
|
||||
}
|
||||
|
||||
this.mDoubleClickDetector.reset();
|
||||
mDoubleClickDetector.reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent event) {
|
||||
Object tag = view.getTag();
|
||||
if (tag != null && "Go".equals(tag)) {
|
||||
|
||||
@@ -69,6 +69,56 @@ public class LeanbackKeyboardView extends FrameLayout {
|
||||
private int mRowCount;
|
||||
private int mShiftState;
|
||||
private final int mUnfocusStartDelay;
|
||||
private final KeyConverter mConverter;
|
||||
|
||||
private class KeyConverter {
|
||||
private static final int LOWER_CASE = 0;
|
||||
private static final int UPPER_CASE = 1;
|
||||
|
||||
private void init(KeyHolder keyHolder) {
|
||||
// store original label
|
||||
// in case when two characters are stored in one label (e.g. "A|B")
|
||||
if (keyHolder.key.text == null) {
|
||||
keyHolder.key.text = keyHolder.key.label;
|
||||
}
|
||||
}
|
||||
|
||||
public void toLowerCase(KeyHolder keyHolder) {
|
||||
extractChar(LOWER_CASE, keyHolder);
|
||||
}
|
||||
|
||||
public void toUpperCase(KeyHolder keyHolder) {
|
||||
extractChar(UPPER_CASE, keyHolder);
|
||||
}
|
||||
|
||||
private void extractChar(int charCase, KeyHolder keyHolder) {
|
||||
init(keyHolder);
|
||||
|
||||
CharSequence result = null;
|
||||
CharSequence label = keyHolder.key.text;
|
||||
|
||||
String[] labels = splitLabels(label);
|
||||
|
||||
switch (charCase) {
|
||||
case LOWER_CASE:
|
||||
result = labels != null ? labels[0] : label.toString().toLowerCase();
|
||||
break;
|
||||
case UPPER_CASE:
|
||||
result = labels != null ? labels[1] : label.toString().toUpperCase();
|
||||
break;
|
||||
}
|
||||
|
||||
keyHolder.key.label = result;
|
||||
}
|
||||
|
||||
private String[] splitLabels(CharSequence label) {
|
||||
String realLabel = label.toString();
|
||||
|
||||
String[] labels = realLabel.split("\\|");
|
||||
|
||||
return labels.length == 2 ? labels : null; // remember, we encoding two chars
|
||||
}
|
||||
}
|
||||
|
||||
public LeanbackKeyboardView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@@ -92,29 +142,24 @@ public class LeanbackKeyboardView extends FrameLayout {
|
||||
mClickAnimDur = res.getInteger(R.integer.clicked_anim_duration);
|
||||
mUnfocusStartDelay = res.getInteger(R.integer.unfocused_anim_delay);
|
||||
mInactiveMiniKbAlpha = res.getInteger(R.integer.inactive_mini_kb_alpha);
|
||||
mConverter = new KeyConverter();
|
||||
}
|
||||
|
||||
private CharSequence adjustCase(LeanbackKeyboardView.KeyHolder keyHolder) {
|
||||
CharSequence label = keyHolder.key.label;
|
||||
CharSequence result = label;
|
||||
if (label != null && label.length() < 3) {
|
||||
boolean flag;
|
||||
if (keyHolder.isInMiniKb && keyHolder.isInvertible) {
|
||||
flag = true;
|
||||
} else {
|
||||
flag = false;
|
||||
}
|
||||
private void adjustCase(LeanbackKeyboardView.KeyHolder keyHolder) {
|
||||
boolean flag;
|
||||
|
||||
if (this.mKeyboard.isShifted() ^ flag) {
|
||||
result = label.toString().toUpperCase();
|
||||
} else {
|
||||
result = label.toString().toLowerCase();
|
||||
}
|
||||
|
||||
keyHolder.key.label = result;
|
||||
if (keyHolder.isInMiniKb && keyHolder.isInvertible) {
|
||||
flag = true;
|
||||
} else {
|
||||
flag = false;
|
||||
}
|
||||
|
||||
return result;
|
||||
// ^ equals to !=
|
||||
if (mKeyboard.isShifted() ^ flag) {
|
||||
mConverter.toUpperCase(keyHolder);
|
||||
} else {
|
||||
mConverter.toLowerCase(keyHolder);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
|
||||
@@ -53,7 +53,7 @@ public class LeanbackImeService extends InputMethodService {
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public LeanbackImeService() {
|
||||
if (!this.enableHardwareAcceleration()) {
|
||||
if (!enableHardwareAcceleration()) {
|
||||
Log.w("LbImeService", "Could not enable hardware acceleration");
|
||||
}
|
||||
}
|
||||
@@ -224,15 +224,19 @@ public class LeanbackImeService extends InputMethodService {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* At this point, decision whether to show kbd taking place
|
||||
* @return whether to show kbd
|
||||
*/
|
||||
@SuppressLint("MissingSuperCall")
|
||||
@Override
|
||||
public boolean onEvaluateInputViewShown() {
|
||||
return true;
|
||||
return mKeyboardController.showInputView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinishInputView(boolean var1) {
|
||||
super.onFinishInputView(var1);
|
||||
public void onFinishInputView(boolean finishingInput) {
|
||||
super.onFinishInputView(finishingInput);
|
||||
this.sendBroadcast(new Intent(IME_CLOSE));
|
||||
this.mSuggestionsFactory.clearSuggestions();
|
||||
}
|
||||
@@ -246,7 +250,7 @@ public class LeanbackImeService extends InputMethodService {
|
||||
}
|
||||
|
||||
public void onHideIme() {
|
||||
this.requestHideSelf(0);
|
||||
requestHideSelf(InputMethodService.BACK_DISPOSITION_DEFAULT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -266,10 +270,11 @@ public class LeanbackImeService extends InputMethodService {
|
||||
return isInputViewShown() && mKeyboardController.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onShowInputRequested(int flags, boolean configChange) {
|
||||
return true;
|
||||
}
|
||||
// FireTV fix
|
||||
//@Override
|
||||
//public boolean onShowInputRequested(int flags, boolean configChange) {
|
||||
// return true;
|
||||
//}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(final Intent intent, final int flags, final int startId) {
|
||||
@@ -298,6 +303,15 @@ public class LeanbackImeService extends InputMethodService {
|
||||
@Override
|
||||
public void onStartInputView(EditorInfo info, boolean restarting) {
|
||||
super.onStartInputView(info, restarting);
|
||||
|
||||
// FireTV: fix accidental kbd pop-ups
|
||||
// more info: https://forum.xda-developers.com/fire-tv/general/guide-change-screen-keyboard-to-leankey-t3527675/page2
|
||||
updateInputViewShown();
|
||||
if (!mKeyboardController.showInputView()) {
|
||||
onHideIme();
|
||||
return;
|
||||
}
|
||||
|
||||
mKeyboardController.onStartInputView();
|
||||
sendBroadcast(new Intent(IME_OPEN));
|
||||
if (mKeyboardController.areSuggestionsEnabled()) {
|
||||
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -15,6 +15,7 @@
|
||||
<string-array name="additional_languages">
|
||||
<item>Russian|ru</item>
|
||||
<item>Ukrainian|uk</item>
|
||||
<item>Thai|th</item>
|
||||
<item>Hebrew|he</item>
|
||||
<item>Arabic|ar</item>
|
||||
<item>Bulgarian|bg</item>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">LeanKey Keyboard</string>
|
||||
<string name="ime_service_name">LeanKey Keyboard</string>
|
||||
<string name="ime_name">LeanKey Keyboard Pro</string>
|
||||
<string name="ime_service_name">LeanKey Keyboard Pro</string>
|
||||
<string name="word_separators">" .,;:!?
|
||||
()[]*&@{}/<>_+=|"</string>
|
||||
<string name="label_go_key">Go</string>
|
||||
@@ -24,6 +24,6 @@
|
||||
<string name="keyboardview_keycode_right">Right</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Plug in a headset to hear password keys spoken.</string>
|
||||
<string name="keyboard_password_character_no_headset">Dot.</string>
|
||||
<string name="language_dialog_title">Select desired keyboards</string>
|
||||
<string name="language_dialog_title">Select additional keyboards</string>
|
||||
<string name="language_dialog_subtitle">To open dialog next time, long press on \'world\' button</string>
|
||||
</resources>
|
||||
|
||||
68
leankeykeyboard/src/main/res/xml/qwerty_th.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Keyboard android:keyWidth="@dimen/key_width" android:keyHeight="@dimen/key_height" android:horizontalGap="@dimen/keyboard_horizontal_gap" android:verticalGap="@dimen/keyboard_vertical_gap"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- Thai keyboard -->
|
||||
<!-- https://en.wikipedia.org/wiki/Thai_(Unicode_block) -->
|
||||
<Row android:rowEdgeFlags="top">
|
||||
<Key android:keyEdgeFlags="left" android:keyLabel="ๆ|๑" />
|
||||
<Key android:keyLabel="ภ|๒" />
|
||||
<Key android:keyLabel="ถ|๓" />
|
||||
<Key android:keyLabel="ุ|ู" />
|
||||
<Key android:keyLabel="ึ|๔" />
|
||||
<Key android:keyLabel="ค|๕" />
|
||||
<Key android:keyLabel="ต|๖" />
|
||||
<Key android:keyLabel="จ|๗" />
|
||||
<Key android:keyLabel="ข|๘" />
|
||||
<Key android:keyLabel="ช|๙" />
|
||||
<Key android:codes="-5" android:keyEdgeFlags="right" android:keyLabel="@string/keyboardview_keycode_delete" android:keyIcon="@drawable/ic_ime_delete" />
|
||||
</Row>
|
||||
<Row>
|
||||
<!-- NOTE: example of adding different chars to uppercase/lowercase states -->
|
||||
<!-- format is: android:keyLabel="lower_char|upper_char" e.g. android:keyLabel="ฝ|๒" -->
|
||||
<Key android:keyLabel="ไ|๐" android:keyEdgeFlags="left" />
|
||||
<Key android:keyLabel="ำ|ฎ" />
|
||||
<Key android:keyLabel="พ|ฑ" />
|
||||
<Key android:keyLabel="ะ|ธ" />
|
||||
<Key android:keyLabel="ั|ํ" />
|
||||
<Key android:keyLabel="ี|๊" />
|
||||
<Key android:keyLabel="ร|ณ" />
|
||||
<Key android:keyLabel="น|ฯ" />
|
||||
<Key android:keyLabel="ย|ญ" />
|
||||
<Key android:keyLabel="บ|ฐ" />
|
||||
<Key android:keyLabel="ล|," android:keyEdgeFlags="right" />
|
||||
</Row>
|
||||
<Row>
|
||||
<Key android:keyLabel="ฟ|ฤ" android:keyEdgeFlags="left" />
|
||||
<Key android:keyLabel="ห|ฆ" />
|
||||
<Key android:keyLabel="ก|ฏ" />
|
||||
<Key android:keyLabel="ด|โ" />
|
||||
<Key android:keyLabel="เ|ฌ" />
|
||||
<Key android:keyLabel="้|็" />
|
||||
<Key android:keyLabel="่|๋" />
|
||||
<Key android:keyLabel="า|ษ" />
|
||||
<Key android:keyLabel="ส|ศ" />
|
||||
<Key android:keyLabel="ว|ซ" />
|
||||
<Key android:keyLabel="ง|." android:keyEdgeFlags="right" />
|
||||
</Row>
|
||||
<Row>
|
||||
<Key android:keyLabel="ผ|(" android:keyEdgeFlags="left" />
|
||||
<Key android:keyLabel="ป|)" />
|
||||
<Key android:keyLabel="แ|ฉ" />
|
||||
<Key android:keyLabel="อ|ฮ" />
|
||||
<Key android:keyLabel="ิ|ฺ" />
|
||||
<Key android:keyLabel="ื|์" />
|
||||
<Key android:keyLabel="ท|?" />
|
||||
<Key android:keyLabel="ม|ฒ" />
|
||||
<Key android:keyLabel="ใ|ฬ" />
|
||||
<Key android:keyLabel="ฝ|ฦ" />
|
||||
<Key android:keyLabel="ฃ|ฅ" android:keyEdgeFlags="right" />
|
||||
</Row>
|
||||
<Row android:rowEdgeFlags="bottom">
|
||||
<Key android:codes="-2" android:keyEdgeFlags="left" android:keyLabel="@string/keyboardview_keycode_mode_change" android:keyIcon="@drawable/ic_ime_symbols" />
|
||||
<Key android:codes="-1" android:keyLabel="@string/keyboardview_keycode_shift" android:keyIcon="@drawable/ic_ime_shift_off" />
|
||||
<Key android:codes="-9" android:keyLabel="@string/keyboardview_keycode_lang" android:keyIcon="@drawable/ic_ime_world" />
|
||||
<Key android:keyWidth="@dimen/space_key_width" android:codes="32" android:keyLabel="@string/keyboardview_keycode_space" android:keyIcon="@drawable/ic_ime_space_th" />
|
||||
<Key android:codes="-3" android:keyLabel="@string/keyboardview_keycode_left" android:keyIcon="@drawable/ic_ime_left_arrow" />
|
||||
<Key android:codes="-4" android:keyEdgeFlags="right" android:keyLabel="@string/keyboardview_keycode_right" android:keyIcon="@drawable/ic_ime_right_arrow" />
|
||||
</Row>
|
||||
</Keyboard>
|
||||