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