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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19340644

Change-Id: Id975fe1ef50e8bab6a0ac851eab071b3f246c2ae
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Sean McQuillan
2022-07-20 16:22:58 +00:00
committed by Automerger Merge Worker
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) {
setText(text, type, true, 0);
if (mCharWrapper != null) {
mCharWrapper.mChars = null;
}
// drop any potential mCharWrappper leaks
mCharWrapper = null;
}
@UnsupportedAppUsage
@@ -6653,11 +6652,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* since the TextView has no way to know that the text
* 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 start start index in the char array
* @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;
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 {
@NonNull
private char[] mChars;
private int mStart, mLength;
public CharWrapper(char[] chars, int start, int len) {
CharWrapper(@NonNull char[] chars, int start, int len) {
mChars = chars;
mStart = start;
mLength = len;
}
/* package */ void set(char[] chars, int start, int len) {
/* package */ void set(@NonNull char[] chars, int start, int len) {
mChars = chars;
mStart = start;
mLength = len;

View File

@@ -304,6 +304,23 @@ public class TextViewTest {
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() {
int size = 600 * 1000;
final StringBuilder builder = new StringBuilder(size);