Merge "Import translations. DO NOT MERGE" into jb-ub-mail-ur8
diff --git a/res/values-sw600dp/dimen.xml b/res/values-sw600dp/dimen.xml
index 61d6cb3..237bfc0 100644
--- a/res/values-sw600dp/dimen.xml
+++ b/res/values-sw600dp/dimen.xml
@@ -43,7 +43,6 @@
     <dimen name="attachment_tile_min_size">180dp</dimen>
     <dimen name="attachment_tile_max_size">254dp</dimen>
     <dimen name="wait_padding">32dp</dimen>
-    <dimen name="folders_left_padding">8dip</dimen>
 
     <dimen name="compose_area_left_padding">80dip</dimen>
     <dimen name="compose_area_right_padding">80dip</dimen>
diff --git a/res/values/dimen.xml b/res/values/dimen.xml
index 1429704..7bbf99f 100644
--- a/res/values/dimen.xml
+++ b/res/values/dimen.xml
@@ -49,7 +49,7 @@
     <dimen name="move_slop">4dip</dimen>
     <dimen name="standard_scaled_dimen">100sp</dimen>
     <dimen name="folder_cell_width">8dip</dimen>
-    <dimen name="folders_left_padding">16dip</dimen>
+    <dimen name="folders_left_padding">4dip</dimen>
     <dimen name="triangle_width">15dip</dimen>
     <dimen name="conversation_page_gutter">16dp</dimen>
     <dimen name="conversation_message_content_margin_side">16dp</dimen>
diff --git a/src/com/android/mail/browse/ConversationItemView.java b/src/com/android/mail/browse/ConversationItemView.java
index 3687606..07392f9 100644
--- a/src/com/android/mail/browse/ConversationItemView.java
+++ b/src/com/android/mail/browse/ConversationItemView.java
@@ -73,6 +73,7 @@
 
 import com.android.mail.ui.DividedImageCanvas;
 import com.android.mail.ui.DividedImageCanvas.InvalidateCallback;
+import com.android.mail.ui.EllipsizedMultilineTextView;
 import com.android.mail.ui.FolderDisplayer;
 import com.android.mail.ui.SwipeableItemView;
 import com.android.mail.ui.SwipeableListView;
@@ -171,7 +172,7 @@
     private String mAccount;
     private ControllableActivity mActivity;
     private int mBackgroundOverride = -1;
-    private TextView mSubjectTextView;
+    private EllipsizedMultilineTextView mSubjectTextView;
     private TextView mSendersTextView;
     private TextView mDateTextView;
     private DividedImageCanvas mContactImagesHolder;
@@ -403,9 +404,10 @@
             sContactPhotoManager = ContactPhotoManager.createContactPhotoManager(context);
         }
 
-        mSubjectTextView = new TextView(mContext);
+        mSubjectTextView = new EllipsizedMultilineTextView(mContext);
         mSubjectTextView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT));
+        mSubjectTextView.setMaxLines(2);
         mSendersTextView = new TextView(mContext);
         mSendersTextView.setMaxLines(1);
         mSendersTextView.setEllipsize(TextUtils.TruncateAt.END);
@@ -679,56 +681,57 @@
         }
     }
 
