summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextView.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/widget/TextView.java')
-rw-r--r--core/java/android/widget/TextView.java100
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;
}
/**