Plug memory leak in EditText.

Change-Id: I0b42c23ceeaa958d02255945c35ff6807c177114
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index cb96969..2c78679 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -274,8 +274,11 @@
             sStaticLayout = null;
         }
 
-        if (reflowed == null)
+        if (reflowed == null) {
             reflowed = new StaticLayout(true);
+        } else {
+            reflowed.prepare();
+        }
 
         reflowed.generate(text, where, where + after,
                 getPaint(), getWidth(), getAlignment(), getTextDirectionHeuristic(),
@@ -356,6 +359,7 @@
 
         synchronized (sLock) {
             sStaticLayout = reflowed;
+            reflowed.finish();
         }
     }
 
@@ -485,7 +489,7 @@
     private int mTopPadding, mBottomPadding;
 
     private static StaticLayout sStaticLayout = new StaticLayout(true);
-    private static Object sLock = new Object();
+    private static final Object[] sLock = new Object[0];
 
     private static final int START = 0;
     private static final int DIR = START;
diff --git a/core/java/android/text/MeasuredText.java b/core/java/android/text/MeasuredText.java
index 2920ac5..c184c11 100644
--- a/core/java/android/text/MeasuredText.java
+++ b/core/java/android/text/MeasuredText.java
@@ -29,14 +29,15 @@
  */
 class MeasuredText {
     private static final boolean localLOGV = false;
-    /* package */ CharSequence mText;
-    /* package */ int mTextStart;
-    /* package */ float[] mWidths;
-    /* package */ char[] mChars;
-    /* package */ byte[] mLevels;
-    /* package */ int mDir;
-    /* package */ boolean mEasy;
-    /* package */ int mLen;
+    CharSequence mText;
+    int mTextStart;
+    float[] mWidths;
+    char[] mChars;
+    byte[] mLevels;
+    int mDir;
+    boolean mEasy;
+    int mLen;
+
     private int mPos;
     private TextPaint mWorkPaint;
 
@@ -44,16 +45,16 @@
         mWorkPaint = new TextPaint();
     }
 
-    private static MeasuredText[] cached = new MeasuredText[3];
+    private static final Object[] sLock = new Object[0];
+    private static MeasuredText[] sCached = new MeasuredText[3];
 
-    /* package */
     static MeasuredText obtain() {
         MeasuredText mt;
-        synchronized (cached) {
-            for (int i = cached.length; --i >= 0;) {
-                if (cached[i] != null) {
-                    mt = cached[i];
-                    cached[i] = null;
+        synchronized (sLock) {
+            for (int i = sCached.length; --i >= 0;) {
+                if (sCached[i] != null) {
+                    mt = sCached[i];
+                    sCached[i] = null;
                     return mt;
                 }
             }
@@ -65,14 +66,14 @@
         return mt;
     }
 
-    /* package */
     static MeasuredText recycle(MeasuredText mt) {
         mt.mText = null;
         if (mt.mLen < 1000) {
-            synchronized(cached) {
-                for (int i = 0; i < cached.length; ++i) {
-                    if (cached[i] == null) {
-                        cached[i] = mt;
+            synchronized(sLock) {
+                for (int i = 0; i < sCached.length; ++i) {
+                    if (sCached[i] == null) {
+                        sCached[i] = mt;
+                        mt.mText = null;
                         break;
                     }
                 }
@@ -84,7 +85,6 @@
     /**
      * Analyzes text for bidirectional runs.  Allocates working buffers.
      */
-    /* package */
     void setPara(CharSequence text, int start, int end, TextDirectionHeuristic textDir) {
         mText = text;
         mTextStart = start;
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index f7b9502..14c71b2 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -923,6 +923,14 @@
     public void setMaximumVisibleLineCount(int lineCount) {
         mMaximumVisibleLineCount = lineCount;
     }
+    
+    void prepare() {
+        mMeasured = MeasuredText.obtain();
+    }
+    
+    void finish() {
+        mMeasured = MeasuredText.recycle(mMeasured);
+    }
 
     private int mLineCount;
     private int mTopPadding, mBottomPadding;