Loading core/java/android/widget/Editor.java +72 −4 Original line number Diff line number Diff line Loading @@ -3158,6 +3158,7 @@ public class Editor { // Offset from touch position to mPosition private float mTouchToWindowOffsetX, mTouchToWindowOffsetY; protected int mHotspotX; protected int mHorizontalGravity; // Offsets the hotspot point up, so that cursor is not hidden by the finger when moving up private float mTouchOffsetY; // Where the touch position should be on the handle to ensure a maximum cursor visibility Loading @@ -3172,6 +3173,8 @@ public class Editor { private boolean mPositionHasChanged = true; // Used to delay the appearance of the action popup window private Runnable mActionPopupShower; // Minimum touch target size for handles private int mMinSize; public HandleView(Drawable drawableLtr, Drawable drawableRtl) { super(mTextView.getContext()); Loading @@ -3184,10 +3187,12 @@ public class Editor { mDrawableLtr = drawableLtr; mDrawableRtl = drawableRtl; mMinSize = mTextView.getContext().getResources().getDimensionPixelSize( com.android.internal.R.dimen.text_handle_min_size); updateDrawable(); final int handleHeight = mDrawable.getIntrinsicHeight(); final int handleHeight = getPreferredHeight(); mTouchOffsetY = -0.3f * handleHeight; mIdealVerticalOffset = 0.7f * handleHeight; } Loading @@ -3197,9 +3202,11 @@ public class Editor { final boolean isRtlCharAtOffset = mTextView.getLayout().isRtlCharAt(offset); mDrawable = isRtlCharAtOffset ? mDrawableRtl : mDrawableLtr; mHotspotX = getHotspotX(mDrawable, isRtlCharAtOffset); mHorizontalGravity = getHorizontalGravity(isRtlCharAtOffset); } protected abstract int getHotspotX(Drawable drawable, boolean isRtlRun); protected abstract int getHorizontalGravity(boolean isRtlRun); // Touch-up filter: number of previous positions remembered private static final int HISTORY_SIZE = 5; Loading Loading @@ -3244,7 +3251,15 @@ public class Editor { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight()); setMeasuredDimension(getPreferredWidth(), getPreferredHeight()); } private int getPreferredWidth() { return Math.max(mDrawable.getIntrinsicWidth(), mMinSize); } private int getPreferredHeight() { return Math.max(mDrawable.getIntrinsicHeight(), mMinSize); } public void show() { Loading Loading @@ -3336,7 +3351,8 @@ public class Editor { } final int line = layout.getLineForOffset(offset); mPositionX = (int) (layout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX); mPositionX = (int) (layout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX - getHorizontalOffset() + getCursorOffset()); mPositionY = layout.getLineBottom(line); // Take TextView's padding and scroll into account. Loading Loading @@ -3385,10 +3401,36 @@ public class Editor { @Override protected void onDraw(Canvas c) { mDrawable.setBounds(0, 0, mRight - mLeft, mBottom - mTop); final int drawWidth = mDrawable.getIntrinsicWidth(); final int left = getHorizontalOffset(); mDrawable.setBounds(left, 0, left + drawWidth, mDrawable.getIntrinsicHeight()); mDrawable.draw(c); } private int getHorizontalOffset() { final int width = getPreferredWidth(); final int drawWidth = mDrawable.getIntrinsicWidth(); final int left; switch (mHorizontalGravity) { case Gravity.LEFT: left = 0; break; default: case Gravity.CENTER: left = (width - drawWidth) / 2; break; case Gravity.RIGHT: left = width - drawWidth; break; } return left; } protected int getCursorOffset() { return 0; } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getActionMasked()) { Loading Loading @@ -3507,6 +3549,22 @@ public class Editor { return drawable.getIntrinsicWidth() / 2; } @Override protected int getHorizontalGravity(boolean isRtlRun) { return Gravity.CENTER_HORIZONTAL; } @Override protected int getCursorOffset() { int offset = super.getCursorOffset(); final Drawable cursor = mCursorCount > 0 ? mCursorDrawable[0] : null; if (cursor != null) { cursor.getPadding(mTempRect); offset += (cursor.getIntrinsicWidth() - mTempRect.left - mTempRect.right) / 2; } return offset; } @Override public boolean onTouchEvent(MotionEvent ev) { final boolean result = super.onTouchEvent(ev); Loading Loading @@ -3593,6 +3651,11 @@ public class Editor { } } @Override protected int getHorizontalGravity(boolean isRtlRun) { return isRtlRun ? Gravity.RIGHT : Gravity.LEFT; } @Override public int getCurrentCursorOffset() { return mTextView.getSelectionStart(); Loading Loading @@ -3636,6 +3699,11 @@ public class Editor { } } @Override protected int getHorizontalGravity(boolean isRtlRun) { return isRtlRun ? Gravity.LEFT : Gravity.RIGHT; } @Override public int getCurrentCursorOffset() { return mTextView.getSelectionEnd(); Loading core/res/res/values/dimens.xml +3 −0 Original line number Diff line number Diff line Loading @@ -394,4 +394,7 @@ <dimen name="lock_pattern_dot_line_width">3dp</dimen> <dimen name="lock_pattern_dot_size">12dp</dimen> <dimen name="lock_pattern_dot_size_activated">28dp</dimen> <dimen name="text_handle_min_size">40dp</dimen> </resources> core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1983,4 +1983,5 @@ <java-symbol type="layout" name="select_dialog_singlechoice_material" /> <java-symbol type="layout" name="select_dialog_multichoice_material" /> <java-symbol type="array" name="no_ems_support_sim_operators" /> <java-symbol type="dimen" name="text_handle_min_size" /> </resources> Loading
core/java/android/widget/Editor.java +72 −4 Original line number Diff line number Diff line Loading @@ -3158,6 +3158,7 @@ public class Editor { // Offset from touch position to mPosition private float mTouchToWindowOffsetX, mTouchToWindowOffsetY; protected int mHotspotX; protected int mHorizontalGravity; // Offsets the hotspot point up, so that cursor is not hidden by the finger when moving up private float mTouchOffsetY; // Where the touch position should be on the handle to ensure a maximum cursor visibility Loading @@ -3172,6 +3173,8 @@ public class Editor { private boolean mPositionHasChanged = true; // Used to delay the appearance of the action popup window private Runnable mActionPopupShower; // Minimum touch target size for handles private int mMinSize; public HandleView(Drawable drawableLtr, Drawable drawableRtl) { super(mTextView.getContext()); Loading @@ -3184,10 +3187,12 @@ public class Editor { mDrawableLtr = drawableLtr; mDrawableRtl = drawableRtl; mMinSize = mTextView.getContext().getResources().getDimensionPixelSize( com.android.internal.R.dimen.text_handle_min_size); updateDrawable(); final int handleHeight = mDrawable.getIntrinsicHeight(); final int handleHeight = getPreferredHeight(); mTouchOffsetY = -0.3f * handleHeight; mIdealVerticalOffset = 0.7f * handleHeight; } Loading @@ -3197,9 +3202,11 @@ public class Editor { final boolean isRtlCharAtOffset = mTextView.getLayout().isRtlCharAt(offset); mDrawable = isRtlCharAtOffset ? mDrawableRtl : mDrawableLtr; mHotspotX = getHotspotX(mDrawable, isRtlCharAtOffset); mHorizontalGravity = getHorizontalGravity(isRtlCharAtOffset); } protected abstract int getHotspotX(Drawable drawable, boolean isRtlRun); protected abstract int getHorizontalGravity(boolean isRtlRun); // Touch-up filter: number of previous positions remembered private static final int HISTORY_SIZE = 5; Loading Loading @@ -3244,7 +3251,15 @@ public class Editor { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight()); setMeasuredDimension(getPreferredWidth(), getPreferredHeight()); } private int getPreferredWidth() { return Math.max(mDrawable.getIntrinsicWidth(), mMinSize); } private int getPreferredHeight() { return Math.max(mDrawable.getIntrinsicHeight(), mMinSize); } public void show() { Loading Loading @@ -3336,7 +3351,8 @@ public class Editor { } final int line = layout.getLineForOffset(offset); mPositionX = (int) (layout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX); mPositionX = (int) (layout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX - getHorizontalOffset() + getCursorOffset()); mPositionY = layout.getLineBottom(line); // Take TextView's padding and scroll into account. Loading Loading @@ -3385,10 +3401,36 @@ public class Editor { @Override protected void onDraw(Canvas c) { mDrawable.setBounds(0, 0, mRight - mLeft, mBottom - mTop); final int drawWidth = mDrawable.getIntrinsicWidth(); final int left = getHorizontalOffset(); mDrawable.setBounds(left, 0, left + drawWidth, mDrawable.getIntrinsicHeight()); mDrawable.draw(c); } private int getHorizontalOffset() { final int width = getPreferredWidth(); final int drawWidth = mDrawable.getIntrinsicWidth(); final int left; switch (mHorizontalGravity) { case Gravity.LEFT: left = 0; break; default: case Gravity.CENTER: left = (width - drawWidth) / 2; break; case Gravity.RIGHT: left = width - drawWidth; break; } return left; } protected int getCursorOffset() { return 0; } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getActionMasked()) { Loading Loading @@ -3507,6 +3549,22 @@ public class Editor { return drawable.getIntrinsicWidth() / 2; } @Override protected int getHorizontalGravity(boolean isRtlRun) { return Gravity.CENTER_HORIZONTAL; } @Override protected int getCursorOffset() { int offset = super.getCursorOffset(); final Drawable cursor = mCursorCount > 0 ? mCursorDrawable[0] : null; if (cursor != null) { cursor.getPadding(mTempRect); offset += (cursor.getIntrinsicWidth() - mTempRect.left - mTempRect.right) / 2; } return offset; } @Override public boolean onTouchEvent(MotionEvent ev) { final boolean result = super.onTouchEvent(ev); Loading Loading @@ -3593,6 +3651,11 @@ public class Editor { } } @Override protected int getHorizontalGravity(boolean isRtlRun) { return isRtlRun ? Gravity.RIGHT : Gravity.LEFT; } @Override public int getCurrentCursorOffset() { return mTextView.getSelectionStart(); Loading Loading @@ -3636,6 +3699,11 @@ public class Editor { } } @Override protected int getHorizontalGravity(boolean isRtlRun) { return isRtlRun ? Gravity.LEFT : Gravity.RIGHT; } @Override public int getCurrentCursorOffset() { return mTextView.getSelectionEnd(); Loading
core/res/res/values/dimens.xml +3 −0 Original line number Diff line number Diff line Loading @@ -394,4 +394,7 @@ <dimen name="lock_pattern_dot_line_width">3dp</dimen> <dimen name="lock_pattern_dot_size">12dp</dimen> <dimen name="lock_pattern_dot_size_activated">28dp</dimen> <dimen name="text_handle_min_size">40dp</dimen> </resources>
core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1983,4 +1983,5 @@ <java-symbol type="layout" name="select_dialog_singlechoice_material" /> <java-symbol type="layout" name="select_dialog_multichoice_material" /> <java-symbol type="array" name="no_ems_support_sim_operators" /> <java-symbol type="dimen" name="text_handle_min_size" /> </resources>