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