MoreKeysKeyboardView.java revision 33482a9b9ccf605c63fab7c9b8273a240bbc2035
1ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka/* 2ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * Copyright (C) 2011 The Android Open Source Project 3ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * 4ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 5ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * you may not use this file except in compliance with the License. 6ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * You may obtain a copy of the License at 7ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * 8ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 9ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * 10ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 11ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 12ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * See the License for the specific language governing permissions and 14ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka * limitations under the License. 15ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka */ 16ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 17ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaokapackage com.android.inputmethod.keyboard; 18ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 19ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaokaimport android.content.Context; 20ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaokaimport android.content.res.Resources; 21ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaokaimport android.util.AttributeSet; 2235580bad6f3da3b204653825bbb6871563e70728Tom Ouyangimport android.view.MotionEvent; 23ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaokaimport android.view.View; 24ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 25ac78633be28e8990fc3b3a8de192c80966e746e3Tadashi G. Takaokaimport com.android.inputmethod.latin.Constants; 26e07b51e7c65220ac183546103010dd617d164f60Tadashi G. Takaokaimport com.android.inputmethod.latin.R; 27e28eba5074664d5716b8e58b8d0a235746b261ebKen Wakasaimport com.android.inputmethod.latin.utils.CoordinateUtils; 28e07b51e7c65220ac183546103010dd617d164f60Tadashi G. Takaoka 29ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka/** 302affaf91a04d63e0994102299816014a8bbe11e1Tadashi G. Takaoka * A view that renders a virtual {@link MoreKeysKeyboard}. It handles rendering of keys and 312affaf91a04d63e0994102299816014a8bbe11e1Tadashi G. Takaoka * detecting key presses and touch movements. 32ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka */ 3335580bad6f3da3b204653825bbb6871563e70728Tom Ouyangpublic class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel { 34359c35e0f6e534d096efc1d9f2ff585139e3b3acTadashi G. Takaoka private final int[] mCoordinates = CoordinateUtils.newInstance(); 35ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 3651c38a441a09a4920703e765cb26179e7a80f029Tadashi G. Takaoka protected final KeyDetector mKeyDetector; 3709e4530ca75d4664eb72708face83b466839c522Tadashi G. Takaoka private Controller mController = EMPTY_CONTROLLER; 3835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang protected KeyboardActionListener mListener; 39ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka private int mOriginX; 40ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka private int mOriginY; 4135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang private Key mCurrentKey; 4263c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka 4335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang private int mActivePointerId; 44ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 45bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka public MoreKeysKeyboardView(final Context context, final AttributeSet attrs) { 462affaf91a04d63e0994102299816014a8bbe11e1Tadashi G. Takaoka this(context, attrs, R.attr.moreKeysKeyboardViewStyle); 47ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka } 48ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 49bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka public MoreKeysKeyboardView(final Context context, final AttributeSet attrs, 50bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka final int defStyle) { 51ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka super(context, attrs, defStyle); 52ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 53ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka final Resources res = context.getResources(); 5450e1073e11240fe51b3baf0e2ed80dac0d9f001dTadashi G. Takaoka mKeyDetector = new MoreKeysDetector( 552affaf91a04d63e0994102299816014a8bbe11e1Tadashi G. Takaoka res.getDimension(R.dimen.more_keys_keyboard_slide_allowance)); 56ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka } 57ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 58ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka @Override 59bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 6038f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka final Keyboard keyboard = getKeyboard(); 6138f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka if (keyboard != null) { 628da9a13760896cd78235b60d0ea680ea13620532Tadashi G. Takaoka final int width = keyboard.mOccupiedWidth + getPaddingLeft() + getPaddingRight(); 638da9a13760896cd78235b60d0ea680ea13620532Tadashi G. Takaoka final int height = keyboard.mOccupiedHeight + getPaddingTop() + getPaddingBottom(); 6438f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka setMeasuredDimension(width, height); 6538f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka } else { 6638f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka super.onMeasure(widthMeasureSpec, heightMeasureSpec); 6738f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka } 6838f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka } 6938f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka 7038f55b36c3992a580cf7e20668b1eb72a4eb2431Tadashi G. Takaoka @Override 71bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka public void setKeyboard(final Keyboard keyboard) { 7263c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka super.setKeyboard(keyboard); 7363c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), 7408ae0d5ca03ed455827e82222df249d1cafb5d71Tadashi G. Takaoka -getPaddingTop() + getVerticalCorrection()); 7563c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka } 7663c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka 7763c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka @Override 78bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka public void showMoreKeysPanel(final View parentView, final Controller controller, 79fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang final int pointX, final int pointY, final KeyboardActionListener listener) { 80f44a01b40852dde2363a061cdc7df2ef4cb59aadTadashi G. Takaoka mController = controller; 81f44a01b40852dde2363a061cdc7df2ef4cb59aadTadashi G. Takaoka mListener = listener; 82fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang final View container = getContainerView(); 83bcbaffd9dd950c6b82c682a742c93f9319d908f5Tadashi G. Takaoka // The coordinates of panel's left-top corner in parentView's coordinate system. 8435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final int x = pointX - getDefaultCoordX() - container.getPaddingLeft(); 857ecc1081ab9b4e41e4b2aec7877aaaf8df29e611Tadashi G. Takaoka final int y = pointY - container.getMeasuredHeight() + container.getPaddingBottom(); 86ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 87bcbaffd9dd950c6b82c682a742c93f9319d908f5Tadashi G. Takaoka parentView.getLocationInWindow(mCoordinates); 88fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang // Ensure the horizontal position of the panel does not extend past the screen edges. 89fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang final int maxX = parentView.getMeasuredWidth() - container.getMeasuredWidth(); 90be68b41ccb1a16201c3b91f1576a731f7715aaf6Tom Ouyang final int panelX = Math.max(0, Math.min(maxX, x)) + CoordinateUtils.x(mCoordinates); 91fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang final int panelY = y + CoordinateUtils.y(mCoordinates); 92fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang container.setX(panelX); 93fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang container.setY(panelY); 94ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka 95bcbaffd9dd950c6b82c682a742c93f9319d908f5Tadashi G. Takaoka mOriginX = x + container.getPaddingLeft(); 96bcbaffd9dd950c6b82c682a742c93f9319d908f5Tadashi G. Takaoka mOriginY = y + container.getPaddingTop(); 97fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang controller.onShowMoreKeysPanel(this); 98f3f3189adbce15d609d5e06632f8e0630db890d1Tadashi G. Takaoka } 99f3f3189adbce15d609d5e06632f8e0630db890d1Tadashi G. Takaoka 10035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang /** 10135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang * Returns the default x coordinate for showing this panel. 10235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang */ 10335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang protected int getDefaultCoordX() { 10435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang return ((MoreKeysKeyboard)getKeyboard()).getDefaultCoordX(); 10535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 10635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 10735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang @Override 10835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang public void onDownEvent(final int x, final int y, final int pointerId, final long eventTime) { 10935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang mActivePointerId = pointerId; 11035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang onMoveKeyInternal(x, y, pointerId); 11135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 11235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 11335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang @Override 11435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang public void onMoveEvent(int x, int y, final int pointerId, long eventTime) { 115ac69ab400d1ea4f90b4ca24486d62212decf1069Tom Ouyang if (mActivePointerId != pointerId) { 116ac69ab400d1ea4f90b4ca24486d62212decf1069Tom Ouyang return; 117ac69ab400d1ea4f90b4ca24486d62212decf1069Tom Ouyang } 118ac69ab400d1ea4f90b4ca24486d62212decf1069Tom Ouyang final boolean hasOldKey = (mCurrentKey != null); 11935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang onMoveKeyInternal(x, y, pointerId); 120ac69ab400d1ea4f90b4ca24486d62212decf1069Tom Ouyang if (hasOldKey && mCurrentKey == null) { 121ac69ab400d1ea4f90b4ca24486d62212decf1069Tom Ouyang // If the pointer has moved too far away from any target then cancel the panel. 1220e08d70fe52737582b6c83dbf48aaf4d83063566Tadashi G. Takaoka mController.onCancelMoreKeysPanel(this); 123ac69ab400d1ea4f90b4ca24486d62212decf1069Tom Ouyang } 12435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 12535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 12635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang @Override 12735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang public void onUpEvent(final int x, final int y, final int pointerId, final long eventTime) { 12835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang if (mCurrentKey != null && mActivePointerId == pointerId) { 12935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang updateReleaseKeyGraphics(mCurrentKey); 13035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang onCodeInput(mCurrentKey.mCode, x, y); 13135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang mCurrentKey = null; 13235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 13335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 13435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 13535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang /** 13635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang * Performs the specific action for this panel when the user presses a key on the panel. 13735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang */ 13835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang protected void onCodeInput(final int code, final int x, final int y) { 13935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang if (code == Constants.CODE_OUTPUT_TEXT) { 14035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang mListener.onTextInput(mCurrentKey.getOutputText()); 14135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } else if (code != Constants.CODE_UNSPECIFIED) { 14235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang mListener.onCodeInput(code, x, y); 14335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 14435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 14535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 14635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang private void onMoveKeyInternal(int x, int y, int pointerId) { 14735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang if (mActivePointerId != pointerId) { 14835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang // Ignore old pointers when newer pointer is active. 14935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang return; 15035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 15135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final Key oldKey = mCurrentKey; 15235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final Key newKey = mKeyDetector.detectHitKey(x, y); 15335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang if (newKey != oldKey) { 15435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang mCurrentKey = newKey; 15535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang invalidateKey(mCurrentKey); 15635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang if (oldKey != null) { 15735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang updateReleaseKeyGraphics(oldKey); 15835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 15935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang if (newKey != null) { 16035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang updatePressKeyGraphics(newKey); 16135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 16235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 16335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 16435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 16535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang private void updateReleaseKeyGraphics(final Key key) { 16635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang key.onReleased(); 16735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang invalidateKey(key); 16835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 16935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 17035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang private void updatePressKeyGraphics(final Key key) { 17135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang key.onPressed(); 17235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang invalidateKey(key); 17335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 17435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 175ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka @Override 17609e4530ca75d4664eb72708face83b466839c522Tadashi G. Takaoka public void dismissMoreKeysPanel() { 17709e4530ca75d4664eb72708face83b466839c522Tadashi G. Takaoka if (!isShowingInParent()) { 17809e4530ca75d4664eb72708face83b466839c522Tadashi G. Takaoka return; 17909e4530ca75d4664eb72708face83b466839c522Tadashi G. Takaoka } 1800e08d70fe52737582b6c83dbf48aaf4d83063566Tadashi G. Takaoka mController.onDismissMoreKeysPanel(this); 1819ec80d9d89eb599329c354451acdc482cc3de836Tadashi G. Takaoka } 1829ec80d9d89eb599329c354451acdc482cc3de836Tadashi G. Takaoka 1839ec80d9d89eb599329c354451acdc482cc3de836Tadashi G. Takaoka @Override 184bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka public int translateX(final int x) { 18563c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka return x - mOriginX; 18663c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka } 18763c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka 18863c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka @Override 189bc464e2952e102219f0b977fc1e9140ad5bd03e4Tadashi G. Takaoka public int translateY(final int y) { 19063c233ab9f50d844be6e52e382c6664475606760Tadashi G. Takaoka return y - mOriginY; 191ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka } 192fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang 193fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang @Override 19435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang public boolean onTouchEvent(final MotionEvent me) { 19535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final int action = me.getActionMasked(); 19635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final long eventTime = me.getEventTime(); 19735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final int index = me.getActionIndex(); 19835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final int x = (int)me.getX(index); 19935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final int y = (int)me.getY(index); 20035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang final int pointerId = me.getPointerId(index); 20135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang switch (action) { 20235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang case MotionEvent.ACTION_DOWN: 20335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang case MotionEvent.ACTION_POINTER_DOWN: 20435580bad6f3da3b204653825bbb6871563e70728Tom Ouyang onDownEvent(x, y, pointerId, eventTime); 20535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang break; 20635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang case MotionEvent.ACTION_UP: 20735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang case MotionEvent.ACTION_POINTER_UP: 20835580bad6f3da3b204653825bbb6871563e70728Tom Ouyang onUpEvent(x, y, pointerId, eventTime); 20935580bad6f3da3b204653825bbb6871563e70728Tom Ouyang break; 21035580bad6f3da3b204653825bbb6871563e70728Tom Ouyang case MotionEvent.ACTION_MOVE: 21135580bad6f3da3b204653825bbb6871563e70728Tom Ouyang onMoveEvent(x, y, pointerId, eventTime); 21235580bad6f3da3b204653825bbb6871563e70728Tom Ouyang break; 21335580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 21433482a9b9ccf605c63fab7c9b8273a240bbc2035Tadashi G. Takaoka return true; 21535580bad6f3da3b204653825bbb6871563e70728Tom Ouyang } 21635580bad6f3da3b204653825bbb6871563e70728Tom Ouyang 21735580bad6f3da3b204653825bbb6871563e70728Tom Ouyang @Override 218fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang public View getContainerView() { 219fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang return (View)getParent(); 220fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang } 221fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang 222fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang @Override 223fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang public boolean isShowingInParent() { 224fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang return (getContainerView().getParent() != null); 225fa2d543785c52f639ad3157c57420f58a199c550Tom Ouyang } 226ff082d081f3ea18ff0b9b22126ee4a86504cf83cTadashi G. Takaoka} 227