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