Home | History | Annotate | Download | only in keyboard
      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 
     17 package com.android.inputmethod.keyboard;
     18 
     19 import android.content.Context;
     20 import android.content.res.Resources;
     21 import android.util.AttributeSet;
     22 import android.view.Gravity;
     23 import android.view.View;
     24 import android.widget.PopupWindow;
     25 
     26 import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
     27 import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
     28 import 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  */
     34 public 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             // Because a more keys keyboard doesn't need proximity characters correction, we don't
     51             // send touch event coordinates.
     52             mListener.onCodeInput(primaryCode, NOT_A_TOUCH_COORDINATE, NOT_A_TOUCH_COORDINATE);
     53         }
     54 
     55         @Override
     56         public void onTextInput(CharSequence text) {
     57             mListener.onTextInput(text);
     58         }
     59 
     60         @Override
     61         public void onCancelInput() {
     62             mListener.onCancelInput();
     63         }
     64 
     65         @Override
     66         public void onPressKey(int primaryCode) {
     67             mListener.onPressKey(primaryCode);
     68         }
     69 
     70         @Override
     71         public void onReleaseKey(int primaryCode, boolean withSliding) {
     72             mListener.onReleaseKey(primaryCode, withSliding);
     73         }
     74     };
     75 
     76     public MoreKeysKeyboardView(Context context, AttributeSet attrs) {
     77         this(context, attrs, R.attr.moreKeysKeyboardViewStyle);
     78     }
     79 
     80     public MoreKeysKeyboardView(Context context, AttributeSet attrs, int defStyle) {
     81         super(context, attrs, defStyle);
     82 
     83         final Resources res = context.getResources();
     84         mKeyDetector = new MoreKeysDetector(
     85                 res.getDimension(R.dimen.more_keys_keyboard_slide_allowance));
     86         setKeyPreviewPopupEnabled(false, 0);
     87     }
     88 
     89     @Override
     90     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     91         final Keyboard keyboard = getKeyboard();
     92         if (keyboard != null) {
     93             final int width = keyboard.mOccupiedWidth + getPaddingLeft() + getPaddingRight();
     94             final int height = keyboard.mOccupiedHeight + getPaddingTop() + getPaddingBottom();
     95             setMeasuredDimension(width, height);
     96         } else {
     97             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     98         }
     99     }
    100 
    101     @Override
    102     public void setKeyboard(Keyboard keyboard) {
    103         super.setKeyboard(keyboard);
    104         mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
    105                 -getPaddingTop() + mVerticalCorrection);
    106     }
    107 
    108     @Override
    109     public KeyDetector getKeyDetector() {
    110         return mKeyDetector;
    111     }
    112 
    113     @Override
    114     public KeyboardActionListener getKeyboardActionListener() {
    115         return mMoreKeysKeyboardListener;
    116     }
    117 
    118     @Override
    119     public DrawingProxy getDrawingProxy() {
    120         return this;
    121     }
    122 
    123     @Override
    124     public TimerProxy getTimerProxy() {
    125         return EMPTY_TIMER_PROXY;
    126     }
    127 
    128     @Override
    129     public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
    130         // More keys keyboard needs no pop-up key preview displayed, so we pass always false with a
    131         // delay of 0. The delay does not matter actually since the popup is not shown anyway.
    132         super.setKeyPreviewPopupEnabled(false, 0);
    133     }
    134 
    135     @Override
    136     public void showMoreKeysPanel(View parentView, Controller controller, int pointX, int pointY,
    137             PopupWindow window, KeyboardActionListener listener) {
    138         mController = controller;
    139         mListener = listener;
    140         final View container = (View)getParent();
    141         final MoreKeysKeyboard pane = (MoreKeysKeyboard)getKeyboard();
    142         final int defaultCoordX = pane.getDefaultCoordX();
    143         // The coordinates of panel's left-top corner in parentView's coordinate system.
    144         final int x = pointX - defaultCoordX - container.getPaddingLeft();
    145         final int y = pointY - container.getMeasuredHeight() + container.getPaddingBottom();
    146 
    147         window.setContentView(container);
    148         window.setWidth(container.getMeasuredWidth());
    149         window.setHeight(container.getMeasuredHeight());
    150         parentView.getLocationInWindow(mCoordinates);
    151         window.showAtLocation(parentView, Gravity.NO_GRAVITY,
    152                 x + mCoordinates[0], y + mCoordinates[1]);
    153 
    154         mOriginX = x + container.getPaddingLeft();
    155         mOriginY = y + container.getPaddingTop();
    156     }
    157 
    158     private boolean mIsDismissing;
    159 
    160     @Override
    161     public boolean dismissMoreKeysPanel() {
    162         if (mIsDismissing || mController == null) return false;
    163         mIsDismissing = true;
    164         final boolean dismissed = mController.dismissMoreKeysPanel();
    165         mIsDismissing = false;
    166         return dismissed;
    167     }
    168 
    169     @Override
    170     public int translateX(int x) {
    171         return x - mOriginX;
    172     }
    173 
    174     @Override
    175     public int translateY(int y) {
    176         return y - mOriginY;
    177     }
    178 }
    179