15c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein/**
25c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * Copyright (C) 2013 Google Inc.
35c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * Licensed to The Android Open Source Project.
45c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein *
55c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
65c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * you may not use this file except in compliance with the License.
75c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * You may obtain a copy of the License at
85c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein *
95c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
105c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein *
115c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software
125c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
135c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * See the License for the specific language governing permissions and
155c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * limitations under the License.
165c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein */
175c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
185c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinpackage com.android.mail.print;
195c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
205c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinimport android.content.Context;
215c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinimport android.content.res.Resources;
225c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
235c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinimport com.android.mail.R;
2494033deeb31df739a27fce15887a3f0a2e808b12James Lemieuximport com.android.mail.providers.Conversation;
255c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinimport com.android.mail.ui.AbstractHtmlTemplates;
265c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinimport com.android.mail.utils.LogTag;
275c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinimport com.android.mail.utils.LogUtils;
285c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
295c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein/**
305c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein * Renders data into very simple string-substitution HTML templates for printing conversations.
315c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein */
325c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinpublic class HtmlPrintTemplates extends AbstractHtmlTemplates {
335c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
345c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    private static final String TAG = LogTag.getLogTag();
355c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
365c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    private final String mConversationUpper;
375c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    private final String mMessage;
385c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    private final String mConversationLower;
395c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    private final String mConversationLowerNoJs;
40676e6d40c3fb120218571e9e0e2c3088fc7de164Andrew Sapperstein    private final String mLogo;
415c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
425c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public HtmlPrintTemplates(Context context) {
435c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        super(context);
445c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
455c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mConversationUpper = readTemplate(R.raw.template_print_conversation_upper);
465c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mMessage = readTemplate(R.raw.template_print_message);
475c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mConversationLower = readTemplate(R.raw.template_print_conversation_lower);
485c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mConversationLowerNoJs = readTemplate(R.raw.template_print_conversation_lower_no_js);
49676e6d40c3fb120218571e9e0e2c3088fc7de164Andrew Sapperstein        mLogo = readTemplate(R.raw.logo);
505c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
515c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
525c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
535c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Start building the html for a printed conversation. Can only be called once
545c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * until {@link #endPrintConversation()} or {@link #endPrintConversationNoJavascript()}
555c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * is called.
565c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
57562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein    public void startPrintConversation(String subject, int numMessages) {
585c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        if (mInProgress) {
595c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            throw new IllegalStateException("Should not call startPrintConversation twice");
605c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        }
615c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
625c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        reset();
635c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
645c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        final Resources res = mContext.getResources();
655c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        final String numMessageString = res.getQuantityString(
665c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein                R.plurals.num_messages, numMessages, numMessages);
67562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein
6894033deeb31df739a27fce15887a3f0a2e808b12James Lemieux        final String printedSubject =
6994033deeb31df739a27fce15887a3f0a2e808b12James Lemieux                Conversation.getSubjectForDisplay(mContext, null /* badgeText */, subject);
7094033deeb31df739a27fce15887a3f0a2e808b12James Lemieux
71676e6d40c3fb120218571e9e0e2c3088fc7de164Andrew Sapperstein        append(mConversationUpper, mLogo, mContext.getString(R.string.app_name),
72562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein                printedSubject, numMessageString);
735c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
745c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mInProgress = true;
755c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
765c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
775c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
785c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Add a message to the html for this printed conversation.
795c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
805c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public void appendMessage(String senderName, String senderAddress, String date,
815c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            String recipients, String bodyHtml, String attachments) {
825c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        append(mMessage, senderName, senderAddress, date, recipients, bodyHtml, attachments);
835c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
845c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
855c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
865c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Adds the end of the printed conversation to the html. NOTE: this method
875c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * includes JavaScript. If you need a version without JavaScript,
885c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * use {@link #endPrintConversationNoJavascript()}.<br/><br/>
895c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     *
905c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * One example where we use JavaScript is to hide quoted text.
915c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     *
925c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * @return a {@link String} containing the html for the conversation.
935c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
945c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public String endPrintConversation() {
955c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        if (!mInProgress) {
965c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            throw new IllegalStateException("must call startConversation first");
975c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        }
985c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
995c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        append(mConversationLower, mContext.getString(R.string.quoted_text_hidden_print));
1005c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1015c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mInProgress = false;
1025c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1035c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        LogUtils.d(TAG, "rendered conversation of %d bytes, buffer capacity=%d",
1045c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein                mBuilder.length() << 1, mBuilder.capacity() << 1);
1055c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1065c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        return emit();
1075c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
1085c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1095c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
1105c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Adds the end of the printed conversation to the html. NOTE: this method
1115c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * does not include any JavaScript. If you need a version with JavaScript,
1125c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * use {@link #endPrintConversation()}.
1135c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * @return a {@link String} containing the html for the conversation.
1145c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
1155c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public String endPrintConversationNoJavascript() {
1165c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        if (!mInProgress) {
1175c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            throw new IllegalStateException("must call startConversation first");
1185c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        }
1195c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1205c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        append(mConversationLowerNoJs);
1215c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1225c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mInProgress = false;
1235c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1245c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        LogUtils.d(TAG, "rendered conversation of %d bytes, buffer capacity=%d",
1255c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein                mBuilder.length() << 1, mBuilder.capacity() << 1);
1265c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1275c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        return emit();
1285c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
1295c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein}
130