Merge "Don't crash after unsetting char[] in TextView" into tm-qpr-dev

This commit is contained in:
Sean McQuillan
2022-07-20 16:05:54 +00:00
committed by Android (Google) Code Review
2 changed files with 26 additions and 6 deletions

View File

@@ -6440,9 +6440,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
public void setText(CharSequence text, BufferType type) { public void setText(CharSequence text, BufferType type) {
setText(text, type, true, 0); setText(text, type, true, 0);
if (mCharWrapper != null) { // drop any potential mCharWrappper leaks
mCharWrapper.mChars = null; mCharWrapper = null;
}
} }
@UnsupportedAppUsage @UnsupportedAppUsage
@@ -6653,11 +6652,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* since the TextView has no way to know that the text * since the TextView has no way to know that the text
* has changed and that it needs to invalidate and re-layout. * has changed and that it needs to invalidate and re-layout.
* *
* @throws NullPointerException if text is null
* @throws IndexOutOfBoundsException if start or start+len are not in 0 to text.length
*
* @param text char array to be displayed * @param text char array to be displayed
* @param start start index in the char array * @param start start index in the char array
* @param len length of char count after {@code start} * @param len length of char count after {@code start}
*/ */
public final void setText(char[] text, int start, int len) { public final void setText(/* @NonNull */ char[] text, int start, int len) {
int oldlen = 0; int oldlen = 0;
if (start < 0 || len < 0 || start + len > text.length) { if (start < 0 || len < 0 || start + len > text.length) {
@@ -13888,16 +13890,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
} }
private static class CharWrapper implements CharSequence, GetChars, GraphicsOperations { private static class CharWrapper implements CharSequence, GetChars, GraphicsOperations {
@NonNull
private char[] mChars; private char[] mChars;
private int mStart, mLength; private int mStart, mLength;
public CharWrapper(char[] chars, int start, int len) { CharWrapper(@NonNull char[] chars, int start, int len) {
mChars = chars; mChars = chars;
mStart = start; mStart = start;
mLength = len; mLength = len;
} }
/* package */ void set(char[] chars, int start, int len) { /* package */ void set(@NonNull char[] chars, int start, int len) {
mChars = chars; mChars = chars;
mStart = start; mStart = start;
mLength = len; mLength = len;

View File

@@ -304,6 +304,23 @@ public class TextViewTest {
assertFalse(mTextView.isCursorVisible()); assertFalse(mTextView.isCursorVisible());
} }
@Test(expected = NullPointerException.class)
@UiThreadTest
public void setTextCharArrayNullThrows() {
mTextView = new TextView(mActivity);
mTextView.setText((char[]) null, 0, 0);
}
@Test
@UiThreadTest
public void setTextCharArrayValidAfterSetTextString() {
mTextView = new TextView(mActivity);
mTextView.setText(new char[] { 'h', 'i'}, 0, 2);
CharSequence charWrapper = mTextView.getText();
mTextView.setText("null out char wrapper");
assertEquals("hi", charWrapper.toString());
}
private String createLongText() { private String createLongText() {
int size = 600 * 1000; int size = 600 * 1000;
final StringBuilder builder = new StringBuilder(size); final StringBuilder builder = new StringBuilder(size);