From 9a81ce92c381007affe6bb2310bf94c9856eaae1 Mon Sep 17 00:00:00 2001 From: alanv Date: Tue, 28 Feb 2012 10:01:40 -0800 Subject: Added virtual view hierarchy for keyboard accessibility. Bug: 5829051 Change-Id: Ied1b6267eec616bd3b9337f6e761b0c740aa0eb2 --- .../accessibility/AccessibilityEntityProvider.java | 377 +++++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java new file mode 100644 index 000000000..dc7c12ba6 --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -0,0 +1,377 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.accessibility; + +import android.graphics.Rect; +import android.inputmethodservice.InputMethodService; +import android.support.v4.view.ViewCompat; +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.View; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; +import android.view.accessibility.AccessibilityEvent; +import android.view.inputmethod.EditorInfo; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardView; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +/** + * Exposes a virtual view sub-tree for {@link KeyboardView} and generates + * {@link AccessibilityEvent}s for individual {@link Key}s. + *

+ * A virtual sub-tree is composed of imaginary {@link View}s that are reported + * as a part of the view hierarchy for accessibility purposes. This enables + * custom views that draw complex content to report them selves as a tree of + * virtual views, thus conveying their logical structure. + *

+ */ +public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat { + private static final String TAG = AccessibilityEntityProvider.class.getSimpleName(); + + private final KeyboardView mKeyboardView; + private final InputMethodService mInputMethodService; + private final KeyCodeDescriptionMapper mKeyCodeDescriptionMapper; + private final AccessibilityUtils mAccessibilityUtils; + + /** A map of integer IDs to {@link Key}s. */ + private final SparseArray mVirtualViewIdToKey = new SparseArray(); + + /** Temporary rect used to calculate in-screen bounds. */ + private final Rect mTempBoundsInScreen = new Rect(); + + /** The parent view's cached on-screen location. */ + private final int[] mParentLocation = new int[2]; + + public AccessibilityEntityProvider(KeyboardView keyboardView, InputMethodService inputMethod) { + mKeyboardView = keyboardView; + mInputMethodService = inputMethod; + + mKeyCodeDescriptionMapper = KeyCodeDescriptionMapper.getInstance(); + mAccessibilityUtils = AccessibilityUtils.getInstance(); + + assignVirtualViewIds(); + updateParentLocation(); + + // Ensure that the on-screen bounds are cleared when the layout changes. + mKeyboardView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener); + } + + /** + * Creates and populates an {@link AccessibilityEvent} for the specified key + * and event type. + * + * @param key A key on the host keyboard view. + * @param eventType The event type to create. + * @return A populated {@link AccessibilityEvent} for the key. + * @see AccessibilityEvent + */ + public AccessibilityEvent createAccessibilityEvent(Key key, int eventType) { + final int virtualViewId = generateVirtualViewIdForKey(key); + final String keyDescription = getKeyDescription(key); + + final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); + event.setPackageName(mKeyboardView.getContext().getPackageName()); + event.setClassName(key.getClass().getName()); + event.getText().add(keyDescription); + + final AccessibilityRecordCompat record = new AccessibilityRecordCompat(event); + record.setSource(mKeyboardView, virtualViewId); + + return event; + } + + /** + * Returns an {@link AccessibilityNodeInfoCompat} representing a virtual + * view, i.e. a descendant of the host View, with the given virtualViewId or + * the host View itself if virtualViewId equals to {@link View#NO_ID}. + *

+ * A virtual descendant is an imaginary View that is reported as a part of + * the view hierarchy for accessibility purposes. This enables custom views + * that draw complex content to report them selves as a tree of virtual + * views, thus conveying their logical structure. + *

+ *

+ * The implementer is responsible for obtaining an accessibility node info + * from the pool of reusable instances and setting the desired properties of + * the node info before returning it. + *

+ * + * @param virtualViewId A client defined virtual view id. + * @return A populated {@link AccessibilityNodeInfoCompat} for a virtual + * descendant or the host View. + * @see AccessibilityNodeInfoCompat + */ + @Override + public AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int virtualViewId) { + AccessibilityNodeInfoCompat info = null; + + if (virtualViewId == View.NO_ID) { + // We are requested to create an AccessibilityNodeInfo describing + // this View, i.e. the root of the virtual sub-tree. + info = AccessibilityNodeInfoCompat.obtain(mKeyboardView); + ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, info); + + // Add the virtual children of the root View. + // TODO(alanv): Need to assign a unique ID to each key. + final Keyboard keyboard = mKeyboardView.getKeyboard(); + final Set keys = keyboard.mKeys; + for (Key key : keys) { + final int childVirtualViewId = generateVirtualViewIdForKey(key); + info.addChild(mKeyboardView, childVirtualViewId); + } + } else { + // Find the view that corresponds to the given id. + final Key key = mVirtualViewIdToKey.get(virtualViewId); + if (key == null) { + Log.e(TAG, "Invalid virtual view ID: " + virtualViewId); + return null; + } + + final String keyDescription = getKeyDescription(key); + final Rect boundsInParent = key.mHitBox; + + // Calculate the key's in-screen bounds. + mTempBoundsInScreen.set(boundsInParent); + mTempBoundsInScreen.offset(mParentLocation[0], mParentLocation[1]); + + final Rect boundsInScreen = mTempBoundsInScreen; + + // Obtain and initialize an AccessibilityNodeInfo with + // information about the virtual view. + info = AccessibilityNodeInfoCompat.obtain(); + info.addAction(AccessibilityNodeInfoCompat.ACTION_SELECT); + info.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION); + info.setPackageName(mKeyboardView.getContext().getPackageName()); + info.setClassName(key.getClass().getName()); + info.setBoundsInParent(boundsInParent); + info.setBoundsInScreen(boundsInScreen); + info.setParent(mKeyboardView); + info.setSource(mKeyboardView, virtualViewId); + info.setBoundsInScreen(boundsInScreen); + info.setText(keyDescription); + } + + return info; + } + + /** + * Performs an accessibility action on a virtual view, i.e. a descendant of + * the host View, with the given virtualViewId or the host View itself if + * virtualViewId equals to {@link View#NO_ID}. + * + * @param action The action to perform. + * @param virtualViewId A client defined virtual view id. + * @return True if the action was performed. + * @see #createAccessibilityNodeInfo(int) + * @see AccessibilityNodeInfoCompat + */ + @Override + public boolean performAccessibilityAction(int action, int virtualViewId) { + if (virtualViewId == View.NO_ID) { + // Perform the action on the host View. + switch (action) { + case AccessibilityNodeInfoCompat.ACTION_SELECT: + if (!mKeyboardView.isSelected()) { + mKeyboardView.setSelected(true); + return mKeyboardView.isSelected(); + } + break; + case AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION: + if (mKeyboardView.isSelected()) { + mKeyboardView.setSelected(false); + return !mKeyboardView.isSelected(); + } + break; + } + } else { + // Find the view that corresponds to the given id. + final Key child = mVirtualViewIdToKey.get(virtualViewId); + if (child == null) + return false; + + // Perform the action on a virtual view. + switch (action) { + case AccessibilityNodeInfoCompat.ACTION_SELECT: + // TODO: Provide some focus indicator. + return true; + case AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION: + // TODO: Provide some clear focus indicator. + return true; + } + } + + return false; + } + + /** + * Finds {@link AccessibilityNodeInfoCompat}s by text. The match is case + * insensitive containment. The search is relative to the virtual view, i.e. + * a descendant of the host View, with the given virtualViewId or the host + * View itself virtualViewId equals to {@link View#NO_ID}. + * + * @param virtualViewId A client defined virtual view id which defined the + * root of the tree in which to perform the search. + * @param text The searched text. + * @return A list of node info. + * @see #createAccessibilityNodeInfo(int) + * @see AccessibilityNodeInfoCompat + */ + @Override + public List findAccessibilityNodeInfosByText( + String text, int virtualViewId) { + final String searchedLowerCase = text.toLowerCase(); + final Keyboard keyboard = mKeyboardView.getKeyboard(); + + List results = null; + + if (virtualViewId == View.NO_ID) { + for (Key key : keyboard.mKeys) { + results = findByTextAndPopulate(searchedLowerCase, key, results); + } + } else { + final Key key = mVirtualViewIdToKey.get(virtualViewId); + + results = findByTextAndPopulate(searchedLowerCase, key, results); + } + + if (results == null) { + return Collections.emptyList(); + } + + return results; + } + + /** + * Helper method for {@link #findAccessibilityNodeInfosByText(String, int)}. + * Takes a current set of results and matches a specified key against a + * lower-case search string. Returns an updated list of results. + * + * @param searchedLowerCase The lower-case search string. + * @param key The key to compare against. + * @param results The current list of results, or {@code null} if no results + * found. + * @return An updated list of results, or {@code null} if no results found. + */ + private List findByTextAndPopulate(String searchedLowerCase, + Key key, List results) { + if (!keyContainsText(key, searchedLowerCase)) { + return results; + } + + final int childVirtualViewId = generateVirtualViewIdForKey(key); + final AccessibilityNodeInfoCompat nodeInfo = createAccessibilityNodeInfo( + childVirtualViewId); + + if (results == null) { + results = new LinkedList(); + } + + results.add(nodeInfo); + + return results; + } + + /** + * Returns whether a key's current description contains the lower-case + * search text. + * + * @param key The key to compare against. + * @param textLowerCase The lower-case search string. + * @return {@code true} if the key contains the search text. + */ + private boolean keyContainsText(Key key, String textLowerCase) { + if (key == null) { + return false; + } + + final String description = getKeyDescription(key); + + if (description == null) { + return false; + } + + return description.toLowerCase().contains(textLowerCase); + } + + /** + * Returns the context-specific description for a {@link Key}. + * + * @param key The key to describe. + * @return The context-specific description of the key. + */ + private String getKeyDescription(Key key) { + final EditorInfo editorInfo = mInputMethodService.getCurrentInputEditorInfo(); + final boolean shouldObscure = mAccessibilityUtils.shouldObscureInput(editorInfo); + final String keyDescription = mKeyCodeDescriptionMapper.getDescriptionForKey( + mKeyboardView.getContext(), mKeyboardView.getKeyboard(), key, shouldObscure); + + return keyDescription; + } + + /** + * 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 Set keySet = keyboard.mKeys; + for (Key key : keySet) { + 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 specified key. + * + * @param key The key to identify. + * @return A virtual view identifier. + */ + private static int generateVirtualViewIdForKey(Key key) { + // The key code is unique within an instance of a Keyboard. + return key.mCode; + } + + private final OnGlobalLayoutListener mGlobalLayoutListener = new OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + assignVirtualViewIds(); + updateParentLocation(); + } + }; +} -- cgit v1.2.3-83-g751a From b4fbbe57f574ce6e6a5827156f875fe7d3eb5089 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 13 Mar 2012 20:53:15 +0900 Subject: Avoid using collection interface, using array instead Change-Id: Ie0554362b73967bfcbbab6ad19c24683066a608e --- .../accessibility/AccessibilityEntityProvider.java | 9 ++++---- .../inputmethod/compat/MotionEventCompatUtils.java | 2 +- .../com/android/inputmethod/keyboard/Keyboard.java | 21 ++++++++---------- .../inputmethod/keyboard/PointerTracker.java | 10 +++------ .../inputmethod/keyboard/ProximityInfo.java | 25 ++++++++++------------ .../keyboard/internal/KeyboardIconsSet.java | 6 +++--- 6 files changed, 31 insertions(+), 42 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index dc7c12ba6..dd43166af 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -36,7 +36,6 @@ import com.android.inputmethod.keyboard.KeyboardView; import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Set; /** * Exposes a virtual view sub-tree for {@link KeyboardView} and generates @@ -135,9 +134,9 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, info); // Add the virtual children of the root View. - // TODO(alanv): Need to assign a unique ID to each key. + // TODO: Need to assign a unique ID to each key. final Keyboard keyboard = mKeyboardView.getKeyboard(); - final Set keys = keyboard.mKeys; + final Key[] keys = keyboard.mKeys; for (Key key : keys) { final int childVirtualViewId = generateVirtualViewIdForKey(key); info.addChild(mKeyboardView, childVirtualViewId); @@ -342,8 +341,8 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat mVirtualViewIdToKey.clear(); - final Set keySet = keyboard.mKeys; - for (Key key : keySet) { + final Key[] keys = keyboard.mKeys; + for (Key key : keys) { final int virtualViewId = generateVirtualViewIdForKey(key); mVirtualViewIdToKey.put(virtualViewId, key); } diff --git a/java/src/com/android/inputmethod/compat/MotionEventCompatUtils.java b/java/src/com/android/inputmethod/compat/MotionEventCompatUtils.java index eca922e68..9a523011a 100644 --- a/java/src/com/android/inputmethod/compat/MotionEventCompatUtils.java +++ b/java/src/com/android/inputmethod/compat/MotionEventCompatUtils.java @@ -17,7 +17,7 @@ package com.android.inputmethod.compat; public class MotionEventCompatUtils { - // TODO(alanv): Remove after these are added to MotionEventCompat. + // TODO: Remove after these are added to MotionEventCompat. public static final int ACTION_HOVER_ENTER = 0x9; public static final int ACTION_HOVER_EXIT = 0xA; } diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index b7f1ddde6..a726878c2 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -40,12 +40,9 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; /** * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard @@ -125,16 +122,16 @@ public class Keyboard { /** Maximum column for more keys keyboard */ public final int mMaxMoreKeysKeyboardColumn; - /** List of keys and icons in this keyboard */ - public final Set mKeys; - public final Set mShiftKeys; + /** Array of keys and icons in this keyboard */ + public final Key[] mKeys; + public final Key[] mShiftKeys; public final KeyboardIconsSet mIconsSet; - private final Map mKeyCache = new HashMap(); + private final HashMap mKeyCache = new HashMap(); private final ProximityInfo mProximityInfo; - public final Map> mAdditionalProximityChars; + private final Map> mAdditionalProximityChars; public Keyboard(Params params) { mId = params.mId; @@ -149,8 +146,8 @@ public class Keyboard { mTopPadding = params.mTopPadding; mVerticalGap = params.mVerticalGap; - mKeys = Collections.unmodifiableSet(params.mKeys); - mShiftKeys = Collections.unmodifiableSet(params.mShiftKeys); + mKeys = params.mKeys.toArray(new Key[params.mKeys.size()]); + mShiftKeys = params.mShiftKeys.toArray(new Key[params.mShiftKeys.size()]); mIconsSet = params.mIconsSet; mAdditionalProximityChars = params.mAdditionalProximityChars; @@ -225,8 +222,8 @@ public class Keyboard { public int GRID_WIDTH; public int GRID_HEIGHT; - public final Set mKeys = new HashSet(); - public final Set mShiftKeys = new HashSet(); + public final ArrayList mKeys = new ArrayList(); + public final ArrayList mShiftKeys = new ArrayList(); public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet(); // TODO: Should be in Key instead of Keyboard.Params? public final Map> mAdditionalProximityChars = diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 7a9915be0..316177fbb 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -25,8 +25,6 @@ import com.android.inputmethod.keyboard.internal.PointerTrackerQueue; import com.android.inputmethod.latin.LatinImeLogger; import java.util.ArrayList; -import java.util.List; -import java.util.Set; public class PointerTracker { private static final String TAG = PointerTracker.class.getSimpleName(); @@ -109,7 +107,7 @@ public class PointerTracker { private static LatinKeyboardView.PointerTrackerParams sParams; private static int sTouchNoiseThresholdDistanceSquared; - private static final List sTrackers = new ArrayList(); + private static final ArrayList sTrackers = new ArrayList(); private static PointerTrackerQueue sPointerTrackerQueue; public final int mPointerId; @@ -120,7 +118,6 @@ public class PointerTracker { private KeyboardActionListener mListener = EMPTY_LISTENER; private Keyboard mKeyboard; - private Set mKeys; private int mKeyQuarterWidthSquared; private final TextView mKeyPreviewText; @@ -180,7 +177,7 @@ public class PointerTracker { } public static PointerTracker getPointerTracker(final int id, KeyEventHandler handler) { - final List trackers = sTrackers; + final ArrayList trackers = sTrackers; // Create pointer trackers until we can get 'id+1'-th tracker, if needed. for (int i = trackers.size(); i <= id; i++) { @@ -303,7 +300,6 @@ public class PointerTracker { private void setKeyDetectorInner(KeyDetector keyDetector) { mKeyDetector = keyDetector; mKeyboard = keyDetector.getKeyboard(); - mKeys = mKeyboard.mKeys; final int keyQuarterWidth = mKeyboard.mMostCommonKeyWidth / 4; mKeyQuarterWidthSquared = keyQuarterWidth * keyQuarterWidth; } @@ -691,7 +687,7 @@ public class PointerTracker { } private boolean isMajorEnoughMoveToBeOnNewKey(int x, int y, Key newKey) { - if (mKeys == null || mKeyDetector == null) + if (mKeyDetector == null) throw new NullPointerException("keyboard and/or key detector not set"); Key curKey = mCurrentKey; if (newKey == curKey) { diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java index 8a65a5fc6..e2a48306a 100644 --- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java +++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java @@ -28,7 +28,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; public class ProximityInfo { public static final int MAX_PROXIMITY_CHARS_SIZE = 16; @@ -50,8 +49,8 @@ public class ProximityInfo { private final String mLocaleStr; ProximityInfo(String localeStr, int gridWidth, int gridHeight, int minWidth, int height, - int mostCommonKeyWidth, - int mostCommonKeyHeight, Set keys, TouchPositionCorrection touchPositionCorrection, + int mostCommonKeyWidth, int mostCommonKeyHeight, final Key[] keys, + TouchPositionCorrection touchPositionCorrection, Map> additionalProximityChars) { if (TextUtils.isEmpty(localeStr)) { mLocaleStr = ""; @@ -77,8 +76,8 @@ public class ProximityInfo { } public static ProximityInfo createDummyProximityInfo() { - return new ProximityInfo("", 1, 1, 1, 1, 1, 1, Collections. emptySet(), - null, Collections.> emptyMap()); + return new ProximityInfo("", 1, 1, 1, 1, 1, 1, EMPTY_KEY_ARRAY, null, + Collections.> emptyMap()); } public static ProximityInfo createSpellCheckerProximityInfo(final int[] proximity) { @@ -106,8 +105,7 @@ public class ProximityInfo { private native void releaseProximityInfoNative(long nativeProximityInfo); private final void setProximityInfo(Key[][] gridNeighborKeys, int keyboardWidth, - int keyboardHeight, Set keys, - TouchPositionCorrection touchPositionCorrection) { + int keyboardHeight, final Key[] keys, TouchPositionCorrection touchPositionCorrection) { final int[] proximityCharsArray = new int[mGridSize * MAX_PROXIMITY_CHARS_SIZE]; Arrays.fill(proximityCharsArray, KeyDetector.NOT_A_CODE); for (int i = 0; i < mGridSize; ++i) { @@ -117,7 +115,7 @@ public class ProximityInfo { gridNeighborKeys[i][j].mCode; } } - final int keyCount = keys.size(); + final int keyCount = keys.length; final int[] keyXCoordinates = new int[keyCount]; final int[] keyYCoordinates = new int[keyCount]; final int[] keyWidths = new int[keyCount]; @@ -132,8 +130,8 @@ public class ProximityInfo { sweetSpotCenterYs = new float[keyCount]; sweetSpotRadii = new float[keyCount]; calculateSweetSpotParams = true; - int i = 0; - for (final Key key : keys) { + for (int i = 0; i < keyCount; i++) { + final Key key = keys[i]; keyXCoordinates[i] = key.mX; keyYCoordinates[i] = key.mY; keyWidths[i] = key.mWidth; @@ -156,7 +154,6 @@ public class ProximityInfo { hitBoxWidth * hitBoxWidth + hitBoxHeight * hitBoxHeight); } } - i++; } } else { sweetSpotCenterXs = sweetSpotCenterYs = sweetSpotRadii = null; @@ -186,17 +183,17 @@ public class ProximityInfo { } } - private void computeNearestNeighbors(int defaultWidth, Set keys, + private void computeNearestNeighbors(int defaultWidth, final Key[] keys, TouchPositionCorrection touchPositionCorrection, Map> additionalProximityChars) { - final Map keyCodeMap = new HashMap(); + final HashMap keyCodeMap = new HashMap(); for (final Key key : keys) { keyCodeMap.put(key.mCode, key); } final int thresholdBase = (int) (defaultWidth * SEARCH_DISTANCE); final int threshold = thresholdBase * thresholdBase; // Round-up so we don't have any pixels outside the grid - final Key[] neighborKeys = new Key[keys.size()]; + final Key[] neighborKeys = new Key[keys.length]; final int gridWidth = mGridWidth * mCellWidth; final int gridHeight = mGridHeight * mCellHeight; for (int x = 0; x < gridWidth; x += mCellWidth) { diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java index ca711ec7d..9b9c86179 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java @@ -24,7 +24,6 @@ import android.util.Log; import com.android.inputmethod.latin.R; import java.util.HashMap; -import java.util.Map; public class KeyboardIconsSet { private static final String TAG = KeyboardIconsSet.class.getSimpleName(); @@ -35,8 +34,9 @@ public class KeyboardIconsSet { private final Drawable[] mIcons = new Drawable[NUM_ICONS + 1]; - private static final Map ATTR_ID_TO_ICON_ID = new HashMap(); - private static final Map NAME_TO_ICON_ID = new HashMap(); + private static final HashMap ATTR_ID_TO_ICON_ID + = new HashMap(); + private static final HashMap NAME_TO_ICON_ID = new HashMap(); private static final String[] ICON_NAMES = new String[NUM_ICONS + 1]; private static final int ATTR_UNDEFINED = 0; -- cgit v1.2.3-83-g751a From 26c80a1b9a103cdccbaeafac75a3db2543a9ee7e Mon Sep 17 00:00:00 2001 From: alanv Date: Thu, 5 Apr 2012 14:56:57 -0700 Subject: Set view properties for Key node infos. Bug: 6298716 Change-Id: Iae0616f0095d32e0ca61dcb55f2f84744e91f60e --- .../inputmethod/accessibility/AccessibilityEntityProvider.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index dd43166af..bb5890ad2 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -95,6 +95,7 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat event.setPackageName(mKeyboardView.getContext().getPackageName()); event.setClassName(key.getClass().getName()); event.getText().add(keyDescription); + event.setEnabled(true); final AccessibilityRecordCompat record = new AccessibilityRecordCompat(event); record.setSource(mKeyboardView, virtualViewId); @@ -171,6 +172,9 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat info.setSource(mKeyboardView, virtualViewId); info.setBoundsInScreen(boundsInScreen); info.setText(keyDescription); + info.setClickable(true); + info.setEnabled(true); + info.setLongClickable(true); } return info; -- cgit v1.2.3-83-g751a From 621e3f983039f4b9c9f44903a2b0083c20dd827b Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Fri, 20 Apr 2012 16:44:22 -0700 Subject: Fix the build Change-Id: I5c4e230500f058f7db86c05d554be45411004ffc --- .../inputmethod/accessibility/AccessibilityEntityProvider.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index bb5890ad2..004ee4c22 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -18,6 +18,7 @@ package com.android.inputmethod.accessibility; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; +import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat; @@ -185,14 +186,15 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat * the host View, with the given virtualViewId or the host View itself if * virtualViewId equals to {@link View#NO_ID}. * - * @param action The action to perform. * @param virtualViewId A client defined virtual view id. + * @param action The action to perform. + * @param arguments Optional arguments. * @return True if the action was performed. * @see #createAccessibilityNodeInfo(int) * @see AccessibilityNodeInfoCompat */ @Override - public boolean performAccessibilityAction(int action, int virtualViewId) { + public boolean performAction(int virtualViewId, int action, Bundle arguments) { if (virtualViewId == View.NO_ID) { // Perform the action on the host View. switch (action) { -- cgit v1.2.3-83-g751a From 8e5f79f57d4f8622f809928f1f9c8034b9ffd1f9 Mon Sep 17 00:00:00 2001 From: alanv Date: Tue, 8 May 2012 19:51:49 -0700 Subject: Remove unused code from AccessibilityEntityProvider. Change-Id: I73882668b516344d36e69355e9cb39534becb629 --- .../accessibility/AccessibilityEntityProvider.java | 151 --------------------- 1 file changed, 151 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 004ee4c22..812bbc881 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -18,7 +18,6 @@ package com.android.inputmethod.accessibility; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; -import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat; @@ -34,10 +33,6 @@ import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.KeyboardView; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - /** * Exposes a virtual view sub-tree for {@link KeyboardView} and generates * {@link AccessibilityEvent}s for individual {@link Key}s. @@ -95,7 +90,6 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); event.setPackageName(mKeyboardView.getContext().getPackageName()); event.setClassName(key.getClass().getName()); - event.getText().add(keyDescription); event.setEnabled(true); final AccessibilityRecordCompat record = new AccessibilityRecordCompat(event); @@ -136,7 +130,6 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, info); // Add the virtual children of the root View. - // TODO: Need to assign a unique ID to each key. final Keyboard keyboard = mKeyboardView.getKeyboard(); final Key[] keys = keyboard.mKeys; for (Key key : keys) { @@ -163,8 +156,6 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat // Obtain and initialize an AccessibilityNodeInfo with // information about the virtual view. info = AccessibilityNodeInfoCompat.obtain(); - info.addAction(AccessibilityNodeInfoCompat.ACTION_SELECT); - info.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION); info.setPackageName(mKeyboardView.getContext().getPackageName()); info.setClassName(key.getClass().getName()); info.setBoundsInParent(boundsInParent); @@ -173,154 +164,12 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat info.setSource(mKeyboardView, virtualViewId); info.setBoundsInScreen(boundsInScreen); info.setText(keyDescription); - info.setClickable(true); info.setEnabled(true); - info.setLongClickable(true); } return info; } - /** - * Performs an accessibility action on a virtual view, i.e. a descendant of - * the host View, with the given virtualViewId or the host View itself if - * virtualViewId equals to {@link View#NO_ID}. - * - * @param virtualViewId A client defined virtual view id. - * @param action The action to perform. - * @param arguments Optional arguments. - * @return True if the action was performed. - * @see #createAccessibilityNodeInfo(int) - * @see AccessibilityNodeInfoCompat - */ - @Override - public boolean performAction(int virtualViewId, int action, Bundle arguments) { - if (virtualViewId == View.NO_ID) { - // Perform the action on the host View. - switch (action) { - case AccessibilityNodeInfoCompat.ACTION_SELECT: - if (!mKeyboardView.isSelected()) { - mKeyboardView.setSelected(true); - return mKeyboardView.isSelected(); - } - break; - case AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION: - if (mKeyboardView.isSelected()) { - mKeyboardView.setSelected(false); - return !mKeyboardView.isSelected(); - } - break; - } - } else { - // Find the view that corresponds to the given id. - final Key child = mVirtualViewIdToKey.get(virtualViewId); - if (child == null) - return false; - - // Perform the action on a virtual view. - switch (action) { - case AccessibilityNodeInfoCompat.ACTION_SELECT: - // TODO: Provide some focus indicator. - return true; - case AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION: - // TODO: Provide some clear focus indicator. - return true; - } - } - - return false; - } - - /** - * Finds {@link AccessibilityNodeInfoCompat}s by text. The match is case - * insensitive containment. The search is relative to the virtual view, i.e. - * a descendant of the host View, with the given virtualViewId or the host - * View itself virtualViewId equals to {@link View#NO_ID}. - * - * @param virtualViewId A client defined virtual view id which defined the - * root of the tree in which to perform the search. - * @param text The searched text. - * @return A list of node info. - * @see #createAccessibilityNodeInfo(int) - * @see AccessibilityNodeInfoCompat - */ - @Override - public List findAccessibilityNodeInfosByText( - String text, int virtualViewId) { - final String searchedLowerCase = text.toLowerCase(); - final Keyboard keyboard = mKeyboardView.getKeyboard(); - - List results = null; - - if (virtualViewId == View.NO_ID) { - for (Key key : keyboard.mKeys) { - results = findByTextAndPopulate(searchedLowerCase, key, results); - } - } else { - final Key key = mVirtualViewIdToKey.get(virtualViewId); - - results = findByTextAndPopulate(searchedLowerCase, key, results); - } - - if (results == null) { - return Collections.emptyList(); - } - - return results; - } - - /** - * Helper method for {@link #findAccessibilityNodeInfosByText(String, int)}. - * Takes a current set of results and matches a specified key against a - * lower-case search string. Returns an updated list of results. - * - * @param searchedLowerCase The lower-case search string. - * @param key The key to compare against. - * @param results The current list of results, or {@code null} if no results - * found. - * @return An updated list of results, or {@code null} if no results found. - */ - private List findByTextAndPopulate(String searchedLowerCase, - Key key, List results) { - if (!keyContainsText(key, searchedLowerCase)) { - return results; - } - - final int childVirtualViewId = generateVirtualViewIdForKey(key); - final AccessibilityNodeInfoCompat nodeInfo = createAccessibilityNodeInfo( - childVirtualViewId); - - if (results == null) { - results = new LinkedList(); - } - - results.add(nodeInfo); - - return results; - } - - /** - * Returns whether a key's current description contains the lower-case - * search text. - * - * @param key The key to compare against. - * @param textLowerCase The lower-case search string. - * @return {@code true} if the key contains the search text. - */ - private boolean keyContainsText(Key key, String textLowerCase) { - if (key == null) { - return false; - } - - final String description = getKeyDescription(key); - - if (description == null) { - return false; - } - - return description.toLowerCase().contains(textLowerCase); - } - /** * Returns the context-specific description for a {@link Key}. * -- cgit v1.2.3-83-g751a From b4c41fa813426eaff2c20837c86e3f8aaa215b6f Mon Sep 17 00:00:00 2001 From: alanv Date: Wed, 9 May 2012 22:20:41 -0700 Subject: Use key index as virtual view ID. Bug: 6464677 Change-Id: I443e4add8052dbce1d413c2ce38a7b98408613bf --- .../inputmethod/accessibility/AccessibilityEntityProvider.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 812bbc881..d7cd8e23a 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -211,14 +211,17 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat } /** - * Generates a virtual view identifier for the specified key. + * 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(Key key) { - // The key code is unique within an instance of a Keyboard. - return key.mCode; + // 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.mX) << (Integer.SIZE / 2)) | (0xFFFF & key.mY); } private final OnGlobalLayoutListener mGlobalLayoutListener = new OnGlobalLayoutListener() { -- cgit v1.2.3-83-g751a From 6662e2a40dc764d5b6a55c0e30ce650fd834afb6 Mon Sep 17 00:00:00 2001 From: alanv Date: Thu, 10 May 2012 11:33:31 -0700 Subject: Implement "lift-to-type" interaction. Fix event text. Bug: 6456970 Change-Id: Idd6b84fc7a730a1e78d9c1157e3b5f22e5d49fc4 --- .../accessibility/AccessibilityEntityProvider.java | 3 ++- .../accessibility/AccessibleKeyboardViewProxy.java | 30 +++++++++++++++++++++- .../inputmethod/keyboard/LatinKeyboardView.java | 2 +- .../inputmethod/keyboard/PointerTracker.java | 4 +-- 4 files changed, 34 insertions(+), 5 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index d7cd8e23a..955cb4c42 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -90,6 +90,7 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); event.setPackageName(mKeyboardView.getContext().getPackageName()); event.setClassName(key.getClass().getName()); + event.setContentDescription(keyDescription); event.setEnabled(true); final AccessibilityRecordCompat record = new AccessibilityRecordCompat(event); @@ -158,12 +159,12 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat info = AccessibilityNodeInfoCompat.obtain(); info.setPackageName(mKeyboardView.getContext().getPackageName()); info.setClassName(key.getClass().getName()); + info.setContentDescription(keyDescription); info.setBoundsInParent(boundsInParent); info.setBoundsInScreen(boundsInScreen); info.setParent(mKeyboardView); info.setSource(mKeyboardView, virtualViewId); info.setBoundsInScreen(boundsInScreen); - info.setText(keyDescription); info.setEnabled(true); } diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java index ba814e390..34817ba4e 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java @@ -23,6 +23,7 @@ import android.support.v4.view.ViewCompat; import android.support.v4.view.accessibility.AccessibilityEventCompat; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityEvent; import com.android.inputmethod.keyboard.Key; @@ -41,6 +42,12 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { private Key mLastHoverKey = null; + /** + * Inset in pixels to look for keys when the user's finger exits the + * keyboard area. See {@link ViewConfiguration#getScaledEdgeSlop()}. + */ + private int mEdgeSlop; + public static void init(InputMethodService inputMethod) { sInstance.initInternal(inputMethod); } @@ -55,6 +62,7 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { private void initInternal(InputMethodService inputMethod) { mInputMethod = inputMethod; + mEdgeSlop = ViewConfiguration.get(inputMethod).getScaledEdgeSlop(); } /** @@ -108,8 +116,14 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { mLastHoverKey = key; switch (event.getAction()) { - case MotionEvent.ACTION_HOVER_ENTER: case MotionEvent.ACTION_HOVER_EXIT: + // Make sure we're not getting an EXIT event because the user slid + // off the keyboard area, then force a key press. + if (pointInView(x, y)) { + tracker.onRegisterKey(key); + } + //$FALL-THROUGH$ + case MotionEvent.ACTION_HOVER_ENTER: return onHoverKey(key, event); case MotionEvent.ACTION_HOVER_MOVE: if (key != previousKey) { @@ -122,6 +136,20 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { return false; } + /** + * Utility method to determine whether the given point, in local + * coordinates, is inside the view, where the area of the view is contracted + * by the edge slop factor. + * + * @param localX The local x-coordinate. + * @param localY The local y-coordinate. + */ + private boolean pointInView(int localX, int localY) { + return (localX >= mEdgeSlop) && (localY >= mEdgeSlop) + && (localX < (mView.getWidth() - mEdgeSlop)) + && (localY < (mView.getHeight() - mEdgeSlop)); + } + /** * 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 diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java index aeca839f1..337ae9c17 100644 --- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java @@ -140,7 +140,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke final PointerTracker tracker = (PointerTracker) msg.obj; switch (msg.what) { case MSG_REPEAT_KEY: - tracker.onRepeatKey(tracker.getKey()); + tracker.onRegisterKey(tracker.getKey()); startKeyRepeatTimer(tracker, mParams.mKeyRepeatInterval); break; case MSG_LONGPRESS_KEY: diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index c62c3ddbc..6ad854d1b 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -714,7 +714,7 @@ public class PointerTracker { private void startRepeatKey(Key key) { if (key != null && key.isRepeatable()) { - onRepeatKey(key); + onRegisterKey(key); mTimerProxy.startKeyRepeatTimer(this); mIsRepeatableKey = true; } else { @@ -722,7 +722,7 @@ public class PointerTracker { } } - public void onRepeatKey(Key key) { + public void onRegisterKey(Key key) { if (key != null) { detectAndSendKey(key, key.mX, key.mY); if (!key.altCodeWhileTyping() && !key.isModifier()) { -- cgit v1.2.3-83-g751a From f2eba97cc09c86f9a84b61cccf3f233e1fb85a6c Mon Sep 17 00:00:00 2001 From: alanv Date: Tue, 15 May 2012 15:11:12 -0700 Subject: Make LatinIME keys accessibility focusable, clickable. Also fix speech for labeled keys. Bug: 6498563 Change-Id: I094d4db0e57fa373759a63eb3354b1ab3ab0f525 --- .../accessibility/AccessibilityEntityProvider.java | 116 ++++++++++++++++++++- .../accessibility/AccessibleKeyboardViewProxy.java | 49 +++++---- .../accessibility/KeyCodeDescriptionMapper.java | 3 + 3 files changed, 142 insertions(+), 26 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 955cb4c42..67e21b10c 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -18,13 +18,18 @@ 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.ViewParent; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.accessibility.AccessibilityEvent; import android.view.inputmethod.EditorInfo; @@ -45,6 +50,7 @@ import com.android.inputmethod.keyboard.KeyboardView; */ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat { private static final String TAG = AccessibilityEntityProvider.class.getSimpleName(); + private static final int UNDEFINED = Integer.MIN_VALUE; private final KeyboardView mKeyboardView; private final InputMethodService mInputMethodService; @@ -60,6 +66,9 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat /** The parent view's cached on-screen location. */ private final int[] mParentLocation = new int[2]; + /** The virtual view identifier for the focused node. */ + private int mAccessibilityFocusedView = UNDEFINED; + public AccessibilityEntityProvider(KeyboardView keyboardView, InputMethodService inputMethod) { mKeyboardView = keyboardView; mInputMethodService = inputMethod; @@ -124,7 +133,9 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat public AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int virtualViewId) { AccessibilityNodeInfoCompat info = null; - if (virtualViewId == View.NO_ID) { + if (virtualViewId == UNDEFINED) { + return null; + } else if (virtualViewId == View.NO_ID) { // We are requested to create an AccessibilityNodeInfo describing // this View, i.e. the root of the virtual sub-tree. info = AccessibilityNodeInfoCompat.obtain(mKeyboardView); @@ -166,11 +177,114 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat info.setSource(mKeyboardView, virtualViewId); info.setBoundsInScreen(boundsInScreen); info.setEnabled(true); + info.setClickable(true); + info.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK); + + if (mAccessibilityFocusedView == virtualViewId) { + info.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS); + } else { + info.addAction(AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS); + } } 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(Key key) { + final int x = key.mX + (key.mWidth / 2); + final int y = key.mY + (key.mHeight / 2); + 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); + } + + @Override + public boolean performAction(int virtualViewId, int action, Bundle arguments) { + final Key key = mVirtualViewIdToKey.get(virtualViewId); + + if (key == null) { + return false; + } + + return performActionForKey(key, action, arguments); + } + + /** + * Performs the specified accessibility action for the given key. + * + * @param key The on which to perform the action. + * @param action The action to perform. + * @param arguments The action's arguments. + * @return The result of performing the action, or false if the action is + * not supported. + */ + boolean performActionForKey(Key key, int action, Bundle arguments) { + final int virtualViewId = generateVirtualViewIdForKey(key); + + switch (action) { + case AccessibilityNodeInfoCompat.ACTION_CLICK: + simulateKeyPress(key); + return true; + case AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS: + if (mAccessibilityFocusedView == virtualViewId) { + return false; + } + mAccessibilityFocusedView = virtualViewId; + sendAccessibilityEventForKey( + key, AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED); + return true; + case AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS: + if (mAccessibilityFocusedView != virtualViewId) { + return false; + } + mAccessibilityFocusedView = UNDEFINED; + sendAccessibilityEventForKey( + key, AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED); + return true; + } + + return false; + } + + @Override + public AccessibilityNodeInfoCompat findAccessibilityFocus(int virtualViewId) { + return createAccessibilityNodeInfo(mAccessibilityFocusedView); + } + + @Override + public AccessibilityNodeInfoCompat accessibilityFocusSearch(int direction, int virtualViewId) { + // Focus search is not currently supported for IMEs. + return null; + } + + /** + * Sends an accessibility event for the given {@link Key}. + * + * @param key The key that's sending the event. + * @param eventType The type of event to send. + */ + void sendAccessibilityEventForKey(Key key, int eventType) { + final AccessibilityEvent event = createAccessibilityEvent(key, eventType); + final ViewParent parent = mKeyboardView.getParent(); + + if (parent == null) { + return; + } + + parent.requestSendAccessibilityEvent(mKeyboardView, event); + } + /** * Returns the context-specific description for a {@link Key}. * diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java index 34817ba4e..1b0e488bc 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java @@ -21,10 +21,10 @@ import android.inputmethodservice.InputMethodService; import android.support.v4.view.AccessibilityDelegateCompat; import android.support.v4.view.ViewCompat; import android.support.v4.view.accessibility.AccessibilityEventCompat; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; -import android.view.accessibility.AccessibilityEvent; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; @@ -91,13 +91,7 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { */ @Override public AccessibilityEntityProvider getAccessibilityNodeProvider(View host) { - // Instantiate the provide only when requested. Since the system - // will call this method multiple times it is a good practice to - // cache the provider instance. - if (mAccessibilityNodeProvider == null) { - mAccessibilityNodeProvider = new AccessibilityEntityProvider(mView, mInputMethod); - } - return mAccessibilityNodeProvider; + return getAccessibilityNodeProvider(); } /** @@ -120,7 +114,7 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { // Make sure we're not getting an EXIT event because the user slid // off the keyboard area, then force a key press. if (pointInView(x, y)) { - tracker.onRegisterKey(key); + getAccessibilityNodeProvider().simulateKeyPress(key); } //$FALL-THROUGH$ case MotionEvent.ACTION_HOVER_ENTER: @@ -136,6 +130,19 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { return false; } + /** + * @return A lazily-instantiated node provider for this view proxy. + */ + private AccessibilityEntityProvider getAccessibilityNodeProvider() { + // Instantiate the provide only when requested. Since the system + // will call this method multiple times it is a good practice to + // cache the provider instance. + if (mAccessibilityNodeProvider == null) { + mAccessibilityNodeProvider = new AccessibilityEntityProvider(mView, mInputMethod); + } + return mAccessibilityNodeProvider; + } + /** * Utility method to determine whether the given point, in local * coordinates, is inside the view, where the area of the view is contracted @@ -191,32 +198,24 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { return false; } + final AccessibilityEntityProvider provider = getAccessibilityNodeProvider(); + switch (event.getAction()) { case MotionEvent.ACTION_HOVER_ENTER: - sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_ENTER); + provider.sendAccessibilityEventForKey( + key, AccessibilityEventCompat.TYPE_VIEW_HOVER_ENTER); + provider.performActionForKey( + key, AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS, null); break; case MotionEvent.ACTION_HOVER_EXIT: - sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT); + provider.sendAccessibilityEventForKey( + key, AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT); break; } return true; } - /** - * Populates and sends an {@link AccessibilityEvent} for the specified key. - * - * @param key The key to send an event for. - * @param eventType The type of event to send. - */ - private void sendAccessibilityEventForKey(Key key, int eventType) { - final AccessibilityEntityProvider nodeProvider = getAccessibilityNodeProvider(null); - final AccessibilityEvent event = nodeProvider.createAccessibilityEvent(key, eventType); - - // Propagates the event up the view hierarchy. - mView.getParent().requestSendAccessibilityEvent(mView, event); - } - /** * Notifies the user of changes in the keyboard shift state. */ diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java index 3d861c231..f4e4105e3 100644 --- a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java +++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java @@ -111,6 +111,9 @@ public class KeyCodeDescriptionMapper { if (mKeyLabelMap.containsKey(label)) { return context.getString(mKeyLabelMap.get(label)); } + + // Otherwise, return the label. + return key.mLabel; } // Just attempt to speak the description. -- cgit v1.2.3-83-g751a From 282adf733093b41a31514746825ea05fc90fb3ee Mon Sep 17 00:00:00 2001 From: alanv Date: Sat, 19 May 2012 00:05:13 -0700 Subject: Pass IME accessibility events directly to the AccessibilityManager. Bug: 6523554 Change-Id: I44bceb7b068ff1ac0c799f4a93d5dcd8026f1e4b --- .../accessibility/AccessibilityEntityProvider.java | 7 ++++++- .../inputmethod/accessibility/AccessibilityUtils.java | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 67e21b10c..3cfef972a 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -282,7 +282,12 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat return; } - parent.requestSendAccessibilityEvent(mKeyboardView, event); + if (!parent.requestSendAccessibilityEvent(mKeyboardView, event)) { + // TODO: Remove this line after the top-level view for the IME + // window is fixed to be non-null and requestSendAccessibilityEvent + // can return true. + mAccessibilityUtils.requestSendAccessibilityEvent(event); + } } /** diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java index 2ea7d83e4..616b1c6d7 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java @@ -174,4 +174,16 @@ public class AccessibilityUtils { speak(text); } } + + /** + * Sends the specified {@link AccessibilityEvent} if accessibility is + * enabled. No operation if accessibility is disabled. + * + * @param event The event to send. + */ + public void requestSendAccessibilityEvent(AccessibilityEvent event) { + if (mAccessibilityManager.isEnabled()) { + mAccessibilityManager.sendAccessibilityEvent(event); + } + } } -- cgit v1.2.3-83-g751a From 067689c57d353e4e37e0457989c6c2686977df9e Mon Sep 17 00:00:00 2001 From: alanv Date: Mon, 21 May 2012 20:31:06 -0700 Subject: Always use AccessibilityUtils to send events. Bug: 6532601 Change-Id: I3aba9066ccd8d401973abfe9100f4cab731b5e7d --- .../accessibility/AccessibilityEntityProvider.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 3cfef972a..8bc789317 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -29,7 +29,6 @@ import android.util.Log; import android.util.SparseArray; import android.view.MotionEvent; import android.view.View; -import android.view.ViewParent; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.accessibility.AccessibilityEvent; import android.view.inputmethod.EditorInfo; @@ -276,18 +275,7 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat */ void sendAccessibilityEventForKey(Key key, int eventType) { final AccessibilityEvent event = createAccessibilityEvent(key, eventType); - final ViewParent parent = mKeyboardView.getParent(); - - if (parent == null) { - return; - } - - if (!parent.requestSendAccessibilityEvent(mKeyboardView, event)) { - // TODO: Remove this line after the top-level view for the IME - // window is fixed to be non-null and requestSendAccessibilityEvent - // can return true. - mAccessibilityUtils.requestSendAccessibilityEvent(event); - } + mAccessibilityUtils.requestSendAccessibilityEvent(event); } /** -- cgit v1.2.3-83-g751a From 48ccd5528163383a46b597e9d5ea919ddc799f25 Mon Sep 17 00:00:00 2001 From: alanv Date: Wed, 30 May 2012 15:39:48 -0700 Subject: Update keyboard view used by node provider. Remove global layout listener. Bug: 6582130 Change-Id: I2976e37e921a3e2c151486a919b0a93a908c3384 --- .../accessibility/AccessibilityEntityProvider.java | 32 +++++++++++----------- .../accessibility/AccessibleKeyboardViewProxy.java | 4 +++ 2 files changed, 20 insertions(+), 16 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 8bc789317..9986f6ec0 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -29,7 +29,6 @@ import android.util.Log; import android.util.SparseArray; import android.view.MotionEvent; import android.view.View; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.accessibility.AccessibilityEvent; import android.view.inputmethod.EditorInfo; @@ -51,7 +50,6 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat private static final String TAG = AccessibilityEntityProvider.class.getSimpleName(); private static final int UNDEFINED = Integer.MIN_VALUE; - private final KeyboardView mKeyboardView; private final InputMethodService mInputMethodService; private final KeyCodeDescriptionMapper mKeyCodeDescriptionMapper; private final AccessibilityUtils mAccessibilityUtils; @@ -68,18 +66,28 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat /** The virtual view identifier for the focused node. */ private int mAccessibilityFocusedView = UNDEFINED; + /** The current keyboard view. */ + private KeyboardView mKeyboardView; + public AccessibilityEntityProvider(KeyboardView keyboardView, InputMethodService inputMethod) { - mKeyboardView = keyboardView; mInputMethodService = inputMethod; mKeyCodeDescriptionMapper = KeyCodeDescriptionMapper.getInstance(); mAccessibilityUtils = AccessibilityUtils.getInstance(); + setView(keyboardView); + } + + /** + * Sets the keyboard view represented by this node provider. + * + * @param keyboardView The keyboard view to represent. + */ + public void setView(KeyboardView keyboardView) { + mKeyboardView = keyboardView; + assignVirtualViewIds(); updateParentLocation(); - - // Ensure that the on-screen bounds are cleared when the layout changes. - mKeyboardView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener); } /** @@ -196,8 +204,8 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat * @param key The key to press. */ void simulateKeyPress(Key key) { - final int x = key.mX + (key.mWidth / 2); - final int y = key.mY + (key.mHeight / 2); + final int x = key.mHitBox.centerX(); + final int y = key.mHitBox.centerY(); final long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain( downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0); @@ -331,12 +339,4 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat // left-half of the integer and OR'ing with the y-coordinate. return ((0xFFFF & key.mX) << (Integer.SIZE / 2)) | (0xFFFF & key.mY); } - - private final OnGlobalLayoutListener mGlobalLayoutListener = new OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - assignVirtualViewIds(); - updateParentLocation(); - } - }; } diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java index 2623dcc03..59f1eec04 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java @@ -80,6 +80,10 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { // Ensure that the view has an accessibility delegate. ViewCompat.setAccessibilityDelegate(view, this); + + if (mAccessibilityNodeProvider != null) { + mAccessibilityNodeProvider.setView(view); + } } /** -- cgit v1.2.3-83-g751a From f147794fd41491a3383e6aca6d49007f58124068 Mon Sep 17 00:00:00 2001 From: alanv Date: Tue, 5 Jun 2012 11:02:54 -0700 Subject: Refresh Accessibility key mapping when KeyboardView changes Keyboards. Bug: 6609626 Change-Id: I93d764b46e96fe70b61c91a7dcb46945ac8853dd --- .../accessibility/AccessibilityEntityProvider.java | 13 ++++++++++++- .../accessibility/AccessibleKeyboardViewProxy.java | 6 ++++++ .../com/android/inputmethod/keyboard/LatinKeyboardView.java | 4 ++++ 3 files changed, 22 insertions(+), 1 deletion(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 9986f6ec0..ba08c593c 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -85,9 +85,20 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat */ public void setView(KeyboardView keyboardView) { mKeyboardView = keyboardView; + updateParentLocation(); + + // Since this class is constructed lazily, we might not get a subsequent + // call to setKeyboard() and therefore need to call it now. + setKeyboard(mKeyboardView.getKeyboard()); + } + /** + * Sets the keyboard represented by this node provider. + * + * @param keyboard The keyboard to represent. + */ + public void setKeyboard(Keyboard keyboard) { assignVirtualViewIds(); - updateParentLocation(); } /** diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java index 59f1eec04..f6376d5f4 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java @@ -86,6 +86,12 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { } } + public void setKeyboard(Keyboard keyboard) { + if (mAccessibilityNodeProvider != null) { + mAccessibilityNodeProvider.setKeyboard(keyboard); + } + } + /** * Proxy method for View.getAccessibilityNodeProvider(). This method is * called in SDK version 15 and higher to obtain the virtual node hierarchy diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java index e917a8128..383298de9 100644 --- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java @@ -468,6 +468,10 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke if (ProductionFlag.IS_EXPERIMENTAL) { ResearchLogger.latinKeyboardView_setKeyboard(keyboard); } + + // This always needs to be set since the accessibility state can + // potentially change without the keyboard being set again. + AccessibleKeyboardViewProxy.getInstance().setKeyboard(keyboard); } /** -- cgit v1.2.3-83-g751a From b910b18c2c28e7bb40e603083198d7c12c50c361 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Fri, 15 Jun 2012 10:58:47 -0700 Subject: Update LatinIME due to hidden APIs taken out of the support lib. 1. We have hidden the APIs for accessiiblity focus search since it wull be perfomred by the client, updated the support lib, and now we are updating the LatinIME. bug:6675330 Change-Id: I9dd3450b40148be7ce750f6bffc0a047a541982f --- .../inputmethod/accessibility/AccessibilityEntityProvider.java | 6 ------ 1 file changed, 6 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index ba08c593c..7d5d7142b 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -280,12 +280,6 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat return createAccessibilityNodeInfo(mAccessibilityFocusedView); } - @Override - public AccessibilityNodeInfoCompat accessibilityFocusSearch(int direction, int virtualViewId) { - // Focus search is not currently supported for IMEs. - return null; - } - /** * Sends an accessibility event for the given {@link Key}. * -- cgit v1.2.3-83-g751a From d3cc73ada83e4444c8e5fb1662cc70bff45e4f69 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Sun, 17 Jun 2012 15:21:58 -0700 Subject: Removing implementation of unnecessary APIs taken out of the support lib. 1. We have hidden a framework API and it was take out of the support lib. This API is not necessary and this patch removes the implementation in LatinIME. bug:6675330 Change-Id: I18aff7a6c7bc2b76c7332abe0bf294fbbb99ccfc --- .../inputmethod/accessibility/AccessibilityEntityProvider.java | 5 ----- 1 file changed, 5 deletions(-) (limited to 'java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java') diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java index 7d5d7142b..70e38fdb0 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java @@ -275,11 +275,6 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat return false; } - @Override - public AccessibilityNodeInfoCompat findAccessibilityFocus(int virtualViewId) { - return createAccessibilityNodeInfo(mAccessibilityFocusedView); - } - /** * Sends an accessibility event for the given {@link Key}. * -- cgit v1.2.3-83-g751a