Implement workaround for issues in staticlayout.

There is some bug that is not keeping text on 1 line
and not ellipsizing (http://b/issue?id=6954231)

Using a textview to explicitly set maxlines == 1
Fixes b/7002058 Conversation list overwriting lines when font size is "Large"
since this bug existed as of late in ICS, and we need to support all the way
back to HC, we need to use a workaround here.

Change-Id: Id3523a115f9e23ec7697fa9cc5f711cb29143942
diff --git a/res/values/dimen.xml b/res/values/dimen.xml
index 610b73b..d211baf 100644
--- a/res/values/dimen.xml
+++ b/res/values/dimen.xml
@@ -99,4 +99,6 @@
     <dimen name="toast_bar_bottom_margin_in_conversation">24dip</dimen>
     <dimen name="undo_animation_offset">360dp</dimen>
     <dimen name="wait_padding">16dp</dimen>
+    <dimen name="senders_textview_top_padding">-4dp</dimen>
+    <dimen name="senders_textview_height">30dp</dimen>
 </resources>
diff --git a/src/com/android/mail/browse/ConversationItemView.java b/src/com/android/mail/browse/ConversationItemView.java
index 3aab551..53251d7 100644
--- a/src/com/android/mail/browse/ConversationItemView.java
+++ b/src/com/android/mail/browse/ConversationItemView.java
@@ -47,10 +47,14 @@
 import android.text.style.ForegroundColorSpan;
 import android.text.style.StyleSpan;
 import android.util.SparseArray;
+import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
 import android.view.animation.DecelerateInterpolator;
 import android.widget.ListView;
+import android.widget.TextView;
 
 import com.android.mail.R;
 import com.android.mail.browse.ConversationItemViewModel.SenderFragment;
@@ -162,6 +166,8 @@
     private ControllableActivity mActivity;
     private CharacterStyle mActivatedTextSpan;
     private int mBackgroundOverride = -1;
+    private static int sSendersTextViewTopPadding;
+    private static int sSendersTextViewHeight;
     private static ForegroundColorSpan sActivatedTextSpan;
     private static Bitmap sDateBackgroundAttachment;
     private static Bitmap sDateBackgroundNoAttachment;
@@ -368,6 +374,10 @@
             sElidedPaddingToken = res.getString(R.string.elided_padding_token);
             sEllipsis = res.getString(R.string.ellipsis);
             sAnimatingBackgroundColor = res.getColor(R.color.animating_item_background_color);
+            sSendersTextViewTopPadding = res.getDimensionPixelSize
+                    (R.dimen.senders_textview_top_padding);
+            sSendersTextViewHeight = res.getDimensionPixelSize
+                    (R.dimen.senders_textview_height);
         }
     }
 
@@ -585,11 +595,19 @@
         } else {
             mHeader.styledSendersString.removeSpan(mActivatedTextSpan);
         }
+        mHeader.sendersTextView = getSendersTextView();
+    }
+
+    private TextView getSendersTextView() {
+        TextView sendersTextView = new TextView(mContext);
+        sendersTextView.setMaxLines(1);
+        sendersTextView.setEllipsize(TextUtils.TruncateAt.END);
+        sendersTextView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT));
         int length = (int) sPaint.measureText(mHeader.styledSendersString.toString());
-        mHeader.sendersDisplayLayout = new StaticLayout(mHeader.styledSendersString, 0,
-                mHeader.styledSendersString.length(), sPaint,
-                length,
-                Alignment.ALIGN_NORMAL, 1, 0, true, TextUtils.TruncateAt.END, length);
+        sendersTextView.setText(mHeader.styledSendersString, TextView.BufferType.SPANNABLE);
+        sendersTextView.setWidth(length);
+        return sendersTextView;
     }
 
     private CharacterStyle getActivatedTextSpan() {
@@ -962,21 +980,24 @@
         // Senders.
         boolean isUnread = mHeader.unread;
         // Old style senders; apply text colors/ sizes/ styling.
-        if (mHeader.senderFragments.size() > 0) {
+        canvas.save();
+        if (mHeader.sendersDisplayLayout != null) {
             sPaint.setTextSize(mCoordinates.sendersFontSize);
             sPaint.setTypeface(SendersView.getTypeface(isUnread));
-            int sendersColor = getFontColor(isUnread ? sSendersTextColorUnread
-                    : sSendersTextColorRead);
-            sPaint.setColor(sendersColor);
+            sPaint.setColor(getFontColor(isUnread ? sSendersTextColorUnread
+                    : sSendersTextColorRead));
+            canvas.translate(mCoordinates.sendersX,
+                    mCoordinates.sendersY + mHeader.sendersDisplayLayout.getTopPadding());
+            mHeader.sendersDisplayLayout.draw(canvas);
         } else {
-            sPaint.setTextSize(mCoordinates.sendersFontSize);
+            canvas.translate(mCoordinates.sendersX,
+                    mCoordinates.sendersY + sSendersTextViewTopPadding);
+            mHeader.sendersTextView.layout(0, 0, mSendersWidth, sSendersTextViewHeight);
+            mHeader.sendersTextView.draw(canvas);
         }
-        canvas.save();
-        canvas.translate(mCoordinates.sendersX,
-                mCoordinates.sendersY + mHeader.sendersDisplayLayout.getTopPadding());
-        mHeader.sendersDisplayLayout.draw(canvas);
         canvas.restore();
 
+
         // Subject.
         sPaint.setTextSize(mCoordinates.subjectFontSize);
         sPaint.setTypeface(Typeface.DEFAULT);
diff --git a/src/com/android/mail/browse/ConversationItemViewModel.java b/src/com/android/mail/browse/ConversationItemViewModel.java
index 44227e3..22d17a8 100644
--- a/src/com/android/mail/browse/ConversationItemViewModel.java
+++ b/src/com/android/mail/browse/ConversationItemViewModel.java
@@ -33,6 +33,7 @@
 import android.text.style.CharacterStyle;
 import android.util.LruCache;
 import android.util.Pair;
+import android.widget.TextView;
 
 import com.android.mail.R;
 import com.android.mail.providers.Conversation;
@@ -130,6 +131,8 @@
 
     private String mContentDescription;
 
+    public TextView sendersTextView;
+
     /**
      * Returns the view model for a conversation. If the model doesn't exist for this conversation
      * null is returned. Note: this should only be called from the UI thread.