Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f44a01b4 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Make PopupPanel decoupled with LatinKeyboardView and Keyboard

Bug: 5023981
Change-Id: Ib4fd55d52718aa244178ca2313f5e8487378324f
parent 1f891474
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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);
+1 −2
Original line number Diff line number Diff line
@@ -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 {
+29 −30
Original line number Diff line number Diff line
@@ -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
+14 −5
Original line number Diff line number Diff line
@@ -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.