SecureConversationViewFragment.java revision d82a31f04f2a4cce27c8023d5330ff13aad198b0
1f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp/*
2f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Copyright (C) 2012 Google Inc.
3f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Licensed to The Android Open Source Project.
4f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp *
5f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Licensed under the Apache License, Version 2.0 (the "License");
6f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * you may not use this file except in compliance with the License.
7f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * You may obtain a copy of the License at
8f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp *
9f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp *      http://www.apache.org/licenses/LICENSE-2.0
10f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp *
11f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Unless required by applicable law or agreed to in writing, software
12f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * distributed under the License is distributed on an "AS IS" BASIS,
13f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * See the License for the specific language governing permissions and
15f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * limitations under the License.
16f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp */
17f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
18351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangpackage com.android.mail.ui;
19f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
20f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.content.Loader;
21f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.database.Cursor;
22f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.net.Uri;
23f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.os.Bundle;
240e8a95148f7fdc9c6a33971924b0d29a202d73ecmindypimport android.text.Html;
250e8a95148f7fdc9c6a33971924b0d29a202d73ecmindypimport android.text.SpannedString;
26f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.text.TextUtils;
27f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.LayoutInflater;
28f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.View;
29f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.ViewGroup;
30f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.webkit.WebSettings;
31f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.webkit.WebSettings.LayoutAlgorithm;
32f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.webkit.WebView;
33ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindypimport android.webkit.WebViewClient;
3426d4d2d9c43c499f458808f050ec73ea3c28dec4mindypimport android.widget.ScrollView;
35f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
36f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.R;
37351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.ConversationViewAdapter;
38351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.ConversationViewHeader;
39351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.MessageCursor;
40351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.MessageFooterView;
41351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.MessageHeaderView;
42f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.ConversationViewAdapter.MessageHeaderItem;
43f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.MessageCursor.ConversationMessage;
44f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.MessageHeaderView.MessageHeaderViewCallbacks;
45adbf3e8cadb66666f307352b72537fbac57b916fAndy Huangimport com.android.mail.providers.Account;
46f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.Conversation;
47f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.Message;
48f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.UIProvider;
49f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogTag;
50f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogUtils;
51f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
52f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport java.util.HashSet;
53f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
54f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyppublic class SecureConversationViewFragment extends AbstractConversationViewFragment implements
55f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        MessageHeaderViewCallbacks {
56f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private static final String LOG_TAG = LogTag.getLogTag();
5726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    private WebView mWebView;
58f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private ConversationViewHeader mConversationHeaderView;
59f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private MessageHeaderView mMessageHeaderView;
6026d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    private MessageFooterView mMessageFooterView;
61f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private ConversationMessage mMessage;
6226d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    private ScrollView mScrollView;
630a1aa1bb89221eda2f67af52ef274612f28ecf5cPaul Westbrook
64542fec98d011c78782b63b33d29cf81044e96f75Paul Westbrook    private WebViewClient mWebViewClient = new AbstractConversationWebViewClient() {
65ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        @Override
66ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        public void onPageFinished(WebView view, String url) {
679d3fd92ed6091dbd0d38799222a1cf841f1c3f29Andy Huang            if (isUserVisible()) {
684d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook                onConversationSeen();
694d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook            }
704d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook
71ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp            dismissLoadingStatus();
72ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        }
73ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp    };
74f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
75f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    /**
76f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * Creates a new instance of {@link ConversationViewFragment}, initialized
77f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * to display a conversation with other parameters inherited/copied from an
78f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * existing bundle, typically one created using {@link #makeBasicArgs}.
79f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     */
80f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public static SecureConversationViewFragment newInstance(Bundle existingArgs,
81f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            Conversation conversation) {
82f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        SecureConversationViewFragment f = new SecureConversationViewFragment();
83f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        Bundle args = new Bundle(existingArgs);
84f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        args.putParcelable(ARG_CONVERSATION, conversation);
85f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        f.setArguments(args);
86f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        return f;
87f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
88f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
89f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    /**
90f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * Constructor needs to be public to handle orientation changes and activity
91f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * lifecycle events.
92f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     */
93f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public SecureConversationViewFragment() {
94f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        super();
95f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
96f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
97f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
98f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void onActivityCreated(Bundle savedInstanceState) {
99f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        super.onActivityCreated(savedInstanceState);
100f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mConversationHeaderView.setCallbacks(this, this);
101604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        mConversationHeaderView.setFoldersVisible(false);
102f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        final SubjectDisplayChanger sdc = mActivity.getSubjectDisplayChanger();
103f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        if (sdc != null) {
104f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            sdc.setSubject(mConversation.subject);
105f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
1067388dba58aecafacd91ded0f787cf01bfc7af232Andy Huang        mConversationHeaderView.setSubject(mConversation.subject);
107f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView.setContactInfoSource(getContactInfoSource());
108f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView.setCallbacks(this);
109f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView.setExpandable(false);
11069a6cdff8afde77ec9bcd75a5651ee212344019eVikram Aggarwal        mMessageHeaderView.setVeiledMatcher(
11169a6cdff8afde77ec9bcd75a5651ee212344019eVikram Aggarwal                ((ControllableActivity) getActivity()).getAccountController()
11269a6cdff8afde77ec9bcd75a5651ee212344019eVikram Aggarwal                        .getVeiledAddressMatcher());
113f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        getLoaderManager().initLoader(MESSAGE_LOADER, null, getMessageLoaderCallbacks());
114ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        showLoadingStatus();
115f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
116f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
117f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
118f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public View onCreateView(LayoutInflater inflater, ViewGroup container,
119f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            Bundle savedInstanceState) {
120f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        View rootView = inflater.inflate(R.layout.secure_conversation_view, container, false);
12126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        mScrollView = (ScrollView) rootView.findViewById(R.id.scroll_view);
122f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mConversationHeaderView = (ConversationViewHeader) rootView.findViewById(R.id.conv_header);
123f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView = (MessageHeaderView) rootView.findViewById(R.id.message_header);
12426d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        mMessageFooterView = (MessageFooterView) rootView.findViewById(R.id.message_footer);
125ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        instantiateProgressIndicators(rootView);
12626d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        mWebView = (WebView) rootView.findViewById(R.id.webview);
127ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        mWebView.setWebViewClient(mWebViewClient);
12805e522165c415f0a16a23117cd7d91a033780890mindyp        mWebView.setFocusable(false);
129f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        final WebSettings settings = mWebView.getSettings();
130f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
131f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setJavaScriptEnabled(false);
132f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
133f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
134f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setSupportZoom(true);
135f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setBuiltInZoomControls(true);
136f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setDisplayZoomControls(false);
1374d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook
138f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        return rootView;
139f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
140f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
141f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
142fafcd17adae9b7ba5c270611d0f53608ced92e2eScott Kennedy    protected WebView getWebView() {
143fafcd17adae9b7ba5c270611d0f53608ced92e2eScott Kennedy        return mWebView;
144fafcd17adae9b7ba5c270611d0f53608ced92e2eScott Kennedy    }
145fafcd17adae9b7ba5c270611d0f53608ced92e2eScott Kennedy
146fafcd17adae9b7ba5c270611d0f53608ced92e2eScott Kennedy    @Override
147f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    protected void markUnread() {
148d82a31f04f2a4cce27c8023d5330ff13aad198b0Vikram Aggarwal        super.markUnread();
149d82a31f04f2a4cce27c8023d5330ff13aad198b0Vikram Aggarwal        // Ignore unsafe calls made after a fragment is detached from an activity
150f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        final ControllableActivity activity = (ControllableActivity) getActivity();
151fb05201c2c5c53f58846112240a05849319317a9mindyp        if (activity == null || mConversation == null || mMessage == null) {
152fb05201c2c5c53f58846112240a05849319317a9mindyp            LogUtils.w(LOG_TAG, "ignoring markUnread for conv=%s",
153fb05201c2c5c53f58846112240a05849319317a9mindyp                    mConversation != null ? mConversation.id : 0);
154f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            return;
155f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
156d82a31f04f2a4cce27c8023d5330ff13aad198b0Vikram Aggarwal        final HashSet<Uri> uris = new HashSet<Uri>();
157f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        uris.add(mMessage.uri);
158f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        activity.getConversationUpdater().markConversationMessagesUnread(mConversation, uris,
159351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang                mViewState.getConversationInfo());
160f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
161f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
162f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
163adbf3e8cadb66666f307352b72537fbac57b916fAndy Huang    public void onAccountChanged(Account newAccount, Account oldAccount) {
164f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
165f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
166f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
167f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
168f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void setMessageSpacerHeight(MessageHeaderItem item, int newSpacerHeight) {
169f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
170f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
171f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
172f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
173f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void setMessageExpanded(MessageHeaderItem item, int newSpacerHeight) {
174f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
175f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
176f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
177f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
178f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void onConversationViewHeaderHeightChange(int newHeight) {
179f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
180f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
181f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
182f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
183f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void onUserVisibleHintChanged() {
184604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        if (mActivity == null) {
185604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp            return;
186604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        }
18751ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal        if (isUserVisible()) {
18851ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal            mScrollView.scrollTo(0, 0);
18951ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal            onConversationSeen();
190604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        }
191f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
192f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
193f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
194eb9a4bdc53269ee05fe11870b9ebf03f18196585Scott Kennedy    public void showExternalResources(final Message msg) {
195eb9a4bdc53269ee05fe11870b9ebf03f18196585Scott Kennedy        mWebView.getSettings().setBlockNetworkImage(false);
196eb9a4bdc53269ee05fe11870b9ebf03f18196585Scott Kennedy    }
197eb9a4bdc53269ee05fe11870b9ebf03f18196585Scott Kennedy
198eb9a4bdc53269ee05fe11870b9ebf03f18196585Scott Kennedy    @Override
199eb9a4bdc53269ee05fe11870b9ebf03f18196585Scott Kennedy    public void showExternalResources(final String rawSenderAddress) {
200f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mWebView.getSettings().setBlockNetworkImage(false);
201f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
202f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
203f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
204014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang    protected void onMessageCursorLoadFinished(Loader<Cursor> loader, MessageCursor newCursor,
205014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang            MessageCursor oldCursor) {
206f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // ignore cursors that are still loading results
207014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang        if (newCursor == null || !newCursor.isLoaded()) {
208f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            LogUtils.i(LOG_TAG, "CONV RENDER: existing cursor is null, rendering from scratch");
209f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            return;
210f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
2111abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei        if (mActivity == null || mActivity.isFinishing()) {
2121abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei            // Activity is finishing, just bail.
2131abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei            return;
2141abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei        }
215014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang        renderMessageBodies(newCursor, mEnableContentReadySignal);
216f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
217f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
218f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    /**
219f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * Populate the adapter with overlay views (message headers, super-collapsed
220f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * blocks, a conversation header), and return an HTML document with spacer
221f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * divs inserted for all overlays.
222f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     */
223f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private void renderMessageBodies(MessageCursor messageCursor,
224f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            boolean enableContentReadySignal) {
22551ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal        final StringBuilder convHtml = new StringBuilder();
226f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        String content;
227f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        if (messageCursor.moveToFirst()) {
228f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            content = messageCursor.getString(UIProvider.MESSAGE_BODY_HTML_COLUMN);
229f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            if (TextUtils.isEmpty(content)) {
230f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp                content = messageCursor.getString(UIProvider.MESSAGE_BODY_TEXT_COLUMN);
2310e8a95148f7fdc9c6a33971924b0d29a202d73ecmindyp                if (content != null) {
2320e8a95148f7fdc9c6a33971924b0d29a202d73ecmindyp                    content = Html.toHtml(new SpannedString(content));
2330e8a95148f7fdc9c6a33971924b0d29a202d73ecmindyp                }
234f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            }
235f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            convHtml.append(content);
236f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessage = messageCursor.getMessage();
2370a1aa1bb89221eda2f67af52ef274612f28ecf5cPaul Westbrook            mWebView.getSettings().setBlockNetworkImage(!mMessage.alwaysShowImages);
2380a1aa1bb89221eda2f67af52ef274612f28ecf5cPaul Westbrook            mWebView.loadDataWithBaseURL(mBaseUri, convHtml.toString(), "text/html", "utf-8", null);
239f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            ConversationViewAdapter mAdapter = new ConversationViewAdapter(mActivity, null, null,
240f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp                    null, null, null, null, null, null);
241202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy            MessageHeaderItem item = mAdapter.newMessageHeaderItem(mMessage, true,
242202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy                    mMessage.alwaysShowImages);
243f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessageHeaderView.initialize(mDateBuilder, this, mAddressCache);
24477a4605e6fbc368b2b87b4888f2ffd6329620807mindyp            mMessageHeaderView.setExpandMode(MessageHeaderView.POPUP_MODE);
245f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessageHeaderView.bind(item, false);
246f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessageHeaderView.setMessageDetailsVisibility(View.VISIBLE);
24726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp            if (mMessage.hasAttachments) {
24826d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp                mMessageFooterView.setVisibility(View.VISIBLE);
24926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp                mMessageFooterView.initialize(getLoaderManager(), getFragmentManager());
25026d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp                mMessageFooterView.bind(item, false);
25126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp            }
25226d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        }
25326d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    }
25426d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp
25526d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    @Override
25626d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    public void onConversationUpdated(Conversation conv) {
25726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        final ConversationViewHeader headerView = mConversationHeaderView;
25826d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        if (headerView != null) {
25926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp            headerView.onConversationUpdated(conv);
26051ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal            headerView.setSubject(conv.subject);
261f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
262f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
2631b3cc47f54072105c161d6ed557550e0e149b8bbmindyp
2641b3cc47f54072105c161d6ed557550e0e149b8bbmindyp    @Override
2651b3cc47f54072105c161d6ed557550e0e149b8bbmindyp    public void setMessageDetailsExpanded(MessageHeaderItem i, boolean expanded, int heightbefore) {
2661b3cc47f54072105c161d6ed557550e0e149b8bbmindyp        // Do nothing.
2671b3cc47f54072105c161d6ed557550e0e149b8bbmindyp    }
268f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp}
269