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);