Loading core/java/android/widget/TextView.java +36 −58 Original line number Diff line number Diff line Loading @@ -297,6 +297,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Drawable mSelectHandleRight; Drawable mSelectHandleCenter; // Set when this TextView gained focus with some text selected. Will start selection mode. private boolean mCreatedWithASelection = false; /* * Kick-start the font cache for the zygote process (to pay the cost of * initializing freetype for our default font only once). Loading Loading @@ -3758,8 +3761,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // - ExtractEditText does not call onFocus when it is displayed. Fixing this issue would // allow to test for hasSelection in onFocusChanged, which would trigger a // startTextSelectionMode here. TODO if (this instanceof ExtractEditText && selectionController != null && hasSelection()) { if (mCreatedWithASelection || (this instanceof ExtractEditText && selectionController != null && hasSelection())) { startTextSelectionMode(); mCreatedWithASelection = false; } mPreDrawState = PREDRAW_DONE; Loading Loading @@ -4175,6 +4180,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mInsertionPointCursorController.isShowing()) { mInsertionPointCursorController.updatePosition(); } if (mSelectionModifierCursorController != null && mSelectionModifierCursorController.isShowing()) { mSelectionModifierCursorController.updatePosition(); Loading Loading @@ -6580,6 +6586,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int selStart = getSelectionStart(); int selEnd = getSelectionEnd(); // SelectAllOnFocus fields are highlighted and not selected. Do not start text selection // mode for these, unless there was a specific selection already started. final boolean isFocusHighlighted = mSelectAllOnFocus && selStart == 0 && selEnd == mText.length(); mCreatedWithASelection = mFrozenWithFocus && hasSelection() && !isFocusHighlighted; if (!mFrozenWithFocus || (selStart < 0 || selEnd < 0)) { // If a tap was used to give focus to that view, move cursor at tap position. // Has to be done before onTakeFocus, which can be overloaded. Loading @@ -6592,10 +6604,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mMovement.onTakeFocus(this, (Spannable) mText, direction); } if (mSelectAllOnFocus) { Selection.setSelection((Spannable) mText, 0, mText.length()); } // The DecorView does not have focus when the 'Done' ExtractEditText button is // pressed. Since it is the ViewRoot's mView, it requests focus before // ExtractEditText clears focus, which gives focus to the ExtractEditText. Loading @@ -6614,6 +6622,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ Selection.setSelection((Spannable) mText, selStart, selEnd); } if (mSelectAllOnFocus) { Selection.setSelection((Spannable) mText, 0, mText.length()); } mTouchFocusSelected = true; } Loading Loading @@ -6643,7 +6656,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // ExtractEditText goes out of focus. mIsInTextSelectionMode = false; } else { terminateTextSelectionMode(); stopTextSelectionMode(); } if (mSelectionModifierCursorController != null) { Loading Loading @@ -6745,29 +6758,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final int end = getSelectionEnd(); if (start == end) { if (start >= prevStart && start < prevEnd) { boolean tapInsideSelectAllOnFocus = mSelectAllOnFocus && prevStart == 0 && prevEnd == mText.length(); if (start >= prevStart && start < prevEnd && !tapInsideSelectAllOnFocus) { // Restore previous selection Selection.setSelection((Spannable)mText, prevStart, prevEnd); if (hasSelectionController() && !getSelectionController().isShowing()) { // If the anchors aren't showing, revive them. getSelectionController().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 stopTextSelectionMode(); if (hasInsertionController() && mText.length() > 0) { boolean selectAllGotFocus = mSelectAllOnFocus && mTouchFocusSelected; if (hasInsertionController() && !selectAllGotFocus) { getInsertionController().show(); } } } else if (hasSelection() && hasSelectionController()) { getSelectionController().show(); } } Loading @@ -6790,7 +6797,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int end = Math.min(len, mPrevEnd); Selection.setSelection((Spannable)mText, start, end); if (hasSelection()) { boolean selectAllGotFocus = mSelectAllOnFocus && mTouchFocusSelected; if (hasSelection() && !selectAllGotFocus) { startTextSelectionMode(); } } Loading Loading @@ -7147,7 +7155,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } private boolean canSelectText() { return textCanBeSelected() && mText.length() != 0; return hasSelectionController() && mText.length() != 0; } private boolean textCanBeSelected() { Loading Loading @@ -7476,6 +7484,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (added) { hideControllers(); menu.setHeaderTitle(com.android.internal.R.string.editTextMenuTitle); } } Loading Loading @@ -7652,30 +7661,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return; } if (!requestFocus()) { if (!canSelectText() || !requestFocus()) { return; } selectCurrentWord(); getSelectionController().show(); final InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(this, 0, null); mIsInTextSelectionMode = true; } } /** * Same as {@link #stopTextSelectionMode()}, except that there is no cursor controller * fade out animation. Needed since the drawable and their alpha values are shared by all * TextViews. Switching from one TextView to another would fade the cursor controllers in the * new one otherwise. */ private void terminateTextSelectionMode() { stopTextSelectionMode(); if (mSelectionModifierCursorController != null) { SelectionModifierCursorController selectionModifierCursorController = (SelectionModifierCursorController) mSelectionModifierCursorController; selectionModifierCursorController.cancelFadeOutAnimation(); } } private void stopTextSelectionMode() { if (mIsInTextSelectionMode) { Selection.setSelection((Spannable) mText, getSelectionEnd()); Loading Loading @@ -8052,14 +8050,6 @@ 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() { mStartHandle = new HandleView(this, HandleView.LEFT); mEndHandle = new HandleView(this, HandleView.RIGHT); Loading @@ -8076,29 +8066,18 @@ 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() { return mIsShowing; } public void cancelFadeOutAnimation() { hide(); } public void updatePosition(HandleView handle, int x, int y) { int selectionStart = getSelectionStart(); int selectionEnd = getSelectionEnd(); Loading Loading @@ -8150,7 +8129,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mStartHandle.positionAtCursor(selectionStart, true); mEndHandle.positionAtCursor(selectionEnd, true); hideDelayed(DELAY_BEFORE_FADE_OUT); } public boolean onTouchEvent(MotionEvent event) { Loading core/res/res/layout/search_bar.xml +1 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ android:drawablePadding="2dip" android:singleLine="true" android:ellipsize="end" android:selectAllOnFocus="true" android:inputType="text|textAutoComplete" android:dropDownWidth="match_parent" android:dropDownHeight="match_parent" Loading Loading
core/java/android/widget/TextView.java +36 −58 Original line number Diff line number Diff line Loading @@ -297,6 +297,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Drawable mSelectHandleRight; Drawable mSelectHandleCenter; // Set when this TextView gained focus with some text selected. Will start selection mode. private boolean mCreatedWithASelection = false; /* * Kick-start the font cache for the zygote process (to pay the cost of * initializing freetype for our default font only once). Loading Loading @@ -3758,8 +3761,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // - ExtractEditText does not call onFocus when it is displayed. Fixing this issue would // allow to test for hasSelection in onFocusChanged, which would trigger a // startTextSelectionMode here. TODO if (this instanceof ExtractEditText && selectionController != null && hasSelection()) { if (mCreatedWithASelection || (this instanceof ExtractEditText && selectionController != null && hasSelection())) { startTextSelectionMode(); mCreatedWithASelection = false; } mPreDrawState = PREDRAW_DONE; Loading Loading @@ -4175,6 +4180,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mInsertionPointCursorController.isShowing()) { mInsertionPointCursorController.updatePosition(); } if (mSelectionModifierCursorController != null && mSelectionModifierCursorController.isShowing()) { mSelectionModifierCursorController.updatePosition(); Loading Loading @@ -6580,6 +6586,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int selStart = getSelectionStart(); int selEnd = getSelectionEnd(); // SelectAllOnFocus fields are highlighted and not selected. Do not start text selection // mode for these, unless there was a specific selection already started. final boolean isFocusHighlighted = mSelectAllOnFocus && selStart == 0 && selEnd == mText.length(); mCreatedWithASelection = mFrozenWithFocus && hasSelection() && !isFocusHighlighted; if (!mFrozenWithFocus || (selStart < 0 || selEnd < 0)) { // If a tap was used to give focus to that view, move cursor at tap position. // Has to be done before onTakeFocus, which can be overloaded. Loading @@ -6592,10 +6604,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mMovement.onTakeFocus(this, (Spannable) mText, direction); } if (mSelectAllOnFocus) { Selection.setSelection((Spannable) mText, 0, mText.length()); } // The DecorView does not have focus when the 'Done' ExtractEditText button is // pressed. Since it is the ViewRoot's mView, it requests focus before // ExtractEditText clears focus, which gives focus to the ExtractEditText. Loading @@ -6614,6 +6622,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ Selection.setSelection((Spannable) mText, selStart, selEnd); } if (mSelectAllOnFocus) { Selection.setSelection((Spannable) mText, 0, mText.length()); } mTouchFocusSelected = true; } Loading Loading @@ -6643,7 +6656,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // ExtractEditText goes out of focus. mIsInTextSelectionMode = false; } else { terminateTextSelectionMode(); stopTextSelectionMode(); } if (mSelectionModifierCursorController != null) { Loading Loading @@ -6745,29 +6758,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final int end = getSelectionEnd(); if (start == end) { if (start >= prevStart && start < prevEnd) { boolean tapInsideSelectAllOnFocus = mSelectAllOnFocus && prevStart == 0 && prevEnd == mText.length(); if (start >= prevStart && start < prevEnd && !tapInsideSelectAllOnFocus) { // Restore previous selection Selection.setSelection((Spannable)mText, prevStart, prevEnd); if (hasSelectionController() && !getSelectionController().isShowing()) { // If the anchors aren't showing, revive them. getSelectionController().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 stopTextSelectionMode(); if (hasInsertionController() && mText.length() > 0) { boolean selectAllGotFocus = mSelectAllOnFocus && mTouchFocusSelected; if (hasInsertionController() && !selectAllGotFocus) { getInsertionController().show(); } } } else if (hasSelection() && hasSelectionController()) { getSelectionController().show(); } } Loading @@ -6790,7 +6797,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int end = Math.min(len, mPrevEnd); Selection.setSelection((Spannable)mText, start, end); if (hasSelection()) { boolean selectAllGotFocus = mSelectAllOnFocus && mTouchFocusSelected; if (hasSelection() && !selectAllGotFocus) { startTextSelectionMode(); } } Loading Loading @@ -7147,7 +7155,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } private boolean canSelectText() { return textCanBeSelected() && mText.length() != 0; return hasSelectionController() && mText.length() != 0; } private boolean textCanBeSelected() { Loading Loading @@ -7476,6 +7484,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (added) { hideControllers(); menu.setHeaderTitle(com.android.internal.R.string.editTextMenuTitle); } } Loading Loading @@ -7652,30 +7661,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return; } if (!requestFocus()) { if (!canSelectText() || !requestFocus()) { return; } selectCurrentWord(); getSelectionController().show(); final InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(this, 0, null); mIsInTextSelectionMode = true; } } /** * Same as {@link #stopTextSelectionMode()}, except that there is no cursor controller * fade out animation. Needed since the drawable and their alpha values are shared by all * TextViews. Switching from one TextView to another would fade the cursor controllers in the * new one otherwise. */ private void terminateTextSelectionMode() { stopTextSelectionMode(); if (mSelectionModifierCursorController != null) { SelectionModifierCursorController selectionModifierCursorController = (SelectionModifierCursorController) mSelectionModifierCursorController; selectionModifierCursorController.cancelFadeOutAnimation(); } } private void stopTextSelectionMode() { if (mIsInTextSelectionMode) { Selection.setSelection((Spannable) mText, getSelectionEnd()); Loading Loading @@ -8052,14 +8050,6 @@ 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() { mStartHandle = new HandleView(this, HandleView.LEFT); mEndHandle = new HandleView(this, HandleView.RIGHT); Loading @@ -8076,29 +8066,18 @@ 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() { return mIsShowing; } public void cancelFadeOutAnimation() { hide(); } public void updatePosition(HandleView handle, int x, int y) { int selectionStart = getSelectionStart(); int selectionEnd = getSelectionEnd(); Loading Loading @@ -8150,7 +8129,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mStartHandle.positionAtCursor(selectionStart, true); mEndHandle.positionAtCursor(selectionEnd, true); hideDelayed(DELAY_BEFORE_FADE_OUT); } public boolean onTouchEvent(MotionEvent event) { Loading
core/res/res/layout/search_bar.xml +1 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ android:drawablePadding="2dip" android:singleLine="true" android:ellipsize="end" android:selectAllOnFocus="true" android:inputType="text|textAutoComplete" android:dropDownWidth="match_parent" android:dropDownHeight="match_parent" Loading