summaryrefslogtreecommitdiffstats
path: root/core/java/android/inputmethodservice
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/inputmethodservice')
-rw-r--r--core/java/android/inputmethodservice/ExtractEditText.java7
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java266
-rwxr-xr-xcore/java/android/inputmethodservice/KeyboardView.java22
3 files changed, 17 insertions, 278 deletions
diff --git a/core/java/android/inputmethodservice/ExtractEditText.java b/core/java/android/inputmethodservice/ExtractEditText.java
index 0295f69..52f8209 100644
--- a/core/java/android/inputmethodservice/ExtractEditText.java
+++ b/core/java/android/inputmethodservice/ExtractEditText.java
@@ -98,13 +98,6 @@ public class ExtractEditText extends EditText {
}
/**
- * Return true if the edit text is currently showing a scroll bar.
- */
- public boolean hasVerticalScrollBar() {
- return computeVerticalScrollRange() > computeVerticalScrollExtent();
- }
-
- /**
* Pretend like the window this view is in always has focus, so its
* highlight and cursor will be displayed.
*/
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 1e2e2f3..4be1fc7 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -26,9 +26,7 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.IBinder;
-import android.os.SystemClock;
import android.provider.Settings;
-import android.text.InputType;
import android.text.Layout;
import android.text.Spannable;
import android.text.method.MovementMethod;
@@ -51,7 +49,6 @@ import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethod;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
import android.widget.FrameLayout;
import java.io.FileDescriptor;
@@ -244,8 +241,6 @@ public class InputMethodService extends AbstractInputMethodService {
boolean mIsFullscreen;
View mExtractView;
ExtractEditText mExtractEditText;
- ViewGroup mExtractAccessories;
- Button mExtractAction;
ExtractedText mExtractedText;
int mExtractedToken;
@@ -276,21 +271,6 @@ public class InputMethodService extends AbstractInputMethodService {
}
};
- final View.OnClickListener mActionClickListener = new View.OnClickListener() {
- public void onClick(View v) {
- final EditorInfo ei = getCurrentInputEditorInfo();
- final InputConnection ic = getCurrentInputConnection();
- if (ei != null && ic != null) {
- if (ei.actionId != 0) {
- ic.performEditorAction(ei.actionId);
- } else if ((ei.imeOptions&EditorInfo.IME_MASK_ACTION)
- != EditorInfo.IME_ACTION_NONE) {
- ic.performEditorAction(ei.imeOptions&EditorInfo.IME_MASK_ACTION);
- }
- }
- }
- };
-
/**
* Concrete implementation of
* {@link AbstractInputMethodService.AbstractInputMethodImpl} that provides
@@ -542,8 +522,6 @@ public class InputMethodService extends AbstractInputMethodService {
mExtractFrame = (FrameLayout)mRootView.findViewById(android.R.id.extractArea);
mExtractView = null;
mExtractEditText = null;
- mExtractAccessories = null;
- mExtractAction = null;
mFullscreenApplied = false;
mCandidatesFrame = (FrameLayout)mRootView.findViewById(android.R.id.candidatesArea);
@@ -725,7 +703,7 @@ public class InputMethodService extends AbstractInputMethodService {
setExtractView(v);
}
}
- startExtractingText(false);
+ startExtractingText();
}
}
@@ -929,17 +907,9 @@ public class InputMethodService extends AbstractInputMethodService {
mExtractEditText = (ExtractEditText)view.findViewById(
com.android.internal.R.id.inputExtractEditText);
mExtractEditText.setIME(this);
- mExtractAction = (Button)view.findViewById(
- com.android.internal.R.id.inputExtractAction);
- if (mExtractAction != null) {
- mExtractAccessories = (ViewGroup)view.findViewById(
- com.android.internal.R.id.inputExtractAccessories);
- }
- startExtractingText(false);
+ startExtractingText();
} else {
mExtractEditText = null;
- mExtractAccessories = null;
- mExtractAction = null;
}
}
@@ -1196,7 +1166,7 @@ public class InputMethodService extends AbstractInputMethodService {
}
if (doShowInput) {
- startExtractingText(false);
+ startExtractingText();
}
if (!wasVisible) {
@@ -1306,7 +1276,7 @@ public class InputMethodService extends AbstractInputMethodService {
if (DEBUG) Log.v(TAG, "CALL: onStartInputView");
mInputViewStarted = true;
onStartInputView(mInputEditorInfo, restarting);
- startExtractingText(true);
+ startExtractingText();
} else if (mCandidatesVisibility == View.VISIBLE) {
if (DEBUG) Log.v(TAG, "CALL: onStartCandidatesView");
mCandidatesViewStarted = true;
@@ -1483,25 +1453,6 @@ public class InputMethodService extends AbstractInputMethodService {
static final int MOVEMENT_DOWN = -1;
static final int MOVEMENT_UP = -2;
- void reportExtractedMovement(int keyCode, int count) {
- int dx = 0, dy = 0;
- switch (keyCode) {
- case KeyEvent.KEYCODE_DPAD_LEFT:
- dx = -count;
- break;
- case KeyEvent.KEYCODE_DPAD_RIGHT:
- dx = count;
- break;
- case KeyEvent.KEYCODE_DPAD_UP:
- dy = -count;
- break;
- case KeyEvent.KEYCODE_DPAD_DOWN:
- dy = count;
- break;
- }
- onExtractedCursorMovement(dx, dy);
- }
-
boolean doMovementKey(int keyCode, KeyEvent event, int count) {
final ExtractEditText eet = mExtractEditText;
if (isFullscreenMode() && isInputViewShown() && eet != null) {
@@ -1516,7 +1467,6 @@ public class InputMethodService extends AbstractInputMethodService {
if (count == MOVEMENT_DOWN) {
if (movement.onKeyDown(eet,
(Spannable)eet.getText(), keyCode, event)) {
- reportExtractedMovement(keyCode, 1);
return true;
}
} else if (count == MOVEMENT_UP) {
@@ -1525,9 +1475,7 @@ public class InputMethodService extends AbstractInputMethodService {
return true;
}
} else {
- if (movement.onKeyOther(eet, (Spannable)eet.getText(), event)) {
- reportExtractedMovement(keyCode, count);
- } else {
+ if (!movement.onKeyOther(eet, (Spannable)eet.getText(), event)) {
KeyEvent down = new KeyEvent(event, KeyEvent.ACTION_DOWN);
if (movement.onKeyDown(eet,
(Spannable)eet.getText(), keyCode, down)) {
@@ -1540,7 +1488,6 @@ public class InputMethodService extends AbstractInputMethodService {
movement.onKeyUp(eet,
(Spannable)eet.getText(), keyCode, up);
}
- reportExtractedMovement(keyCode, count);
}
}
}
@@ -1560,97 +1507,6 @@ public class InputMethodService extends AbstractInputMethodService {
}
/**
- * Send the given key event code (as defined by {@link KeyEvent}) to the
- * current input connection is a key down + key up event pair. The sent
- * events have {@link KeyEvent#FLAG_SOFT_KEYBOARD KeyEvent.FLAG_SOFT_KEYBOARD}
- * set, so that the recipient can identify them as coming from a software
- * input method, and
- * {@link KeyEvent#FLAG_KEEP_TOUCH_MODE KeyEvent.FLAG_KEEP_TOUCH_MODE}, so
- * that they don't impact the current touch mode of the UI.
- *
- * @param keyEventCode The raw key code to send, as defined by
- * {@link KeyEvent}.
- */
- public void sendDownUpKeyEvents(int keyEventCode) {
- InputConnection ic = getCurrentInputConnection();
- if (ic == null) return;
- long eventTime = SystemClock.uptimeMillis();
- ic.sendKeyEvent(new KeyEvent(eventTime, eventTime,
- KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,
- KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
- ic.sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
- KeyEvent.ACTION_UP, keyEventCode, 0, 0, 0, 0,
- KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
- }
-
- /**
- * Ask the input target to execute its default action via
- * {@link InputConnection#performEditorAction
- * InputConnection.performEditorAction()}.
- *
- * @param fromEnterKey If true, this will be executed as if the user had
- * pressed an enter key on the keyboard, that is it will <em>not</em>
- * be done if the editor has set {@link EditorInfo#IME_FLAG_NO_ENTER_ACTION
- * EditorInfo.IME_FLAG_NO_ENTER_ACTION}. If false, the action will be
- * sent regardless of how the editor has set that flag.
- *
- * @return Returns a boolean indicating whether an action has been sent.
- * If false, either the editor did not specify a default action or it
- * does not want an action from the enter key. If true, the action was
- * sent (or there was no input connection at all).
- */
- public boolean sendDefaultEditorAction(boolean fromEnterKey) {
- EditorInfo ei = getCurrentInputEditorInfo();
- if (ei != null &&
- (!fromEnterKey || (ei.imeOptions &
- EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0) &&
- (ei.imeOptions & EditorInfo.IME_MASK_ACTION) !=
- EditorInfo.IME_ACTION_NONE) {
- // If the enter key was pressed, and the editor has a default
- // action associated with pressing enter, then send it that
- // explicit action instead of the key event.
- InputConnection ic = getCurrentInputConnection();
- if (ic != null) {
- ic.performEditorAction(ei.imeOptions&EditorInfo.IME_MASK_ACTION);
- }
- return true;
- }
-
- return false;
- }
-
- /**
- * Send the given UTF-16 character to the current input connection. Most
- * characters will be delivered simply by calling
- * {@link InputConnection#commitText InputConnection.commitText()} with
- * the character; some, however, may be handled different. In particular,
- * the enter character ('\n') will either be delivered as an action code
- * or a raw key event, as appropriate.
- *
- * @param charCode The UTF-16 character code to send.
- */
- public void sendKeyChar(char charCode) {
- switch (charCode) {
- case '\n': // Apps may be listening to an enter key to perform an action
- if (!sendDefaultEditorAction(true)) {
- sendDownUpKeyEvents(KeyEvent.KEYCODE_ENTER);
- }
- break;
- default:
- // Make sure that digits go through any text watcher on the client side.
- if (charCode >= '0' && charCode <= '9') {
- sendDownUpKeyEvents(charCode - '0' + KeyEvent.KEYCODE_0);
- } else {
- InputConnection ic = getCurrentInputConnection();
- if (ic != null) {
- ic.commitText(String.valueOf((char) charCode), 1);
- }
- }
- break;
- }
- }
-
- /**
* This is called when the user has moved the cursor in the extracted
* text view, when running in fullsreen mode. The default implementation
* performs the corresponding selection change on the underlying text
@@ -1666,36 +1522,11 @@ public class InputMethodService extends AbstractInputMethodService {
/**
* This is called when the user has clicked on the extracted text view,
* when running in fullscreen mode. The default implementation hides
- * the candidates view when this happens, but only if the extracted text
- * editor has a vertical scroll bar because its text doesn't fit.
- * Re-implement this to provide whatever behavior you want.
+ * the candidates view when this happens. Re-implement this to provide
+ * whatever behavior you want.
*/
public void onExtractedTextClicked() {
- if (mExtractEditText == null) {
- return;
- }
- if (mExtractEditText.hasVerticalScrollBar()) {
- setCandidatesViewShown(false);
- }
- }
-
- /**
- * This is called when the user has performed a cursor movement in the
- * extracted text view, when it is running in fullscreen mode. The default
- * implementation hides the candidates view when a vertical movement
- * happens, but only if the extracted text editor has a vertical scroll bar
- * because its text doesn't fit.
- * Re-implement this to provide whatever behavior you want.
- * @param dx The amount of cursor movement in the x dimension.
- * @param dy The amount of cursor movement in the y dimension.
- */
- public void onExtractedCursorMovement(int dx, int dy) {
- if (mExtractEditText == null || dy == 0) {
- return;
- }
- if (mExtractEditText.hasVerticalScrollBar()) {
- setCandidatesViewShown(false);
- }
+ setCandidatesViewShown(false);
}
/**
@@ -1714,74 +1545,7 @@ public class InputMethodService extends AbstractInputMethodService {
return true;
}
- /**
- * Return text that can be used as a button label for the given
- * {@link EditorInfo#imeOptions EditorInfo.imeOptions}. Returns null
- * if there is no action requested. Note that there is no guarantee that
- * the returned text will be relatively short, so you probably do not
- * want to use it as text on a soft keyboard key label.
- *
- * @param imeOptions The value from @link EditorInfo#imeOptions EditorInfo.imeOptions}.
- *
- * @return Returns a label to use, or null if there is no action.
- */
- public CharSequence getTextForImeAction(int imeOptions) {
- switch (imeOptions&EditorInfo.IME_MASK_ACTION) {
- case EditorInfo.IME_ACTION_NONE:
- return null;
- case EditorInfo.IME_ACTION_GO:
- return getText(com.android.internal.R.string.ime_action_go);
- case EditorInfo.IME_ACTION_SEARCH:
- return getText(com.android.internal.R.string.ime_action_search);
- case EditorInfo.IME_ACTION_SEND:
- return getText(com.android.internal.R.string.ime_action_send);
- case EditorInfo.IME_ACTION_NEXT:
- return getText(com.android.internal.R.string.ime_action_next);
- default:
- return getText(com.android.internal.R.string.ime_action_default);
- }
- }
-
- /**
- * Called when it is time to update the actions available from a full-screen
- * IME. You do not need to deal with this if you are using the standard
- * full screen extract UI. If replacing it, you will need to re-implement
- * this to put the action in your own UI and handle it.
- */
- public void onUpdateExtractingAccessories(EditorInfo ei) {
- if (mExtractAccessories == null) {
- return;
- }
- final boolean hasAction = ei.actionLabel != null || (
- (ei.imeOptions&EditorInfo.IME_MASK_ACTION) != EditorInfo.IME_ACTION_NONE &&
- (ei.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0);
- if (hasAction) {
- mExtractAccessories.setVisibility(View.VISIBLE);
- if (ei.actionLabel != null) {
- mExtractAction.setText(ei.actionLabel);
- } else {
- mExtractAction.setText(getTextForImeAction(ei.imeOptions));
- }
- mExtractAction.setOnClickListener(mActionClickListener);
- } else {
- mExtractAccessories.setVisibility(View.GONE);
- mExtractAction.setOnClickListener(null);
- }
- }
-
- /**
- * This is called when, while currently displayed in extract mode, the
- * current input target changes. The default implementation will
- * auto-hide the IME if the new target is not a full editor, since this
- * can be an confusing experience for the user.
- */
- public void onExtractingInputChanged(EditorInfo ei) {
- if (ei.inputType == InputType.TYPE_NULL) {
- dismissSoftInput(InputMethodManager.HIDE_NOT_ALWAYS);
- }
- }
-
- void startExtractingText(boolean inputChanged) {
+ void startExtractingText() {
final ExtractEditText eet = mExtractEditText;
if (eet != null && getCurrentInputStarted()
&& isFullscreenMode()) {
@@ -1793,13 +1557,9 @@ public class InputMethodService extends AbstractInputMethodService {
req.hintMaxChars = 10000;
mExtractedText = getCurrentInputConnection().getExtractedText(req,
InputConnection.GET_EXTRACTED_TEXT_MONITOR);
-
- final EditorInfo ei = getCurrentInputEditorInfo();
-
try {
eet.startInternalChanges();
- onUpdateExtractingAccessories(ei);
- int inputType = ei.inputType;
+ int inputType = getCurrentInputEditorInfo().inputType;
if ((inputType&EditorInfo.TYPE_MASK_CLASS)
== EditorInfo.TYPE_CLASS_TEXT) {
if ((inputType&EditorInfo.TYPE_TEXT_FLAG_IME_MULTI_LINE) != 0) {
@@ -1807,7 +1567,7 @@ public class InputMethodService extends AbstractInputMethodService {
}
}
eet.setInputType(inputType);
- eet.setHint(ei.hintText);
+ eet.setHint(mInputEditorInfo.hintText);
if (mExtractedText != null) {
eet.setEnabled(true);
eet.setExtractedText(mExtractedText);
@@ -1818,10 +1578,6 @@ public class InputMethodService extends AbstractInputMethodService {
} finally {
eet.finishInternalChanges();
}
-
- if (inputChanged) {
- onExtractingInputChanged(ei);
- }
}
}
diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java
index c838779..886e688 100755
--- a/core/java/android/inputmethodservice/KeyboardView.java
+++ b/core/java/android/inputmethodservice/KeyboardView.java
@@ -74,6 +74,7 @@ public class KeyboardView extends View implements View.OnClickListener {
* For keys that repeat, this is only called once.
* @param primaryCode the unicode of the key being pressed. If the touch is not on a valid
* key, the value will be zero.
+ * @hide Pending API Council approval
*/
void onPress(int primaryCode);
@@ -81,6 +82,7 @@ public class KeyboardView extends View implements View.OnClickListener {
* Called when the user releases a key. This is sent after the {@link #onKey} is called.
* For keys that repeat, this is only called once.
* @param primaryCode the code of the key that was released
+ * @hide Pending API Council approval
*/
void onRelease(int primaryCode);
@@ -97,12 +99,6 @@ public class KeyboardView extends View implements View.OnClickListener {
void onKey(int primaryCode, int[] keyCodes);
/**
- * Sends a sequence of characters to the listener.
- * @param text the sequence of characters to be displayed.
- */
- void onText(CharSequence text);
-
- /**
* Called when the user quickly moves the finger from right to left.
*/
void swipeLeft();
@@ -398,7 +394,6 @@ public class KeyboardView extends View implements View.OnClickListener {
requestLayout();
invalidate();
computeProximityThreshold(keyboard);
- mMiniKeyboardCache.clear(); // Not really necessary to do every time, but will free up views
}
/**
@@ -704,7 +699,9 @@ public class KeyboardView extends View implements View.OnClickListener {
if (index != NOT_A_KEY && index < mKeys.length) {
final Key key = mKeys[index];
if (key.text != null) {
- mKeyboardActionListener.onText(key.text);
+ for (int i = 0; i < key.text.length(); i++) {
+ mKeyboardActionListener.onKey(key.text.charAt(i), key.codes);
+ }
mKeyboardActionListener.onRelease(NOT_A_KEY);
} else {
int code = key.codes[0];
@@ -795,7 +792,7 @@ public class KeyboardView extends View implements View.OnClickListener {
mPreviewText.setCompoundDrawables(null, null, null, null);
mPreviewText.setText(getPreviewText(key));
if (key.label.length() > 1 && key.codes.length < 2) {
- mPreviewText.setTextSize(mKeyTextSize);
+ mPreviewText.setTextSize(mLabelTextSize);
mPreviewText.setTypeface(Typeface.DEFAULT_BOLD);
} else {
mPreviewText.setTextSize(mPreviewTextSizeLarge);
@@ -899,11 +896,6 @@ public class KeyboardView extends View implements View.OnClickListener {
dismissPopupKeyboard();
}
- public void onText(CharSequence text) {
- mKeyboardActionListener.onText(text);
- dismissPopupKeyboard();
- }
-
public void swipeLeft() { }
public void swipeRight() { }
public void swipeUp() { }
@@ -1110,8 +1102,6 @@ public class KeyboardView extends View implements View.OnClickListener {
mHandler.removeMessages(MSG_SHOW_PREVIEW);
dismissPopupKeyboard();
-
- mMiniKeyboardCache.clear();
}
@Override