1839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang/*
2839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * Copyright (C) 2012 Google Inc.
3839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * Licensed to The Android Open Source Project.
4839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang *
5839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * Licensed under the Apache License, Version 2.0 (the "License");
6839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * you may not use this file except in compliance with the License.
7839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * You may obtain a copy of the License at
8839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang *
9839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang *      http://www.apache.org/licenses/LICENSE-2.0
10839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang *
11839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * Unless required by applicable law or agreed to in writing, software
12839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * distributed under the License is distributed on an "AS IS" BASIS,
13839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * See the License for the specific language governing permissions and
15839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * limitations under the License.
16839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang */
17839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
18839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangpackage com.android.mail.ui;
19839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
20839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport android.net.Uri;
21839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport android.os.Bundle;
22839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport android.os.Parcel;
23839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport android.os.Parcelable;
24839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
25839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport com.android.mail.providers.Conversation;
26839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport com.android.mail.providers.Message;
27839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport com.google.common.collect.Maps;
28839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport com.google.common.collect.Sets;
29839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
30839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport java.util.Map;
31839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huangimport java.util.Set;
32839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
33839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang/**
34839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang * A small class to keep state for conversation view when restoring.
35839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang *
36839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang */
379f957f3463fd149d33c209409e2bba500b539177Andrew Sappersteinpublic class ConversationViewState implements Parcelable {
38839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
39839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    // N.B. don't serialize entire Messages because they contain body HTML/text
40839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
41839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    private final Map<Uri, MessageViewState> mMessageViewStates = Maps.newHashMap();
42839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
43351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang    private byte[] mConversationInfo;
44839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
45cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    public static final class ExpansionState {
46cee3c90574b48ccaa0f8b9f9341383c231ed41d2Andrew Sapperstein        public static int NONE = 0;
47cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        public static int EXPANDED = 1;
48cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        public static int COLLAPSED = 2;
49cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        public static int SUPER_COLLAPSED = 3;
50cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
51cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        private ExpansionState() {}
52cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
53cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        public static boolean isExpanded(int state) {
54cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang            return state == EXPANDED;
55cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        }
56cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        public static boolean isSuperCollapsed(int state) {
57cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang            return state == SUPER_COLLAPSED;
58cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        }
59cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    }
60cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
61839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    public ConversationViewState() {}
62839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
6347aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang    /**
6447aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang     * Copy constructor that will copy overall conversation state, but NOT individual message state.
6547aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang     */
6647aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang    public ConversationViewState(ConversationViewState other) {
6747aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang        mConversationInfo = other.mConversationInfo;
6847aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang    }
6947aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang
70839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    public boolean isUnread(Message m) {
71839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        final MessageViewState mvs = mMessageViewStates.get(m.uri);
72839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        return (mvs != null && !mvs.read);
73839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
74839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
75839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    public void setReadState(Message m, boolean read) {
76839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        MessageViewState mvs = mMessageViewStates.get(m.uri);
77839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        if (mvs == null) {
78839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            mvs = new MessageViewState();
79839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
80839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        mvs.read = read;
81839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        mMessageViewStates.put(m.uri, mvs);
82839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
83839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
84202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy    public boolean getShouldShowImages(Message m) {
85202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        final MessageViewState mvs = mMessageViewStates.get(m.uri);
86202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        return (mvs != null && mvs.showImages);
87202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy    }
88202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy
89202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy    public void setShouldShowImages(Message m, boolean showImages) {
90202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        MessageViewState mvs = mMessageViewStates.get(m.uri);
91202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        if (mvs == null) {
92202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy            mvs = new MessageViewState();
93202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        }
94202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        mvs.showImages = showImages;
95202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        mMessageViewStates.put(m.uri, mvs);
96202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy    }
97202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy
98839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    /**
99cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang     * Returns the expansion state of a message in a conversation view.
100839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang     *
101839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang     * @param m a Message in the conversation
102cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang     * @return 1 = expanded, 2 = collapsed, 3 = super collapsed, or null otherwise
103cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang     * (see {@link ExpansionState}).
104839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang     */
10508098ec4c894d9a15dfe800ad2397494e7e0a79aPaul Westbrook    public Integer getExpansionState(Message m) {
106839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        final MessageViewState mvs = mMessageViewStates.get(m.uri);
10708098ec4c894d9a15dfe800ad2397494e7e0a79aPaul Westbrook        return (mvs == null ? null : mvs.expansionState);
108839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
109839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
11008098ec4c894d9a15dfe800ad2397494e7e0a79aPaul Westbrook    public void setExpansionState(Message m, int expansionState) {
111839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        MessageViewState mvs = mMessageViewStates.get(m.uri);
112839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        if (mvs == null) {
113839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            mvs = new MessageViewState();
114839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
11508098ec4c894d9a15dfe800ad2397494e7e0a79aPaul Westbrook        mvs.expansionState = expansionState;
116839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        mMessageViewStates.put(m.uri, mvs);
117839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
118839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
119351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang    public byte[] getConversationInfo() {
120839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        return mConversationInfo;
121839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
122839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
123cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    public void setInfoForConversation(Conversation conv) {
124edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        mConversationInfo = conv.conversationInfo.toBlob();
125839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
126839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
127839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    /**
128839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang     * Returns URIs of all unread messages in the conversation per
129839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang     * {@link #setReadState(Message, boolean)}. Returns an empty set for read conversations.
130839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang     *
131839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang     */
132839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    public Set<Uri> getUnreadMessageUris() {
133839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        final Set<Uri> result = Sets.newHashSet();
134839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        for (Uri uri : mMessageViewStates.keySet()) {
135839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            final MessageViewState mvs = mMessageViewStates.get(uri);
136839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            if (mvs != null && !mvs.read) {
137839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang                result.add(uri);
138839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            }
139839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
140839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        return result;
141839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
142839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
14347aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang    public boolean contains(Message m) {
14447aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang        return mMessageViewStates.containsKey(m.uri);
14547aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang    }
14647aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang
147839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    @Override
148839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    public int describeContents() {
149839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        return 0;
150839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
151839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
152839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    @Override
153839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    public void writeToParcel(Parcel dest, int flags) {
154839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        final Bundle states = new Bundle();
155839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        for (Uri uri : mMessageViewStates.keySet()) {
156839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            final MessageViewState mvs = mMessageViewStates.get(uri);
157839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            states.putParcelable(uri.toString(), mvs);
158839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
159839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        dest.writeBundle(states);
160351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        dest.writeByteArray(mConversationInfo);
161839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
162839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
1632bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang    private ConversationViewState(Parcel source, ClassLoader loader) {
1642bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang        final Bundle states = source.readBundle(loader);
165839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        for (String key : states.keySet()) {
166839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            final MessageViewState state = states.getParcelable(key);
167839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            mMessageViewStates.put(Uri.parse(key), state);
168839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
169351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        mConversationInfo = source.createByteArray();
170839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
171839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
1722bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang    public static final ClassLoaderCreator<ConversationViewState> CREATOR =
1732bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang            new ClassLoaderCreator<ConversationViewState>() {
174839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
175839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        @Override
176839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        public ConversationViewState createFromParcel(Parcel source) {
1772bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang            return new ConversationViewState(source, null);
1782bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang        }
1792bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang
1802bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang        @Override
1812bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang        public ConversationViewState createFromParcel(Parcel source, ClassLoader loader) {
1822bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang            return new ConversationViewState(source, loader);
183839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
184839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
185839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        @Override
186839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        public ConversationViewState[] newArray(int size) {
187839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            return new ConversationViewState[size];
188839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
189839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
190839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    };
191839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
192839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    // Keep per-message state in an inner Parcelable.
193839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    // This is a semi-private implementation detail.
194839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    static class MessageViewState implements Parcelable {
195839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
196839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        public boolean read;
197839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        /**
198cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang         * See {@link ExpansionState} for values.
199cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang         *
200839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang         */
20108098ec4c894d9a15dfe800ad2397494e7e0a79aPaul Westbrook        public Integer expansionState;
202202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy        public boolean showImages;
203839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
204839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        public MessageViewState() {}
205839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
206839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        @Override
207839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        public int describeContents() {
208839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            return 0;
209839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
210839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
211839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        @Override
212839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        public void writeToParcel(Parcel dest, int flags) {
213839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            dest.writeInt(read ? 1 : 0);
21408098ec4c894d9a15dfe800ad2397494e7e0a79aPaul Westbrook            dest.writeInt(expansionState == null ? -1 : expansionState.intValue());
215202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy            dest.writeInt(showImages ? 1 : 0);
216839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
217839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
218839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        private MessageViewState(Parcel source) {
219839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            read = (source.readInt() != 0);
220839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            final int expandedVal = source.readInt();
22108098ec4c894d9a15dfe800ad2397494e7e0a79aPaul Westbrook            expansionState = (expandedVal == -1) ? null : expandedVal;
222202738427ede23dd5863583aa3df17e4abfbf5e2Scott Kennedy            showImages = (source.readInt() != 0);
223839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        }
224839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
225839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        @SuppressWarnings("hiding")
2262bc8bc1f69faacaddab41ab61e1d2e8658f4181fAndy Huang        public static final Parcelable.Creator<MessageViewState> CREATOR =
227839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang                new Parcelable.Creator<MessageViewState>() {
228839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
229839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            @Override
230839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            public MessageViewState createFromParcel(Parcel source) {
231839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang                return new MessageViewState(source);
232839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            }
233839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
234839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            @Override
235839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            public MessageViewState[] newArray(int size) {
236839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang                return new MessageViewState[size];
237839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang            }
238839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
239839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        };
240839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
241839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang    }
242839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang
243839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang}
244