Merge "Don't crash after unsetting char[] in TextView" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
469768f559
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user