From f44a01b40852dde2363a061cdc7df2ef4cb59aad Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Mon, 29 Aug 2011 17:02:52 +0900
Subject: [PATCH] Make PopupPanel decoupled with LatinKeyboardView and Keyboard

Bug: 5023981
Change-Id: Ib4fd55d52718aa244178ca2313f5e8487378324f
---
 .../keyboard/LatinKeyboardView.java           | 11 +++-
 .../inputmethod/keyboard/PointerTracker.java  |  3 +-
 .../keyboard/PopupMiniKeyboardView.java       | 59 +++++++++----------
 .../inputmethod/keyboard/PopupPanel.java      | 19 ++++--
 4 files changed, 54 insertions(+), 38 deletions(-)

diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index be04b5a525..b7aa82bc99 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 d33cb442bf..83bab67bab 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 c3b5825f5c..8b8b27b39c 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;
+    public void setShifted(boolean shifted) {
+        final MiniKeyboard miniKeyboard = (MiniKeyboard)getKeyboard();
+        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();
-        final Keyboard parentKeyboard = parentKeyboardView.getKeyboard();
 
-        parentKeyboardView.getLocationInWindow(mCoordinates);
-        final int pointX = (mConfigShowMiniKeyboardAtTouchedPoint) ? tracker.getLastX()
-                : parentKey.mX + parentKey.mWidth / 2;
-        final int pointY = parentKey.mY;
+        parentView.getLocationInWindow(mCoordinates);
         final int miniKeyboardLeft = pointX - miniKeyboard.getDefaultCoordX()
-                + parentKeyboardView.getPaddingLeft();
+                + parentView.getPaddingLeft();
         final int x = wrapUp(Math.max(0, Math.min(miniKeyboardLeft,
-                parentKeyboardView.getWidth() - miniKeyboard.mOccupiedWidth))
+                parentView.getWidth() - miniKeyboard.mOccupiedWidth))
                 - container.getPaddingLeft() + mCoordinates[0],
-                container.getMeasuredWidth(), 0, parentKeyboardView.getWidth());
-        final int y = pointY - parentKeyboard.mVerticalGap
+                container.getMeasuredWidth(), 0, parentView.getWidth());
+        final int y = pointY
                 - (container.getMeasuredHeight() - container.getPaddingBottom())
-                + parentKeyboardView.getPaddingTop() + mCoordinates[1];
+                + parentView.getPaddingTop() + mCoordinates[1];
 
-        if (miniKeyboard.setShifted(parentKeyboard.isShiftedOrShiftLocked())) {
-            invalidateAllKeys();
-        }
         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 db637c50b4..5e51fd54a3 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.
-- 
GitLab