Loading core/java/android/widget/TextView.java +68 −8 Original line number Diff line number Diff line Loading @@ -3781,18 +3781,34 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener showError(); mShowErrorAfterAttach = false; } final ViewTreeObserver observer = getViewTreeObserver(); if (observer != null) { if (mInsertionPointCursorController != null) { observer.addOnTouchModeChangeListener(mInsertionPointCursorController); } if (mSelectionModifierCursorController != null) { observer.addOnTouchModeChangeListener(mSelectionModifierCursorController); } } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mPreDrawState != PREDRAW_NOT_REGISTERED) { final ViewTreeObserver observer = getViewTreeObserver(); if (observer != null) { if (mPreDrawState != PREDRAW_NOT_REGISTERED) { observer.removeOnPreDrawListener(this); mPreDrawState = PREDRAW_NOT_REGISTERED; } if (mInsertionPointCursorController != null) { observer.removeOnTouchModeChangeListener(mInsertionPointCursorController); } if (mSelectionModifierCursorController != null) { observer.removeOnTouchModeChangeListener(mSelectionModifierCursorController); } } if (mError != null) { Loading Loading @@ -6684,7 +6700,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mInputContentType != null) { mInputContentType.enterDown = false; } hideControllers(); hideInsertionPointCursorController(); if (mSelectionModifierCursorController != null) { mSelectionModifierCursorController.hide(); } } startStopMarquee(hasWindowFocus); Loading @@ -6694,7 +6713,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility != VISIBLE) { hideControllers(); hideInsertionPointCursorController(); if (mSelectionModifierCursorController != null) { mSelectionModifierCursorController.hide(); } } } Loading Loading @@ -6732,8 +6754,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (start >= prevStart && start < prevEnd) { // Restore previous selection Selection.setSelection((Spannable)mText, prevStart, prevEnd); // Tapping inside the selection displays the cut/copy/paste context menu. if (mSelectionModifierCursorController != null && !mSelectionModifierCursorController.isShowing()) { // If the anchors aren't showing, revive them. mSelectionModifierCursorController.show(); } else { // Tapping inside the selection displays the cut/copy/paste context menu // as long as the anchors are already showing. showContextMenu(); } return; } else { // Tapping outside stops selection mode, if any Loading @@ -6743,6 +6773,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mInsertionPointCursorController.show(); } } } else if (hasSelection() && mSelectionModifierCursorController != null) { mSelectionModifierCursorController.show(); } } Loading Loading @@ -7714,7 +7746,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * It is not used outside of {@link TextView}. * @hide */ private interface CursorController { private interface CursorController extends ViewTreeObserver.OnTouchModeChangeListener { /** * Makes the cursor controller visible on screen. Will be drawn by {@link #draw(Canvas)}. * See also {@link #hide()}. Loading Loading @@ -7969,6 +8001,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onTouchEvent(MotionEvent ev) { return false; } public void onTouchModeChanged(boolean isInTouchMode) { if (!isInTouchMode) { hide(); } } } private class SelectionModifierCursorController implements CursorController { Loading @@ -7979,6 +8017,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Whether selection anchors are active private boolean mIsShowing; private static final int DELAY_BEFORE_FADE_OUT = 4100; private final Runnable mHider = new Runnable() { public void run() { hide(); } }; SelectionModifierCursorController() { Resources res = mContext.getResources(); mStartHandle = new HandleView(this, res.getDrawable(mTextSelectHandleLeftRes)); Loading @@ -7991,12 +8037,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mStartHandle.show(); mEndHandle.show(); hideInsertionPointCursorController(); hideDelayed(DELAY_BEFORE_FADE_OUT); } public void hide() { mStartHandle.hide(); mEndHandle.hide(); mIsShowing = false; removeCallbacks(mHider); } private void hideDelayed(int delay) { removeCallbacks(mHider); postDelayed(mHider, delay); } public boolean isShowing() { Loading Loading @@ -8062,6 +8115,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mLayout.getLineForOffset(selectionEnd); mStartHandle.positionAtCursor(selectionStart, oneLineSelection); mEndHandle.positionAtCursor(selectionEnd, true); hideDelayed(DELAY_BEFORE_FADE_OUT); } public boolean onTouchEvent(MotionEvent event) { Loading Loading @@ -8118,6 +8172,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean isSelectionStartDragged() { return mStartHandle.isDragging(); } public void onTouchModeChanged(boolean isInTouchMode) { if (!isInTouchMode) { hide(); } } } private void hideInsertionPointCursorController() { Loading Loading
core/java/android/widget/TextView.java +68 −8 Original line number Diff line number Diff line Loading @@ -3781,18 +3781,34 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener showError(); mShowErrorAfterAttach = false; } final ViewTreeObserver observer = getViewTreeObserver(); if (observer != null) { if (mInsertionPointCursorController != null) { observer.addOnTouchModeChangeListener(mInsertionPointCursorController); } if (mSelectionModifierCursorController != null) { observer.addOnTouchModeChangeListener(mSelectionModifierCursorController); } } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mPreDrawState != PREDRAW_NOT_REGISTERED) { final ViewTreeObserver observer = getViewTreeObserver(); if (observer != null) { if (mPreDrawState != PREDRAW_NOT_REGISTERED) { observer.removeOnPreDrawListener(this); mPreDrawState = PREDRAW_NOT_REGISTERED; } if (mInsertionPointCursorController != null) { observer.removeOnTouchModeChangeListener(mInsertionPointCursorController); } if (mSelectionModifierCursorController != null) { observer.removeOnTouchModeChangeListener(mSelectionModifierCursorController); } } if (mError != null) { Loading Loading @@ -6684,7 +6700,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mInputContentType != null) { mInputContentType.enterDown = false; } hideControllers(); hideInsertionPointCursorController(); if (mSelectionModifierCursorController != null) { mSelectionModifierCursorController.hide(); } } startStopMarquee(hasWindowFocus); Loading @@ -6694,7 +6713,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility != VISIBLE) { hideControllers(); hideInsertionPointCursorController(); if (mSelectionModifierCursorController != null) { mSelectionModifierCursorController.hide(); } } } Loading Loading @@ -6732,8 +6754,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (start >= prevStart && start < prevEnd) { // Restore previous selection Selection.setSelection((Spannable)mText, prevStart, prevEnd); // Tapping inside the selection displays the cut/copy/paste context menu. if (mSelectionModifierCursorController != null && !mSelectionModifierCursorController.isShowing()) { // If the anchors aren't showing, revive them. mSelectionModifierCursorController.show(); } else { // Tapping inside the selection displays the cut/copy/paste context menu // as long as the anchors are already showing. showContextMenu(); } return; } else { // Tapping outside stops selection mode, if any Loading @@ -6743,6 +6773,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mInsertionPointCursorController.show(); } } } else if (hasSelection() && mSelectionModifierCursorController != null) { mSelectionModifierCursorController.show(); } } Loading Loading @@ -7714,7 +7746,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * It is not used outside of {@link TextView}. * @hide */ private interface CursorController { private interface CursorController extends ViewTreeObserver.OnTouchModeChangeListener { /** * Makes the cursor controller visible on screen. Will be drawn by {@link #draw(Canvas)}. * See also {@link #hide()}. Loading Loading @@ -7969,6 +8001,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onTouchEvent(MotionEvent ev) { return false; } public void onTouchModeChanged(boolean isInTouchMode) { if (!isInTouchMode) { hide(); } } } private class SelectionModifierCursorController implements CursorController { Loading @@ -7979,6 +8017,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Whether selection anchors are active private boolean mIsShowing; private static final int DELAY_BEFORE_FADE_OUT = 4100; private final Runnable mHider = new Runnable() { public void run() { hide(); } }; SelectionModifierCursorController() { Resources res = mContext.getResources(); mStartHandle = new HandleView(this, res.getDrawable(mTextSelectHandleLeftRes)); Loading @@ -7991,12 +8037,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mStartHandle.show(); mEndHandle.show(); hideInsertionPointCursorController(); hideDelayed(DELAY_BEFORE_FADE_OUT); } public void hide() { mStartHandle.hide(); mEndHandle.hide(); mIsShowing = false; removeCallbacks(mHider); } private void hideDelayed(int delay) { removeCallbacks(mHider); postDelayed(mHider, delay); } public boolean isShowing() { Loading Loading @@ -8062,6 +8115,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mLayout.getLineForOffset(selectionEnd); mStartHandle.positionAtCursor(selectionStart, oneLineSelection); mEndHandle.positionAtCursor(selectionEnd, true); hideDelayed(DELAY_BEFORE_FADE_OUT); } public boolean onTouchEvent(MotionEvent event) { Loading Loading @@ -8118,6 +8172,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean isSelectionStartDragged() { return mStartHandle.isDragging(); } public void onTouchModeChanged(boolean isInTouchMode) { if (!isInTouchMode) { hide(); } } } private void hideInsertionPointCursorController() { Loading