1 /** 2 * Copyright (c) 2012, Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.mail.providers; 18 19 import android.os.Parcel; 20 import android.os.Parcelable; 21 22 import com.google.common.base.Objects; 23 24 import java.util.ArrayList; 25 26 public class ConversationInfo implements Parcelable { 27 28 public final ArrayList<ParticipantInfo> participantInfos; 29 public int messageCount; 30 public int draftCount; 31 public String firstSnippet; 32 public String firstUnreadSnippet; 33 public String lastSnippet; 34 35 public ConversationInfo() { 36 participantInfos = new ArrayList<ParticipantInfo>(); 37 } 38 39 public ConversationInfo(int messageCount) { 40 this.messageCount = messageCount; 41 // message count is a decent approximation of participant count because for all incoming 42 // mailboxes we typically populate the participant list with the sender of each message 43 participantInfos = new ArrayList<ParticipantInfo>(messageCount); 44 } 45 46 public ConversationInfo(int messageCount, int draft, String first, String firstUnread, 47 String last) { 48 // message count is a decent approximation of participant count because for all incoming 49 // mailboxes we typically populate the participant list with the sender of each message 50 participantInfos = new ArrayList<ParticipantInfo>(messageCount); 51 set(messageCount, draft, first, firstUnread, last); 52 } 53 54 private ConversationInfo(Parcel in) { 55 messageCount = in.readInt(); 56 draftCount = in.readInt(); 57 firstSnippet = in.readString(); 58 firstUnreadSnippet = in.readString(); 59 lastSnippet = in.readString(); 60 participantInfos = in.createTypedArrayList(ParticipantInfo.CREATOR); 61 } 62 63 /** 64 * Sets all public fields to match the passed in ConversationInfo (does not copy objects) 65 * @param orig ConversationInfo to copy 66 */ 67 public void overwriteWith(ConversationInfo orig) { 68 participantInfos.clear(); 69 participantInfos.addAll(orig.participantInfos); 70 messageCount = orig.messageCount; 71 draftCount = orig.draftCount; 72 firstSnippet = orig.firstSnippet; 73 firstUnreadSnippet = orig.firstUnreadSnippet; 74 lastSnippet = orig.lastSnippet; 75 } 76 77 @Override 78 public int describeContents() { 79 return 0; 80 } 81 82 @Override 83 public void writeToParcel(Parcel dest, int flags) { 84 dest.writeInt(messageCount); 85 dest.writeInt(draftCount); 86 dest.writeString(firstSnippet); 87 dest.writeString(firstUnreadSnippet); 88 dest.writeString(lastSnippet); 89 dest.writeTypedList(participantInfos); 90 } 91 92 public static ConversationInfo fromBlob(byte[] blob) { 93 if (blob == null) { 94 return null; 95 } 96 final Parcel p = Parcel.obtain(); 97 p.unmarshall(blob, 0, blob.length); 98 p.setDataPosition(0); 99 final ConversationInfo result = CREATOR.createFromParcel(p); 100 p.recycle(); 101 return result; 102 } 103 104 public byte[] toBlob() { 105 final Parcel p = Parcel.obtain(); 106 writeToParcel(p, 0); 107 final byte[] result = p.marshall(); 108 p.recycle(); 109 return result; 110 } 111 112 public void set(int count, int draft, String first, String firstUnread, String last) { 113 participantInfos.clear(); 114 messageCount = count; 115 draftCount = draft; 116 firstSnippet = first; 117 firstUnreadSnippet = firstUnread; 118 lastSnippet = last; 119 } 120 121 public void reset() { 122 participantInfos.clear(); 123 messageCount = 0; 124 draftCount = 0; 125 firstSnippet = null; 126 firstUnreadSnippet = null; 127 lastSnippet = null; 128 } 129 130 public void addParticipant(ParticipantInfo info) { 131 participantInfos.add(info); 132 } 133 134 public boolean markRead(boolean read) { 135 boolean changed = false; 136 for (ParticipantInfo pi : participantInfos) { 137 changed |= pi.markRead(read); 138 } 139 // Change the firstSnippet only if the conversion has messages. 140 if (messageCount > 0) { 141 if (read) { 142 firstSnippet = lastSnippet; 143 } else { 144 firstSnippet = firstUnreadSnippet; 145 } 146 } 147 return changed; 148 } 149 150 @Override 151 public int hashCode() { 152 return Objects.hashCode(messageCount, draftCount, participantInfos, firstSnippet, 153 lastSnippet, firstUnreadSnippet); 154 } 155 156 public static final Creator<ConversationInfo> CREATOR = new Creator<ConversationInfo>() { 157 158 @Override 159 public ConversationInfo createFromParcel(Parcel source) { 160 return new ConversationInfo(source); 161 } 162 163 @Override 164 public ConversationInfo[] newArray(int size) { 165 return new ConversationInfo[size]; 166 } 167 168 }; 169 170 @Override 171 public String toString() { 172 StringBuilder builder = new StringBuilder(); 173 builder.append("[ConversationInfo object: messageCount = "); 174 builder.append(messageCount); 175 builder.append(", draftCount = "); 176 builder.append(draftCount); 177 builder.append(", firstSnippet= "); 178 builder.append(firstSnippet); 179 builder.append(", firstUnreadSnippet = "); 180 builder.append(firstUnreadSnippet); 181 builder.append(", participants = "); 182 builder.append(participantInfos.toString()); 183 builder.append("]"); 184 return builder.toString(); 185 } 186 } 187