Loading core/java/android/widget/TextView.java +15 −9 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.annotation.Nullable; import android.annotation.StringRes; import android.annotation.StringRes; import android.annotation.StyleRes; import android.annotation.StyleRes; import android.annotation.XmlRes; import android.annotation.XmlRes; import android.app.Activity; import android.content.ClipData; import android.content.ClipData; import android.content.ClipboardManager; import android.content.ClipboardManager; import android.content.Context; import android.content.Context; Loading Loading @@ -1465,18 +1466,24 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PROCESS_TEXT_REQUEST_CODE) { if (requestCode == PROCESS_TEXT_REQUEST_CODE) { CharSequence result = data != null if (resultCode == Activity.RESULT_OK && data != null) { ? data.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT) CharSequence result = data.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT); : ""; if (result != null) { if (isTextEditable()) { if (isTextEditable()) { replaceSelectionWithText(result); replaceSelectionWithText(result); } else { } else { if (result.length() > 0) { if (result.length() > 0) { Toast.makeText(getContext(), String.valueOf(result), Toast.LENGTH_LONG).show(); Toast.makeText(getContext(), String.valueOf(result), Toast.LENGTH_LONG) .show(); } } } } } } } } if (mEditor.hasSelectionController()) { mEditor.startSelectionActionModeWithSelection(); } } } private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) { private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) { Typeface tf = null; Typeface tf = null; Loading Loading @@ -9279,7 +9286,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener void replaceSelectionWithText(CharSequence text) { void replaceSelectionWithText(CharSequence text) { ((Editable) mText).replace(getSelectionStart(), getSelectionEnd(), text); ((Editable) mText).replace(getSelectionStart(), getSelectionEnd(), text); mEditor.startSelectionActionModeWithSelection(); } } /** /** Loading core/tests/coretests/src/android/widget/TextViewTest.java +66 −0 Original line number Original line Diff line number Diff line Loading @@ -16,9 +16,13 @@ package android.widget; package android.widget; import android.app.Activity; import android.content.Intent; import android.test.AndroidTestCase; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest; import android.text.GetChars; import android.text.GetChars; import android.text.Selection; import android.text.Spannable; /** /** * TextViewTest tests {@link TextView}. * TextViewTest tests {@link TextView}. Loading Loading @@ -54,4 +58,66 @@ public class TextViewTest extends AndroidTestCase { assertEquals('o', c2[4]); assertEquals('o', c2[4]); assertEquals('\0', c2[5]); assertEquals('\0', c2[5]); } } public void testProcessTextActivityResultNonEditable() { TextView tv = new TextView(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection((Spannable) tv.getText(), 0, tv.getText().length()); CharSequence newText = "Text is replaced."; Intent data = new Intent(); data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data); // This is a TextView, which can't be modified. Hence no change should have been made. assertEquals(originalText, tv.getText().toString()); } public void testProcessTextActivityResultEditable() { EditText tv = new EditText(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection(tv.getText(), 0, tv.getText().length()); CharSequence newText = "Text is replaced."; Intent data = new Intent(); data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data); assertEquals(newText, tv.getText().toString()); } public void testProcessTextActivityResultCancel() { EditText tv = new EditText(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection(tv.getText(), 0, tv.getText().length()); CharSequence newText = "Text is replaced."; Intent data = new Intent(); data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_CANCELED, data); assertEquals(originalText, tv.getText().toString()); } public void testProcessTextActivityNoData() { EditText tv = new EditText(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection(tv.getText(), 0, tv.getText().length()); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, null); assertEquals(originalText, tv.getText().toString()); } } } Loading
core/java/android/widget/TextView.java +15 −9 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.annotation.Nullable; import android.annotation.StringRes; import android.annotation.StringRes; import android.annotation.StyleRes; import android.annotation.StyleRes; import android.annotation.XmlRes; import android.annotation.XmlRes; import android.app.Activity; import android.content.ClipData; import android.content.ClipData; import android.content.ClipboardManager; import android.content.ClipboardManager; import android.content.Context; import android.content.Context; Loading Loading @@ -1465,18 +1466,24 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PROCESS_TEXT_REQUEST_CODE) { if (requestCode == PROCESS_TEXT_REQUEST_CODE) { CharSequence result = data != null if (resultCode == Activity.RESULT_OK && data != null) { ? data.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT) CharSequence result = data.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT); : ""; if (result != null) { if (isTextEditable()) { if (isTextEditable()) { replaceSelectionWithText(result); replaceSelectionWithText(result); } else { } else { if (result.length() > 0) { if (result.length() > 0) { Toast.makeText(getContext(), String.valueOf(result), Toast.LENGTH_LONG).show(); Toast.makeText(getContext(), String.valueOf(result), Toast.LENGTH_LONG) .show(); } } } } } } } } if (mEditor.hasSelectionController()) { mEditor.startSelectionActionModeWithSelection(); } } } private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) { private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) { Typeface tf = null; Typeface tf = null; Loading Loading @@ -9279,7 +9286,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener void replaceSelectionWithText(CharSequence text) { void replaceSelectionWithText(CharSequence text) { ((Editable) mText).replace(getSelectionStart(), getSelectionEnd(), text); ((Editable) mText).replace(getSelectionStart(), getSelectionEnd(), text); mEditor.startSelectionActionModeWithSelection(); } } /** /** Loading
core/tests/coretests/src/android/widget/TextViewTest.java +66 −0 Original line number Original line Diff line number Diff line Loading @@ -16,9 +16,13 @@ package android.widget; package android.widget; import android.app.Activity; import android.content.Intent; import android.test.AndroidTestCase; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest; import android.text.GetChars; import android.text.GetChars; import android.text.Selection; import android.text.Spannable; /** /** * TextViewTest tests {@link TextView}. * TextViewTest tests {@link TextView}. Loading Loading @@ -54,4 +58,66 @@ public class TextViewTest extends AndroidTestCase { assertEquals('o', c2[4]); assertEquals('o', c2[4]); assertEquals('\0', c2[5]); assertEquals('\0', c2[5]); } } public void testProcessTextActivityResultNonEditable() { TextView tv = new TextView(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection((Spannable) tv.getText(), 0, tv.getText().length()); CharSequence newText = "Text is replaced."; Intent data = new Intent(); data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data); // This is a TextView, which can't be modified. Hence no change should have been made. assertEquals(originalText, tv.getText().toString()); } public void testProcessTextActivityResultEditable() { EditText tv = new EditText(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection(tv.getText(), 0, tv.getText().length()); CharSequence newText = "Text is replaced."; Intent data = new Intent(); data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data); assertEquals(newText, tv.getText().toString()); } public void testProcessTextActivityResultCancel() { EditText tv = new EditText(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection(tv.getText(), 0, tv.getText().length()); CharSequence newText = "Text is replaced."; Intent data = new Intent(); data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_CANCELED, data); assertEquals(originalText, tv.getText().toString()); } public void testProcessTextActivityNoData() { EditText tv = new EditText(mContext); CharSequence originalText = "This is some text."; tv.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, tv.getText().toString()); tv.setTextIsSelectable(true); Selection.setSelection(tv.getText(), 0, tv.getText().length()); tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, null); assertEquals(originalText, tv.getText().toString()); } } }