1eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein/* 2eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * Copyright (C) 2012 Google Inc. 3eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * Licensed to The Android Open Source Project. 4eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * 5eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 6eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * you may not use this file except in compliance with the License. 7eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * You may obtain a copy of the License at 8eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * 9eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 10eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * 11eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software 12eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 13eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * See the License for the specific language governing permissions and 15eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * limitations under the License. 16eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein */ 17eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 18eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinpackage com.android.mail.browse; 19eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 20eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.content.Context; 21eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.content.res.Resources; 22eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.graphics.drawable.Drawable; 23eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.support.v4.text.BidiFormatter; 24eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.Layout; 25eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.Spannable; 26eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.SpannableStringBuilder; 27eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.Spanned; 28eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.method.LinkMovementMethod; 29eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.style.BackgroundColorSpan; 30eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.style.DynamicDrawableSpan; 31eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.text.style.ForegroundColorSpan; 32eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.util.AttributeSet; 33eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport android.widget.TextView; 34eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 35eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.R; 36eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.browse.ConversationViewHeader.ConversationViewHeaderCallbacks; 37eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.providers.Account; 38eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.providers.Conversation; 39eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.providers.Folder; 40eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.providers.Settings; 41eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.text.ChangeLabelsSpan; 42eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.ui.FolderDisplayer; 43eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinimport com.android.mail.utils.ViewUtils; 44eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 45eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein/** 46eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * A TextView that displays the conversation subject and list of folders for the message. 47eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * The view knows the widest that any of its containing {@link FolderSpan}s can be. 48eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * They cannot exceed the TextView line width, or else {@link Layout} 49eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein * will split up the spans in strange places. 50eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein */ 51eb58a092961773a8da67c0e0dd5770346381d938Andrew Sappersteinpublic class SubjectAndFolderView extends TextView 52eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein implements FolderSpan.FolderSpanDimensions { 53eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 54eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private final int mFolderPadding; 55eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private final int mFolderPaddingExtraWidth; 56eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private final int mFolderPaddingAfter; 57eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private final int mRoundedCornerRadius; 58eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private final float mFolderSpanTextSize; 59eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private final int mFolderMarginTop; 60eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 61eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private int mMaxSpanWidth; 62eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 63eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private ConversationFolderDisplayer mFolderDisplayer; 64eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 65eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private String mSubject; 66eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 67eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private boolean mVisibleFolders; 68eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 69eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private ConversationViewAdapter.ConversationHeaderItem mHeaderItem; 70eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 71eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private BidiFormatter mBidiFormatter; 72eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 73eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public SubjectAndFolderView(Context context) { 74eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein this(context, null); 75eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 76eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 77eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public SubjectAndFolderView(Context context, AttributeSet attrs) { 78eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein super(context, attrs); 79eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 80eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mVisibleFolders = false; 81eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderDisplayer = new ConversationFolderDisplayer(getContext(), this); 82eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 83eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final Resources r = getResources(); 84eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderPadding = r.getDimensionPixelOffset(R.dimen.conversation_folder_padding); 85eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderPaddingExtraWidth = r.getDimensionPixelOffset( 86eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein R.dimen.conversation_folder_padding_extra_width); 87eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderPaddingAfter = r.getDimensionPixelOffset( 88eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein R.dimen.conversation_folder_padding_after); 89eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mRoundedCornerRadius = r.getDimensionPixelOffset( 9064f56828a81ad7e29cad3a254a6ecdc05c9284e8James Lemieux R.dimen.folder_rounded_corner_radius); 91eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderSpanTextSize = r.getDimension(R.dimen.conversation_folder_font_size); 92eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderMarginTop = r.getDimensionPixelOffset(R.dimen.conversation_folder_margin_top); 93eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 94eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 95eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 96eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 97eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mMaxSpanWidth = MeasureSpec.getSize(widthMeasureSpec) - getTotalPaddingLeft() 98eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein - getTotalPaddingRight(); 99eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 100eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein super.onMeasure(widthMeasureSpec, heightMeasureSpec); 101eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 102eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 103eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 104eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public int getPadding() { 105eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mFolderPadding; 106eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 107eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 108eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 109eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public int getPaddingExtraWidth() { 110eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mFolderPaddingExtraWidth; 111eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 112eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 113eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 114eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public int getPaddingAfter() { 115eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mFolderPaddingAfter; 116eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 117eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 118eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 119eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public int getMaxWidth() { 120eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mMaxSpanWidth; 121eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 122eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 123eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 124eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public float getRoundedCornerRadius() { 125eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mRoundedCornerRadius; 126eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 127eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 128eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 129eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public float getFolderSpanTextSize() { 130eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mFolderSpanTextSize; 131eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 132eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 133eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 134eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public int getMarginTop() { 135eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mFolderMarginTop; 136eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 137eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 138eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 139eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public boolean isRtl() { 140eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return ViewUtils.isViewRtl(this); 141eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 142eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 143eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public void setSubject(String subject) { 14494033deeb31df739a27fce15887a3f0a2e808b12James Lemieux mSubject = Conversation.getSubjectForDisplay(getContext(), null /* badgeText */, subject); 145eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 146eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein if (!mVisibleFolders) { 147eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein setText(mSubject); 148eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 149eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 150eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 151eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public void setFolders( 152eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein ConversationViewHeaderCallbacks callbacks, Account account, Conversation conv) { 153eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mVisibleFolders = true; 154eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final BidiFormatter bidiFormatter = getBidiFormatter(); 155eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final SpannableStringBuilder sb = 156eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein new SpannableStringBuilder(bidiFormatter.unicodeWrap(mSubject)); 157eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.append('\u0020'); 158eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final Settings settings = account.settings; 159eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int start = sb.length(); 160eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein if (settings.importanceMarkersEnabled && conv.isImportant()) { 161eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.append(".\u0020"); 162eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.setSpan(new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE) { 163eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein @Override 164eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public Drawable getDrawable() { 165eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein Drawable d = getContext().getResources().getDrawable( 166eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein R.drawable.ic_email_caret_none_important_unread); 167eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 168eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return d; 169eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 170eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein }, 171eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein start, start + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 172eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 173eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 174eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderDisplayer.loadConversationFolders(conv, null /* ignoreFolder */, 175eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein -1 /* ignoreFolderType */); 176eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mFolderDisplayer.appendFolderSpans(sb, bidiFormatter); 177eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 178eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int end = sb.length(); 179eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.setSpan(new ChangeLabelsSpan(callbacks), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 180eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 181eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein setText(sb); 182eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein setMovementMethod(LinkMovementMethod.getInstance()); 183eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 184eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 185eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public void bind(ConversationViewAdapter.ConversationHeaderItem headerItem) { 186eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mHeaderItem = headerItem; 187eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 188eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 189eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private BidiFormatter getBidiFormatter() { 190eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein if (mBidiFormatter == null) { 191eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final ConversationViewAdapter adapter = mHeaderItem != null 192eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein ? mHeaderItem.getAdapter() : null; 193eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein if (adapter == null) { 194eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mBidiFormatter = BidiFormatter.getInstance(); 195eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } else { 196eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mBidiFormatter = adapter.getBidiFormatter(); 197eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 198eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 199eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein return mBidiFormatter; 200eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 201eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 202eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private static class ConversationFolderDisplayer extends FolderDisplayer { 203eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 204eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private final FolderSpan.FolderSpanDimensions mDims; 205eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 206eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public ConversationFolderDisplayer(Context context, FolderSpan.FolderSpanDimensions dims) { 207eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein super(context); 208eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein mDims = dims; 209eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 210eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 211eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein public void appendFolderSpans(SpannableStringBuilder sb, BidiFormatter bidiFormatter) { 212eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein for (final Folder f : mFoldersSortedSet) { 213eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int bgColor = f.getBackgroundColor(mDefaultBgColor); 214eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int fgColor = f.getForegroundColor(mDefaultFgColor); 215eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein addSpan(sb, f.name, bgColor, fgColor, bidiFormatter); 216eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 217eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 218eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein if (mFoldersSortedSet.isEmpty()) { 219eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final Resources r = mContext.getResources(); 220eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final String name = r.getString(R.string.add_label); 221eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int bgColor = r.getColor(R.color.conv_header_add_label_background); 222eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int fgColor = r.getColor(R.color.conv_header_add_label_text); 223eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein addSpan(sb, name, bgColor, fgColor, bidiFormatter); 224eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 225eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 226eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 227eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein private void addSpan(SpannableStringBuilder sb, String name, 228eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein int bgColor, int fgColor, BidiFormatter bidiFormatter) { 229eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int start = sb.length(); 230eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.append(bidiFormatter.unicodeWrap(name)); 231eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein final int end = sb.length(); 232eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein 233eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.setSpan(new BackgroundColorSpan(bgColor), start, end, 234eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 235eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.setSpan(new ForegroundColorSpan(fgColor), start, end, 236eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 237eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein sb.setSpan(new FolderSpan(sb, mDims), start, end, 238eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 239eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 240eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein } 241eb58a092961773a8da67c0e0dd5770346381d938Andrew Sapperstein} 242