SecureConversationViewFragment.java revision 1b3cc47f54072105c161d6ed557550e0e149b8bb
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; 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; 37f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.ConversationViewAdapter.MessageHeaderItem; 38f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.MessageCursor.ConversationMessage; 39f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.browse.MessageHeaderView.MessageHeaderViewCallbacks; 40f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.Conversation; 41f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.ConversationInfo; 42f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.Message; 43f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.UIProvider; 44f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.AbstractConversationViewFragment; 45f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.ControllableActivity; 46f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.ConversationViewFragment; 47f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.ui.SubjectDisplayChanger; 48f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogTag; 49f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogUtils; 50f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 51f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport java.util.HashSet; 52f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 53f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyppublic class SecureConversationViewFragment extends AbstractConversationViewFragment implements 54f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp MessageHeaderViewCallbacks { 55f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp private static final String LOG_TAG = LogTag.getLogTag(); 5626d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp private WebView mWebView; 57f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp private ConversationViewHeader mConversationHeaderView; 58f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp private MessageHeaderView mMessageHeaderView; 5926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp private MessageFooterView mMessageFooterView; 60f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp private ConversationMessage mMessage; 6126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp private ScrollView mScrollView; 62542fec98d011c78782b63b33d29cf81044e96f75Paul Westbrook private WebViewClient mWebViewClient = new AbstractConversationWebViewClient() { 63ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp @Override 64ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp public void onPageFinished(WebView view, String url) { 659d3fd92ed6091dbd0d38799222a1cf841f1c3f29Andy Huang if (isUserVisible()) { 664d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook onConversationSeen(); 674d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook } 684d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook 69ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp dismissLoadingStatus(); 70ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp } 71ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp }; 72f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 73f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp /** 74f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Creates a new instance of {@link ConversationViewFragment}, initialized 75f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * to display a conversation with other parameters inherited/copied from an 76f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * existing bundle, typically one created using {@link #makeBasicArgs}. 77f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp */ 78f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public static SecureConversationViewFragment newInstance(Bundle existingArgs, 79f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp Conversation conversation) { 80f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp SecureConversationViewFragment f = new SecureConversationViewFragment(); 81f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp Bundle args = new Bundle(existingArgs); 82f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp args.putParcelable(ARG_CONVERSATION, conversation); 83f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp f.setArguments(args); 84f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp return f; 85f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 86f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 87f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp /** 88f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Constructor needs to be public to handle orientation changes and activity 89f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * lifecycle events. 90f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp */ 91f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public SecureConversationViewFragment() { 92f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp super(); 93f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 94f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 95f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 96f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void onActivityCreated(Bundle savedInstanceState) { 97f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp super.onActivityCreated(savedInstanceState); 98f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mConversationHeaderView.setCallbacks(this, this); 99604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp mConversationHeaderView.setFoldersVisible(false); 100f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp final SubjectDisplayChanger sdc = mActivity.getSubjectDisplayChanger(); 101f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp if (sdc != null) { 102f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp sdc.setSubject(mConversation.subject); 103f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 1047388dba58aecafacd91ded0f787cf01bfc7af232Andy Huang mConversationHeaderView.setSubject(mConversation.subject); 105f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessageHeaderView.setContactInfoSource(getContactInfoSource()); 106f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessageHeaderView.setCallbacks(this); 107f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessageHeaderView.setExpandable(false); 108f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp getLoaderManager().initLoader(MESSAGE_LOADER, null, getMessageLoaderCallbacks()); 109ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp showLoadingStatus(); 110f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 111f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 112f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 113f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public View onCreateView(LayoutInflater inflater, ViewGroup container, 114f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp Bundle savedInstanceState) { 115f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp View rootView = inflater.inflate(R.layout.secure_conversation_view, container, false); 11626d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp mScrollView = (ScrollView) rootView.findViewById(R.id.scroll_view); 117f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mConversationHeaderView = (ConversationViewHeader) rootView.findViewById(R.id.conv_header); 118f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessageHeaderView = (MessageHeaderView) rootView.findViewById(R.id.message_header); 11926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp mMessageFooterView = (MessageFooterView) rootView.findViewById(R.id.message_footer); 120ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp instantiateProgressIndicators(rootView); 12126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp mWebView = (WebView) rootView.findViewById(R.id.webview); 122ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp mWebView.setWebViewClient(mWebViewClient); 12305e522165c415f0a16a23117cd7d91a033780890mindyp mWebView.setFocusable(false); 124f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp final WebSettings settings = mWebView.getSettings(); 125f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 126f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp settings.setJavaScriptEnabled(false); 127f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL); 128f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 129f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp settings.setSupportZoom(true); 130f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp settings.setBuiltInZoomControls(true); 131f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp settings.setDisplayZoomControls(false); 1324d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook 133f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp return rootView; 134f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 135f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 136f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 137f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp protected void markUnread() { 138f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Ignore unsafe calls made after a fragment is detached from an 139f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // activity 140f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp final ControllableActivity activity = (ControllableActivity) getActivity(); 141fb05201c2c5c53f58846112240a05849319317a9mindyp if (activity == null || mConversation == null || mMessage == null) { 142fb05201c2c5c53f58846112240a05849319317a9mindyp LogUtils.w(LOG_TAG, "ignoring markUnread for conv=%s", 143fb05201c2c5c53f58846112240a05849319317a9mindyp mConversation != null ? mConversation.id : 0); 144f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp return; 145f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 146f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp HashSet<Uri> uris = new HashSet<Uri>(); 147f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp uris.add(mMessage.uri); 148f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp activity.getConversationUpdater().markConversationMessagesUnread(mConversation, uris, 149f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp ConversationInfo.toString(mConversation.conversationInfo)); 150f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 151f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 152f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 153f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void onAccountChanged() { 154f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Do nothing. 155f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 156f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 157f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 158f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void setMessageSpacerHeight(MessageHeaderItem item, int newSpacerHeight) { 159f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Do nothing. 160f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 161f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 162f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 163f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void setMessageExpanded(MessageHeaderItem item, int newSpacerHeight) { 164f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Do nothing. 165f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 166f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 167f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 168f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void onConversationViewHeaderHeightChange(int newHeight) { 169f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Do nothing. 170f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 171f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 172f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 173f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void onUserVisibleHintChanged() { 174604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp if (mActivity == null) { 175604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp return; 176604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp } 177604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp final SubjectDisplayChanger sdc = mActivity.getSubjectDisplayChanger(); 178604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp if (sdc != null) { 179604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp sdc.setSubject(mConversation.subject); 180604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp } 1817388dba58aecafacd91ded0f787cf01bfc7af232Andy Huang mConversationHeaderView.setSubject(mConversation.subject); 18226d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp this.mScrollView.scrollTo(0, 0); 1834d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook onConversationSeen(); 184f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 185f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 186f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 187f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void showExternalResources(Message msg) { 188f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mWebView.getSettings().setBlockNetworkImage(false); 189f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 190f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 191f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 192014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang protected void onMessageCursorLoadFinished(Loader<Cursor> loader, MessageCursor newCursor, 193014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang MessageCursor oldCursor) { 194f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // ignore cursors that are still loading results 195014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang if (newCursor == null || !newCursor.isLoaded()) { 196f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp LogUtils.i(LOG_TAG, "CONV RENDER: existing cursor is null, rendering from scratch"); 197f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp return; 198f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 1991abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei if (mActivity == null || mActivity.isFinishing()) { 2001abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei // Activity is finishing, just bail. 2011abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei return; 2021abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei } 203014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang renderMessageBodies(newCursor, mEnableContentReadySignal); 204f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 205f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 206f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp /** 207f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Populate the adapter with overlay views (message headers, super-collapsed 208f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * blocks, a conversation header), and return an HTML document with spacer 209f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * divs inserted for all overlays. 210f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp */ 211f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp private void renderMessageBodies(MessageCursor messageCursor, 212f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp boolean enableContentReadySignal) { 213f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp StringBuilder convHtml = new StringBuilder(); 214f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp String content; 215f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp if (messageCursor.moveToFirst()) { 216f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp content = messageCursor.getString(UIProvider.MESSAGE_BODY_HTML_COLUMN); 217f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp if (TextUtils.isEmpty(content)) { 218f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp content = messageCursor.getString(UIProvider.MESSAGE_BODY_TEXT_COLUMN); 2190e8a95148f7fdc9c6a33971924b0d29a202d73ecmindyp if (content != null) { 2200e8a95148f7fdc9c6a33971924b0d29a202d73ecmindyp content = Html.toHtml(new SpannedString(content)); 2210e8a95148f7fdc9c6a33971924b0d29a202d73ecmindyp } 222f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 223f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp convHtml.append(content); 224f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mWebView.loadDataWithBaseURL(mBaseUri, convHtml.toString(), "text/html", "utf-8", null); 225f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessage = messageCursor.getMessage(); 226f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp ConversationViewAdapter mAdapter = new ConversationViewAdapter(mActivity, null, null, 227f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp null, null, null, null, null, null); 228f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp MessageHeaderItem item = mAdapter.newMessageHeaderItem(mMessage, true); 229f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessageHeaderView.initialize(mDateBuilder, this, mAddressCache); 23077a4605e6fbc368b2b87b4888f2ffd6329620807mindyp mMessageHeaderView.setExpandMode(MessageHeaderView.POPUP_MODE); 231f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessageHeaderView.bind(item, false); 232f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp mMessageHeaderView.setMessageDetailsVisibility(View.VISIBLE); 23326d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp if (mMessage.hasAttachments) { 23426d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp mMessageFooterView.setVisibility(View.VISIBLE); 23526d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp mMessageFooterView.initialize(getLoaderManager(), getFragmentManager()); 23626d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp mMessageFooterView.bind(item, false); 23726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp } 23826d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp } 23926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp } 24026d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp 24126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp @Override 24226d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp public void onConversationUpdated(Conversation conv) { 24326d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp final ConversationViewHeader headerView = mConversationHeaderView; 24426d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp if (headerView != null) { 24526d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp headerView.onConversationUpdated(conv); 246f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 247f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 2481b3cc47f54072105c161d6ed557550e0e149b8bbmindyp 2491b3cc47f54072105c161d6ed557550e0e149b8bbmindyp @Override 2501b3cc47f54072105c161d6ed557550e0e149b8bbmindyp public void setMessageDetailsExpanded(MessageHeaderItem i, boolean expanded, int heightbefore) { 2511b3cc47f54072105c161d6ed557550e0e149b8bbmindyp // Do nothing. 2521b3cc47f54072105c161d6ed557550e0e149b8bbmindyp } 253f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp} 254