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