SecureConversationViewFragment.java revision 4d8cad5e37ade03903a23cca8ea3e782af21170f
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
18f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyppackage com.android.mail.browse;
19f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
20f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.content.Loader;
21f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.database.Cursor;
22f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.net.Uri;
23f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.os.Bundle;
24f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.text.TextUtils;
25f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.LayoutInflater;
26f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.View;
27f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.ViewGroup;
28f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.webkit.WebSettings;
29f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.webkit.WebSettings.LayoutAlgorithm;
30f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.webkit.WebView;
31ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindypimport android.webkit.WebViewClient;
3226d4d2d9c43c499f458808f050ec73ea3c28dec4mindypimport android.widget.ScrollView;
33f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
34f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.R;
35f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.ConversationViewAdapter.MessageHeaderItem;
36f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.MessageCursor.ConversationMessage;
37f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.MessageHeaderView.MessageHeaderViewCallbacks;
38f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.Conversation;
39f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.ConversationInfo;
40f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.Message;
41f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.UIProvider;
42f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.AbstractConversationViewFragment;
43f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.ControllableActivity;
44f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.ConversationViewFragment;
45f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.SubjectDisplayChanger;
46f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogTag;
47f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogUtils;
48f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
49f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport java.util.HashSet;
50f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
51f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyppublic class SecureConversationViewFragment extends AbstractConversationViewFragment implements
52f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        MessageHeaderViewCallbacks {
53f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private static final String LOG_TAG = LogTag.getLogTag();
5426d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    private WebView mWebView;
55f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private ConversationViewHeader mConversationHeaderView;
56f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private MessageHeaderView mMessageHeaderView;
5726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    private MessageFooterView mMessageFooterView;
58f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private ConversationMessage mMessage;
5926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    private ScrollView mScrollView;
60542fec98d011c78782b63b33d29cf81044e96f75Paul Westbrook    private WebViewClient mWebViewClient = new AbstractConversationWebViewClient() {
61ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        @Override
62ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        public void onPageFinished(WebView view, String url) {
634d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook            if (mUserVisible) {
644d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook                onConversationSeen();
654d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook            }
664d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook
67ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp            dismissLoadingStatus();
68ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        }
69ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp    };
70f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
71f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    /**
72f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * Creates a new instance of {@link ConversationViewFragment}, initialized
73f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * to display a conversation with other parameters inherited/copied from an
74f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * existing bundle, typically one created using {@link #makeBasicArgs}.
75f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     */
76f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public static SecureConversationViewFragment newInstance(Bundle existingArgs,
77f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            Conversation conversation) {
78f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        SecureConversationViewFragment f = new SecureConversationViewFragment();
79f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        Bundle args = new Bundle(existingArgs);
80f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        args.putParcelable(ARG_CONVERSATION, conversation);
81f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        f.setArguments(args);
82f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        return f;
83f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
84f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
85f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    /**
86f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * Constructor needs to be public to handle orientation changes and activity
87f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * lifecycle events.
88f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     */
89f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public SecureConversationViewFragment() {
90f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        super();
91f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
92f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
93f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
94f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void onActivityCreated(Bundle savedInstanceState) {
95f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        super.onActivityCreated(savedInstanceState);
96f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mConversationHeaderView.setCallbacks(this, this);
97604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        mConversationHeaderView.setFoldersVisible(false);
98f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        final SubjectDisplayChanger sdc = mActivity.getSubjectDisplayChanger();
99f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        if (sdc != null) {
100f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            sdc.setSubject(mConversation.subject);
101f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
102604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        mConversationHeaderView.setSubject(mConversation.subject, false /* notify */);
103f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView.setContactInfoSource(getContactInfoSource());
104f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView.setCallbacks(this);
105f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView.setExpandable(false);
106f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        getLoaderManager().initLoader(MESSAGE_LOADER, null, getMessageLoaderCallbacks());
107ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        showLoadingStatus();
108f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
109f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
110f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
111f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public View onCreateView(LayoutInflater inflater, ViewGroup container,
112f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            Bundle savedInstanceState) {
113f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        View rootView = inflater.inflate(R.layout.secure_conversation_view, container, false);
11426d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        mScrollView = (ScrollView) rootView.findViewById(R.id.scroll_view);
115f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mConversationHeaderView = (ConversationViewHeader) rootView.findViewById(R.id.conv_header);
116f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mMessageHeaderView = (MessageHeaderView) rootView.findViewById(R.id.message_header);
11726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        mMessageFooterView = (MessageFooterView) rootView.findViewById(R.id.message_footer);
118ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        instantiateProgressIndicators(rootView);
11926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        mWebView = (WebView) rootView.findViewById(R.id.webview);
120ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp        mWebView.setWebViewClient(mWebViewClient);
12105e522165c415f0a16a23117cd7d91a033780890mindyp        mWebView.setFocusable(false);
122f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        final WebSettings settings = mWebView.getSettings();
123f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
124f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setJavaScriptEnabled(false);
125f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
126f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
127f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setSupportZoom(true);
128f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setBuiltInZoomControls(true);
129f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        settings.setDisplayZoomControls(false);
1304d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook
1314d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook        mViewState = getNewViewState();
132f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        return rootView;
133f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
134f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
135f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
136f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    protected void markUnread() {
137f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Ignore unsafe calls made after a fragment is detached from an
138f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // activity
139f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        final ControllableActivity activity = (ControllableActivity) getActivity();
140fb05201c2c5c53f58846112240a05849319317a9mindyp        if (activity == null || mConversation == null || mMessage == null) {
141fb05201c2c5c53f58846112240a05849319317a9mindyp            LogUtils.w(LOG_TAG, "ignoring markUnread for conv=%s",
142fb05201c2c5c53f58846112240a05849319317a9mindyp                    mConversation != null ? mConversation.id : 0);
143f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            return;
144f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
145f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        HashSet<Uri> uris = new HashSet<Uri>();
146f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        uris.add(mMessage.uri);
147f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        activity.getConversationUpdater().markConversationMessagesUnread(mConversation, uris,
148f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp                ConversationInfo.toString(mConversation.conversationInfo));
149f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
150f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
151f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
152f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void onAccountChanged() {
153f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
154f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
155f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
156f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
157f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void setMessageSpacerHeight(MessageHeaderItem item, int newSpacerHeight) {
158f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
159f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
160f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
161f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
162f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void setMessageExpanded(MessageHeaderItem item, int newSpacerHeight) {
163f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
164f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
165f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
166f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
167f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void onConversationViewHeaderHeightChange(int newHeight) {
168f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Do nothing.
169f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
170f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
171f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
172f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void onUserVisibleHintChanged() {
173604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        if (mActivity == null) {
174604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp            return;
175604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        }
176604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        final SubjectDisplayChanger sdc = mActivity.getSubjectDisplayChanger();
177604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        if (sdc != null) {
178604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp            sdc.setSubject(mConversation.subject);
179604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        }
180604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp        mConversationHeaderView.setSubject(mConversation.subject, false /* notify */);
18126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        this.mScrollView.scrollTo(0, 0);
1824d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook        onConversationSeen();
183f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
184f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
185f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
186f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    public void showExternalResources(Message msg) {
187f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        mWebView.getSettings().setBlockNetworkImage(false);
188f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
189f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
190f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    @Override
191f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    protected void onMessageCursorLoadFinished(Loader<Cursor> loader, Cursor data,
192f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            boolean wasNull, boolean changed) {
193f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        MessageCursor messageCursor = getMessageCursor();
194f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
195f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // ignore cursors that are still loading results
196f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        if (messageCursor == null || !messageCursor.isLoaded()) {
197f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            LogUtils.i(LOG_TAG, "CONV RENDER: existing cursor is null, rendering from scratch");
198f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            return;
199f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
200f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        renderMessageBodies(messageCursor, mEnableContentReadySignal);
201f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
202f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp
203f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    /**
204f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * Populate the adapter with overlay views (message headers, super-collapsed
205f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * blocks, a conversation header), and return an HTML document with spacer
206f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     * divs inserted for all overlays.
207f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp     */
208f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    private void renderMessageBodies(MessageCursor messageCursor,
209f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            boolean enableContentReadySignal) {
210f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        StringBuilder convHtml = new StringBuilder();
211f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        String content;
212f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        if (messageCursor.moveToFirst()) {
213f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            content = messageCursor.getString(UIProvider.MESSAGE_BODY_HTML_COLUMN);
214f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            if (TextUtils.isEmpty(content)) {
215f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp                content = messageCursor.getString(UIProvider.MESSAGE_BODY_TEXT_COLUMN);
216f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            }
217f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            convHtml.append(content);
218f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mWebView.loadDataWithBaseURL(mBaseUri, convHtml.toString(), "text/html", "utf-8", null);
219f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessage = messageCursor.getMessage();
220f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            ConversationViewAdapter mAdapter = new ConversationViewAdapter(mActivity, null, null,
221f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp                    null, null, null, null, null, null);
222f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            MessageHeaderItem item = mAdapter.newMessageHeaderItem(mMessage, true);
223f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessageHeaderView.initialize(mDateBuilder, this, mAddressCache);
22477a4605e6fbc368b2b87b4888f2ffd6329620807mindyp            mMessageHeaderView.setExpandMode(MessageHeaderView.POPUP_MODE);
225f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessageHeaderView.bind(item, false);
226f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp            mMessageHeaderView.setMessageDetailsVisibility(View.VISIBLE);
22726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp            if (mMessage.hasAttachments) {
22826d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp                mMessageFooterView.setVisibility(View.VISIBLE);
22926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp                mMessageFooterView.initialize(getLoaderManager(), getFragmentManager());
23026d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp                mMessageFooterView.bind(item, false);
23126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp            }
23226d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        }
23326d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    }
23426d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp
23526d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    @Override
23626d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp    public void onConversationUpdated(Conversation conv) {
23726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        final ConversationViewHeader headerView = mConversationHeaderView;
23826d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp        if (headerView != null) {
23926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp            headerView.onConversationUpdated(conv);
240f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        }
241f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp    }
242f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp}
243