aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java')
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java96
1 files changed, 75 insertions, 21 deletions
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index c8fbb3d5a..d2031d155 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -18,6 +18,7 @@ package com.android.inputmethod.accessibility;
import android.content.Context;
import android.inputmethodservice.InputMethodService;
+import android.os.SystemClock;
import android.support.v4.view.AccessibilityDelegateCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
@@ -34,6 +35,7 @@ import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.MainKeyboardView;
import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat {
private static final AccessibleKeyboardViewProxy sInstance = new AccessibleKeyboardViewProxy();
@@ -66,8 +68,8 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
private int mEdgeSlop;
/** The most recently set keyboard mode. */
- private int mLastKeyboardMode;
- private static final int NOT_A_KEYBOARD_MODE = -1;
+ private int mLastKeyboardMode = KEYBOARD_IS_HIDDEN;
+ private static final int KEYBOARD_IS_HIDDEN = -1;
public static void init(final InputMethodService inputMethod) {
sInstance.initInternal(inputMethod);
@@ -123,20 +125,27 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
if (keyboard == null) {
return;
}
- mKeyboard = keyboard;
if (mAccessibilityNodeProvider != null) {
mAccessibilityNodeProvider.setKeyboard(keyboard);
}
- final int keyboardMode = keyboard.mId.mMode;
+ final Keyboard lastKeyboard = mKeyboard;
+ final int lastKeyboardMode = mLastKeyboardMode;
+ mKeyboard = keyboard;
+ mLastKeyboardMode = keyboard.mId.mMode;
// Since this method is called even when accessibility is off, make sure
- // to check the state before announcing anything. Also, don't announce
- // changes within the same mode.
- if (AccessibilityUtils.getInstance().isAccessibilityEnabled()
- && (mLastKeyboardMode != keyboardMode)) {
- announceKeyboardMode(keyboardMode);
+ // to check the state before announcing anything.
+ if (!AccessibilityUtils.getInstance().isAccessibilityEnabled()) {
+ return;
+ }
+ // Announce the language name only when the language is changed.
+ if (lastKeyboard == null || !lastKeyboard.mId.mSubtype.equals(keyboard.mId.mSubtype)) {
+ announceKeyboardLanguage(keyboard);
+ }
+ // Announce the mode only when the mode is changed.
+ if (lastKeyboardMode != keyboard.mId.mMode) {
+ announceKeyboardMode(keyboard);
}
- mLastKeyboardMode = keyboardMode;
}
/**
@@ -147,23 +156,35 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
return;
}
announceKeyboardHidden();
- mLastKeyboardMode = NOT_A_KEYBOARD_MODE;
+ mLastKeyboardMode = KEYBOARD_IS_HIDDEN;
}
/**
- * Announces which type of keyboard is being displayed. If the keyboard type
- * is unknown, no announcement is made.
+ * Announces which language of keyboard is being displayed.
*
- * @param mode The new keyboard mode.
+ * @param keyboard The new keyboard.
*/
- private void announceKeyboardMode(final int mode) {
- final int resId = KEYBOARD_MODE_RES_IDS.get(mode);
- if (resId == 0) {
+ private void announceKeyboardLanguage(final Keyboard keyboard) {
+ final String languageText = SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(
+ keyboard.mId.mSubtype);
+ sendWindowStateChanged(languageText);
+ }
+
+ /**
+ * Announces which type of keyboard is being displayed.
+ * If the keyboard type is unknown, no announcement is made.
+ *
+ * @param keyboard The new keyboard.
+ */
+ private void announceKeyboardMode(final Keyboard keyboard) {
+ final int mode = keyboard.mId.mMode;
+ final Context context = mView.getContext();
+ final int modeTextResId = KEYBOARD_MODE_RES_IDS.get(mode);
+ if (modeTextResId == 0) {
return;
}
- final Context context = mView.getContext();
- final String keyboardMode = context.getString(resId);
- final String text = context.getString(R.string.announce_keyboard_mode, keyboardMode);
+ final String modeText = context.getString(modeTextResId);
+ final String text = context.getString(R.string.announce_keyboard_mode, modeText);
sendWindowStateChanged(text);
}
@@ -241,7 +262,8 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
// Make sure we're not getting an EXIT event because the user slid
// off the keyboard area, then force a key press.
if (key != null) {
- getAccessibilityNodeProvider().simulateKeyPress(key);
+ final long downTime = simulateKeyPress(key);
+ simulateKeyRelease(key, downTime);
}
//$FALL-THROUGH$
case MotionEvent.ACTION_HOVER_ENTER:
@@ -282,6 +304,38 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
}
/**
+ * Simulates a key press by injecting touch event into the keyboard view.
+ * This avoids the complexity of trackers and listeners within the keyboard.
+ *
+ * @param key The key to press.
+ */
+ private long simulateKeyPress(final Key key) {
+ final int x = key.getHitBox().centerX();
+ final int y = key.getHitBox().centerY();
+ final long downTime = SystemClock.uptimeMillis();
+ final MotionEvent downEvent = MotionEvent.obtain(
+ downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0);
+ mView.onTouchEvent(downEvent);
+ downEvent.recycle();
+ return downTime;
+ }
+
+ /**
+ * Simulates a key release by injecting touch event into the keyboard view.
+ * This avoids the complexity of trackers and listeners within the keyboard.
+ *
+ * @param key The key to release.
+ */
+ private void simulateKeyRelease(final Key key, final long downTime) {
+ final int x = key.getHitBox().centerX();
+ final int y = key.getHitBox().centerY();
+ final MotionEvent upEvent = MotionEvent.obtain(
+ downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
+ mView.onTouchEvent(upEvent);
+ upEvent.recycle();
+ }
+
+ /**
* Simulates a transition between two {@link Key}s by sending a HOVER_EXIT on the previous key,
* a HOVER_ENTER on the current key, and a HOVER_MOVE on the current key.
*