1 /**
2  * Copyright (C) 2013 Google Inc.
3  * Licensed to The Android Open Source Project.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.mail.print;
19 
20 import android.content.Context;
21 import android.content.res.Resources;
22 
23 import com.android.mail.R;
24 import com.android.mail.providers.Conversation;
25 import com.android.mail.ui.AbstractHtmlTemplates;
26 import com.android.mail.utils.LogTag;
27 import com.android.mail.utils.LogUtils;
28 
29 /**
30  * Renders data into very simple string-substitution HTML templates for printing conversations.
31  */
32 public class HtmlPrintTemplates extends AbstractHtmlTemplates {
33 
34     private static final String TAG = LogTag.getLogTag();
35 
36     private final String mConversationUpper;
37     private final String mMessage;
38     private final String mConversationLower;
39     private final String mConversationLowerNoJs;
40     private final String mLogo;
41 
HtmlPrintTemplates(Context context)42     public HtmlPrintTemplates(Context context) {
43         super(context);
44 
45         mConversationUpper = readTemplate(R.raw.template_print_conversation_upper);
46         mMessage = readTemplate(R.raw.template_print_message);
47         mConversationLower = readTemplate(R.raw.template_print_conversation_lower);
48         mConversationLowerNoJs = readTemplate(R.raw.template_print_conversation_lower_no_js);
49         mLogo = readTemplate(R.raw.logo);
50     }
51 
52     /**
53      * Start building the html for a printed conversation. Can only be called once
54      * until {@link #endPrintConversation()} or {@link #endPrintConversationNoJavascript()}
55      * is called.
56      */
startPrintConversation(String subject, int numMessages)57     public void startPrintConversation(String subject, int numMessages) {
58         if (mInProgress) {
59             throw new IllegalStateException("Should not call startPrintConversation twice");
60         }
61 
62         reset();
63 
64         final Resources res = mContext.getResources();
65         final String numMessageString = res.getQuantityString(
66                 R.plurals.num_messages, numMessages, numMessages);
67 
68         final String printedSubject =
69                 Conversation.getSubjectForDisplay(mContext, null /* badgeText */, subject);
70 
71         append(mConversationUpper, mLogo, mContext.getString(R.string.app_name),
72                 printedSubject, numMessageString);
73 
74         mInProgress = true;
75     }
76 
77     /**
78      * Add a message to the html for this printed conversation.
79      */
appendMessage(String senderName, String senderAddress, String date, String recipients, String bodyHtml, String attachments)80     public void appendMessage(String senderName, String senderAddress, String date,
81             String recipients, String bodyHtml, String attachments) {
82         append(mMessage, senderName, senderAddress, date, recipients, bodyHtml, attachments);
83     }
84 
85     /**
86      * Adds the end of the printed conversation to the html. NOTE: this method
87      * includes JavaScript. If you need a version without JavaScript,
88      * use {@link #endPrintConversationNoJavascript()}.<br/><br/>
89      *
90      * One example where we use JavaScript is to hide quoted text.
91      *
92      * @return a {@link String} containing the html for the conversation.
93      */
endPrintConversation()94     public String endPrintConversation() {
95         if (!mInProgress) {
96             throw new IllegalStateException("must call startConversation first");
97         }
98 
99         append(mConversationLower, mContext.getString(R.string.quoted_text_hidden_print));
100 
101         mInProgress = false;
102 
103         LogUtils.d(TAG, "rendered conversation of %d bytes, buffer capacity=%d",
104                 mBuilder.length() << 1, mBuilder.capacity() << 1);
105 
106         return emit();
107     }
108 
109     /**
110      * Adds the end of the printed conversation to the html. NOTE: this method
111      * does not include any JavaScript. If you need a version with JavaScript,
112      * use {@link #endPrintConversation()}.
113      * @return a {@link String} containing the html for the conversation.
114      */
endPrintConversationNoJavascript()115     public String endPrintConversationNoJavascript() {
116         if (!mInProgress) {
117             throw new IllegalStateException("must call startConversation first");
118         }
119 
120         append(mConversationLowerNoJs);
121 
122         mInProgress = false;
123 
124         LogUtils.d(TAG, "rendered conversation of %d bytes, buffer capacity=%d",
125                 mBuilder.length() << 1, mBuilder.capacity() << 1);
126 
127         return emit();
128     }
129 }
130