14ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein/* 24ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * Copyright (C) 2013 Google Inc. 34ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * Licensed to The Android Open Source Project. 44ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * 54ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 64ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * you may not use this file except in compliance with the License. 74ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * You may obtain a copy of the License at 84ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * 94ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 104ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * 114ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software 124ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 134ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 144ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * See the License for the specific language governing permissions and 154ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * limitations under the License. 164ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein */ 174ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 184ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinpackage com.android.mail.ui; 194ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 204ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.app.Fragment; 2121a6ed2bdd46ccfdf9aa3e8aecd4cb1af6c2539fAndrew Sappersteinimport android.app.FragmentManager; 224ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.content.res.Resources; 2350554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdonimport android.graphics.Rect; 244ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.os.Bundle; 254ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.view.LayoutInflater; 264ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.view.View; 274ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.view.ViewGroup; 284ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.webkit.WebSettings; 294ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 304ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.FormattedDateBuilder; 314ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.R; 324ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.ConversationMessage; 334ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.ConversationViewAdapter; 344ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.ConversationViewAdapter.MessageHeaderItem; 354ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.ConversationViewHeader; 368ec43e877a9c1925514f066655984e21fbd255e8Andrew Sappersteinimport com.android.mail.browse.InlineAttachmentViewIntentBuilderCreator; 378ec43e877a9c1925514f066655984e21fbd255e8Andrew Sappersteinimport com.android.mail.browse.InlineAttachmentViewIntentBuilderCreatorHolder; 384ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.MessageFooterView; 394ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.MessageHeaderView; 404ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.MessageScrollView; 414ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.MessageWebView; 4250554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdonimport com.android.mail.browse.ScrollNotifier.ScrollListener; 43e307785b44deec1eb2aad5ecf83ea4b581779baaAndrew Sappersteinimport com.android.mail.browse.WebViewContextMenu; 44562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sappersteinimport com.android.mail.print.PrintUtils; 45562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sappersteinimport com.android.mail.providers.Conversation; 464ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.providers.Message; 474ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.utils.ConversationViewUtils; 484ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 494ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein/** 5050554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon * Controller to do most of the heavy lifting for 5150554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon * {@link SecureConversationViewFragment} and 5250554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon * {@link com.android.mail.browse.EmlMessageViewFragment}. Currently that work 5350554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon * is pretty much the rendering logic. 544ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein */ 554ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinpublic class SecureConversationViewController implements 56381c322eb30c39f63a2bb82812d63262eb3c1c1cAndrew Sapperstein MessageHeaderView.MessageHeaderViewCallbacks, ScrollListener, 57381c322eb30c39f63a2bb82812d63262eb3c1c1cAndrew Sapperstein MessageFooterView.MessageFooterCallbacks { 584ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private static final String BEGIN_HTML = 59d4945f28bdd02c04bb690d59dbf2a6c2b2075b80Andrew Sapperstein "<body style=\"margin: 0 %spx;\"><div style=\"margin: 16px 0; font-size: 80%%\">"; 604ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private static final String END_HTML = "</div></body>"; 614ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 624ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private final SecureConversationViewControllerCallbacks mCallbacks; 634ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 644ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private MessageWebView mWebView; 654ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private ConversationViewHeader mConversationHeaderView; 664ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private MessageHeaderView mMessageHeaderView; 6750554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon private MessageHeaderView mSnapHeaderView; 684ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private MessageFooterView mMessageFooterView; 694ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private ConversationMessage mMessage; 704ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private MessageScrollView mScrollView; 714ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 724ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private ConversationViewProgressController mProgressController; 734ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private FormattedDateBuilder mDateBuilder; 744ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 754ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private int mSideMarginInWebPx; 764ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 774ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public SecureConversationViewController(SecureConversationViewControllerCallbacks callbacks) { 784ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mCallbacks = callbacks; 794ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 804ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 814ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public View onCreateView(LayoutInflater inflater, ViewGroup container, 824ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein Bundle savedInstanceState) { 834ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein View rootView = inflater.inflate(R.layout.secure_conversation_view, container, false); 844ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mScrollView = (MessageScrollView) rootView.findViewById(R.id.scroll_view); 854ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mConversationHeaderView = (ConversationViewHeader) rootView.findViewById(R.id.conv_header); 864ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageHeaderView = (MessageHeaderView) rootView.findViewById(R.id.message_header); 8750554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView = (MessageHeaderView) rootView.findViewById(R.id.snap_header); 884ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageFooterView = (MessageFooterView) rootView.findViewById(R.id.message_footer); 894ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 9050554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mScrollView.addScrollListener(this); 9150554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon 92e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein // Add color backgrounds to the header and footer. 93e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein // Otherwise the backgrounds are grey. They can't 94e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein // be set in xml because that would add more overdraw 95e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein // in ConversationViewFragment. 96e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein final int color = rootView.getResources().getColor( 97e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein R.color.message_header_background_color); 98e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein mMessageHeaderView.setBackgroundColor(color); 99a839fd0af18f53574128e32dc0900339280fba05Andrew Sapperstein mSnapHeaderView.setBackgroundColor(color); 100e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein mMessageFooterView.setBackgroundColor(color); 101e7e2c0aa7b9dbb0c649aa5b430296b829f337dc5Andrew Sapperstein 1024ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mProgressController = new ConversationViewProgressController( 1034ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mCallbacks.getFragment(), mCallbacks.getHandler()); 1044ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mProgressController.instantiateProgressIndicators(rootView); 1054ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mWebView = (MessageWebView) rootView.findViewById(R.id.webview); 106e45fd11ab9d362fbe3e47a7f62b77c498ee3c2caAndrew Sapperstein mWebView.setOverScrollMode(View.OVER_SCROLL_NEVER); 1074ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mWebView.setWebViewClient(mCallbacks.getWebViewClient()); 1088ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein final InlineAttachmentViewIntentBuilderCreator creator = 1098ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein InlineAttachmentViewIntentBuilderCreatorHolder. 11050554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon getInlineAttachmentViewIntentCreator(); 1118ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein mWebView.setOnCreateContextMenuListener(new WebViewContextMenu( 1128ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein mCallbacks.getFragment().getActivity(), 1133c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang creator.createInlineAttachmentViewIntentBuilder(null, -1))); 1144ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mWebView.setFocusable(false); 1154ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final WebSettings settings = mWebView.getSettings(); 1164ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1174ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein settings.setJavaScriptEnabled(false); 1184ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL); 1194ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1204ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein ConversationViewUtils.setTextZoom(mCallbacks.getFragment().getResources(), settings); 1214ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1224ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein settings.setSupportZoom(true); 1234ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein settings.setBuiltInZoomControls(true); 1244ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein settings.setDisplayZoomControls(false); 1254ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1264ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mScrollView.setInnerScrollableView(mWebView); 1274ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1284ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return rootView; 1294ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 1304ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1314ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void onActivityCreated(Bundle savedInstanceState) { 1324ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mCallbacks.setupConversationHeaderView(mConversationHeaderView); 1334ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1344ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final Fragment fragment = mCallbacks.getFragment(); 1354ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1364ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mDateBuilder = new FormattedDateBuilder(fragment.getActivity()); 13714f937408fe2451a91b44d3cd7d141347e716775Andrew Sapperstein mMessageHeaderView.initialize( 1384ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mCallbacks.getConversationAccountController(), mCallbacks.getAddressCache()); 1394ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageHeaderView.setContactInfoSource(mCallbacks.getContactInfoSource()); 1404ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageHeaderView.setCallbacks(this); 1414ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageHeaderView.setExpandable(false); 1424ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageHeaderView.setViewOnlyMode(mCallbacks.isViewOnlyMode()); 1434ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 14450554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.setSnappy(); 14550554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.initialize( 14650554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mCallbacks.getConversationAccountController(), mCallbacks.getAddressCache()); 14750554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.setContactInfoSource(mCallbacks.getContactInfoSource()); 14850554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.setCallbacks(this); 14950554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.setExpandable(false); 15050554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.setViewOnlyMode(mCallbacks.isViewOnlyMode()); 15150554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon 1524ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mCallbacks.setupMessageHeaderVeiledMatcher(mMessageHeaderView); 15350554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mCallbacks.setupMessageHeaderVeiledMatcher(mSnapHeaderView); 1544ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 155f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein mMessageFooterView.initialize(fragment.getLoaderManager(), fragment.getFragmentManager(), 156381c322eb30c39f63a2bb82812d63262eb3c1c1cAndrew Sapperstein mCallbacks.getConversationAccountController(), this); 1574ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1584ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mCallbacks.startMessageLoader(); 1594ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1604ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mProgressController.showLoadingStatus(mCallbacks.isViewVisibleToUser()); 1614ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1624ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final Resources r = mCallbacks.getFragment().getResources(); 16390eccf969d691abb34f9c6f3d854091adb0c18d1Andrew Sapperstein mSideMarginInWebPx = (int) (r.getDimensionPixelOffset( 16490eccf969d691abb34f9c6f3d854091adb0c18d1Andrew Sapperstein R.dimen.conversation_message_content_margin_side) / r.getDisplayMetrics().density); 1654ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 1664ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 16750554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon @Override 16850554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon public void onNotifierScroll(final int y) { 16950554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon // We need to decide whether or not to display the snap header. 17050554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon // Get the location of the moveable message header inside the scroll view. 17150554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon Rect rect = new Rect(); 17250554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mScrollView.offsetDescendantRectToMyCoords(mMessageHeaderView, rect); 17350554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon 17450554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon // If we have scrolled further than the distance from the top of the scrollView to the top 17550554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon // of the message header, then the message header is at least partially ofscreen. As soon 17650554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon // as the message header goes partially offscreen we need to display the snap header. 177f8e065aab2cbff4dee86cc931a4d9c88dec37345Andrew Sapperstein // TODO - re-enable when dogfooders howl 178f8e065aab2cbff4dee86cc931a4d9c88dec37345Andrew Sapperstein// if (y > rect.top) { 179f8e065aab2cbff4dee86cc931a4d9c88dec37345Andrew Sapperstein// mSnapHeaderView.setVisibility(View.VISIBLE); 180f8e065aab2cbff4dee86cc931a4d9c88dec37345Andrew Sapperstein// } else { 18150554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.setVisibility(View.GONE); 182f8e065aab2cbff4dee86cc931a4d9c88dec37345Andrew Sapperstein// } 18350554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon } 18450554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon 1854ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein /** 1864ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * Populate the adapter with overlay views (message headers, super-collapsed 1874ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * blocks, a conversation header), and return an HTML document with spacer 1884ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein * divs inserted for all overlays. 1894ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein */ 1904ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void renderMessage(ConversationMessage message) { 1914ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessage = message; 1924ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1938ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein final boolean alwaysShowImages = mCallbacks.shouldAlwaysShowImages(); 1948ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein mWebView.getSettings().setBlockNetworkImage( 1958ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein !alwaysShowImages && !mMessage.alwaysShowImages); 1964ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1974ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // Add formatting to message body 1984ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // At this point, only adds margins. 1994ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein StringBuilder dataBuilder = new StringBuilder( 2004ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein String.format(BEGIN_HTML, mSideMarginInWebPx)); 2014ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein dataBuilder.append(mMessage.getBodyAsHtml()); 2024ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein dataBuilder.append(END_HTML); 2034ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2044ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mWebView.loadDataWithBaseURL(mCallbacks.getBaseUri(), dataBuilder.toString(), 2054ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein "text/html", "utf-8", null); 2064ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final MessageHeaderItem item = ConversationViewAdapter.newMessageHeaderItem( 20714f937408fe2451a91b44d3cd7d141347e716775Andrew Sapperstein null, mDateBuilder, mMessage, true, mMessage.alwaysShowImages); 20837ce6077b70c94ca11063fb82c0600874d826b06Tony Mantler // Clear out the old info from the header before (re)binding 20937ce6077b70c94ca11063fb82c0600874d826b06Tony Mantler mMessageHeaderView.unbind(); 2104ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageHeaderView.bind(item, false); 21150554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon 21250554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.unbind(); 21350554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon mSnapHeaderView.bind(item, false); 21450554de30bfe85befac6edf5376b600eb3a1f462Martin Hibdon 2154ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein if (mMessage.hasAttachments) { 2164ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mMessageFooterView.setVisibility(View.VISIBLE); 217e1557036849265afc24528be9effbe299b640bffAndrew Sapperstein mMessageFooterView.bind(item, false); 2184ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2194ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2204ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2214ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public ConversationMessage getMessage() { 2224ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return mMessage; 2234ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2244ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2254ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public ConversationViewHeader getConversationHeaderView() { 2264ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return mConversationHeaderView; 2274ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2284ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2294ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void dismissLoadingStatus() { 2304ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mProgressController.dismissLoadingStatus(); 2314ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2324ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2334ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void setSubject(String subject) { 234e6bf30d6e98eb6140b7a5f301efe631ff35c9f7bAndrew Sapperstein mConversationHeaderView.setSubject(subject); 2354ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2364ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 237562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein public void printMessage() { 238562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein final Conversation conversation = mMessage.getConversation(); 239234d35352eeaaa8d3928e31028be49112607bd29Andrew Sapperstein PrintUtils.printMessage(mCallbacks.getFragment().getActivity(), mMessage, 240562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein conversation != null ? conversation.subject : mMessage.subject, 241562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein mCallbacks.getAddressCache(), mCallbacks.getBaseUri(), false /* useJavascript */); 242562c5ba7235948cf1d20a9afa40e67cd62f43cf7Andrew Sapperstein 2435c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein } 2445c1692a5faeab220881a17a3427a8986ef874403Andrew Sapperstein 2454ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // Start MessageHeaderViewCallbacks implementations 2464ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2474ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 2484ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void setMessageSpacerHeight(MessageHeaderItem item, int newSpacerHeight) { 2494ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // Do nothing. 2504ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2514ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2524ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 25359ccec3db4710f2aea6a4a9a30160ad19331367dAndrew Sapperstein public void setMessageExpanded(MessageHeaderItem item, int newSpacerHeight) { 2544ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // Do nothing. 2554ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2564ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2574ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 2584ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void setMessageDetailsExpanded(MessageHeaderItem i, boolean expanded, int heightBefore) { 2594ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // Do nothing. 2604ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2614ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2624ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 2634ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void showExternalResources(final Message msg) { 2644ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mWebView.getSettings().setBlockNetworkImage(false); 2654ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2664ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2674ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 2684ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void showExternalResources(final String rawSenderAddress) { 2694ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mWebView.getSettings().setBlockNetworkImage(false); 2704ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2714ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2724ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 2734ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public boolean supportsMessageTransforms() { 2744ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return false; 2754ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2764ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2774ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 2784ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public String getMessageTransforms(final Message msg) { 2794ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return null; 2804ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 2814ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 28221a6ed2bdd46ccfdf9aa3e8aecd4cb1af6c2539fAndrew Sapperstein @Override 2838e1ffbf042a23824a97a9f47cfc81cf6f14603beJames Lemieux public boolean isSecure() { 2848e1ffbf042a23824a97a9f47cfc81cf6f14603beJames Lemieux return true; 2858e1ffbf042a23824a97a9f47cfc81cf6f14603beJames Lemieux } 2868e1ffbf042a23824a97a9f47cfc81cf6f14603beJames Lemieux 2878e1ffbf042a23824a97a9f47cfc81cf6f14603beJames Lemieux @Override 28821a6ed2bdd46ccfdf9aa3e8aecd4cb1af6c2539fAndrew Sapperstein public FragmentManager getFragmentManager() { 28921a6ed2bdd46ccfdf9aa3e8aecd4cb1af6c2539fAndrew Sapperstein return mCallbacks.getFragment().getFragmentManager(); 29021a6ed2bdd46ccfdf9aa3e8aecd4cb1af6c2539fAndrew Sapperstein } 29121a6ed2bdd46ccfdf9aa3e8aecd4cb1af6c2539fAndrew Sapperstein 2924ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // End MessageHeaderViewCallbacks implementations 2934ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein} 294