mirror of
https://github.com/yuliskov/LeanKeyboard.git
synced 2026-05-03 05:12:36 -04:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2d8ce5aab | ||
|
|
7dfaac0683 | ||
|
|
cc3f605970 | ||
|
|
ac637c79f4 | ||
|
|
cb13108a11 | ||
|
|
43ef8324bf | ||
|
|
70cfd73ac8 | ||
|
|
0a42892d2d | ||
|
|
c5c88e622d | ||
|
|
6e7db94a30 | ||
|
|
80b76e9d1e | ||
|
|
8c1c36cf0e | ||
|
|
a4d615bbf2 | ||
|
|
5e8e68de44 | ||
|
|
48e12a21d1 | ||
|
|
6a8b9c63e5 | ||
|
|
95ab858296 | ||
|
|
37243e4d11 | ||
|
|
0c7052be55 | ||
|
|
5bf9563011 | ||
|
|
abe60af6a6 | ||
|
|
13bc09cfcd |
22
README.md
22
README.md
@@ -5,8 +5,8 @@
|
||||
|
||||
__LeanKeyKeyboard: Keyboard for Android-based set-top boxes and TVs:__
|
||||
|
||||
Visit Google Play page:
|
||||
* <a href="https://play.google.com/store/apps/details?id=org.liskovsoft.androidtv.rukeyboard" target="_blank">[APP] LeanKeyKeyboard</a>
|
||||
* <a href="https://t.me/LeanKeyKeyboard">Telegram group</a>
|
||||
* <a href="https://play.google.com/store/apps/details?id=org.liskovsoft.androidtv.rukeyboard" target="_blank">Google Play page</a>
|
||||
|
||||
__NOTE: Google Play release is outdated. So I recommend to obtain new releases [here](https://github.com/yuliskov/LeanKeyKeyboard/releases).__
|
||||
|
||||
@@ -17,7 +17,9 @@ __NOTE: Google Play release is outdated. So I recommend to obtain new releases [
|
||||
* Doesn't depend on Google Services.
|
||||
* __No root required!__
|
||||
|
||||
__Switch to other language performed with 'world' button, menu key or long press on the space bar.__
|
||||
__Tip: Switch to other language with language button or by long press on the space bar__
|
||||
|
||||
__Tip: Do long press on the language button to choose between available languages__
|
||||
|
||||
### Screenshots:
|
||||
* __[Open screenshots](#screens)__
|
||||
@@ -31,9 +33,15 @@ __Standard installation via ADB__
|
||||
* <a href="https://github.com/yuliskov/LeanKeyKeyboard/releases" target="_blank">Download latest LeanKeyKeyboard APK</a> and sideload/install with adb:
|
||||
* *adb install -r LeanKeyKeyboard.apk*
|
||||
* Enjoy :)
|
||||
|
||||
### Donation:
|
||||
If you want to support my developments you are welcome to buy me a cup of coffee :)
|
||||
* [__Donation Alerts (RU)__](https://www.donationalerts.ru/r/firsthash)
|
||||
* [__PrivatBank (UA)__](https://privatbank.ua/ru/sendmoney?payment=73ab18516e24ad365808eec66192e756879dde16)
|
||||
* __BTC__: 1JAT5VVWarVBkpVbNDn8UA8HXNdrukuBSx
|
||||
|
||||
### Reviews / Articles:
|
||||
* Just google for "LeanKey Keyboard"
|
||||
* [__XDA Discussion__](https://forum.xda-developers.com/fire-tv/general/guide-change-screen-keyboard-to-leankey-t3527675)
|
||||
|
||||
### Changelog:
|
||||
* [Check releases page for changelog ..](https://github.com/yuliskov/LeanKeyKeyboard/releases)
|
||||
@@ -45,12 +53,6 @@ __Standard installation via ADB__
|
||||
### Developer:
|
||||
* __[yuliskov](https://github.com/yuliskov)__ (design & coding)
|
||||
|
||||
### Donation:
|
||||
If you want to support my developments you are welcome to buy me a cup of coffee :)
|
||||
* BTC: 1JAT5VVWarVBkpVbNDn8UA8HXNdrukuBSx
|
||||
* WMZ: Z375157140784
|
||||
* WMU: U449339012933
|
||||
|
||||
### Screens:
|
||||

|
||||

|
||||
|
||||
@@ -14,14 +14,14 @@ buildscript {
|
||||
// https://stackoverflow.com/questions/20404476/how-to-define-common-android-properties-for-all-modules-using-gradle
|
||||
// Gradle constants example: https://github.com/google/ExoPlayer
|
||||
ext {
|
||||
compileSdkVersion = 26
|
||||
buildToolsVersion = "26.0.2"
|
||||
compileSdkVersion = 28
|
||||
buildToolsVersion = "28.0.3"
|
||||
minSdkVersion = 14
|
||||
targetSdkVersion = 26
|
||||
appCompatVersion = 'com.android.support:appcompat-v7:26.+'
|
||||
appCompatVersion = 'com.android.support:appcompat-v7:28.+'
|
||||
espressoCoreVersion = 'com.android.support.test.espresso:espresso-core:2.2.2'
|
||||
junitVersion = 'junit:junit:4.12'
|
||||
supportVersion = 'com.android.support:support-v4:26.+'
|
||||
supportVersion = 'com.android.support:support-v4:28.+'
|
||||
robolectricVersion = 'org.robolectric:robolectric:3.5.1'
|
||||
crashlyticsVersion = 'com.crashlytics.sdk.android:crashlytics:2.8.0@aar'
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "org.liskovsoft.leankeykeyboard.pro"
|
||||
minSdkVersion project.properties.minSdkVersion
|
||||
targetSdkVersion project.properties.targetSdkVersion
|
||||
versionCode 67
|
||||
versionName "4.3.17"
|
||||
versionCode 80
|
||||
versionName "4.3.30"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
|
||||
|
||||
@@ -5,16 +5,23 @@
|
||||
<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="@string/ime_name" android:icon="@drawable/ic_launcher" tools:targetApi="21">
|
||||
<activity android:launchMode="singleTop" android:name="com.liskovsoft.other.SettingsActivity">
|
||||
<activity android:launchMode="singleTop" android:name="com.liskovsoft.other.GenericLaunchActivity">
|
||||
<meta-data android:name="package" android:value="com.android.settings"/>
|
||||
<meta-data android:name="class" android:value="com.android.settings.Settings$InputMethodAndLanguageSettingsActivity"/>
|
||||
<meta-data android:name="class" android:value="com.android.settings.Settings$LanguageAndInputSettingsActivity"/>
|
||||
<!-- "Languages & input" on old api -->
|
||||
<meta-data android:name="package_alt" android:value="com.android.settings"/>
|
||||
<meta-data android:name="class_alt" android:value="com.android.settings.Settings$InputMethodAndLanguageSettingsActivity"/>
|
||||
<!-- Last try (if above not found) -->
|
||||
<meta-data android:name="intent" android:value="android.settings.INPUT_METHOD_SETTINGS"/>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<service android:label="@string/ime_service_name" 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>
|
||||
|
||||
@@ -320,10 +320,10 @@ public class LeanbackKeyboardContainer {
|
||||
* 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 res resources (not used)
|
||||
* @param info current ime attributes
|
||||
*/
|
||||
private void setImeOptions(Resources resources, EditorInfo info) {
|
||||
private void setImeOptions(Resources res, EditorInfo info) {
|
||||
// do not erase last keyboard
|
||||
if (mInitialMainKeyboard == null) {
|
||||
mInitialMainKeyboard = mAbcKeyboard;
|
||||
@@ -446,23 +446,23 @@ public class LeanbackKeyboardContainer {
|
||||
boolean overestimateHeight = false;
|
||||
switch (focus.type) {
|
||||
case KeyFocus.TYPE_MAIN:
|
||||
boolean showScale = false;
|
||||
overestimateHeight = true;
|
||||
if (focus.code != LeanbackKeyboardView.ASCII_SPACE) {
|
||||
overestimateWidth = true;
|
||||
} else {
|
||||
overestimateWidth = false;
|
||||
showScale = true;
|
||||
}
|
||||
|
||||
LeanbackKeyboardView mainView = mMainKeyboardView;
|
||||
int index = focus.index;
|
||||
|
||||
boolean isClicked = false;
|
||||
if (mTouchState == TOUCH_STATE_CLICK) {
|
||||
overestimateHeight = true;
|
||||
} else {
|
||||
overestimateHeight = false;
|
||||
isClicked = true;
|
||||
}
|
||||
|
||||
mainView.setFocus(index, overestimateHeight, overestimateWidth);
|
||||
mainView.setFocus(index, isClicked, showScale);
|
||||
mPrevView = mMainKeyboardView;
|
||||
overestimateHeight = true;
|
||||
break;
|
||||
case KeyFocus.TYPE_VOICE:
|
||||
mVoiceButtonView.setMicFocused(true);
|
||||
@@ -594,7 +594,12 @@ public class LeanbackKeyboardContainer {
|
||||
mSelector.setX(translatedX);
|
||||
mSelector.setY(translatedY);
|
||||
} else {
|
||||
mSelector.animate().x(translatedX).y(translatedY).setInterpolator(sMovementInterpolator).setDuration(MOVEMENT_ANIMATION_DURATION).start();
|
||||
mSelector.animate()
|
||||
.x(translatedX)
|
||||
.y(translatedY)
|
||||
.setInterpolator(sMovementInterpolator)
|
||||
.setDuration(MOVEMENT_ANIMATION_DURATION)
|
||||
.start();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -853,7 +858,7 @@ public class LeanbackKeyboardContainer {
|
||||
}
|
||||
|
||||
public boolean isVoiceVisible() {
|
||||
return mVoiceButtonView.getVisibility() == 0;
|
||||
return mVoiceButtonView.getVisibility() == View.VISIBLE;
|
||||
}
|
||||
|
||||
public void onInitInputView() {
|
||||
@@ -1031,6 +1036,10 @@ public class LeanbackKeyboardContainer {
|
||||
setKbFocus(focus, false, true);
|
||||
}
|
||||
|
||||
public void setFocus(LeanbackKeyboardContainer.KeyFocus focus, final boolean animate) {
|
||||
setKbFocus(focus, false, animate);
|
||||
}
|
||||
|
||||
public void setSelectorToFocus(Rect rect, boolean overestimateWidth, boolean overestimateHeight, boolean animate) {
|
||||
if (this.mSelector.getWidth() != 0 && this.mSelector.getHeight() != 0 && rect.width() != 0 && rect.height() != 0) {
|
||||
final float width = (float) rect.width();
|
||||
@@ -1132,7 +1141,7 @@ public class LeanbackKeyboardContainer {
|
||||
}
|
||||
|
||||
public void updateAddonKeyboard() {
|
||||
mKeyboardManager = new KeyboardManager(mContext, mAbcKeyboard);
|
||||
mKeyboardManager = new KeyboardManager(mContext);
|
||||
switchToNextKeyboard();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package com.google.android.leanback.ime;
|
||||
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.inputmethodservice.Keyboard.Key;
|
||||
import android.os.Handler;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.text.InputType;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
@@ -30,6 +30,7 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
private static final int KEY_CHANGE_HISTORY_SIZE = 10;
|
||||
private static final long KEY_CHANGE_REVERT_TIME_MS = 100L;
|
||||
private static final String TAG = "LbKbController";
|
||||
public static final String TAG_GO = "Go";
|
||||
private boolean clickConsumed;
|
||||
private long lastClickTime;
|
||||
private LeanbackKeyboardContainer mContainer;
|
||||
@@ -49,8 +50,10 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
private LeanbackKeyboardContainer.KeyFocus mTempFocus;
|
||||
private PointF mTempPoint;
|
||||
private LeanbackKeyboardController.TouchEventListener mTouchEventListener;
|
||||
private long prevTime;
|
||||
private long mPrevTime;
|
||||
private boolean mShowInput;
|
||||
private int mLastEditorIdPhysicalKeyboardWasUsed;
|
||||
private boolean mHideKeyboardWhenPhysicalKeyboardUsed = true;
|
||||
|
||||
public LeanbackKeyboardController(final InputMethodService context, final LeanbackKeyboardController.InputListener listener) {
|
||||
this(context, listener, new TouchNavSpaceTracker(), new LeanbackKeyboardContainer(context));
|
||||
@@ -151,14 +154,19 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
this.commitKey(this.mContainer.getCurrFocus());
|
||||
}
|
||||
|
||||
/**
|
||||
* NOTE: where all magic happens. Input from virtual kbd is processed here.
|
||||
* @param focus current key
|
||||
*/
|
||||
private void commitKey(LeanbackKeyboardContainer.KeyFocus focus) {
|
||||
if (mContainer != null && focus != null) {
|
||||
switch (focus.type) {
|
||||
case KeyFocus.TYPE_VOICE:
|
||||
mContainer.onVoiceClick();
|
||||
return;
|
||||
case KeyFocus.TYPE_ACTION:
|
||||
case KeyFocus.TYPE_ACTION: // NOTE: user presses Go, Send, Search etc
|
||||
mInputListener.onEntry(InputListener.ENTRY_TYPE_ACTION, 0, null);
|
||||
// mContext.hideWindow(); // SmartYouTubeTV fix: force hide keyboard
|
||||
return;
|
||||
case KeyFocus.TYPE_SUGGESTION:
|
||||
mInputListener.onEntry(InputListener.ENTRY_TYPE_SUGGESTION, 0, mContainer.getSuggestionText(focus.index));
|
||||
@@ -434,7 +442,8 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
private boolean handleKeyUpEvent(int keyCode, long currTime) {
|
||||
keyCode = getSimplifiedKey(keyCode);
|
||||
boolean handled;
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK) {
|
||||
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE) {
|
||||
handled = false;
|
||||
} else if (mContainer.isVoiceVisible()) {
|
||||
handled = true;
|
||||
@@ -490,15 +499,39 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
updatePositionToCurrentFocus();
|
||||
}
|
||||
|
||||
private boolean isCallAllowed(int periodMillis) {
|
||||
/**
|
||||
* Simple throttle routine.
|
||||
* @param callInterval interval
|
||||
* @return is allowed
|
||||
*/
|
||||
private boolean isCallAllowedOrigin(int callInterval) {
|
||||
long currTimeMS = System.currentTimeMillis();
|
||||
if (this.prevTime != 0L && currTimeMS - this.prevTime <= (long) (periodMillis * 3)) {
|
||||
if (currTimeMS - this.prevTime > (long) periodMillis) {
|
||||
this.prevTime = 0L;
|
||||
long timeDelta = currTimeMS - mPrevTime;
|
||||
if (mPrevTime != 0 && timeDelta <= (callInterval * 3)) {
|
||||
if (timeDelta > callInterval) {
|
||||
mPrevTime = 0;
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
this.prevTime = currTimeMS;
|
||||
mPrevTime = currTimeMS;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple throttle routine. Simplified comparing to previous. Not tested yet!!!!
|
||||
* @param interval interval
|
||||
* @return is allowed
|
||||
*/
|
||||
private boolean isCallAllowed2(int interval) {
|
||||
long currTimeMS = System.currentTimeMillis();
|
||||
long timeDelta = currTimeMS - mPrevTime;
|
||||
if (mPrevTime == 0) {
|
||||
mPrevTime = currTimeMS;
|
||||
return true;
|
||||
} else if (timeDelta > interval) {
|
||||
mPrevTime = 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -530,13 +563,10 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
}
|
||||
|
||||
private void moveSelectorToPoint(float x, float y) {
|
||||
LeanbackKeyboardContainer container = this.mContainer;
|
||||
LeanbackKeyboardContainer.KeyFocus focus = this.mTempFocus;
|
||||
container.getBestFocus(new Float(x), new Float(y), focus);
|
||||
this.mContainer.setFocus(this.mTempFocus);
|
||||
container = this.mContainer;
|
||||
Rect rect = this.mTempFocus.rect;
|
||||
container.alignSelector((float) rect.centerX(), (float) rect.centerY(), false);
|
||||
LeanbackKeyboardContainer container = mContainer;
|
||||
LeanbackKeyboardContainer.KeyFocus focus = mTempFocus;
|
||||
container.getBestFocus(x, y, focus);
|
||||
mContainer.setFocus(mTempFocus, false);
|
||||
}
|
||||
|
||||
private boolean onDirectionalMove(int dir) {
|
||||
@@ -604,7 +634,7 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
Button button = mContainer.getGoButton();
|
||||
button.setOnTouchListener(this);
|
||||
button.setOnHoverListener(this);
|
||||
button.setTag("Go");
|
||||
button.setTag(TAG_GO);
|
||||
return view;
|
||||
} else {
|
||||
return null;
|
||||
@@ -624,21 +654,21 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to handle on hover event
|
||||
* Control keyboard from the mouse. Movement catching
|
||||
* @param view active view
|
||||
* @param event event object
|
||||
* @return is hover handled
|
||||
*/
|
||||
@Override
|
||||
public boolean onHover(View view, MotionEvent event) {
|
||||
boolean allowed = isCallAllowed(300);
|
||||
if (allowed) {
|
||||
if (event.getAction() == MotionEvent.ACTION_HOVER_MOVE) {
|
||||
PointF pos = getRelativePosition(mContainer.getView(), event);
|
||||
moveSelectorToPoint(pos.x, pos.y);
|
||||
}
|
||||
boolean handled = false;
|
||||
if (event.getAction() == MotionEvent.ACTION_HOVER_MOVE) {
|
||||
PointF pos = getRelativePosition(mContainer.getView(), event);
|
||||
moveSelectorToPoint(pos.x, pos.y);
|
||||
handled = true;
|
||||
}
|
||||
|
||||
return allowed;
|
||||
return handled;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -647,7 +677,12 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
* @param event {@link KeyEvent KeyEvent}
|
||||
* @return is event handled
|
||||
*/
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||
public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {
|
||||
//greater than zero means it is a physical keyboard.
|
||||
//we also want to hide the view if it's a glyph (for example, not physical volume-up key)
|
||||
//if (event.getDeviceId() > 0 && event.isPrintingKey()) onPhysicalKeyboardKeyPressed();
|
||||
if (event.isPrintingKey()) onPhysicalKeyboardKeyPressed();
|
||||
|
||||
mDownFocus.set(mContainer.getCurrFocus());
|
||||
if (mSpaceTracker != null && mSpaceTracker.onKeyDown(keyCode, event)) {
|
||||
return true;
|
||||
@@ -663,6 +698,24 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
}
|
||||
}
|
||||
|
||||
private void onPhysicalKeyboardKeyPressed() {
|
||||
EditorInfo editorInfo = mContext.getCurrentInputEditorInfo();
|
||||
mLastEditorIdPhysicalKeyboardWasUsed = editorInfo == null ? 0 : editorInfo.fieldId;
|
||||
if (mHideKeyboardWhenPhysicalKeyboardUsed) {
|
||||
mContext.hideWindow();
|
||||
}
|
||||
|
||||
// For all other keys, if we want to do transformations on
|
||||
// text being entered with a hard keyboard, we need to process
|
||||
// it and do the appropriate action.
|
||||
// using physical keyboard is more annoying with candidate view in
|
||||
// the way
|
||||
// so we disable it.
|
||||
|
||||
// stopping any soft-keyboard prediction
|
||||
//abortCorrectionAndResetPredictionState(false);
|
||||
}
|
||||
|
||||
public boolean onKeyUp(int keyCode, KeyEvent keyEvent) {
|
||||
if (mSpaceTracker != null && mSpaceTracker.onKeyUp(keyCode, keyEvent)) {
|
||||
return true;
|
||||
@@ -718,31 +771,37 @@ public class LeanbackKeyboardController implements LeanbackKeyboardContainer.Voi
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent event) {
|
||||
Object tag = view.getTag();
|
||||
if (tag != null && "Go".equals(tag)) {
|
||||
fakeKeyIndex(0, KeyFocus.TYPE_ACTION);
|
||||
} else {
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
moveSelectorToPoint(event.getX(), event.getY());
|
||||
fakeClickDown();
|
||||
beginLongClickCountdown();
|
||||
boolean isEnterKey = TAG_GO.equals(tag);
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
if (isEnterKey) {
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if (!clickConsumed) {
|
||||
clickConsumed = true;
|
||||
if (isDoubleClick()) {
|
||||
mContainer.onKeyLongPress();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fakeClickUp();
|
||||
moveSelectorToPoint(event.getX(), event.getY());
|
||||
fakeClickDown();
|
||||
beginLongClickCountdown();
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if (isEnterKey) {
|
||||
fakeKeyIndex(0, KeyFocus.TYPE_ACTION);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!clickConsumed) {
|
||||
clickConsumed = true;
|
||||
if (isDoubleClick()) {
|
||||
mContainer.onKeyLongPress();
|
||||
break;
|
||||
}
|
||||
|
||||
fakeLongClickUp();
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
fakeClickUp();
|
||||
}
|
||||
|
||||
fakeLongClickUp();
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -523,8 +523,12 @@ public class LeanbackKeyboardView extends FrameLayout {
|
||||
}
|
||||
|
||||
mCurrentFocusView = mKeyImageViews[indexFull];
|
||||
mCurrentFocusView.animate().scaleX(scale).scaleY(scale).setInterpolator(LeanbackKeyboardContainer.sMovementInterpolator)
|
||||
.setDuration((long) mClickAnimDur).start();
|
||||
mCurrentFocusView.animate()
|
||||
.scaleX(scale)
|
||||
.scaleY(scale)
|
||||
.setInterpolator(LeanbackKeyboardContainer.sMovementInterpolator)
|
||||
.setDuration((long) mClickAnimDur)
|
||||
.start();
|
||||
}
|
||||
|
||||
mFocusIndex = indexFull;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.google.leanback.ime;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.os.Handler;
|
||||
@@ -161,8 +162,15 @@ public class LeanbackImeService extends InputMethodService {
|
||||
|
||||
connection.commitText(text, 1);
|
||||
mEnterSpaceBeforeCommitting = true;
|
||||
case InputListener.ENTRY_TYPE_ACTION:
|
||||
sendDefaultEditorAction(false);
|
||||
case InputListener.ENTRY_TYPE_ACTION: // NOTE: user presses Go, Send, Search etc
|
||||
boolean result = sendDefaultEditorAction(true);
|
||||
|
||||
if (result) {
|
||||
hideWindow(); // NOTE: SmartYouTubeTV hide kbd on search page fix
|
||||
} else {
|
||||
sendEnterKey(connection);
|
||||
}
|
||||
|
||||
updateSuggestions = false;
|
||||
break;
|
||||
case InputListener.ENTRY_TYPE_LEFT:
|
||||
@@ -210,6 +218,10 @@ public class LeanbackImeService extends InputMethodService {
|
||||
}
|
||||
}
|
||||
|
||||
private void sendEnterKey(InputConnection connection) {
|
||||
connection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateInputView() {
|
||||
mInputView = mKeyboardController.getView();
|
||||
@@ -271,14 +283,39 @@ public class LeanbackImeService extends InputMethodService {
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||
// NOTE: hide keyboard on ESC key
|
||||
// https://github.com/yuliskov/SmartYouTubeTV/issues/142
|
||||
event = mapEscToBack(event);
|
||||
keyCode = mapEscToBack(keyCode);
|
||||
|
||||
return isInputViewShown() && mKeyboardController.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||
// NOTE: hide keyboard on ESC key
|
||||
// https://github.com/yuliskov/SmartYouTubeTV/issues/142
|
||||
event = mapEscToBack(event);
|
||||
keyCode = mapEscToBack(keyCode);
|
||||
|
||||
return isInputViewShown() && mKeyboardController.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event);
|
||||
}
|
||||
|
||||
private KeyEvent mapEscToBack(KeyEvent event) {
|
||||
if (event.getKeyCode() == KeyEvent.KEYCODE_ESCAPE) {
|
||||
// pay attention, you must pass the same action
|
||||
event = new KeyEvent(event.getAction(), KeyEvent.KEYCODE_BACK);
|
||||
}
|
||||
return event;
|
||||
}
|
||||
|
||||
private int mapEscToBack(int keyCode) {
|
||||
if (keyCode == KeyEvent.KEYCODE_ESCAPE) {
|
||||
keyCode = KeyEvent.KEYCODE_BACK;
|
||||
}
|
||||
return keyCode;
|
||||
}
|
||||
|
||||
// FireTV fix
|
||||
//@Override
|
||||
//public boolean onShowInputRequested(int flags, boolean configChange) {
|
||||
@@ -298,7 +335,7 @@ public class LeanbackImeService extends InputMethodService {
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
return Service.START_STICKY;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,7 +8,6 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class KeyboardManager {
|
||||
private final Keyboard mEnglishKeyboard;
|
||||
private final Context mContext;
|
||||
private final KeyboardStateManager mStateManager;
|
||||
private List<? extends KeyboardBuilder> mKeyboardBuilders;
|
||||
@@ -17,13 +16,8 @@ public class KeyboardManager {
|
||||
|
||||
private int mKeyboardIndex = 0;
|
||||
|
||||
public KeyboardManager(Context ctx, int keyboardResId) {
|
||||
this(ctx, new Keyboard(ctx, keyboardResId));
|
||||
}
|
||||
|
||||
public KeyboardManager(Context ctx, Keyboard englishKeyboard) {
|
||||
public KeyboardManager(Context ctx) {
|
||||
mContext = ctx;
|
||||
mEnglishKeyboard = englishKeyboard;
|
||||
mStateManager = new KeyboardStateManager(mContext, this);
|
||||
mStateManager.restore();
|
||||
init();
|
||||
@@ -37,7 +31,6 @@ public class KeyboardManager {
|
||||
|
||||
private List<Keyboard> buildAllKeyboards() {
|
||||
List<Keyboard> keyboards = new ArrayList<>();
|
||||
keyboards.add(mEnglishKeyboard);
|
||||
if (!mKeyboardBuilders.isEmpty()) {
|
||||
for (KeyboardBuilder builder : mKeyboardBuilders) {
|
||||
keyboards.add(builder.createKeyboard());
|
||||
|
||||
@@ -21,26 +21,37 @@ public class ResKeyboardFactory implements KeyboardFactory {
|
||||
@Override
|
||||
public List<? extends KeyboardBuilder> getAllAvailableKeyboards(Context context) {
|
||||
List<KeyboardBuilder> result = new ArrayList<>();
|
||||
|
||||
List<KeyboardInfo> infos = ResKeyboardInfo.getAllKeyboardInfos(context);
|
||||
final Resources resources = mContext.getResources();
|
||||
|
||||
for (final KeyboardInfo info : infos) {
|
||||
if (!info.isEnabled()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
result.add(new KeyboardBuilder() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Keyboard createKeyboard() {
|
||||
return new Keyboard(mContext, resources.getIdentifier("qwerty_" + info.getLangCode(), "xml", mContext.getPackageName()));
|
||||
}
|
||||
});
|
||||
result.add(createKeyboard(info.getLangCode()));
|
||||
}
|
||||
|
||||
// at least one kbd should be enabled
|
||||
if (result.isEmpty()) {
|
||||
KeyboardInfo firstKbd = infos.get(0);
|
||||
result.add(createKeyboard(firstKbd.getLangCode()));
|
||||
firstKbd.setEnabled(true);
|
||||
ResKeyboardInfo.updateAllKeyboardInfos(mContext, infos);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private KeyboardBuilder createKeyboard(final String langCode) {
|
||||
return new KeyboardBuilder() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Keyboard createKeyboard() {
|
||||
return new Keyboard(mContext, mContext.getResources().getIdentifier("qwerty_" + langCode, "xml", mContext.getPackageName()));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needUpdate() {
|
||||
return ResKeyboardInfo.needUpdate();
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
package com.liskovsoft.other;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.widget.Toast;
|
||||
import android.os.Bundle;
|
||||
import android.content.ComponentName;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.Intent;
|
||||
import android.app.Activity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class GenericLaunchActivity extends Activity
|
||||
{
|
||||
private static final String META_PACKAGE_NAME = "package";
|
||||
private static final String META_CLASS_NAME = "class";
|
||||
private static final String META_PACKAGE_NAME_ALT = "package_alt";
|
||||
private static final String META_CLASS_NAME_ALT = "class_alt";
|
||||
private static final String META_INTENT_NAME = "intent";
|
||||
private List<Intent> mIntents = new ArrayList<>();
|
||||
|
||||
protected void onCreate(final Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
launchApp();
|
||||
}
|
||||
|
||||
@SuppressLint("WrongConstant")
|
||||
private void addCommonIntentFlags(final Intent intent) {
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
}
|
||||
|
||||
@SuppressLint("WrongConstant")
|
||||
private ActivityInfo getCurrentActivityInfo() {
|
||||
try {
|
||||
return getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA | PackageManager.GET_ACTIVITIES);
|
||||
}
|
||||
catch (NameNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
makeLongToast(ex.getLocalizedMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void launchApp() {
|
||||
makeIntentList();
|
||||
startIntents();
|
||||
finish();
|
||||
}
|
||||
|
||||
private void startIntents() {
|
||||
for (Intent intent : mIntents) {
|
||||
boolean result = startIntent(intent);
|
||||
if (result) { // run until first successful attempt
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void makeIntentList() {
|
||||
final ActivityInfo activityInfo = getCurrentActivityInfo();
|
||||
if (activityInfo == null) {
|
||||
return;
|
||||
}
|
||||
final Bundle metaData = activityInfo.metaData;
|
||||
|
||||
String metaPackageName = metaData.getString(META_PACKAGE_NAME);
|
||||
String metaClassName = metaData.getString(META_CLASS_NAME);
|
||||
mIntents.add(createIntent(metaPackageName, metaClassName));
|
||||
|
||||
String metaPackageNameAlt = metaData.getString(META_PACKAGE_NAME_ALT);
|
||||
String metaClassNameAlt = metaData.getString(META_CLASS_NAME_ALT);
|
||||
mIntents.add(createIntent(metaPackageNameAlt, metaClassNameAlt));
|
||||
|
||||
String metaIntentName = metaData.getString(META_INTENT_NAME);
|
||||
mIntents.add(createIntent(metaIntentName));
|
||||
}
|
||||
|
||||
private Intent createIntent(String intentName) {
|
||||
if (intentName == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Intent intent = new Intent();
|
||||
intent.setAction(intentName);
|
||||
addCommonIntentFlags(intent);
|
||||
return intent;
|
||||
}
|
||||
|
||||
private Intent createIntent(String packageName, String className) {
|
||||
if (packageName == null || className == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Intent intent = new Intent();
|
||||
intent.setComponent(new ComponentName(packageName, className));
|
||||
addCommonIntentFlags(intent);
|
||||
return intent;
|
||||
}
|
||||
|
||||
private void makeLongToast(final String s) {
|
||||
makeLongToast(s, 10);
|
||||
}
|
||||
|
||||
private void makeLongToast(final String s, int nums) {
|
||||
int n;
|
||||
for (n = nums / 2, nums = 0; nums < n; ++nums) {
|
||||
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean startIntent(final Intent intent) {
|
||||
if (intent == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
startActivity(intent);
|
||||
}
|
||||
catch (ActivityNotFoundException ex) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
//
|
||||
// Decompiled by Procyon v0.5.30
|
||||
//
|
||||
|
||||
package com.liskovsoft.other;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.widget.Toast;
|
||||
import android.os.Bundle;
|
||||
import android.content.ComponentName;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.Intent;
|
||||
import android.app.Activity;
|
||||
|
||||
public class SettingsActivity extends Activity
|
||||
{
|
||||
@SuppressLint("WrongConstant")
|
||||
private void addIntentFlags(final Intent intent) {
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
}
|
||||
|
||||
@SuppressLint("WrongConstant")
|
||||
private ActivityInfo getCurrentActivityInfo() {
|
||||
try {
|
||||
return getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA | PackageManager.GET_ACTIVITIES);
|
||||
}
|
||||
catch (NameNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
makeLongToast(ex.getLocalizedMessage(), 10);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void launchApp() {
|
||||
final Intent intent = makeIntent(getCurrentActivityInfo());
|
||||
addIntentFlags(intent);
|
||||
startIntent(intent);
|
||||
finish();
|
||||
}
|
||||
|
||||
private Intent makeIntent(final ActivityInfo activityInfo) {
|
||||
final Bundle metaData = activityInfo.metaData;
|
||||
final Intent intent = new Intent();
|
||||
if (metaData.getString("intent") != null) {
|
||||
intent.setAction(metaData.getString("intent"));
|
||||
return intent;
|
||||
}
|
||||
intent.setComponent(new ComponentName(metaData.getString("package"), metaData.getString("class")));
|
||||
return intent;
|
||||
}
|
||||
|
||||
private void makeLongToast(final String s, int nums) {
|
||||
int n;
|
||||
for (n = nums / 2, nums = 0; nums < n; ++nums) {
|
||||
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
private void startIntent(final Intent intent) {
|
||||
try {
|
||||
startActivity(intent);
|
||||
}
|
||||
catch (ActivityNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
makeLongToast(ex.getLocalizedMessage(), 10);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onCreate(final Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
launchApp();
|
||||
}
|
||||
}
|
||||
25
leankeykeyboard/src/main/res/values-ar-rXB/strings.xml
Normal file
25
leankeykeyboard/src/main/res/values-ar-rXB/strings.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Leanback Keyboard</string>
|
||||
<string name="ime_service_name">Leanback Keyboard</string>
|
||||
<string name="word_separators">" .,;:!?
|
||||
()[]*&@{}/<>_+=|"</string>
|
||||
<string name="label_go_key">Go</string>
|
||||
<string name="label_next_key">Next</string>
|
||||
<string name="label_send_key">Send</string>
|
||||
<string name="label_search_key">Search</string>
|
||||
<string name="label_done_key">Done</string>
|
||||
<string name="settings_title">Keyboard Options</string>
|
||||
<string name="title_movement_sensitivity">Movement sensitivity</string>
|
||||
<string name="btn_on">On</string>
|
||||
<string name="btn_off">Off</string>
|
||||
<string name="keyboardview_keycode_space">Space</string>
|
||||
<string name="keyboardview_keycode_delete">Delete</string>
|
||||
<string name="keyboardview_keycode_mode_change">Mode change</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Left</string>
|
||||
<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>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-ar/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-ar/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">لوحة مفاتيح Leanback</string>
|
||||
<string name="ime_service_name">لوحة مفاتيح Leanback</string>
|
||||
<string name="label_go_key">انتقال</string>
|
||||
<string name="label_next_key">التالي</string>
|
||||
<string name="label_send_key">إرسال</string>
|
||||
<string name="label_search_key">بحث</string>
|
||||
<string name="label_done_key">تم</string>
|
||||
<string name="settings_title">خيارات لوحة المفاتيح</string>
|
||||
<string name="title_movement_sensitivity">حساسية الحركة</string>
|
||||
<string name="btn_on">تشغيل</string>
|
||||
<string name="btn_off">إيقاف</string>
|
||||
<string name="keyboardview_keycode_space">مسافة</string>
|
||||
<string name="keyboardview_keycode_delete">حذف</string>
|
||||
<string name="keyboardview_keycode_mode_change">تغيير الوضع</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">لليسار</string>
|
||||
<string name="keyboardview_keycode_right">لليمين</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور عندما يتم نطقها.</string>
|
||||
<string name="keyboard_password_character_no_headset">نقطة</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-bg/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-bg/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Клавиатура за Leanback</string>
|
||||
<string name="ime_service_name">Клавиатура за Leanback</string>
|
||||
<string name="label_go_key">Старт</string>
|
||||
<string name="label_next_key">Напред</string>
|
||||
<string name="label_send_key">Изпращане</string>
|
||||
<string name="label_search_key">Търсене</string>
|
||||
<string name="label_done_key">Готово</string>
|
||||
<string name="settings_title">Опции за клавиатурата</string>
|
||||
<string name="title_movement_sensitivity">Чувствителност на движението</string>
|
||||
<string name="btn_on">Включено</string>
|
||||
<string name="btn_off">Изключено</string>
|
||||
<string name="keyboardview_keycode_space">Space</string>
|
||||
<string name="keyboardview_keycode_delete">Изтриване</string>
|
||||
<string name="keyboardview_keycode_mode_change">Промяна на режима</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Left</string>
|
||||
<string name="keyboardview_keycode_right">Right</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Включете слушалки, за да чуете изговарянето на клавишите за паролата.</string>
|
||||
<string name="keyboard_password_character_no_headset">Точка.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-de/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-de/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Leanback-Tastatur</string>
|
||||
<string name="ime_service_name">Leanback-Tastatur</string>
|
||||
<string name="label_go_key">Los</string>
|
||||
<string name="label_next_key">Weiter</string>
|
||||
<string name="label_send_key">Senden</string>
|
||||
<string name="label_search_key">Suchen</string>
|
||||
<string name="label_done_key">Fertig</string>
|
||||
<string name="settings_title">Tastaturoptionen</string>
|
||||
<string name="title_movement_sensitivity">Bewegungsempfindlichkeit</string>
|
||||
<string name="btn_on">An</string>
|
||||
<string name="btn_off">Aus</string>
|
||||
<string name="keyboardview_keycode_space">Leertaste</string>
|
||||
<string name="keyboardview_keycode_delete">Löschen</string>
|
||||
<string name="keyboardview_keycode_mode_change">Modusänderung</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Feststelltaste</string>
|
||||
<string name="keyboardview_keycode_left">Nach links</string>
|
||||
<string name="keyboardview_keycode_right">Nach rechts</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Schließen Sie ein Headset an, um das Passwort gesprochen zu hören.</string>
|
||||
<string name="keyboard_password_character_no_headset">Punkt.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-el/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-el/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Πληκτρολόγιο Leanback</string>
|
||||
<string name="ime_service_name">Πληκτρολόγιο Leanback</string>
|
||||
<string name="label_go_key">Μετάβαση</string>
|
||||
<string name="label_next_key">Επόμενο</string>
|
||||
<string name="label_send_key">Αποστολή</string>
|
||||
<string name="label_search_key">Αναζήτηση</string>
|
||||
<string name="label_done_key">Τέλος</string>
|
||||
<string name="settings_title">Επιλογές πληκτρολογίου</string>
|
||||
<string name="title_movement_sensitivity">Ευαισθησία κίνησης</string>
|
||||
<string name="btn_on">Ενεργοποίηση</string>
|
||||
<string name="btn_off">Απενεργοποίηση</string>
|
||||
<string name="keyboardview_keycode_space">Πλήκτρο διαστήματος</string>
|
||||
<string name="keyboardview_keycode_delete">Διαγραφή</string>
|
||||
<string name="keyboardview_keycode_mode_change">Αλλαγή τρόπου</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Αριστερά</string>
|
||||
<string name="keyboardview_keycode_right">Δεξιά</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Συνδέστε ακουστικά για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται.</string>
|
||||
<string name="keyboard_password_character_no_headset">Τελεία.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-fa/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-fa/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">صفحهکلید Leanback</string>
|
||||
<string name="ime_service_name">صفحهکلید Leanback</string>
|
||||
<string name="label_go_key">برو</string>
|
||||
<string name="label_next_key">بعدی</string>
|
||||
<string name="label_send_key">ارسال</string>
|
||||
<string name="label_search_key">جستجو</string>
|
||||
<string name="label_done_key">انجام شد</string>
|
||||
<string name="settings_title">گزینههای صفحهکلید</string>
|
||||
<string name="title_movement_sensitivity">حساسیت حرکت</string>
|
||||
<string name="btn_on">فعال</string>
|
||||
<string name="btn_off">خاموش</string>
|
||||
<string name="keyboardview_keycode_space">فاصله</string>
|
||||
<string name="keyboardview_keycode_delete">حذف</string>
|
||||
<string name="keyboardview_keycode_mode_change">تغییر حالت</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">چپ</string>
|
||||
<string name="keyboardview_keycode_right">راست</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">هدست را برای شنیدن کلیدهای گذرواژه که خوانده میشوند، وصل کنید.</string>
|
||||
<string name="keyboard_password_character_no_headset">نقطه.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-fr/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-fr/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Clavier Leanback</string>
|
||||
<string name="ime_service_name">Clavier Leanback</string>
|
||||
<string name="label_go_key">OK</string>
|
||||
<string name="label_next_key">Suivant</string>
|
||||
<string name="label_send_key">Envoyer</string>
|
||||
<string name="label_search_key">Rechercher</string>
|
||||
<string name="label_done_key">OK</string>
|
||||
<string name="settings_title">Options de clavier</string>
|
||||
<string name="title_movement_sensitivity">Sensibilité du déplacement</string>
|
||||
<string name="btn_on">Activer</string>
|
||||
<string name="btn_off">Désactiver</string>
|
||||
<string name="keyboardview_keycode_space">Espace</string>
|
||||
<string name="keyboardview_keycode_delete">Supprimer</string>
|
||||
<string name="keyboardview_keycode_mode_change">Changement de mode</string>
|
||||
<string name="keyboardview_keycode_shift">Maj</string>
|
||||
<string name="keyboardview_keycode_caps">Verrouillage des majuscules</string>
|
||||
<string name="keyboardview_keycode_left">Gauche</string>
|
||||
<string name="keyboardview_keycode_right">Droite</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">"Branchez un casque pour entendre l'énoncé des touches lors de la saisie du mot de passe."</string>
|
||||
<string name="keyboard_password_character_no_headset">Point.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-is-rIS/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-is-rIS/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Leanback lyklaborð</string>
|
||||
<string name="ime_service_name">Leanback lyklaborð</string>
|
||||
<string name="label_go_key">Áfram</string>
|
||||
<string name="label_next_key">Næsta</string>
|
||||
<string name="label_send_key">Senda</string>
|
||||
<string name="label_search_key">Leita</string>
|
||||
<string name="label_done_key">Lokið</string>
|
||||
<string name="settings_title">Valkostir lyklaborðs</string>
|
||||
<string name="title_movement_sensitivity">Hreyfinæmi</string>
|
||||
<string name="btn_on">Kveikt</string>
|
||||
<string name="btn_off">Slökkt</string>
|
||||
<string name="keyboardview_keycode_space">Bil</string>
|
||||
<string name="keyboardview_keycode_delete">Eyða</string>
|
||||
<string name="keyboardview_keycode_mode_change">Breyta stillingu</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Hástafalás</string>
|
||||
<string name="keyboardview_keycode_left">Vinstri</string>
|
||||
<string name="keyboardview_keycode_right">Hægri</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Tengdu heyrnartól til að heyra stafi aðgangsorðsins lesna upphátt.</string>
|
||||
<string name="keyboard_password_character_no_headset">Punktur.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-it/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-it/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Tastiera Leanback</string>
|
||||
<string name="ime_service_name">Tastiera Leanback</string>
|
||||
<string name="label_go_key">Vai</string>
|
||||
<string name="label_next_key">Avanti</string>
|
||||
<string name="label_send_key">Invia</string>
|
||||
<string name="label_search_key">Cerca</string>
|
||||
<string name="label_done_key">Fine</string>
|
||||
<string name="settings_title">Opzioni tastiera</string>
|
||||
<string name="title_movement_sensitivity">Sensibilità movimento</string>
|
||||
<string name="btn_on">Attiva</string>
|
||||
<string name="btn_off">Disattiva</string>
|
||||
<string name="keyboardview_keycode_space">Spazio</string>
|
||||
<string name="keyboardview_keycode_delete">Elimina</string>
|
||||
<string name="keyboardview_keycode_mode_change">Cambio modalità</string>
|
||||
<string name="keyboardview_keycode_shift">Maiusc</string>
|
||||
<string name="keyboardview_keycode_caps">Bloc Maiusc</string>
|
||||
<string name="keyboardview_keycode_left">Sinistra</string>
|
||||
<string name="keyboardview_keycode_right">Destra</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password.</string>
|
||||
<string name="keyboard_password_character_no_headset">Punto.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-nl/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-nl/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Toetsenbord voor Leanback</string>
|
||||
<string name="ime_service_name">Toetsenbord voor Leanback</string>
|
||||
<string name="label_go_key">Gaan</string>
|
||||
<string name="label_next_key">Volgende</string>
|
||||
<string name="label_send_key">Verzenden</string>
|
||||
<string name="label_search_key">Zoeken</string>
|
||||
<string name="label_done_key">Gereed</string>
|
||||
<string name="settings_title">Toetsenbordopties</string>
|
||||
<string name="title_movement_sensitivity">Gevoeligheid beweging</string>
|
||||
<string name="btn_on">Aan</string>
|
||||
<string name="btn_off">Uit</string>
|
||||
<string name="keyboardview_keycode_space">Spatiebalk</string>
|
||||
<string name="keyboardview_keycode_delete">Verwijderen</string>
|
||||
<string name="keyboardview_keycode_mode_change">Modus wijzigen</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Links</string>
|
||||
<string name="keyboardview_keycode_right">Rechts</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Sluit een headset aan om wachtwoordtoetsen te laten voorlezen.</string>
|
||||
<string name="keyboard_password_character_no_headset">Stip.</string>
|
||||
</resources>
|
||||
@@ -1,10 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="label_go_key">Перейти</string>
|
||||
<string name="label_next_key">Следующ</string>
|
||||
<string name="label_send_key">Послать</string>
|
||||
<string name="label_search_key">Искать</string>
|
||||
<string name="ime_name">Клавиатура Leanback</string>
|
||||
<string name="ime_service_name">Клавиатура Leanback</string>
|
||||
<string name="label_go_key">ОК</string>
|
||||
<string name="label_next_key">Далее</string>
|
||||
<string name="label_send_key">Отправить</string>
|
||||
<string name="label_search_key">Поиск</string>
|
||||
<string name="label_done_key">Готово</string>
|
||||
<string name="settings_title">Настройки клавиатуры</string>
|
||||
<string name="title_movement_sensitivity">Обработка движений</string>
|
||||
<string name="btn_on">ВКЛ</string>
|
||||
<string name="btn_off">ВЫКЛ</string>
|
||||
<string name="keyboardview_keycode_space">Пробел.</string>
|
||||
<string name="keyboardview_keycode_delete">Удалить</string>
|
||||
<string name="keyboardview_keycode_mode_change">Смена режима</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Стрелка влево</string>
|
||||
<string name="keyboardview_keycode_right">Стрелка вправо</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Подключите гарнитуру, чтобы услышать пароль.</string>
|
||||
<string name="keyboard_password_character_no_headset">Точка</string>
|
||||
<string name="language_dialog_title">Выберите дополнительные раскладки</string>
|
||||
<string name="language_dialog_subtitle">Чтобы открыть этот диалог, зажмите кнопку \'земной шар\'</string>
|
||||
</resources>
|
||||
|
||||
26
leankeykeyboard/src/main/res/values-sv/strings.xml
Normal file
26
leankeykeyboard/src/main/res/values-sv/strings.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Tangentbord för Leanback</string>
|
||||
<string name="ime_service_name">Tangentbord för Leanback</string>
|
||||
<string name="label_go_key">Kör</string>
|
||||
<string name="label_next_key">Nästa</string>
|
||||
<string name="label_send_key">Skicka</string>
|
||||
<string name="label_search_key">Sök</string>
|
||||
<string name="label_done_key">Klar</string>
|
||||
<string name="settings_title">Tangentbordsinställningar</string>
|
||||
<string name="title_movement_sensitivity">Rörelsekänslighet</string>
|
||||
<string name="btn_on">På</string>
|
||||
<string name="btn_off">Av</string>
|
||||
<string name="keyboardview_keycode_space">Blanksteg</string>
|
||||
<string name="keyboardview_keycode_delete">Ta bort</string>
|
||||
<string name="keyboardview_keycode_mode_change">Funktionsändring</string>
|
||||
<string name="keyboardview_keycode_shift">Skift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Vänster</string>
|
||||
<string name="keyboardview_keycode_right">Höger</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Anslut hörlurar om du vill höra lösenordet tecken för tecken.</string>
|
||||
<string name="keyboard_password_character_no_headset">Punkt.</string>
|
||||
<string name="keyboardview_keycode_lang">Språk</string>
|
||||
<string name="language_dialog_title">Välj layouter</string>
|
||||
<string name="language_dialog_subtitle">"För att öppna dialogen nästa gång, tryck länge på knappen med världsikonen</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-th/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-th/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">แป้นพิมพ์ Leanback</string>
|
||||
<string name="ime_service_name">แป้นพิมพ์ Leanback</string>
|
||||
<string name="label_go_key">ไป</string>
|
||||
<string name="label_next_key">ถัดไป</string>
|
||||
<string name="label_send_key">ส่ง</string>
|
||||
<string name="label_search_key">ค้นหา</string>
|
||||
<string name="label_done_key">เสร็จสิ้น</string>
|
||||
<string name="settings_title">ตัวเลือกแป้นพิมพ์</string>
|
||||
<string name="title_movement_sensitivity">ความไวในการเคลื่อนที่</string>
|
||||
<string name="btn_on">เปิด</string>
|
||||
<string name="btn_off">ปิด</string>
|
||||
<string name="keyboardview_keycode_space">วรรค</string>
|
||||
<string name="keyboardview_keycode_delete">ลบ</string>
|
||||
<string name="keyboardview_keycode_mode_change">เปลี่ยนโหมด</string>
|
||||
<string name="keyboardview_keycode_shift">Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">ซ้าย</string>
|
||||
<string name="keyboardview_keycode_right">ขวา</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">เสียบชุดหูฟังเพื่อฟังเสียงรหัสผ่าน</string>
|
||||
<string name="keyboard_password_character_no_headset">เครื่องหมายจุด</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-tr/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-tr/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Leanback Klavyesi</string>
|
||||
<string name="ime_service_name">Leanback Klavyesi</string>
|
||||
<string name="label_go_key">Git</string>
|
||||
<string name="label_next_key">İleri</string>
|
||||
<string name="label_send_key">Gönder</string>
|
||||
<string name="label_search_key">Ara</string>
|
||||
<string name="label_done_key">Bitti</string>
|
||||
<string name="settings_title">Klavye Seçenekleri</string>
|
||||
<string name="title_movement_sensitivity">Hareket duyarlılığı</string>
|
||||
<string name="btn_on">Aç</string>
|
||||
<string name="btn_off">Kapat</string>
|
||||
<string name="keyboardview_keycode_space">Boşluk</string>
|
||||
<string name="keyboardview_keycode_delete">Sil</string>
|
||||
<string name="keyboardview_keycode_mode_change">Mod değiştir</string>
|
||||
<string name="keyboardview_keycode_shift">ÜstKrktr</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Sol</string>
|
||||
<string name="keyboardview_keycode_right">Sağ</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Şifre tuşlarının sesli okunmasını dinlemek için mikrofonlu kulaklık takın.</string>
|
||||
<string name="keyboard_password_character_no_headset">Nokta.</string>
|
||||
</resources>
|
||||
23
leankeykeyboard/src/main/res/values-uk/strings.xml
Normal file
23
leankeykeyboard/src/main/res/values-uk/strings.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ime_name">Клавіатура додатка Leanback</string>
|
||||
<string name="ime_service_name">Клавіатура додатка Leanback</string>
|
||||
<string name="label_go_key">ОК</string>
|
||||
<string name="label_next_key">Далі</string>
|
||||
<string name="label_send_key">Надіслати</string>
|
||||
<string name="label_search_key">Пошук</string>
|
||||
<string name="label_done_key">Готово</string>
|
||||
<string name="settings_title">Параметри клавіатури</string>
|
||||
<string name="title_movement_sensitivity">Чутливість руху</string>
|
||||
<string name="btn_on">Увімкнути</string>
|
||||
<string name="btn_off">Вимкнути</string>
|
||||
<string name="keyboardview_keycode_space">Пробіл</string>
|
||||
<string name="keyboardview_keycode_delete">Видалити</string>
|
||||
<string name="keyboardview_keycode_mode_change">Зміна режиму</string>
|
||||
<string name="keyboardview_keycode_shift">Клавіша Shift</string>
|
||||
<string name="keyboardview_keycode_caps">Caps Lock</string>
|
||||
<string name="keyboardview_keycode_left">Ліворуч</string>
|
||||
<string name="keyboardview_keycode_right">Праворуч</string>
|
||||
<string name="keyboard_headset_required_to_hear_password">Підключіть гарнітуру, щоб почути символи пароля.</string>
|
||||
<string name="keyboard_password_character_no_headset">Крапка.</string>
|
||||
</resources>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="additional_languages">
|
||||
<item>Swedish|sv</item>
|
||||
<item>English|us</item>
|
||||
<item>Arabic|ar</item>
|
||||
<item>Bulgarian|bg</item>
|
||||
<item>Dutch|nl</item>
|
||||
@@ -13,6 +13,7 @@
|
||||
<item>Italian|it</item>
|
||||
<item>Persian|fa</item>
|
||||
<item>Russian|ru</item>
|
||||
<item>Swedish|sv</item>
|
||||
<item>Thai|th</item>
|
||||
<item>Turkish|tr</item>
|
||||
<item>Ukrainian|uk</item>
|
||||
|
||||
7
leankeykeyboard/src/main/res/xml/accent_fa_a.xml
Normal file
7
leankeykeyboard/src/main/res/xml/accent_fa_a.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?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">
|
||||
<Row>
|
||||
<Key android:keyLabel="آ" />
|
||||
</Row>
|
||||
</Keyboard>
|
||||
@@ -37,7 +37,8 @@
|
||||
<Key android:keyLabel="ی" />
|
||||
<Key android:keyLabel="ب" />
|
||||
<Key android:keyLabel="ل" />
|
||||
<Key android:keyLabel="ا" />
|
||||
<!-- fix from Shobair Mohammadi <shobairmohammadi@gmail.com> -->
|
||||
<Key android:keyLabel="ا|آ" android:popupKeyboard="@xml/accent_fa_a" />
|
||||
<Key android:keyLabel="ت" />
|
||||
<Key android:keyLabel="ن" />
|
||||
<Key android:keyLabel="م" />
|
||||
|
||||
Reference in New Issue
Block a user