Loading core/java/android/widget/TextView.java +26 −3 Original line number Diff line number Diff line Loading @@ -282,6 +282,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private boolean mPreDrawRegistered; // A flag to prevent repeated movements from escaping the enclosing text view. The idea here is // that if a user is holding down a movement key to traverse text, we shouldn't also traverse // the view hierarchy. On the other hand, if the user is using the movement key to traverse views // (i.e. the first movement was to traverse out of this view, or this view was traversed into by // the user holding the movement key down) then we shouldn't prevent the focus from changing. private boolean mPreventDefaultMovement; private TextUtils.TruncateAt mEllipsize; static class Drawables { Loading Loading @@ -5229,7 +5236,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onKeyDown(int keyCode, KeyEvent event) { int which = doKeyDown(keyCode, event, null); if (which == 0) { // Go through default dispatching. return super.onKeyDown(keyCode, event); } Loading Loading @@ -5327,6 +5333,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return 0; } // If this is the initial keydown, we don't want to prevent a movement away from this view. // While this shouldn't be necessary because any time we're preventing default movement we // should be restricting the focus to remain within this view, thus we'll also receive // the key up event, occasionally key up events will get dropped and we don't want to // prevent the user from traversing out of this on the next key down. if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) { mPreventDefaultMovement = false; } switch (keyCode) { case KeyEvent.KEYCODE_ENTER: if (event.hasNoModifiers()) { Loading Loading @@ -5435,12 +5450,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } if (doDown) { if (mMovement.onKeyDown(this, (Spannable)mText, keyCode, event)) if (mMovement.onKeyDown(this, (Spannable)mText, keyCode, event)) { if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) { mPreventDefaultMovement = true; } return 2; } } } return 0; return mPreventDefaultMovement && !KeyEvent.isModifierKey(keyCode) ? -1 : 0; } /** Loading Loading @@ -5473,6 +5492,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return super.onKeyUp(keyCode, event); } if (!KeyEvent.isModifierKey(keyCode)) { mPreventDefaultMovement = false; } switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: if (event.hasNoModifiers()) { Loading Loading
core/java/android/widget/TextView.java +26 −3 Original line number Diff line number Diff line Loading @@ -282,6 +282,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private boolean mPreDrawRegistered; // A flag to prevent repeated movements from escaping the enclosing text view. The idea here is // that if a user is holding down a movement key to traverse text, we shouldn't also traverse // the view hierarchy. On the other hand, if the user is using the movement key to traverse views // (i.e. the first movement was to traverse out of this view, or this view was traversed into by // the user holding the movement key down) then we shouldn't prevent the focus from changing. private boolean mPreventDefaultMovement; private TextUtils.TruncateAt mEllipsize; static class Drawables { Loading Loading @@ -5229,7 +5236,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onKeyDown(int keyCode, KeyEvent event) { int which = doKeyDown(keyCode, event, null); if (which == 0) { // Go through default dispatching. return super.onKeyDown(keyCode, event); } Loading Loading @@ -5327,6 +5333,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return 0; } // If this is the initial keydown, we don't want to prevent a movement away from this view. // While this shouldn't be necessary because any time we're preventing default movement we // should be restricting the focus to remain within this view, thus we'll also receive // the key up event, occasionally key up events will get dropped and we don't want to // prevent the user from traversing out of this on the next key down. if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) { mPreventDefaultMovement = false; } switch (keyCode) { case KeyEvent.KEYCODE_ENTER: if (event.hasNoModifiers()) { Loading Loading @@ -5435,12 +5450,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } if (doDown) { if (mMovement.onKeyDown(this, (Spannable)mText, keyCode, event)) if (mMovement.onKeyDown(this, (Spannable)mText, keyCode, event)) { if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) { mPreventDefaultMovement = true; } return 2; } } } return 0; return mPreventDefaultMovement && !KeyEvent.isModifierKey(keyCode) ? -1 : 0; } /** Loading Loading @@ -5473,6 +5492,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return super.onKeyUp(keyCode, event); } if (!KeyEvent.isModifierKey(keyCode)) { mPreventDefaultMovement = false; } switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: if (event.hasNoModifiers()) { Loading