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