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