diff options
Diffstat (limited to 'java/src')
16 files changed, 101 insertions, 56 deletions
diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java index 18673a366..cb13483f2 100644 --- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java +++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java @@ -49,7 +49,9 @@ import java.util.List; */ final class KeyboardAccessibilityNodeProvider extends AccessibilityNodeProviderCompat { private static final String TAG = KeyboardAccessibilityNodeProvider.class.getSimpleName(); - private static final int UNDEFINED = Integer.MIN_VALUE; + + // From {@link android.view.accessibility.AccessibilityNodeInfo#UNDEFINED_ITEM_ID}. + private static final int UNDEFINED = Integer.MAX_VALUE; private final KeyCodeDescriptionMapper mKeyCodeDescriptionMapper; private final AccessibilityUtils mAccessibilityUtils; @@ -167,22 +169,10 @@ final class KeyboardAccessibilityNodeProvider extends AccessibilityNodeProviderC } if (virtualViewId == View.NO_ID) { // We are requested to create an AccessibilityNodeInfo describing - // this View, i.e. the root of the virtual sub-tree. + // this View. Returning an empty info is sufficient for a keyboard. final AccessibilityNodeInfoCompat rootInfo = AccessibilityNodeInfoCompat.obtain(mKeyboardView); ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, rootInfo); - - // Add the virtual children of the root View. - 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; } diff --git a/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java index 3a56c5d2a..4022da343 100644 --- a/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java +++ b/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java @@ -23,7 +23,7 @@ import android.view.MotionEvent; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.KeyDetector; import com.android.inputmethod.keyboard.MoreKeysKeyboardView; -import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.keyboard.PointerTracker; /** * This class represents a delegate that can be registered in {@link MoreKeysKeyboardView} to @@ -55,6 +55,10 @@ public class MoreKeysKeyboardAccessibilityDelegate sendWindowStateChanged(mOpenAnnounceResId); } + public void onDismissMoreKeysKeyboard() { + sendWindowStateChanged(mCloseAnnounceResId); + } + @Override protected void onHoverEnter(final MotionEvent event) { if (DEBUG_HOVER) { @@ -103,12 +107,14 @@ public class MoreKeysKeyboardAccessibilityDelegate // Invoke {@link MoreKeysKeyboardView#onUpEvent(int,int,int,long)} as if this hover // exit event selects a key. mKeyboardView.onUpEvent(x, y, pointerId, eventTime); - mKeyboardView.dismissMoreKeysPanel(); + // TODO: Should fix this reference. This is a hack to clear the state of + // {@link PointerTracker}. + PointerTracker.dismissAllMoreKeysPanels(); return; } // Close the more keys keyboard. - mKeyboardView.onMoveEvent( - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, pointerId, eventTime); - sendWindowStateChanged(mCloseAnnounceResId); + // TODO: Should fix this reference. This is a hack to clear the state of + // {@link PointerTracker}. + PointerTracker.dismissAllMoreKeysPanels(); } } diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 89a60cc1d..88cde1111 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -195,7 +195,8 @@ public class Key implements Comparable<Key> { mHintLabel = hintLabel; mLabelFlags = labelFlags; mBackgroundType = backgroundType; - mActionFlags = 0; + // TODO: Pass keyActionFlags as an argument. + mActionFlags = ACTION_FLAGS_NO_KEY_PREVIEW; mMoreKeys = null; mMoreKeysColumnAndFlags = 0; mLabel = label; diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java index 0ea9c742f..7b41dfef6 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java @@ -99,7 +99,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> { private static int getSdkVersion() { final int sdkVersion = Build.VERSION.SDK_INT; // TODO: Consider to remove this check once the *next* version becomes available. - if (sdkVersion == VERSION_CODES.KITKAT && Build.VERSION.CODENAME.startsWith("L")) { + if (sdkVersion > VERSION_CODES.KITKAT) { return VERSION_CODES.CUR_DEVELOPMENT; } return sdkVersion; diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index bcd0cd848..9a859bfdb 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -446,15 +446,15 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack @Override public void showKeyPreview(final Key key) { - // If key is invalid or IME is already closed, we must not show key preview. - // Trying to show key preview while root window is closed causes - // WindowManager.BadTokenException. - if (key == null) { + // If the key is invalid or has no key preview, we must not show key preview. + if (key == null || key.noKeyPreview()) { return; } - - final KeyPreviewDrawParams previewParams = mKeyPreviewDrawParams; final Keyboard keyboard = getKeyboard(); + if (keyboard == null) { + return; + } + final KeyPreviewDrawParams previewParams = mKeyPreviewDrawParams; if (!previewParams.isPopupEnabled()) { previewParams.setVisibleOffset(-keyboard.mVerticalGap); return; diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java index 0f575d30c..3994487aa 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java @@ -35,7 +35,7 @@ import com.android.inputmethod.latin.utils.CoordinateUtils; public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel { private final int[] mCoordinates = CoordinateUtils.newInstance(); - protected KeyDetector mKeyDetector; + protected final KeyDetector mKeyDetector; private Controller mController = EMPTY_CONTROLLER; protected KeyboardActionListener mListener; private int mOriginX; @@ -72,13 +72,10 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel @Override public void setKeyboard(final Keyboard keyboard) { super.setKeyboard(keyboard); + mKeyDetector.setKeyboard( + keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection()); if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { - // With accessibility mode on, any hover event outside {@link MoreKeysKeyboardView} is - // discarded at {@link InputView#dispatchHoverEvent(MotionEvent)}. Because only a hover - // event that is on this view is dispatched by the platform, we should use a - // {@link KeyDetector} that has no sliding allowance and no hysteresis. if (mAccessibilityDelegate == null) { - mKeyDetector = new KeyDetector(); mAccessibilityDelegate = new MoreKeysKeyboardAccessibilityDelegate( this, mKeyDetector); mAccessibilityDelegate.setOpenAnnounce(R.string.spoken_open_more_keys_keyboard); @@ -86,12 +83,8 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel } mAccessibilityDelegate.setKeyboard(keyboard); } else { - mKeyDetector = new MoreKeysDetector(getResources().getDimension( - R.dimen.config_more_keys_keyboard_slide_allowance)); mAccessibilityDelegate = null; } - mKeyDetector.setKeyboard( - keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection()); } @Override @@ -214,6 +207,10 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel if (!isShowingInParent()) { return; } + final MoreKeysKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate; + if (accessibilityDelegate != null) { + accessibilityDelegate.onDismissMoreKeysKeyboard(); + } mController.onDismissMoreKeysPanel(); } diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java index 80ba60c82..a34dbef4b 100644 --- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java @@ -55,7 +55,22 @@ final class EmojiPageKeyboardView extends KeyboardView implements private OnKeyEventListener mListener = EMPTY_LISTENER; private final KeyDetector mKeyDetector = new KeyDetector(); private final GestureDetector mGestureDetector; - private KeyboardAccessibilityDelegate<EmojiPageKeyboardView> mAccessibilityDelegate; + private EmojiPageKeyboardAccessibilityDelegate mAccessibilityDelegate; + + private static final class EmojiPageKeyboardAccessibilityDelegate + extends KeyboardAccessibilityDelegate<EmojiPageKeyboardView> { + public EmojiPageKeyboardAccessibilityDelegate(final EmojiPageKeyboardView keyboardView, + final KeyDetector keyDetector) { + super(keyboardView, keyDetector); + } + + @Override + protected void simulateTouchEvent(int touchAction, MotionEvent hoverEvent) { + final MotionEvent touchEvent = synthesizeTouchEvent(touchAction, hoverEvent); + mKeyboardView.onTouchEvent(touchEvent); + touchEvent.recycle(); + } + } public EmojiPageKeyboardView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.keyboardViewStyle); @@ -82,7 +97,8 @@ final class EmojiPageKeyboardView extends KeyboardView implements mKeyDetector.setKeyboard(keyboard, 0 /* correctionX */, 0 /* correctionY */); if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) { if (mAccessibilityDelegate == null) { - mAccessibilityDelegate = new KeyboardAccessibilityDelegate<>(this, mKeyDetector); + mAccessibilityDelegate = new EmojiPageKeyboardAccessibilityDelegate( + this, mKeyDetector); } mAccessibilityDelegate.setKeyboard(keyboard); } else { diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index e69499829..8bff27574 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -444,6 +444,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { continue; } final int labelFlags = row.getDefaultKeyLabelFlags(); + // TODO: Should be able to assign default keyActionFlags as well. final int backgroundType = row.getDefaultBackgroundType(); final int x = (int)row.getKeyX(null); final int y = row.getKeyY(); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java index 6db1d02c9..92daf0742 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java @@ -45,6 +45,7 @@ public final class KeyboardRow { private final ArrayDeque<RowAttributes> mRowAttributesStack = new ArrayDeque<>(); + // TODO: Add keyActionFlags. private static class RowAttributes { /** Default width of a key in this row. */ public final float mDefaultKeyWidth; diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 4dbfb44d6..543f74fc4 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -207,6 +207,7 @@ public final class BinaryDictionary extends Dictionary { private static native boolean addUnigramWordNative(long dict, int[] word, int probability, int[] shortcutTarget, int shortcutProbability, boolean isBeginningOfSentence, boolean isNotAWord, boolean isBlacklisted, int timestamp); + private static native boolean removeUnigramWordNative(long dict, int[] word); private static native boolean addBigramWordsNative(long dict, int[] word0, boolean isBeginningOfSentence, int[] word1, int probability, int timestamp); private static native boolean removeBigramWordsNative(long dict, int[] word0, @@ -436,6 +437,19 @@ public final class BinaryDictionary extends Dictionary { return true; } + // Remove a unigram entry from the binary dictionary in native code. + public boolean removeUnigramEntry(final String word) { + if (TextUtils.isEmpty(word)) { + return false; + } + final int[] codePoints = StringUtils.toCodePointArray(word); + if (!removeUnigramWordNative(mNativeDict, codePoints)) { + return false; + } + mHasUpdated = true; + return true; + } + // Add an n-gram entry to the binary dictionary with timestamp in native code. public boolean addNgramEntry(final PrevWordsInfo prevWordsInfo, final String word, final int probability, final int timestamp) { diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java index fa51436de..f9339361a 100644 --- a/java/src/com/android/inputmethod/latin/Constants.java +++ b/java/src/com/android/inputmethod/latin/Constants.java @@ -263,10 +263,10 @@ public final class Constants { case CODE_ENTER: return "enter"; case CODE_SPACE: return "space"; default: - if (code < CODE_SPACE) return String.format("\\u%02x", code); + if (code < CODE_SPACE) return String.format("\\u%02X", code); if (code < 0x100) return String.format("%c", code); - if (code < 0x10000) return String.format("\\u04x", code); - return String.format("\\U%05x", code); + if (code < 0x10000) return String.format("\\u%04X", code); + return String.format("\\U%05X", code); } } diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java index 4dbfa0bac..b1966bffc 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java @@ -122,6 +122,12 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { return mBinaryDictionary.isValidDictionary(); } + // TODO: Remove and always enable beginning of sentence prediction. Currently, this is enabled + // only for ContextualDictionary. + protected boolean enableBeginningOfSentencePrediction() { + return false; + } + /** * Creates a new expandable binary dictionary. * @@ -398,6 +404,10 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { if (mBinaryDictionary == null) { return null; } + if (composer.size() == 0 && prevWordsInfo.mIsBeginningOfSentence + && !enableBeginningOfSentencePrediction()) { + return null; + } final ArrayList<SuggestedWordInfo> suggestions = mBinaryDictionary.getSuggestions(composer, prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions, sessionId, diff --git a/java/src/com/android/inputmethod/latin/InputView.java b/java/src/com/android/inputmethod/latin/InputView.java index 0801cfa88..e9e12f09f 100644 --- a/java/src/com/android/inputmethod/latin/InputView.java +++ b/java/src/com/android/inputmethod/latin/InputView.java @@ -202,7 +202,12 @@ public final class InputView extends LinearLayout { @Override protected boolean needsToForward(final int x, final int y) { - return isInKeyboardTopPadding(y); + // Forwarding an event only when {@link MainKeyboardView} is visible. + // Because the visibility of {@link MainKeyboardView} is controlled by its parent + // view in {@link KeyboardSwitcher#setMainKeyboardFrame()}, we should check the + // visibility of the parent view. + final View mainKeyboardFrame = (View)mSenderView.getParent(); + return mainKeyboardFrame.getVisibility() == View.VISIBLE && isInKeyboardTopPadding(y); } @Override diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java index cbdc4b9eb..7758ac78e 100644 --- a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java +++ b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java @@ -409,21 +409,12 @@ public final class RichInputMethodManager { public boolean shouldOfferSwitchingToNextInputMethod(final IBinder binder, boolean defaultValue) { - // Use the default value instead on Jelly Bean MR2 and previous, where - // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} isn't yet available. - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR2) { + // Use the default value instead on Jelly Bean MR2 and previous where + // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} isn't yet available + // and on KitKat where the API is still just a stub to return true always. + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { return defaultValue; } - // Use the default value instead on KitKat as well, where - // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} is still just a stub to - // return true always. - if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { - // Make sure this is actually KitKat. - // TODO: Consider to remove this check once the *next* version becomes available. - if (Build.VERSION.CODENAME.equals("REL")) { - return defaultValue; - } - } return mImmWrapper.shouldOfferSwitchingToNextInputMethod(binder); } } diff --git a/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java index 536554d98..a96018fe9 100644 --- a/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java +++ b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java @@ -35,6 +35,7 @@ public class ContextualDictionary extends ExpandableBinaryDictionary { // Always reset the contents. clear(); } + @UsedForTesting public static ContextualDictionary getDictionary(final Context context, final Locale locale, final File dictFile, final String dictNamePrefix) { @@ -42,6 +43,11 @@ public class ContextualDictionary extends ExpandableBinaryDictionary { } @Override + protected boolean enableBeginningOfSentencePrediction() { + return true; + } + + @Override public boolean isValidWord(final String word) { // Strings out of this dictionary should not be considered existing words. return false; diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java index 3be933ff7..aebfb7d4c 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java @@ -33,6 +33,7 @@ import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; import android.widget.ImageButton; import android.widget.RelativeLayout; import android.widget.TextView; @@ -415,6 +416,12 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick } @Override + public boolean dispatchPopulateAccessibilityEvent(final AccessibilityEvent event) { + // Don't populate accessibility event with suggested words and voice key. + return true; + } + + @Override public boolean onTouchEvent(final MotionEvent me) { // In the sliding input mode. {@link MotionEvent} should be forwarded to // {@link MoreSuggestionsView}. |