HtmlPrintTemplates.java revision 562c5ba7235948cf1d20a9afa40e67cd62f43cf7
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;
22562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sappersteinimport android.text.TextUtils;
235c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
245c1692a5faeab220881a17a3427a8986ef874403Andrew Sappersteinimport com.android.mail.R;
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;
405c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
415c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public HtmlPrintTemplates(Context context) {
425c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        super(context);
435c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
445c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mConversationUpper = readTemplate(R.raw.template_print_conversation_upper);
455c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mMessage = readTemplate(R.raw.template_print_message);
465c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mConversationLower = readTemplate(R.raw.template_print_conversation_lower);
475c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mConversationLowerNoJs = readTemplate(R.raw.template_print_conversation_lower_no_js);
485c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
495c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
505c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
515c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Start building the html for a printed conversation. Can only be called once
525c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * until {@link #endPrintConversation()} or {@link #endPrintConversationNoJavascript()}
535c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * is called.
545c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
55562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein    public void startPrintConversation(String subject, int numMessages) {
565c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        if (mInProgress) {
575c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            throw new IllegalStateException("Should not call startPrintConversation twice");
585c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        }
595c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
605c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        reset();
615c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
625c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        final Resources res = mContext.getResources();
635c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        final String numMessageString = res.getQuantityString(
645c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein                R.plurals.num_messages, numMessages, numMessages);
65562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein
66562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein        final String printedSubject = TextUtils.isEmpty(subject)
67562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein                ? res.getString(R.string.no_subject) : subject;
685c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        append(mConversationUpper, mContext.getString(R.string.app_name),
69562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein                printedSubject, numMessageString);
705c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
715c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mInProgress = true;
725c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
735c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
745c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
755c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Add a message to the html for this printed conversation.
765c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
775c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public void appendMessage(String senderName, String senderAddress, String date,
785c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            String recipients, String bodyHtml, String attachments) {
795c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        append(mMessage, senderName, senderAddress, date, recipients, bodyHtml, attachments);
805c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
815c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
825c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
835c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Adds the end of the printed conversation to the html. NOTE: this method
845c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * includes JavaScript. If you need a version without JavaScript,
855c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * use {@link #endPrintConversationNoJavascript()}.<br/><br/>
865c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     *
875c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * One example where we use JavaScript is to hide quoted text.
885c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     *
895c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * @return a {@link String} containing the html for the conversation.
905c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
915c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public String endPrintConversation() {
925c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        if (!mInProgress) {
935c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            throw new IllegalStateException("must call startConversation first");
945c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        }
955c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
965c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        append(mConversationLower, mContext.getString(R.string.quoted_text_hidden_print));
975c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
985c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mInProgress = false;
995c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1005c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        LogUtils.d(TAG, "rendered conversation of %d bytes, buffer capacity=%d",
1015c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein                mBuilder.length() << 1, mBuilder.capacity() << 1);
1025c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1035c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        return emit();
1045c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
1055c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1065c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    /**
1075c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * Adds the end of the printed conversation to the html. NOTE: this method
1085c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * does not include any JavaScript. If you need a version with JavaScript,
1095c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * use {@link #endPrintConversation()}.
1105c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     * @return a {@link String} containing the html for the conversation.
1115c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein     */
1125c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    public String endPrintConversationNoJavascript() {
1135c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        if (!mInProgress) {
1145c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein            throw new IllegalStateException("must call startConversation first");
1155c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        }
1165c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1175c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        append(mConversationLowerNoJs);
1185c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1195c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        mInProgress = false;
1205c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1215c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        LogUtils.d(TAG, "rendered conversation of %d bytes, buffer capacity=%d",
1225c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein                mBuilder.length() << 1, mBuilder.capacity() << 1);
1235c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein
1245c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein        return emit();
1255c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein    }
1265c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein}
127