196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/* 296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License. 696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at 796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and 1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License. 1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 172193962ca2b3157e79f731736afa2a0c972e778aMarc Blankpackage com.android.emailcommon.mail; 1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.Date; 2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.HashSet; 2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic abstract class Message implements Part, Body { 237e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki public static final Message[] EMPTY_ARRAY = new Message[0]; 247e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki 2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public enum RecipientType { 2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project TO, CC, BCC, 2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project protected String mUid; 3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3144552da606048720de11f89321dc767ef291c391Andrew Stadler private HashSet<Flag> mFlags = null; 3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project protected Date mInternalDate; 3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project protected Folder mFolder; 3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public String getUid() { 3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return mUid; 3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public void setUid(String uid) { 4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project this.mUid = uid; 4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public Folder getFolder() { 4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return mFolder; 4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract String getSubject() throws MessagingException; 5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void setSubject(String subject) throws MessagingException; 5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public Date getInternalDate() { 5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return mInternalDate; 5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public void setInternalDate(Date internalDate) { 5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project this.mInternalDate = internalDate; 5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract Date getReceivedDate() throws MessagingException; 6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract Date getSentDate() throws MessagingException; 6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void setSentDate(Date sentDate) throws MessagingException; 6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract Address[] getRecipients(RecipientType type) throws MessagingException; 6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void setRecipients(RecipientType type, Address[] addresses) 7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throws MessagingException; 7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public void setRecipient(RecipientType type, Address address) throws MessagingException { 7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project setRecipients(type, new Address[] { 7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project address 7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project }); 7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract Address[] getFrom() throws MessagingException; 7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void setFrom(Address from) throws MessagingException; 8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract Address[] getReplyTo() throws MessagingException; 8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void setReplyTo(Address[] from) throws MessagingException; 8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract Body getBody() throws MessagingException; 8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract String getContentType() throws MessagingException; 8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void addHeader(String name, String value) throws MessagingException; 9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void setHeader(String name, String value) throws MessagingException; 9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract String[] getHeader(String name) throws MessagingException; 9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void removeHeader(String name) throws MessagingException; 9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 9844552da606048720de11f89321dc767ef291c391Andrew Stadler // Always use these instead of getHeader("Message-ID") or setHeader("Message-ID"); 9944552da606048720de11f89321dc767ef291c391Andrew Stadler public abstract void setMessageId(String messageId) throws MessagingException; 10044552da606048720de11f89321dc767ef291c391Andrew Stadler public abstract String getMessageId() throws MessagingException; 10144552da606048720de11f89321dc767ef291c391Andrew Stadler 10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void setBody(Body body) throws MessagingException; 10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public boolean isMimeType(String mimeType) throws MessagingException { 10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return getContentType().startsWith(mimeType); 10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 10844552da606048720de11f89321dc767ef291c391Andrew Stadler private HashSet<Flag> getFlagSet() { 10944552da606048720de11f89321dc767ef291c391Andrew Stadler if (mFlags == null) { 11044552da606048720de11f89321dc767ef291c391Andrew Stadler mFlags = new HashSet<Flag>(); 11144552da606048720de11f89321dc767ef291c391Andrew Stadler } 11244552da606048720de11f89321dc767ef291c391Andrew Stadler return mFlags; 11344552da606048720de11f89321dc767ef291c391Andrew Stadler } 11444552da606048720de11f89321dc767ef291c391Andrew Stadler 11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /* 1167e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * TODO Refactor Flags at some point to be able to store user defined flags. 11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public Flag[] getFlags() { 11944552da606048720de11f89321dc767ef291c391Andrew Stadler return getFlagSet().toArray(new Flag[] {}); 12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 122af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki /** 123af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki * Set/clear a flag directly, without involving overrides of {@link #setFlag} in subclasses. 124af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki * Only used for testing. 125af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki */ 126af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki public final void setFlagDirectlyForTest(Flag flag, boolean set) throws MessagingException { 12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (set) { 12844552da606048720de11f89321dc767ef291c391Andrew Stadler getFlagSet().add(flag); 12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else { 13044552da606048720de11f89321dc767ef291c391Andrew Stadler getFlagSet().remove(flag); 13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 134af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki public void setFlag(Flag flag, boolean set) throws MessagingException { 135af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki setFlagDirectlyForTest(flag, set); 136af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki } 137af6724527e564d35dd27ac35e24dbced554792e5Makoto Onuki 13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This method calls setFlag(Flag, boolean) 14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param flags 14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param set 14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public void setFlags(Flag[] flags, boolean set) throws MessagingException { 14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project for (Flag flag : flags) { 14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project setFlag(flag, set); 14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 14796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 14896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 14996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public boolean isSet(Flag flag) { 15044552da606048720de11f89321dc767ef291c391Andrew Stadler return getFlagSet().contains(flag); 15196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 15296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 15396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public abstract void saveChanges() throws MessagingException; 1547e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki 155deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project @Override 156deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project public String toString() { 157deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project return getClass().getSimpleName() + ':' + mUid; 158deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project } 15996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project} 160