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