MoreKeysKeyboardView.java revision ca7ec2097ca6af1505c1e6aa8b81b6068ba46dae
1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.inputmethod.keyboard;
18
19import android.content.Context;
20import android.content.res.Resources;
21import android.util.AttributeSet;
22import android.view.Gravity;
23import android.view.View;
24import android.widget.PopupWindow;
25
26import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
27import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
28import com.android.inputmethod.latin.R;
29
30/**
31 * A view that renders a virtual {@link MoreKeysKeyboard}. It handles rendering of keys and
32 * detecting key presses and touch movements.
33 */
34public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel {
35    private final int[] mCoordinates = new int[2];
36
37    private final KeyDetector mKeyDetector;
38
39    private Controller mController;
40    private KeyboardActionListener mListener;
41    private int mOriginX;
42    private int mOriginY;
43
44    private static final TimerProxy EMPTY_TIMER_PROXY = new TimerProxy.Adapter();
45
46    private final KeyboardActionListener mMoreKeysKeyboardListener =
47            new KeyboardActionListener.Adapter() {
48        @Override
49        public void onCodeInput(int primaryCode, int x, int y) {
50            mListener.onCodeInput(primaryCode, x, y);
51        }
52
53        @Override
54        public void onTextInput(CharSequence text) {
55            mListener.onTextInput(text);
56        }
57
58        @Override
59        public void onCancelInput() {
60            mListener.onCancelInput();
61        }
62
63        @Override
64        public void onPressKey(int primaryCode) {
65            mListener.onPressKey(primaryCode);
66        }
67
68        @Override
69        public void onReleaseKey(int primaryCode, boolean withSliding) {
70            mListener.onReleaseKey(primaryCode, withSliding);
71        }
72    };
73
74    public MoreKeysKeyboardView(Context context, AttributeSet attrs) {
75        this(context, attrs, R.attr.moreKeysKeyboardViewStyle);
76    }
77
78    public MoreKeysKeyboardView(Context context, AttributeSet attrs, int defStyle) {
79        super(context, attrs, defStyle);
80
81        final Resources res = context.getResources();
82        mKeyDetector = new MoreKeysDetector(
83                res.getDimension(R.dimen.more_keys_keyboard_slide_allowance));
84        setKeyPreviewPopupEnabled(false, 0);
85    }
86
87    @Override
88    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
89        final Keyboard keyboard = getKeyboard();
90        if (keyboard != null) {
91            final int width = keyboard.mOccupiedWidth + getPaddingLeft() + getPaddingRight();
92            final int height = keyboard.mOccupiedHeight + getPaddingTop() + getPaddingBottom();
93            setMeasuredDimension(width, height);
94        } else {
95            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
96        }
97    }
98
99    @Override
100    public void setKeyboard(Keyboard keyboard) {
101        super.setKeyboard(keyboard);
102        mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
103                -getPaddingTop() + mVerticalCorrection);
104    }
105
106    @Override
107    public KeyDetector getKeyDetector() {
108        return mKeyDetector;
109    }
110
111    @Override
112    public KeyboardActionListener getKeyboardActionListener() {
113        return mMoreKeysKeyboardListener;
114    }
115
116    @Override
117    public DrawingProxy getDrawingProxy() {
118        return this;
119    }
120
121    @Override
122    public TimerProxy getTimerProxy() {
123        return EMPTY_TIMER_PROXY;
124    }
125
126    @Override
127    public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
128        // More keys keyboard needs no pop-up key preview displayed, so we pass always false with a
129        // delay of 0. The delay does not matter actually since the popup is not shown anyway.
130        super.setKeyPreviewPopupEnabled(false, 0);
131    }
132
133    @Override
134    public void showMoreKeysPanel(View parentView, Controller controller, int pointX, int pointY,
135            PopupWindow window, KeyboardActionListener listener) {
136        mController = controller;
137        mListener = listener;
138        final View container = (View)getParent();
139        final MoreKeysKeyboard moreKeysKeyboard = (MoreKeysKeyboard)getKeyboard();
140
141        parentView.getLocationInWindow(mCoordinates);
142        final int moreKeysKeyboardLeft = pointX - moreKeysKeyboard.getDefaultCoordX()
143                + parentView.getPaddingLeft();
144        final int x = wrapUp(Math.max(0, Math.min(moreKeysKeyboardLeft,
145                parentView.getWidth() - moreKeysKeyboard.mOccupiedWidth))
146                - container.getPaddingLeft() + mCoordinates[0],
147                container.getMeasuredWidth(), 0, parentView.getWidth());
148        final int y = pointY
149                - (container.getMeasuredHeight() - container.getPaddingBottom())
150                + parentView.getPaddingTop() + mCoordinates[1];
151
152        window.setContentView(container);
153        window.setWidth(container.getMeasuredWidth());
154        window.setHeight(container.getMeasuredHeight());
155        window.showAtLocation(parentView, Gravity.NO_GRAVITY, x, y);
156
157        mOriginX = x + container.getPaddingLeft() - mCoordinates[0];
158        mOriginY = y + container.getPaddingTop() - mCoordinates[1];
159    }
160
161    private static int wrapUp(int x, int width, int left, int right) {
162        if (x < left)
163            return left;
164        if (x + width > right)
165            return right - width;
166        return x;
167    }
168
169    private boolean mIsDismissing;
170
171    @Override
172    public boolean dismissMoreKeysPanel() {
173        if (mIsDismissing) return false;
174        mIsDismissing = true;
175        final boolean dismissed = mController.dismissMoreKeysPanel();
176        mIsDismissing = false;
177        return dismissed;
178    }
179
180    @Override
181    public int translateX(int x) {
182        return x - mOriginX;
183    }
184
185    @Override
186    public int translateY(int y) {
187        return y - mOriginY;
188    }
189}
190