1648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira/** 2648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Copyright (c) 2012, Google Inc. 3648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * 4648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 5648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * you may not use this file except in compliance with the License. 6648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * You may obtain a copy of the License at 7648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * 8648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 9648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * 10648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Unless required by applicable law or agreed to in writing, software 11648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 12648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * See the License for the specific language governing permissions and 14648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * limitations under the License. 15648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira */ 16648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 17648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereirapackage com.android.mail.providers; 18648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 19351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport android.os.Parcel; 20351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangimport android.os.Parcelable; 21351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang 2278d4974e8aaa22f60ac8974937446db52c9ba755Paul Westbrookimport com.google.common.base.Objects; 23648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 24648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereiraimport java.util.ArrayList; 25351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang 26351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huangpublic class ConversationInfo implements Parcelable { 27648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 283b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux public final ArrayList<ParticipantInfo> participantInfos; 29c4cecabd7a505fe005a6ceddab44a08bb80d9700Paul Westbrook public int messageCount; 30c4cecabd7a505fe005a6ceddab44a08bb80d9700Paul Westbrook public int draftCount; 31648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira public String firstSnippet; 32648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira public String firstUnreadSnippet; 33648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira public String lastSnippet; 34648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 35c4cecabd7a505fe005a6ceddab44a08bb80d9700Paul Westbrook public ConversationInfo() { 363b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos = new ArrayList<ParticipantInfo>(); 37c4cecabd7a505fe005a6ceddab44a08bb80d9700Paul Westbrook } 38c4cecabd7a505fe005a6ceddab44a08bb80d9700Paul Westbrook 393b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux public ConversationInfo(int messageCount) { 403b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux this.messageCount = messageCount; 413b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux // message count is a decent approximation of participant count because for all incoming 423b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux // mailboxes we typically populate the participant list with the sender of each message 433b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos = new ArrayList<ParticipantInfo>(messageCount); 448c36df9e90dfd2a438f9b15daf3b56b442f01478Andy Huang } 458c36df9e90dfd2a438f9b15daf3b56b442f01478Andy Huang 463b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux public ConversationInfo(int messageCount, int draft, String first, String firstUnread, 473b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux String last) { 483b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux // message count is a decent approximation of participant count because for all incoming 493b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux // mailboxes we typically populate the participant list with the sender of each message 503b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos = new ArrayList<ParticipantInfo>(messageCount); 513b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux set(messageCount, draft, first, firstUnread, last); 52c4cecabd7a505fe005a6ceddab44a08bb80d9700Paul Westbrook } 53c4cecabd7a505fe005a6ceddab44a08bb80d9700Paul Westbrook 542ee9005581f402f51c53c037679bfbfd48114340Andy Huang private ConversationInfo(Parcel in) { 55351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang messageCount = in.readInt(); 56351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang draftCount = in.readInt(); 57351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang firstSnippet = in.readString(); 58351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang firstUnreadSnippet = in.readString(); 59351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang lastSnippet = in.readString(); 603b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos = in.createTypedArrayList(ParticipantInfo.CREATOR); 61648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira } 62648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 63edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler /** 64edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler * Sets all public fields to match the passed in ConversationInfo (does not copy objects) 65edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler * @param orig ConversationInfo to copy 66edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler */ 67edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public void overwriteWith(ConversationInfo orig) { 683b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos.clear(); 693b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos.addAll(orig.participantInfos); 70edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler messageCount = orig.messageCount; 71edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler draftCount = orig.draftCount; 72edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler firstSnippet = orig.firstSnippet; 73edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler firstUnreadSnippet = orig.firstUnreadSnippet; 74edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler lastSnippet = orig.lastSnippet; 75edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 76edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 77351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang @Override 78351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public int describeContents() { 79351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang return 0; 80648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira } 81648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 82351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang @Override 83351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public void writeToParcel(Parcel dest, int flags) { 84351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang dest.writeInt(messageCount); 85351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang dest.writeInt(draftCount); 86351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang dest.writeString(firstSnippet); 87351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang dest.writeString(firstUnreadSnippet); 88351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang dest.writeString(lastSnippet); 893b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux dest.writeTypedList(participantInfos); 90648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira } 91648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 92351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public static ConversationInfo fromBlob(byte[] blob) { 9309cb391d6040e1648cde6b549548193d2aa51010Andy Huang if (blob == null) { 9409cb391d6040e1648cde6b549548193d2aa51010Andy Huang return null; 9509cb391d6040e1648cde6b549548193d2aa51010Andy Huang } 96351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang final Parcel p = Parcel.obtain(); 97351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang p.unmarshall(blob, 0, blob.length); 98351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang p.setDataPosition(0); 992ee9005581f402f51c53c037679bfbfd48114340Andy Huang final ConversationInfo result = CREATOR.createFromParcel(p); 100b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang p.recycle(); 101b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang return result; 102648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira } 103648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 104351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public byte[] toBlob() { 105351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang final Parcel p = Parcel.obtain(); 106351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang writeToParcel(p, 0); 107b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang final byte[] result = p.marshall(); 108b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang p.recycle(); 109b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang return result; 1105f424372f9a801120b5dc8d3f56e907baaa04e25Mindy Pereira } 1115f424372f9a801120b5dc8d3f56e907baaa04e25Mindy Pereira 112351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public void set(int count, int draft, String first, String firstUnread, String last) { 1133b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos.clear(); 114351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang messageCount = count; 115351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang draftCount = draft; 116351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang firstSnippet = first; 117351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang firstUnreadSnippet = firstUnread; 118351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang lastSnippet = last; 1195f424372f9a801120b5dc8d3f56e907baaa04e25Mindy Pereira } 1205f424372f9a801120b5dc8d3f56e907baaa04e25Mindy Pereira 121ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp public void reset() { 1223b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos.clear(); 123ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp messageCount = 0; 124ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp draftCount = 0; 125ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp firstSnippet = null; 126ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp firstUnreadSnippet = null; 127ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp lastSnippet = null; 128ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp } 129ae96226b7bbb4038c1aa68fce758ad6384c65889mindyp 1303b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux public void addParticipant(ParticipantInfo info) { 1313b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux participantInfos.add(info); 132648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira } 1336c2663dc9cade8aff34c462d244e3d72c475c664Mindy Pereira 1347f55c685376659550ed11b047a78cd8d70158ad9mindyp public boolean markRead(boolean read) { 1357f55c685376659550ed11b047a78cd8d70158ad9mindyp boolean changed = false; 1363b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux for (ParticipantInfo pi : participantInfos) { 1373b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux changed |= pi.markRead(read); 1386c2663dc9cade8aff34c462d244e3d72c475c664Mindy Pereira } 1397190bbe532985a2004bf0b8decab3d7c65867029Jorge Ruesga // Change the firstSnippet only if the conversion has messages. 1407190bbe532985a2004bf0b8decab3d7c65867029Jorge Ruesga if (messageCount > 0) { 1417190bbe532985a2004bf0b8decab3d7c65867029Jorge Ruesga if (read) { 1427190bbe532985a2004bf0b8decab3d7c65867029Jorge Ruesga firstSnippet = lastSnippet; 1437190bbe532985a2004bf0b8decab3d7c65867029Jorge Ruesga } else { 1447190bbe532985a2004bf0b8decab3d7c65867029Jorge Ruesga firstSnippet = firstUnreadSnippet; 1457190bbe532985a2004bf0b8decab3d7c65867029Jorge Ruesga } 146aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira } 1477f55c685376659550ed11b047a78cd8d70158ad9mindyp return changed; 1486c2663dc9cade8aff34c462d244e3d72c475c664Mindy Pereira } 149c3efca18f09904f4ce39395169559c5d82bd3d06Mindy Pereira 150c3efca18f09904f4ce39395169559c5d82bd3d06Mindy Pereira @Override 151c3efca18f09904f4ce39395169559c5d82bd3d06Mindy Pereira public int hashCode() { 1523b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux return Objects.hashCode(messageCount, draftCount, participantInfos, firstSnippet, 15378d4974e8aaa22f60ac8974937446db52c9ba755Paul Westbrook lastSnippet, firstUnreadSnippet); 154c3efca18f09904f4ce39395169559c5d82bd3d06Mindy Pereira } 1552909b7442130800d6c6c20c1227d65295262f03emindyp 1562ee9005581f402f51c53c037679bfbfd48114340Andy Huang public static final Creator<ConversationInfo> CREATOR = new Creator<ConversationInfo>() { 157a88fbbaa07312640b9a337a3e06b7b5e0f60a521Andy Huang 158351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang @Override 159351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public ConversationInfo createFromParcel(Parcel source) { 1602ee9005581f402f51c53c037679bfbfd48114340Andy Huang return new ConversationInfo(source); 161a88fbbaa07312640b9a337a3e06b7b5e0f60a521Andy Huang } 162351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang 163351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang @Override 164351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public ConversationInfo[] newArray(int size) { 165351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang return new ConversationInfo[size]; 166351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang } 167351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang 168351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang }; 169a88fbbaa07312640b9a337a3e06b7b5e0f60a521Andy Huang 17081230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal @Override 17181230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal public String toString() { 17281230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal StringBuilder builder = new StringBuilder(); 17381230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append("[ConversationInfo object: messageCount = "); 17481230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append(messageCount); 17581230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append(", draftCount = "); 17681230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append(draftCount); 17781230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append(", firstSnippet= "); 17881230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append(firstSnippet); 17981230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append(", firstUnreadSnippet = "); 18081230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append(firstUnreadSnippet); 1813b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux builder.append(", participants = "); 1823b59b333ad0693f74f9a8cfb24a468a8acbaca8cJames Lemieux builder.append(participantInfos.toString()); 18381230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal builder.append("]"); 18481230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal return builder.toString(); 18581230ee24b65099109ee91add5a137d3795c454aVikram Aggarwal } 186648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira} 187