-    private void createSubject(boolean isUnread, boolean activated) {
-        String subject = filterTag(mHeader.conversation.subject);
+    private void createSubject(final boolean isUnread, boolean activated) {
+        final String subject = filterTag(mHeader.conversation.subject);
         final String snippet = mHeader.conversation.getSnippet();
-        int maxWidth = -1;
+
+        SpannableStringBuilder subjectText = new SpannableStringBuilder(
+                Conversation.getSubjectAndSnippetForDisplay(mContext, subject, snippet));
+        int subjectTextLength = Math.min(subjectText.length(), subject.length());
+             if (!TextUtils.isEmpty(subject)) {
+                 subjectText.setSpan(TextAppearanceSpan.wrap(isUnread ?
+                         sSubjectTextUnreadSpan : sSubjectTextReadSpan), 0, subjectTextLength,
+                         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+             }
+             if (!TextUtils.isEmpty(snippet)) {
+                 final int startOffset = subjectTextLength;
+                 // Start after the end of the subject text; since the subject may be
+                 // "" or null, this could start at the 0th character in the
+                 // subectText string
+                 if (startOffset < subjectText.length()) {
+                     subjectText.setSpan(ForegroundColorSpan.wrap(isUnread ?
+                             sSnippetTextUnreadSpan : sSnippetTextReadSpan), startOffset,
+                             subjectText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                 }
+             }
+             layoutSubject(subjectText);
+    }
+
+
+    private void layoutSubject(SpannableStringBuilder subjectText) {
+        int secondLineMaxWidth = EllipsizedMultilineTextView.ALL_AVAILABLE;
         if (!ConversationItemViewCoordinates.isWideMode(mMode) && mCoordinates.showFolders
                 && mHeader.folderDisplayer != null
                 && mHeader.folderDisplayer.hasVisibleFolders()) {
-            sPaint.setTextSize(mHeader.unread ? sSubjectTextUnreadSpan.getTextSize()
-                    : sSubjectTextReadSpan.getTextSize());
-            sPaint.setTypeface(mHeader.unread ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
-            maxWidth = (mSendersWidth * 2)
-                        - ConversationItemViewCoordinates.getFoldersWidth(mContext, mMode)
-                        - sFoldersLeftPadding;
+            secondLineMaxWidth = mCoordinates.subjectWidth
+                    - Math.min(ConversationItemViewCoordinates.getFoldersWidth(mContext, mMode),
+                            mHeader.folderDisplayer.measureFolders(mMode))
+                    - sFoldersLeftPadding;
         }
-        SpannableStringBuilder subjectText = Conversation.getSubjectAndSnippetForDisplay(mContext,
-                subject, snippet, maxWidth, sPaint);
-        int subjectTextLength = Math.min(subjectText.length(), subject.length());
-        if (!TextUtils.isEmpty(subject)) {
-            subjectText.setSpan(TextAppearanceSpan.wrap(isUnread ?
-                    sSubjectTextUnreadSpan : sSubjectTextReadSpan), 0, subjectTextLength,
-                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        }
-        if (!TextUtils.isEmpty(snippet)) {
-            final int startOffset = subjectTextLength;
-            // Start after the end of the subject text; since the subject may be
-            // "" or null, this could start at the 0th character in the
-            // subectText string
-            if (startOffset < subjectText.length()) {
-                subjectText.setSpan(ForegroundColorSpan.wrap(isUnread ?
-                        sSnippetTextUnreadSpan : sSnippetTextReadSpan), startOffset,
-                        subjectText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-            }
-        }
-        layoutSubject(subjectText);
-    }
-
-    private void layoutSubject(SpannableStringBuilder subjectText) {
-        TextView subjectLayout = mSubjectTextView;
+        EllipsizedMultilineTextView subjectLayout = mSubjectTextView;
         int subjectWidth = mCoordinates.subjectWidth;
-        int subjectHeight = (int) (subjectLayout.getLineHeight() * 2 + sPaint.descent());
+        int subjectHeight = (int) (subjectLayout.getLineHeight() * 2 + subjectLayout.getPaint()
+                .descent());
         if (isActivated() && showActivatedText()) {
             subjectText.setSpan(sActivatedTextSpan, 0, subjectText.length(),
                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
         } else {
             subjectText.removeSpan(sActivatedTextSpan);
         }
-        subjectLayout.setText(subjectText, TextView.BufferType.SPANNABLE);
         subjectLayout.measure(MeasureSpec.makeMeasureSpec(subjectWidth, MeasureSpec.EXACTLY),
                 subjectHeight);
         subjectLayout.layout(0, 0, subjectWidth, subjectHeight);
+        subjectLayout.setText(subjectText, secondLineMaxWidth);
     }
 
     /**
diff --git a/src/com/android/mail/providers/Conversation.java b/src/com/android/mail/providers/Conversation.java
index 1554927..27121d8 100644
--- a/src/com/android/mail/providers/Conversation.java
+++ b/src/com/android/mail/providers/Conversation.java
@@ -23,9 +23,7 @@
 import android.os.Parcelable;
 import android.provider.BaseColumns;
 import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
 import android.text.TextUtils;
-import android.text.TextUtils.TruncateAt;
 
 import com.android.mail.R;
 import com.android.mail.providers.UIProvider.ConversationColumns;
@@ -531,27 +529,14 @@
      * @param context
      * @param filteredSubject
      * @param snippet
-     * @param maxChars Supply max characters the returned string can have, or -1
-     *            if there is no limit
      */
-    public static SpannableStringBuilder getSubjectAndSnippetForDisplay(Context context,
-            String filteredSubject, String snippet, int avail, TextPaint paint) {
+    public static String getSubjectAndSnippetForDisplay(Context context,
+            String filteredSubject, String snippet) {
         if (sSubjectAndSnippet == null) {
             sSubjectAndSnippet = context.getString(R.string.subject_and_snippet);
         }
-        String subjectText = (!TextUtils.isEmpty(snippet)) ?
+        return (!TextUtils.isEmpty(snippet)) ?
                 String.format(sSubjectAndSnippet, filteredSubject, snippet)
                 : filteredSubject;
-        SpannableStringBuilder builder = new SpannableStringBuilder();
-        if (avail != -1) {
-            CharSequence ellipsizedText = TextUtils.ellipsize(subjectText, paint, avail,
-                    TruncateAt.END);
-            if (!TextUtils.isEmpty(ellipsizedText)) {
-                builder.append(ellipsizedText, 0, ellipsizedText.length() - 1);
-            }
-        } else {
-            builder.append(subjectText);
-        }
-        return builder;
     }
 }
diff --git a/src/com/android/mail/ui/EllipsizedMultilineTextView.java b/src/com/android/mail/ui/EllipsizedMultilineTextView.java
new file mode 100644
index 0000000..9d2746d
--- /dev/null
+++ b/src/com/android/mail/ui/EllipsizedMultilineTextView.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Licensed to The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mail.ui;
+
+import android.content.Context;
+import android.text.Layout;
+import android.text.SpannableStringBuilder;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+/**
+ * A special MultiLine TextView that will apply ellipsize logic to only the last
+ * line of text, such that the last line may be shorter than any previous lines.
+ */
+public class EllipsizedMultilineTextView extends TextView {
+
+    public static final int ALL_AVAILABLE = -1;
+    private int mMaxLines;
+    private int mLastWSpec;
+    private int mLastHSpec;
+
+    public EllipsizedMultilineTextView(Context context) {
+        this(context, null);
+    }
+
+    public EllipsizedMultilineTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public void setMaxLines(int maxlines) {
+        super.setMaxLines(maxlines);
+        mMaxLines = maxlines;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        mLastWSpec = widthMeasureSpec;
+        mLastHSpec = heightMeasureSpec;
+    }
+
+    /**
+     * Ellipsize just the last line of text in this view and set the text to the
+     * new ellipsized value.
+     * @param text Text to set and ellipsize
+     * @param avail available width in pixels for the last line
+     * @param paint Paint that has the proper properties set to measure the text
+     *            for this view
+     */
+    public void setText(final CharSequence text, int avail) {
+        if (text == null || text.length() == 0) {
+            return;
+        }
+
+        setEllipsize(null);
+        setText(text, TextView.BufferType.SPANNABLE);
+
+        if (avail == ALL_AVAILABLE) {
+            return;
+        }
+        Layout layout = getLayout();
+
+        if (layout == null) {
+            measure(mLastWSpec, mLastHSpec);
+            layout = getLayout();
+        }
+
+        if (layout == null) {
+            // Bail
+            return;
+        }
+
+        CharSequence remainder;
+        SpannableStringBuilder builder = new SpannableStringBuilder();
+        int lineCount = layout.getLineCount();
+        if (lineCount <= mMaxLines) {
+            remainder = null;
+        } else {
+            remainder = TextUtils.ellipsize(
+                    text.subSequence(layout.getLineStart(mMaxLines - 1), text.length()),
+                    getPaint(), avail, TextUtils.TruncateAt.END);
+        }
+
+        builder.append(text, 0, layout.getLineStart(mMaxLines - 1));
+        if (!TextUtils.isEmpty(remainder) && remainder.length() > 1) {
+            builder.append(remainder, 0, remainder.length() - 1);
+        }
+        setText(builder, TextView.BufferType.SPANNABLE);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/mail/widget/WidgetConversationViewBuilder.java b/src/com/android/mail/widget/WidgetConversationViewBuilder.java
index a3e25b7..6c30570 100644
--- a/src/com/android/mail/widget/WidgetConversationViewBuilder.java
+++ b/src/com/android/mail/widget/WidgetConversationViewBuilder.java
@@ -158,8 +158,8 @@
 
         // Add style to subject
         int subjectColor = isUnread ? SUBJECT_TEXT_COLOR_UNREAD : SUBJECT_TEXT_COLOR_READ;
-        SpannableStringBuilder subjectAndSnippet = Conversation.getSubjectAndSnippetForDisplay(
-                mContext, filteredSubject, snippet, -1, null);
+        SpannableStringBuilder subjectAndSnippet = new SpannableStringBuilder(
+                Conversation.getSubjectAndSnippetForDisplay(mContext, filteredSubject, snippet));
         if (isUnread) {
             subjectAndSnippet.setSpan(new StyleSpan(Typeface.BOLD), 0, filteredSubject.length(),
                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);