diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java index be04b5a52..b7aa82bc9 100644 --- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java @@ -81,6 +81,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke private int mOldPointerCount = 1; private int mOldKeyIndex; + private final boolean mConfigShowMiniKeyboardAtTouchedPoint; protected KeyDetector mKeyDetector; // To detect double tap. @@ -225,6 +226,8 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke a.recycle(); final Resources res = getResources(); + mConfigShowMiniKeyboardAtTouchedPoint = res.getBoolean( + R.bool.config_show_mini_keyboard_at_touched_point); final float keyHysteresisDistance = res.getDimension(R.dimen.key_hysteresis_distance); mKeyDetector = new KeyDetector(keyHysteresisDistance); @@ -459,7 +462,13 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke mPopupPanel = popupPanel; mPopupPanelPointerTrackerId = tracker.mPointerId; - popupPanel.showPopupPanel(this, parentKey, tracker, mPopupWindow); + final Keyboard keyboard = getKeyboard(); + mPopupPanel.setShifted(keyboard.isShiftedOrShiftLocked()); + final int pointX = (mConfigShowMiniKeyboardAtTouchedPoint) ? tracker.getLastX() + : parentKey.mX + parentKey.mWidth / 2; + final int pointY = parentKey.mY - keyboard.mVerticalGap; + popupPanel.showPopupPanel( + this, this, pointX, pointY, mPopupWindow, getKeyboardActionListener()); final int translatedX = popupPanel.translateX(tracker.getLastX()); final int translatedY = popupPanel.translateY(tracker.getLastY()); tracker.onShowPopupPanel(translatedX, translatedY, SystemClock.uptimeMillis(), popupPanel); diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index d33cb442b..83bab67ba 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -63,13 +63,12 @@ public class PointerTracker { public TimerProxy getTimerProxy(); } - public interface DrawingProxy { + public interface DrawingProxy extends PopupPanel.Controller { public void invalidateKey(Key key); public TextView inflateKeyPreviewText(); public void showKeyPreview(int keyIndex, PointerTracker tracker); public void cancelShowKeyPreview(PointerTracker tracker); public void dismissKeyPreview(PointerTracker tracker); - public boolean dismissPopupPanel(); } public interface TimerProxy { diff --git a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java index c3b5825f5..8b8b27b39 100644 --- a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java @@ -36,12 +36,12 @@ import java.util.List; */ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { private final int[] mCoordinates = new int[2]; - private final boolean mConfigShowMiniKeyboardAtTouchedPoint; private final KeyDetector mKeyDetector; private final int mVerticalCorrection; - private LatinKeyboardView mParentKeyboardView; + private Controller mController; + private KeyboardActionListener mListener; private int mOriginX; private int mOriginY; @@ -101,30 +101,29 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { public void cancelKeyTimers() {} }; - private final KeyboardActionListener mListner = new KeyboardActionListener() { + private final KeyboardActionListener mMiniKeyboardListener = new KeyboardActionListener() { @Override public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) { - mParentKeyboardView.getKeyboardActionListener() - .onCodeInput(primaryCode, keyCodes, x, y); + mListener.onCodeInput(primaryCode, keyCodes, x, y); } @Override public void onTextInput(CharSequence text) { - mParentKeyboardView.getKeyboardActionListener().onTextInput(text); + mListener.onTextInput(text); } @Override public void onCancelInput() { - mParentKeyboardView.getKeyboardActionListener().onCancelInput(); + mListener.onCancelInput(); } @Override public void onPress(int primaryCode, boolean withSliding) { - mParentKeyboardView.getKeyboardActionListener().onPress(primaryCode, withSliding); + mListener.onPress(primaryCode, withSliding); } @Override public void onRelease(int primaryCode, boolean withSliding) { - mParentKeyboardView.getKeyboardActionListener().onRelease(primaryCode, withSliding); + mListener.onRelease(primaryCode, withSliding); } @Override public boolean onCustomRequest(int requestCode) { return false; } @@ -144,8 +143,6 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { a.recycle(); final Resources res = context.getResources(); - mConfigShowMiniKeyboardAtTouchedPoint = res.getBoolean( - R.bool.config_show_mini_keyboard_at_touched_point); // Override default ProximityKeyDetector. mKeyDetector = new MiniKeyboardKeyDetector(res.getDimension( R.dimen.mini_keyboard_slide_allowance)); @@ -179,7 +176,7 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { @Override public KeyboardActionListener getKeyboardActionListener() { - return mListner; + return mMiniKeyboardListener; } @Override @@ -200,34 +197,36 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { } @Override - public void showPopupPanel(LatinKeyboardView parentKeyboardView, Key parentKey, - PointerTracker tracker, PopupWindow window) { - mParentKeyboardView = parentKeyboardView; - final View container = (View)getParent(); + public void setShifted(boolean shifted) { final MiniKeyboard miniKeyboard = (MiniKeyboard)getKeyboard(); - final Keyboard parentKeyboard = parentKeyboardView.getKeyboard(); - - parentKeyboardView.getLocationInWindow(mCoordinates); - final int pointX = (mConfigShowMiniKeyboardAtTouchedPoint) ? tracker.getLastX() - : parentKey.mX + parentKey.mWidth / 2; - final int pointY = parentKey.mY; - final int miniKeyboardLeft = pointX - miniKeyboard.getDefaultCoordX() - + parentKeyboardView.getPaddingLeft(); - final int x = wrapUp(Math.max(0, Math.min(miniKeyboardLeft, - parentKeyboardView.getWidth() - miniKeyboard.mOccupiedWidth)) - - container.getPaddingLeft() + mCoordinates[0], - container.getMeasuredWidth(), 0, parentKeyboardView.getWidth()); - final int y = pointY - parentKeyboard.mVerticalGap - - (container.getMeasuredHeight() - container.getPaddingBottom()) - + parentKeyboardView.getPaddingTop() + mCoordinates[1]; - - if (miniKeyboard.setShifted(parentKeyboard.isShiftedOrShiftLocked())) { + if (miniKeyboard.setShifted(shifted)) { invalidateAllKeys(); } + } + + @Override + public void showPopupPanel(View parentView, Controller controller, int pointX, int pointY, + PopupWindow window, KeyboardActionListener listener) { + mController = controller; + mListener = listener; + final View container = (View)getParent(); + final MiniKeyboard miniKeyboard = (MiniKeyboard)getKeyboard(); + + parentView.getLocationInWindow(mCoordinates); + final int miniKeyboardLeft = pointX - miniKeyboard.getDefaultCoordX() + + parentView.getPaddingLeft(); + final int x = wrapUp(Math.max(0, Math.min(miniKeyboardLeft, + parentView.getWidth() - miniKeyboard.mOccupiedWidth)) + - container.getPaddingLeft() + mCoordinates[0], + container.getMeasuredWidth(), 0, parentView.getWidth()); + final int y = pointY + - (container.getMeasuredHeight() - container.getPaddingBottom()) + + parentView.getPaddingTop() + mCoordinates[1]; + window.setContentView(container); window.setWidth(container.getMeasuredWidth()); window.setHeight(container.getMeasuredHeight()); - window.showAtLocation(parentKeyboardView, Gravity.NO_GRAVITY, x, y); + window.showAtLocation(parentView, Gravity.NO_GRAVITY, x, y); mOriginX = x + container.getPaddingLeft() - mCoordinates[0]; mOriginY = y + container.getPaddingTop() - mCoordinates[1]; @@ -243,7 +242,7 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { @Override public boolean dismissPopupPanel() { - return mParentKeyboardView.dismissPopupPanel(); + return mController.dismissPopupPanel(); } @Override diff --git a/java/src/com/android/inputmethod/keyboard/PopupPanel.java b/java/src/com/android/inputmethod/keyboard/PopupPanel.java index db637c50b..5e51fd54a 100644 --- a/java/src/com/android/inputmethod/keyboard/PopupPanel.java +++ b/java/src/com/android/inputmethod/keyboard/PopupPanel.java @@ -16,18 +16,27 @@ package com.android.inputmethod.keyboard; +import android.view.View; import android.widget.PopupWindow; public interface PopupPanel extends PointerTracker.KeyEventHandler { + public interface Controller { + public boolean dismissPopupPanel(); + } + + public void setShifted(boolean shifted); + /** * Show popup panel. - * @param parentKeyboardView the parent KeyboardView that has the parent key. - * @param parentKey the parent key that is the source of this popup panel - * @param tracker the pointer tracker that pressesd the parent key + * @param parentView the parent view of this popup panel + * @param controller the controller that can dismiss this popup panel + * @param pointX x coordinate of this popup panel + * @param pointY y coordinate of this popup panel * @param window PopupWindow to be used to show this popup panel + * @param listener the listener that will receive keyboard action from this popup panel. */ - public void showPopupPanel(LatinKeyboardView parentKeyboardView, Key parentKey, - PointerTracker tracker, PopupWindow window); + public void showPopupPanel(View parentView, Controller controller, int pointX, int pointY, + PopupWindow window, KeyboardActionListener listener); /** * Translate X-coordinate of touch event to the local X-coordinate of this PopupPanel.