ConversationSelectionSet.java revision d247dc966bca1ed303039c2893c54979d448a336
14a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal/******************************************************************************* 24a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * Copyright (C) 2012 Google Inc. 34a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * Licensed to The Android Open Source Project. 44a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * 54a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * Licensed under the Apache License, Version 2.0 (the "License"); 64a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * you may not use this file except in compliance with the License. 74a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * You may obtain a copy of the License at 84a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * 94a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * http://www.apache.org/licenses/LICENSE-2.0 104a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * 114a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * Unless required by applicable law or agreed to in writing, software 124a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * distributed under the License is distributed on an "AS IS" BASIS, 134a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 144a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * See the License for the specific language governing permissions and 154a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * limitations under the License. 164a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal *******************************************************************************/ 174a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 184a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalpackage com.android.mail.ui; 194a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 204a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport com.google.common.annotations.VisibleForTesting; 214a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport com.google.common.collect.Lists; 224a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 234a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport android.os.Parcel; 244a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport android.os.Parcelable; 254a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 261ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport com.android.mail.providers.Conversation; 274a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport java.util.ArrayList; 284a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport java.util.Collection; 294a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport java.util.HashMap; 304a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 314a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal/** 324a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * A simple thread-safe wrapper over a set of conversations representing a 334a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * selection set (e.g. in a conversation list). This class dispatches changes 344a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * when the set goes empty, and when it becomes unempty. For simplicity, this 354a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * class <b>does not allow modifications</b> to the collection in observers when 364a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * responding to change events. 374a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal */ 384a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalpublic class ConversationSelectionSet implements Parcelable { 391ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public static final Parcelable.Creator<ConversationSelectionSet> CREATOR = 401ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal new Parcelable.Creator<ConversationSelectionSet>() { 411ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 421ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 431ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public ConversationSelectionSet createFromParcel(Parcel source) { 441ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal ConversationSelectionSet result = new ConversationSelectionSet(); 451ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal Parcelable[] conversations = source.readParcelableArray( 461ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal Conversation.class.getClassLoader()); 471ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal for (Parcelable parceled : conversations) { 481ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal Conversation conversation = (Conversation) parceled; 491ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal result.put(conversation.id, conversation); 501ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 511ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal return result; 521ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 531ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 541ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 551ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public ConversationSelectionSet[] newArray(int size) { 561ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal return new ConversationSelectionSet[size]; 571ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 581ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal }; 591ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 601ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal private final HashMap<Long, Conversation> mInternalMap = 611ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal new HashMap<Long, Conversation>(); 624a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 634a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal @VisibleForTesting 644a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal final ArrayList<ConversationSetObserver> mObservers = new ArrayList<ConversationSetObserver>(); 654a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 664a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal /** 674a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * Registers an observer to listen for interesting changes on this set. 684a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * 694a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal * @param observer the observer to register. 704a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal */ 714a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal public synchronized void addObserver(ConversationSetObserver observer) { 724a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal mObservers.add(observer); 734a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 744a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 75d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal /** 76d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * Clear the selected set entirely. 77d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal */ 781ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public synchronized void clear() { 791ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal boolean initiallyNotEmpty = !mInternalMap.isEmpty(); 801ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal mInternalMap.clear(); 811ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 821ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal if (mInternalMap.isEmpty() && initiallyNotEmpty) { 831ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal ArrayList<ConversationSetObserver> observersCopy = Lists.newArrayList(mObservers); 841ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal dispatchOnChange(observersCopy); 851ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal dispatchOnEmpty(observersCopy); 861ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 871ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 881ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 89d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal /** 90d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * Returns true if the given key exists in the conversation selection set. This assumes 91d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * the internal representation holds conversation.id values. 92d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * @param key the id of the conversation 93d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * @return true if the key exists in this selected set. 94d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal */ 95d3818654c103802704fc788cf9c6775d25b65bffMindy Pereira public synchronized boolean containsKey(Long key) { 961ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal return mInternalMap.containsKey(key); 971ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 981ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 99d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal /** 100d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * Returns true if the given conversation is stored in the selection set. 101d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * @param conversation 102d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * @return true if the conversation exists in the selected set. 103d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal */ 104d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal public synchronized boolean contains(Conversation conversation) { 105d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal return mInternalMap.containsKey(conversation.id); 106d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal } 107d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal 1081ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 1091ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public int describeContents() { 1101ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal return 0; 1111ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 1121ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 1131ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal private synchronized void dispatchOnBecomeUnempty( 1141ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal ArrayList<ConversationSetObserver> observers) { 1151ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal for (ConversationSetObserver observer : observers) { 1161ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal observer.onSetPopulated(this); 1171ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 1184a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1194a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1204a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal private synchronized void dispatchOnChange(ArrayList<ConversationSetObserver> observers) { 1214a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal // Copy observers so that they may unregister themselves as listeners on 1224a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal // event handling. 1234a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal for (ConversationSetObserver observer : observers) { 1244a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal observer.onSetChanged(this); 1254a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1264a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1274a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1284a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal private synchronized void dispatchOnEmpty(ArrayList<ConversationSetObserver> observers) { 1294a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal for (ConversationSetObserver observer : observers) { 1301ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal observer.onSetEmpty(); 1314a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1324a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1334a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1341ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal /** 1351ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal * Is this conversation set empty? 1361ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal * @return true if the conversation selection set is empty. False otherwise. 1371ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal */ 1381ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public synchronized boolean isEmpty() { 1391ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal return mInternalMap.isEmpty(); 1401ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 1411ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 1424a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal /** @see java.util.HashMap#put */ 1431ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal private synchronized void put(Long id, Conversation info) { 1444a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal boolean initiallyEmpty = mInternalMap.isEmpty(); 1454a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal mInternalMap.put(id, info); 1464a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1474a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal ArrayList<ConversationSetObserver> observersCopy = Lists.newArrayList(mObservers); 1484a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal dispatchOnChange(observersCopy); 1494a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal if (initiallyEmpty) { 1504a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal dispatchOnBecomeUnempty(observersCopy); 1514a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1524a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1534a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1544a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal /** @see java.util.HashMap#remove */ 1554a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal private synchronized void remove(Long id) { 1564a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal boolean initiallyNotEmpty = !mInternalMap.isEmpty(); 1574a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal mInternalMap.remove(id); 1584a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1594a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal ArrayList<ConversationSetObserver> observersCopy = Lists.newArrayList(mObservers); 1604a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal dispatchOnChange(observersCopy); 1614a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal if (mInternalMap.isEmpty() && initiallyNotEmpty) { 1624a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal dispatchOnEmpty(observersCopy); 1634a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1644a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1654a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1661ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal /** 1671ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal * Unregisters an observer for change events. 1681ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal * 1691ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal * @param observer the observer to unregister. 1701ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal */ 1711ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public synchronized void removeObserver(ConversationSetObserver observer) { 1721ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal mObservers.remove(observer); 1734a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1744a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 175d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal /** 176d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * Returns the number of conversations that are currently selected 177d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * @return the number of selected conversations. 178d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal */ 1791ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public synchronized int size() { 1801ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal return mInternalMap.size(); 1814a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1824a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1834a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal /** 184d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * Toggles the existence of the given conversation in the selection set. If the conversation is 185d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * currently selected, it is deselected. If it doesn't exist in the selection set, then it is 186d247dc966bca1ed303039c2893c54979d448a336Vikram Aggarwal * selected. 1871ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal * @param conversation 1884a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal */ 1891ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public void toggle(Conversation conversation) { 1901ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal long conversationId = conversation.id; 1911ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal if (containsKey(conversationId)) { 1921ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal remove(conversationId); 1934a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } else { 1941ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal put(conversationId, conversation); 1954a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1964a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 1974a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 1981ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal /** @see java.util.HashMap#values */ 1991ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal public synchronized Collection<Conversation> values() { 2001ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal return mInternalMap.values(); 2014a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 2024a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 2034a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal @Override 2044a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal public void writeToParcel(Parcel dest, int flags) { 2051ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal Conversation[] values = values().toArray(new Conversation[size()]); 2064a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal dest.writeParcelableArray(values, flags); 2074a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 2084a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal} 209