aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/accessibility
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/accessibility')
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java133
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java9
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java265
-rw-r--r--java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java4
4 files changed, 204 insertions, 207 deletions
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
index c628c5b09..ec1ab3565 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
@@ -17,17 +17,13 @@
package com.android.inputmethod.accessibility;
import android.graphics.Rect;
-import android.inputmethodservice.InputMethodService;
import android.os.Bundle;
-import android.os.SystemClock;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
import android.support.v4.view.accessibility.AccessibilityRecordCompat;
import android.util.Log;
-import android.util.SparseArray;
-import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.inputmethod.EditorInfo;
@@ -37,9 +33,10 @@ import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardView;
import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.settings.SettingsValues;
-import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.CoordinateUtils;
+import java.util.List;
+
/**
* Exposes a virtual view sub-tree for {@link KeyboardView} and generates
* {@link AccessibilityEvent}s for individual {@link Key}s.
@@ -54,13 +51,9 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
private static final String TAG = AccessibilityEntityProvider.class.getSimpleName();
private static final int UNDEFINED = Integer.MIN_VALUE;
- private final InputMethodService mInputMethodService;
private final KeyCodeDescriptionMapper mKeyCodeDescriptionMapper;
private final AccessibilityUtils mAccessibilityUtils;
- /** A map of integer IDs to {@link Key}s. */
- private final SparseArray<Key> mVirtualViewIdToKey = CollectionUtils.newSparseArray();
-
/** Temporary rect used to calculate in-screen bounds. */
private final Rect mTempBoundsInScreen = new Rect();
@@ -73,9 +66,10 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
/** The current keyboard view. */
private KeyboardView mKeyboardView;
- public AccessibilityEntityProvider(final KeyboardView keyboardView,
- final InputMethodService inputMethod) {
- mInputMethodService = inputMethod;
+ /** The current keyboard. */
+ private Keyboard mKeyboard;
+
+ public AccessibilityEntityProvider(final KeyboardView keyboardView) {
mKeyCodeDescriptionMapper = KeyCodeDescriptionMapper.getInstance();
mAccessibilityUtils = AccessibilityUtils.getInstance();
setView(keyboardView);
@@ -92,14 +86,43 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
// Since this class is constructed lazily, we might not get a subsequent
// call to setKeyboard() and therefore need to call it now.
- setKeyboard();
+ setKeyboard(keyboardView.getKeyboard());
}
/**
* Sets the keyboard represented by this node provider.
+ *
+ * @param keyboard The keyboard that is being set to the keyboard view.
*/
- public void setKeyboard() {
- assignVirtualViewIds();
+ public void setKeyboard(final Keyboard keyboard) {
+ mKeyboard = keyboard;
+ }
+
+ private Key getKeyOf(final int virtualViewId) {
+ if (mKeyboard == null) {
+ return null;
+ }
+ final List<Key> sortedKeys = mKeyboard.getSortedKeys();
+ // Use a virtual view id as an index of the sorted keys list.
+ if (virtualViewId >= 0 && virtualViewId < sortedKeys.size()) {
+ return sortedKeys.get(virtualViewId);
+ }
+ return null;
+ }
+
+ private int getVirtualViewIdOf(final Key key) {
+ if (mKeyboard == null) {
+ return View.NO_ID;
+ }
+ final List<Key> sortedKeys = mKeyboard.getSortedKeys();
+ final int size = sortedKeys.size();
+ for (int index = 0; index < size; index++) {
+ if (sortedKeys.get(index) == key) {
+ // Use an index of the sorted keys list as a virtual view id.
+ return index;
+ }
+ }
+ return View.NO_ID;
}
/**
@@ -112,7 +135,7 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
* @see AccessibilityEvent
*/
public AccessibilityEvent createAccessibilityEvent(final Key key, final int eventType) {
- final int virtualViewId = generateVirtualViewIdForKey(key);
+ final int virtualViewId = getVirtualViewIdOf(key);
final String keyDescription = getKeyDescription(key);
final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
event.setPackageName(mKeyboardView.getContext().getPackageName());
@@ -158,17 +181,21 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, rootInfo);
// Add the virtual children of the root View.
- final Keyboard keyboard = mKeyboardView.getKeyboard();
- final Key[] keys = keyboard.getKeys();
- for (Key key : keys) {
- final int childVirtualViewId = generateVirtualViewIdForKey(key);
- rootInfo.addChild(mKeyboardView, childVirtualViewId);
+ final List<Key> sortedKeys = mKeyboard.getSortedKeys();
+ final int size = sortedKeys.size();
+ for (int index = 0; index < size; index++) {
+ final Key key = sortedKeys.get(index);
+ if (key.isSpacer()) {
+ continue;
+ }
+ // Use an index of the sorted keys list as a virtual view id.
+ rootInfo.addChild(mKeyboardView, index);
}
return rootInfo;
}
- // Find the view that corresponds to the given id.
- final Key key = mVirtualViewIdToKey.get(virtualViewId);
+ // Find the key that corresponds to the given virtual view id.
+ final Key key = getKeyOf(virtualViewId);
if (key == null) {
Log.e(TAG, "Invalid virtual view ID: " + virtualViewId);
return null;
@@ -203,31 +230,10 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
return info;
}
- /**
- * Simulates a key press by injecting touch events into the keyboard view.
- * This avoids the complexity of trackers and listeners within the keyboard.
- *
- * @param key The key to press.
- */
- void 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);
- final MotionEvent upEvent = MotionEvent.obtain(
- downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
-
- mKeyboardView.onTouchEvent(downEvent);
- mKeyboardView.onTouchEvent(upEvent);
- downEvent.recycle();
- upEvent.recycle();
- }
-
@Override
public boolean performAction(final int virtualViewId, final int action,
final Bundle arguments) {
- final Key key = mVirtualViewIdToKey.get(virtualViewId);
+ final Key key = getKeyOf(virtualViewId);
if (key == null) {
return false;
}
@@ -243,7 +249,7 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
* @return The result of performing the action, or false if the action is not supported.
*/
boolean performActionForKey(final Key key, final int action, final Bundle arguments) {
- final int virtualViewId = generateVirtualViewIdForKey(key);
+ final int virtualViewId = getVirtualViewIdOf(key);
switch (action) {
case AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS:
@@ -285,11 +291,11 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
* @return The context-specific description of the key.
*/
private String getKeyDescription(final Key key) {
- final EditorInfo editorInfo = mInputMethodService.getCurrentInputEditorInfo();
+ final EditorInfo editorInfo = mKeyboard.mId.mEditorInfo;
final boolean shouldObscure = mAccessibilityUtils.shouldObscureInput(editorInfo);
final SettingsValues currentSettings = Settings.getInstance().getCurrent();
final String keyCodeDescription = mKeyCodeDescriptionMapper.getDescriptionForKey(
- mKeyboardView.getContext(), mKeyboardView.getKeyboard(), key, shouldObscure);
+ mKeyboardView.getContext(), mKeyboard, key, shouldObscure);
if (currentSettings.isWordSeparator(key.getCode())) {
return mAccessibilityUtils.getAutoCorrectionDescription(
keyCodeDescription, shouldObscure);
@@ -299,40 +305,9 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider
}
/**
- * Assigns virtual view IDs to keyboard keys and populates the related maps.
- */
- private void assignVirtualViewIds() {
- final Keyboard keyboard = mKeyboardView.getKeyboard();
- if (keyboard == null) {
- return;
- }
- mVirtualViewIdToKey.clear();
-
- final Key[] keys = keyboard.getKeys();
- for (Key key : keys) {
- final int virtualViewId = generateVirtualViewIdForKey(key);
- mVirtualViewIdToKey.put(virtualViewId, key);
- }
- }
-
- /**
* Updates the parent's on-screen location.
*/
private void updateParentLocation() {
mKeyboardView.getLocationOnScreen(mParentLocation);
}
-
- /**
- * Generates a virtual view identifier for the given key. Returned
- * identifiers are valid until the next global layout state change.
- *
- * @param key The key to identify.
- * @return A virtual view identifier.
- */
- private static int generateVirtualViewIdForKey(final Key key) {
- // The key x- and y-coordinates are stable between layout changes.
- // Generate an identifier by bit-shifting the x-coordinate to the
- // left-half of the integer and OR'ing with the y-coordinate.
- return ((0xFFFF & key.getX()) << (Integer.SIZE / 2)) | (0xFFFF & key.getY());
- }
}
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
index 10fb9fef4..bc094b117 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
@@ -17,7 +17,6 @@
package com.android.inputmethod.accessibility;
import android.content.Context;
-import android.inputmethodservice.InputMethodService;
import android.media.AudioManager;
import android.os.Build;
import android.os.SystemClock;
@@ -63,13 +62,13 @@ public final class AccessibilityUtils {
*/
private static final boolean ENABLE_ACCESSIBILITY = true;
- public static void init(final InputMethodService inputMethod) {
+ public static void init(final Context context) {
if (!ENABLE_ACCESSIBILITY) return;
// These only need to be initialized if the kill switch is off.
- sInstance.initInternal(inputMethod);
+ sInstance.initInternal(context);
KeyCodeDescriptionMapper.init();
- AccessibleKeyboardViewProxy.init(inputMethod);
+ AccessibleKeyboardViewProxy.init(context);
}
public static AccessibilityUtils getInstance() {
@@ -158,7 +157,7 @@ public final class AccessibilityUtils {
* @param typedWord the currently typed word
*/
public void setAutoCorrection(final SuggestedWords suggestedWords, final String typedWord) {
- if (suggestedWords != null && suggestedWords.mWillAutoCorrect) {
+ if (suggestedWords.mWillAutoCorrect) {
mAutoCorrectionWord = suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION);
mTypedWord = typedWord;
} else {
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index 73896dfd3..15f79f3de 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -17,7 +17,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;
@@ -29,11 +29,12 @@ import android.view.ViewParent;
import android.view.accessibility.AccessibilityEvent;
import com.android.inputmethod.keyboard.Key;
+import com.android.inputmethod.keyboard.KeyDetector;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.MainKeyboardView;
-import com.android.inputmethod.keyboard.PointerTracker;
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();
@@ -53,8 +54,8 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_URL, R.string.keyboard_mode_url);
}
- private InputMethodService mInputMethod;
private MainKeyboardView mView;
+ private Keyboard mKeyboard;
private AccessibilityEntityProvider mAccessibilityNodeProvider;
private Key mLastHoverKey = null;
@@ -65,10 +66,11 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
private int mEdgeSlop;
/** The most recently set keyboard mode. */
- private int mLastKeyboardMode;
+ private int mLastKeyboardMode = KEYBOARD_IS_HIDDEN;
+ private static final int KEYBOARD_IS_HIDDEN = -1;
- public static void init(final InputMethodService inputMethod) {
- sInstance.initInternal(inputMethod);
+ public static void init(final Context context) {
+ sInstance.initInternal(context);
}
public static AccessibleKeyboardViewProxy getInstance() {
@@ -79,10 +81,9 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
// Not publicly instantiable.
}
- private void initInternal(final InputMethodService inputMethod) {
- mInputMethod = inputMethod;
- mEdgeSlop = inputMethod.getResources().getDimensionPixelSize(
- R.dimen.accessibility_edge_slop);
+ private void initInternal(final Context context) {
+ mEdgeSlop = context.getResources().getDimensionPixelSize(
+ R.dimen.config_accessibility_edge_slop);
}
/**
@@ -104,6 +105,10 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
return;
}
mAccessibilityNodeProvider.setView(view);
+
+ // Since this class is constructed lazily, we might not get a subsequent
+ // call to setKeyboard() and therefore need to call it now.
+ setKeyboard(view.getKeyboard());
}
/**
@@ -111,24 +116,40 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
* <p>
* <b>Note:</b> This method will be called even if accessibility is not
* enabled.
+ * @param keyboard The keyboard that is being set to the wrapping view.
*/
- public void setKeyboard() {
- if (mView == null) {
+ public void setKeyboard(final Keyboard keyboard) {
+ if (keyboard == null) {
return;
}
if (mAccessibilityNodeProvider != null) {
- mAccessibilityNodeProvider.setKeyboard();
+ mAccessibilityNodeProvider.setKeyboard(keyboard);
}
- final int keyboardMode = mView.getKeyboard().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 || !keyboard.mId.mSubtype.equals(lastKeyboard.mId.mSubtype)) {
+ announceKeyboardLanguage(keyboard);
+ return;
+ }
+ // Announce the mode only when the mode is changed.
+ if (keyboard.mId.mMode != lastKeyboardMode) {
+ announceKeyboardMode(keyboard);
+ return;
+ }
+ // Announce the keyboard type only when the type is changed.
+ if (keyboard.mId.mElementId != lastKeyboard.mId.mElementId) {
+ announceKeyboardType(keyboard, lastKeyboard);
+ return;
}
- mLastKeyboardMode = keyboardMode;
}
/**
@@ -139,23 +160,78 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
return;
}
announceKeyboardHidden();
- mLastKeyboardMode = -1;
+ 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(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 Context context = mView.getContext();
+ final int modeTextResId = KEYBOARD_MODE_RES_IDS.get(keyboard.mId.mMode);
+ 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);
+ }
+
+ /**
+ * Announces which type of keyboard is being displayed.
+ *
+ * @param keyboard The new keyboard.
+ * @param lastKeyboard The last keyboard.
+ */
+ private void announceKeyboardType(final Keyboard keyboard, final Keyboard lastKeyboard) {
+ final int lastElementId = lastKeyboard.mId.mElementId;
+ final int resId;
+ switch (keyboard.mId.mElementId) {
+ case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED:
+ case KeyboardId.ELEMENT_ALPHABET:
+ if (lastElementId == KeyboardId.ELEMENT_ALPHABET
+ || lastElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
+ return;
+ }
+ resId = R.string.spoken_description_mode_alpha;
+ break;
+ case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED:
+ resId = R.string.spoken_description_shiftmode_on;
+ break;
+ case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED:
+ case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED:
+ resId = R.string.spoken_description_shiftmode_locked;
+ break;
+ case KeyboardId.ELEMENT_SYMBOLS:
+ resId = R.string.spoken_description_mode_symbol;
+ break;
+ case KeyboardId.ELEMENT_SYMBOLS_SHIFTED:
+ resId = R.string.spoken_description_mode_symbol_shift;
+ break;
+ case KeyboardId.ELEMENT_PHONE:
+ resId = R.string.spoken_description_mode_phone;
+ break;
+ case KeyboardId.ELEMENT_PHONE_SYMBOLS:
+ resId = R.string.spoken_description_mode_phone_shift;
+ break;
+ default:
+ return;
+ }
+ final String text = mView.getContext().getString(resId);
sendWindowStateChanged(text);
}
@@ -204,25 +280,14 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
}
/**
- * Intercepts touch events before dispatch when touch exploration is turned on in ICS and
- * higher.
- *
- * @param event The motion event being dispatched.
- * @return {@code true} if the event is handled
- */
- public boolean dispatchTouchEvent(final MotionEvent event) {
- // To avoid accidental key presses during touch exploration, always drop
- // touch events generated by the user.
- return false;
- }
-
- /**
* Receives hover events when touch exploration is turned on in SDK versions ICS and higher.
*
* @param event The hover event.
+ * @param keyDetector The {@link KeyDetector} to determine on which key the <code>event</code>
+ * is hovering.
* @return {@code true} if the event is handled
*/
- public boolean dispatchHoverEvent(final MotionEvent event, final PointerTracker tracker) {
+ public boolean dispatchHoverEvent(final MotionEvent event, final KeyDetector keyDetector) {
if (mView == null) {
return false;
}
@@ -233,7 +298,7 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
final Key key;
if (pointInView(x, y)) {
- key = tracker.getKeyOn(x, y);
+ key = keyDetector.detectHitKey(x, y);
} else {
key = null;
}
@@ -244,7 +309,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:
@@ -266,7 +332,7 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
// will call this method multiple times it is a good practice to
// cache the provider instance.
if (mAccessibilityNodeProvider == null) {
- mAccessibilityNodeProvider = new AccessibilityEntityProvider(mView, mInputMethod);
+ mAccessibilityNodeProvider = new AccessibilityEntityProvider(mView);
}
return mAccessibilityNodeProvider;
}
@@ -285,6 +351,38 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
}
/**
+ * Simulates a key press by injecting touch an 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 an 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.
*
@@ -335,77 +433,4 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
}
return true;
}
-
- /**
- * Notifies the user of changes in the keyboard shift state.
- */
- public void notifyShiftState() {
- if (mView == null) {
- return;
- }
-
- final Keyboard keyboard = mView.getKeyboard();
- final KeyboardId keyboardId = keyboard.mId;
- final int elementId = keyboardId.mElementId;
- final Context context = mView.getContext();
- final CharSequence text;
-
- switch (elementId) {
- case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED:
- case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED:
- text = context.getText(R.string.spoken_description_shiftmode_locked);
- break;
- case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED:
- case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED:
- case KeyboardId.ELEMENT_SYMBOLS_SHIFTED:
- text = context.getText(R.string.spoken_description_shiftmode_on);
- break;
- default:
- text = context.getText(R.string.spoken_description_shiftmode_off);
- }
- AccessibilityUtils.getInstance().announceForAccessibility(mView, text);
- }
-
- /**
- * Notifies the user of changes in the keyboard symbols state.
- */
- public void notifySymbolsState() {
- if (mView == null) {
- return;
- }
-
- final Keyboard keyboard = mView.getKeyboard();
- final Context context = mView.getContext();
- final KeyboardId keyboardId = keyboard.mId;
- final int elementId = keyboardId.mElementId;
- final int resId;
-
- switch (elementId) {
- case KeyboardId.ELEMENT_ALPHABET:
- case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED:
- case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED:
- case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED:
- case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED:
- resId = R.string.spoken_description_mode_alpha;
- break;
- case KeyboardId.ELEMENT_SYMBOLS:
- case KeyboardId.ELEMENT_SYMBOLS_SHIFTED:
- resId = R.string.spoken_description_mode_symbol;
- break;
- case KeyboardId.ELEMENT_PHONE:
- resId = R.string.spoken_description_mode_phone;
- break;
- case KeyboardId.ELEMENT_PHONE_SYMBOLS:
- resId = R.string.spoken_description_mode_phone_shift;
- break;
- default:
- resId = -1;
- }
-
- if (resId < 0) {
- return;
- }
- final String text = context.getString(resId);
- AccessibilityUtils.getInstance().announceForAccessibility(mView, text);
- }
}
diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
index 58624a2e6..2e6649bf2 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
@@ -58,9 +58,6 @@ public final class KeyCodeDescriptionMapper {
}
private void initInternal() {
- // Manual label substitutions for key labels with no string resource
- mKeyLabelMap.put(":-)", R.string.spoken_description_smiley);
-
// Special non-character codes defined in Keyboard
mKeyCodeMap.put(Constants.CODE_SPACE, R.string.spoken_description_space);
mKeyCodeMap.put(Constants.CODE_DELETE, R.string.spoken_description_delete);
@@ -75,6 +72,7 @@ public final class KeyCodeDescriptionMapper {
mKeyCodeMap.put(Constants.CODE_ACTION_NEXT, R.string.spoken_description_action_next);
mKeyCodeMap.put(Constants.CODE_ACTION_PREVIOUS,
R.string.spoken_description_action_previous);
+ mKeyCodeMap.put(Constants.CODE_EMOJI, R.string.spoken_description_emoji);
}
/**