diff options
Diffstat (limited to 'core/java/android/widget/TextView.java')
| -rw-r--r-- | core/java/android/widget/TextView.java | 100 |
1 files changed, 91 insertions, 9 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 2d550e479520..93e87e6ab86c 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -290,6 +290,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } InputMethodState mInputMethodState; + private int mTextSelectHandleLeftRes; + private int mTextSelectHandleRightRes; + private int mTextSelectHandleRes; + /* * Kick-start the font cache for the zygote process (to pay the cost of * initializing freetype for our default font only once). @@ -710,6 +714,18 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Log.w(LOG_TAG, "Failure reading input extras", e); } break; + + case com.android.internal.R.styleable.TextView_textSelectHandleLeft: + mTextSelectHandleLeftRes = a.getResourceId(attr, 0); + break; + + case com.android.internal.R.styleable.TextView_textSelectHandleRight: + mTextSelectHandleRightRes = a.getResourceId(attr, 0); + break; + + case com.android.internal.R.styleable.TextView_textSelectHandle: + mTextSelectHandleRes = a.getResourceId(attr, 0); + break; } } a.recycle(); @@ -3763,6 +3779,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener showError(); mShowErrorAfterAttach = false; } + + updateOverlay(); } @Override @@ -3780,6 +3798,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mError != null) { hideError(); } + + setOverlayEnabled(false); } @Override @@ -4147,7 +4167,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ canvas.restore(); + } + /** + * @hide + */ + @Override + public void onDrawOverlay(Canvas canvas) { if (mInsertionPointCursorController != null) { mInsertionPointCursorController.draw(canvas); } @@ -6742,10 +6768,31 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); if (action == MotionEvent.ACTION_DOWN) { + // Check to see if we're testing for our anchor overlay. + boolean handled = false; + final float x = event.getX(); + final float y = event.getY(); + if (x < 0 || x >= mRight - mLeft || y < 0 || y >= mBottom - mTop) { + if (mInsertionPointCursorController != null) { + handled |= mInsertionPointCursorController.onTouchEvent(event); + } + if (mSelectionModifierCursorController != null) { + handled |= mSelectionModifierCursorController.onTouchEvent(event); + } + + if (!handled) { + return false; + } + } + // Reset this state; it will be re-set if super.onTouchEvent // causes focus to move to the view. mTouchFocusSelected = false; mScrolled = false; + + if (handled) { + return true; + } } final boolean superResult = super.onTouchEvent(event); @@ -7658,6 +7705,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } + private void updateOverlay() { + boolean enableOverlay = false; + if (mSelectionModifierCursorController != null) { + enableOverlay |= mSelectionModifierCursorController.isShowing(); + } + if (mInsertionPointCursorController != null) { + enableOverlay |= mInsertionPointCursorController.isShowing(); + } + setOverlayEnabled(enableOverlay); + } + /** * A CursorController instance can be used to control a cursor in the text. * @@ -7681,6 +7739,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public void hide(); /** + * @return true if the CursorController is currently visible + */ + public boolean isShowing(); + + /** * Update the controller's position. */ public void updatePosition(int x, int y); @@ -7702,7 +7765,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * a chance to become active and/or visible. * @param event The touch event */ - public void onTouchEvent(MotionEvent event); + public boolean onTouchEvent(MotionEvent event); /** * Draws a visual representation of the controller on the canvas. @@ -7736,10 +7799,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final Rect bounds = sCursorControllerTempRect; bounds.left = (int) (mLayout.getPrimaryHorizontal(offset) - drawableWidth / 2.0) + mScrollX; - bounds.top = (bottom ? lineBottom : lineTop) - drawableHeight / 2 + mScrollY; + bounds.top = (bottom ? lineBottom : lineTop) + mScrollY; mTopExtension = bottom ? 0 : drawableHeight / 2; - mBottomExtension = drawableHeight; + mBottomExtension = 0; //drawableHeight / 4; // Extend touch region up when editing the last line of text (or a single line) so that // it is easier to grab. @@ -7797,7 +7860,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener InsertionPointCursorController() { Resources res = mContext.getResources(); - mHandle = new Handle(res.getDrawable(com.android.internal.R.drawable.text_select_handle)); + mHandle = new Handle(res.getDrawable(mTextSelectHandleRes)); } public void show() { @@ -7805,6 +7868,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Has to be done after updateDrawablePosition, so that previous position invalidate // in only done if necessary. mIsVisible = true; + updateOverlay(); } public void hide() { @@ -7818,6 +7882,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } + public boolean isShowing() { + return mIsVisible; + } + public void draw(Canvas canvas) { if (mIsVisible) { int time = (int) (System.currentTimeMillis() - mFadeOutTimerStart); @@ -7833,6 +7901,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else { mHandle.mDrawable.setAlpha(0); mIsVisible = false; + updateOverlay(); } } mHandle.mDrawable.draw(canvas); @@ -7861,6 +7930,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Should never happen, safety check. Log.w(LOG_TAG, "Update cursor controller position called with no cursor"); mIsVisible = false; + updateOverlay(); return; } @@ -7870,7 +7940,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mHandle.mDrawable.setAlpha(255); } - public void onTouchEvent(MotionEvent event) { + public boolean onTouchEvent(MotionEvent event) { if (isFocused() && isTextEditable() && mIsVisible) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN : { @@ -7898,8 +7968,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mOffsetY += viewportToContentVerticalOffset(); mOnDownTimerStart = event.getEventTime(); + return true; } - break; + return false; } case MotionEvent.ACTION_UP : { @@ -7917,6 +7988,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } } + return false; } public float getOffsetX() { @@ -7944,8 +8016,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener SelectionModifierCursorController() { Resources res = mContext.getResources(); - mStartHandle = new Handle(res.getDrawable(com.android.internal.R.drawable.text_select_handle)); - mEndHandle = new Handle(res.getDrawable(com.android.internal.R.drawable.text_select_handle)); + mStartHandle = new Handle(res.getDrawable(mTextSelectHandleLeftRes)); + mEndHandle = new Handle(res.getDrawable(mTextSelectHandleRightRes)); } public void show() { @@ -7953,6 +8025,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Has to be done after updateDrawablePositions, so that previous position invalidate // in only done if necessary. mIsVisible = true; + updateOverlay(); mFadeOutTimerStart = -1; hideInsertionPointCursorController(); } @@ -7965,8 +8038,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } + public boolean isShowing() { + return mIsVisible; + } + public void cancelFadeOutAnimation() { mIsVisible = false; + updateOverlay(); mStartHandle.postInvalidate(); mEndHandle.postInvalidate(); } @@ -7985,6 +8063,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mStartHandle.mDrawable.setAlpha(0); mEndHandle.mDrawable.setAlpha(0); mIsVisible = false; + updateOverlay(); } } mStartHandle.mDrawable.draw(canvas); @@ -8042,6 +8121,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Should never happen, safety check. Log.w(LOG_TAG, "Update selection controller position called with no cursor"); mIsVisible = false; + updateOverlay(); return; } @@ -8054,7 +8134,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mEndHandle.mDrawable.setAlpha(255); } - public void onTouchEvent(MotionEvent event) { + public boolean onTouchEvent(MotionEvent event) { if (isTextEditable()) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: @@ -8088,6 +8168,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mOffsetY += viewportToContentVerticalOffset(); ((ArrowKeyMovementMethod)mMovement).setCursorController(this); + return true; } } } @@ -8104,6 +8185,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; } } + return false; } /** |
