SecureConversationViewFragment.java revision 4ddda2f0a4ee5381a90779a6939b05b064ce5d11
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 204ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.app.Fragment; 21f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.content.Loader; 22f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.net.Uri; 23f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.os.Bundle; 24f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.LayoutInflater; 25f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.View; 26f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.view.ViewGroup; 27f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport android.webkit.WebView; 28f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 294ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.browse.ConversationAccountController; 308812d3c50e35c4f2a02d29c35c76082c4ebec0cdAndrew Sappersteinimport com.android.mail.browse.ConversationMessage; 31351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.ConversationViewHeader; 32351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.MessageCursor; 33351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport com.android.mail.browse.MessageHeaderView; 34c42ad5ea3a49e6045a79d1fde3d858033176e67bPaul Westbrookimport com.android.mail.content.ObjectCursor; 35adbf3e8cadb66666f307352b72537fbac57b916fAndy Huangimport com.android.mail.providers.Account; 364ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.android.mail.providers.Address; 37f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.providers.Conversation; 38f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogTag; 39f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport com.android.mail.utils.LogUtils; 404ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.google.common.collect.ImmutableList; 414ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport com.google.common.collect.Sets; 42f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 43f4fce1227d8b49f45e6569f1590565f2df9e8d6emindypimport java.util.HashSet; 444ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport java.util.List; 454ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport java.util.Map; 464ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport java.util.Set; 47f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 484ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinpublic class SecureConversationViewFragment extends AbstractConversationViewFragment 494ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein implements SecureConversationViewControllerCallbacks { 50f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp private static final String LOG_TAG = LogTag.getLogTag(); 51bf1d35fab89443d8e380ab48e98ac1c8cd7a6686Andrew Sapperstein 524ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private SecureConversationViewController mViewController; 53376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 54376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein private class SecureConversationWebViewClient extends AbstractConversationWebViewClient { 554ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public SecureConversationWebViewClient(Account account) { 564ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein super(account); 57376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein } 58376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 59ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp @Override 60ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp public void onPageFinished(WebView view, String url) { 619d3fd92ed6091dbd0d38799222a1cf841f1c3f29Andy Huang if (isUserVisible()) { 624d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook onConversationSeen(); 634d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook } 644d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook 654ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mViewController.dismissLoadingStatus(); 664ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 674ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final Set<String> emailAddresses = Sets.newHashSet(); 684ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final List<Address> cacheCopy; 694ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein synchronized (mAddressCache) { 704ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein cacheCopy = ImmutableList.copyOf(mAddressCache.values()); 714ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 724ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein for (Address addr : cacheCopy) { 734ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein emailAddresses.add(addr.getAddress()); 744ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 754ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final ContactLoaderCallbacks callbacks = getContactInfoSource(); 764ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein callbacks.setSenders(emailAddresses); 774ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein getLoaderManager().restartLoader(CONTACT_LOADER, Bundle.EMPTY, callbacks); 78ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp } 79ff282d0ef252dbdaf6e9f4e2a7fd640287c01e6bmindyp }; 80f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 81f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp /** 82f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Creates a new instance of {@link ConversationViewFragment}, initialized 83f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * to display a conversation with other parameters inherited/copied from an 84f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * existing bundle, typically one created using {@link #makeBasicArgs}. 85f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp */ 86f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public static SecureConversationViewFragment newInstance(Bundle existingArgs, 87f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp Conversation conversation) { 88f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp SecureConversationViewFragment f = new SecureConversationViewFragment(); 89f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp Bundle args = new Bundle(existingArgs); 90f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp args.putParcelable(ARG_CONVERSATION, conversation); 91f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp f.setArguments(args); 92f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp return f; 93f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 94f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 95f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp /** 96f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * Constructor needs to be public to handle orientation changes and activity 97f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp * lifecycle events. 98f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp */ 99f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public SecureConversationViewFragment() { 100f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp super(); 101f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 102f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 103f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 104376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein public void onCreate(Bundle savedState) { 105376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein super.onCreate(savedState); 106376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 1074ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mWebViewClient = new SecureConversationWebViewClient(mAccount); 1084ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mViewController = new SecureConversationViewController(this); 1094ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 1104ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1114ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1124ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public View onCreateView(LayoutInflater inflater, ViewGroup container, 1134ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein Bundle savedInstanceState) { 1144ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return mViewController.onCreateView(inflater, container, savedInstanceState); 115376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein } 116376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 117376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein @Override 118f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void onActivityCreated(Bundle savedInstanceState) { 119f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp super.onActivityCreated(savedInstanceState); 1204ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mViewController.onActivityCreated(savedInstanceState); 1214ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 122376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 1234ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // Start implementations of SecureConversationViewControllerCallbacks 124bf1d35fab89443d8e380ab48e98ac1c8cd7a6686Andrew Sapperstein 1254ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1264ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public Fragment getFragment() { 1274ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return this; 128f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 129f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 130f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 1314ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public AbstractConversationWebViewClient getWebViewClient() { 1324ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return mWebViewClient; 1334ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 134376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 1354ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1364ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void setupConversationHeaderView(ConversationViewHeader headerView) { 1374ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein headerView.setCallbacks(this, this); 1384ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein headerView.setFolders(mConversation); 1394ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein headerView.setSubject(mConversation.subject); 1404ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 141f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 1424ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1434ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public boolean isViewVisibleToUser() { 1444ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return isUserVisible(); 1454ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 146f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 1474ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1484ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public ConversationAccountController getConversationAccountController() { 1494ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return this; 1504ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 151a8d623a3676f8abdda52b9516556e52e8490dbf7Andrew Sapperstein 1524ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1534ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public Map<String, Address> getAddressCache() { 1544ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return mAddressCache; 1554ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 1564d8cad5e37ade03903a23cca8ea3e782af21170fPaul Westbrook 1574ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1584ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void setupMessageHeaderVeiledMatcher(MessageHeaderView messageHeaderView) { 1594ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein messageHeaderView.setVeiledMatcher( 1604ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein ((ControllableActivity) getActivity()).getAccountController() 1614ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein .getVeiledAddressMatcher()); 1624ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 1634ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1644ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1654ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public void startMessageLoader() { 1664ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein getLoaderManager().initLoader(MESSAGE_LOADER, null, getMessageLoaderCallbacks()); 1674ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 1684ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 1694ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1704ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public String getBaseUri() { 1714ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return mBaseUri; 1724ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 173be7739bf0cebc5018c8ffb0c649fc62a74d74e69Andy Huang 1744ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein @Override 1754ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public boolean isViewOnlyMode() { 1764ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return false; 177f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 178f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 1794ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // End implementations of SecureConversationViewControllerCallbacks 1804ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 181f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 182f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp protected void markUnread() { 183d82a31f04f2a4cce27c8023d5330ff13aad198b0Vikram Aggarwal super.markUnread(); 184d82a31f04f2a4cce27c8023d5330ff13aad198b0Vikram Aggarwal // Ignore unsafe calls made after a fragment is detached from an activity 185f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp final ControllableActivity activity = (ControllableActivity) getActivity(); 1864ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final ConversationMessage message = mViewController.getMessage(); 1874ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein if (activity == null || mConversation == null || message == null) { 188fb05201c2c5c53f58846112240a05849319317a9mindyp LogUtils.w(LOG_TAG, "ignoring markUnread for conv=%s", 189fb05201c2c5c53f58846112240a05849319317a9mindyp mConversation != null ? mConversation.id : 0); 190f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp return; 191f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 192d82a31f04f2a4cce27c8023d5330ff13aad198b0Vikram Aggarwal final HashSet<Uri> uris = new HashSet<Uri>(); 1934ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein uris.add(message.uri); 194f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp activity.getConversationUpdater().markConversationMessagesUnread(mConversation, uris, 195351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang mViewState.getConversationInfo()); 196f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 197f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 198f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 199adbf3e8cadb66666f307352b72537fbac57b916fAndy Huang public void onAccountChanged(Account newAccount, Account oldAccount) { 200f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Do nothing. 201f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 202f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 203f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 204f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void onConversationViewHeaderHeightChange(int newHeight) { 205f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Do nothing. 206f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 207f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 208f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 209f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp public void onUserVisibleHintChanged() { 210604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp if (mActivity == null) { 211604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp return; 212604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp } 21351ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal if (isUserVisible()) { 21451ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal onConversationSeen(); 215604f7716eaac3bc0989cdb2ff129c383b6dfe4d6mindyp } 216f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 217f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp 218f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp @Override 219c42ad5ea3a49e6045a79d1fde3d858033176e67bPaul Westbrook protected void onMessageCursorLoadFinished(Loader<ObjectCursor<ConversationMessage>> loader, 220c42ad5ea3a49e6045a79d1fde3d858033176e67bPaul Westbrook MessageCursor newCursor, MessageCursor oldCursor) { 221f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // ignore cursors that are still loading results 222014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang if (newCursor == null || !newCursor.isLoaded()) { 223f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp LogUtils.i(LOG_TAG, "CONV RENDER: existing cursor is null, rendering from scratch"); 224f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp return; 225f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 2261abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei if (mActivity == null || mActivity.isFinishing()) { 2271abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei // Activity is finishing, just bail. 2281abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei return; 2291abfcaf0ee345acee28f0b4892314119082b28a2Mark Wei } 2304ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein if (!newCursor.moveToFirst()) { 2312e57e5485504c9ea2e5b5186f22bb76ea5f7bf6dAndy Huang LogUtils.e(LOG_TAG, "unable to open message cursor"); 2322e57e5485504c9ea2e5b5186f22bb76ea5f7bf6dAndy Huang return; 2332e57e5485504c9ea2e5b5186f22bb76ea5f7bf6dAndy Huang } 2344ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein 2354ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein mViewController.renderMessage(newCursor.getMessage()); 23626d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp } 23726d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp 23826d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp @Override 23926d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp public void onConversationUpdated(Conversation conv) { 2404ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein final ConversationViewHeader headerView = mViewController.getConversationHeaderView(); 24126d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp if (headerView != null) { 24226d4d2d9c43c499f458808f050ec73ea3c28dec4mindyp headerView.onConversationUpdated(conv); 24351ad9041014920d78d9b7b3ab84ec04a7c41beaeVikram Aggarwal headerView.setSubject(conv.subject); 244f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 245f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp } 2461b3cc47f54072105c161d6ed557550e0e149b8bbmindyp 2474ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein // Need this stub here 2484ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein public boolean supportsMessageTransforms() { 2494ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein return false; 2504ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 251f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp} 252