Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
index 6dc6d70a9b190bf542cd3fb18e348096fe785304..e3b9b5bcd28e2e93ba69abedc2c772958e8a669b 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
@@ -487,7 +487,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
private ImeAdapter mImeAdapter; |
private ImeAdapter.AdapterInputConnectionFactory mAdapterInputConnectionFactory; |
private AdapterInputConnection mInputConnection; |
- private InputMethodManagerWrapper mInputMethodManagerWrapper; |
// Lazily created paste popup menu, triggered either via long press in an |
// editable region or from tapping the insertion handle. |
@@ -631,10 +630,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
*/ |
public ContentViewCore(Context context) { |
mContext = context; |
- |
mAdapterInputConnectionFactory = new AdapterInputConnectionFactory(); |
- mInputMethodManagerWrapper = new InputMethodManagerWrapper(mContext); |
- |
mRenderCoordinates = new RenderCoordinates(); |
mJoystickScrollProvider = new JoystickScrollProvider(this); |
float deviceScaleFactor = getContext().getResources().getDisplayMetrics().density; |
@@ -653,7 +649,8 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
mEditable = Editable.Factory.getInstance().newEditable(""); |
Selection.setSelection(mEditable, 0); |
mContainerViewObservers = new ObserverList<ContainerViewObserver>(); |
- mCurrentConfig = getContext().getResources().getConfiguration(); |
+ // Deep copy newConfig so that we can notice the difference. |
+ mCurrentConfig = new Configuration(getContext().getResources().getConfiguration()); |
} |
/** |
@@ -737,17 +734,12 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
} |
@VisibleForTesting |
- public void setInputMethodManagerWrapperForTest(InputMethodManagerWrapper immw) { |
- mInputMethodManagerWrapper = immw; |
- } |
- |
- @VisibleForTesting |
public AdapterInputConnection getInputConnectionForTest() { |
return mInputConnection; |
} |
private ImeAdapter createImeAdapter() { |
- return new ImeAdapter(mInputMethodManagerWrapper, |
+ return new ImeAdapter(new InputMethodManagerWrapper(mContext), |
new ImeAdapter.ImeAdapterDelegate() { |
@Override |
public void onImeEvent() { |
@@ -1553,6 +1545,18 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
* @see View#onCreateInputConnection(EditorInfo) |
*/ |
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { |
+ // Android View framework will check whether the user can compose text by calling this |
+ // function at view attachment. Especially in the case of hardware keyboard, connection can |
+ // be made regardless of whether we have called showSoftInput(), and therefore we need |
+ // to check the availability ourselves here. |
+ // If we return null here, hardware keyboard will not be connected through input connection, |
+ // but key events will go through View#dispatchKeyEvent(), and the user won't get any |
+ // recommendation from text composition, which is what we expect. |
+ if (!mImeAdapter.canCreateInputConnection()) { |
+ mInputConnection = null; |
+ return null; |
+ } |
+ |
if (!mImeAdapter.hasTextInputType()) { |
// Although onCheckIsTextEditor will return false in this case, the EditorInfo |
// is still used by the InputMethodService. Need to make sure the IME doesn't |
@@ -1592,21 +1596,17 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
if (mCurrentConfig.keyboard != newConfig.keyboard |
|| mCurrentConfig.keyboardHidden != newConfig.keyboardHidden |
|| mCurrentConfig.hardKeyboardHidden != newConfig.hardKeyboardHidden) { |
- if (mNativeContentViewCore != 0) { |
- mImeAdapter.attach(nativeGetNativeImeAdapter(mNativeContentViewCore)); |
- } |
- mInputMethodManagerWrapper.restartInput(mContainerView); |
- // By default, we show soft keyboard on keyboard changes. This is useful |
- // when the user transitions from hardware keyboard to software keyboard. |
- mImeAdapter.showSoftKeyboard(); |
+ mImeAdapter.onKeyboardConfigurationChanged(); |
} |
+ // Deep copy newConfig so that we can notice the difference. |
+ mCurrentConfig = new Configuration(newConfig); |
+ |
mContainerViewInternals.super_onConfigurationChanged(newConfig); |
// To request layout has side effect, but it seems OK as it only happen in |
// onConfigurationChange and layout has to be changed in most case. |
mContainerView.requestLayout(); |
} finally { |
- mCurrentConfig = newConfig; |
TraceEvent.end("ContentViewCore.onConfigurationChanged"); |
} |
} |
@@ -1683,10 +1683,11 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
} |
public void onFocusChanged(boolean gainFocus) { |
+ mImeAdapter.onViewFocusChanged(gainFocus); |
+ |
if (gainFocus) { |
restoreSelectionPopupsIfNecessary(); |
} else { |
- hideImeIfNeeded(); |
cancelRequestToScrollFocusedEditableNodeIntoView(); |
if (mPreserveSelectionOnNextLossOfFocus) { |
mPreserveSelectionOnNextLossOfFocus = false; |
@@ -2394,20 +2395,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
nativeSetTextHandlesTemporarilyHidden(mNativeContentViewCore, hide); |
} |
- /** |
- * Hides the IME if the containerView is the active view for IME. |
- */ |
- public void hideImeIfNeeded() { |
- // Hide input method window from the current view synchronously |
- // because ImeAdapter does so asynchronouly with a delay, and |
- // by the time when ImeAdapter dismisses the input, the |
- // containerView may have lost focus. |
- if (mInputMethodManagerWrapper.isActive(mContainerView)) { |
- mInputMethodManagerWrapper.hideSoftInputFromWindow( |
- mContainerView.getWindowToken(), 0, null); |
- } |
- } |
- |
@SuppressWarnings("unused") |
@CalledByNative |
private void updateFrameInfo( |