1345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein/*
2345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Copyright (C) 2008 The Android Open Source Project
3345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
4345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
5345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * you may not use this file except in compliance with the License.
6345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * You may obtain a copy of the License at
7345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
8345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
9345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
10345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software
11345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
12345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * See the License for the specific language governing permissions and
14345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * limitations under the License.
15345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */
16345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
17345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpackage com.android.emailcommon.mail;
18345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
19345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.util.Date;
20345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.util.HashSet;
21345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
22345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpublic abstract class Message implements Part, Body {
23345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public static final Message[] EMPTY_ARRAY = new Message[0];
24345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
25345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public enum RecipientType {
26345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        TO, CC, BCC,
27345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
28345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
29345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    protected String mUid;
30345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
31345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    private HashSet<Flag> mFlags = null;
32345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
33345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    protected Date mInternalDate;
34345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
35345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    protected Folder mFolder;
36345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
37345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public String getUid() {
38345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return mUid;
39345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
40345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
41345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public void setUid(String uid) {
42345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        this.mUid = uid;
43345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
44345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
45345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public Folder getFolder() {
46345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return mFolder;
47345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
48345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
49345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract String getSubject() throws MessagingException;
50345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
51345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void setSubject(String subject) throws MessagingException;
52345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
53345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public Date getInternalDate() {
54345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return mInternalDate;
55345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
56345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
57345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public void setInternalDate(Date internalDate) {
58345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        this.mInternalDate = internalDate;
59345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
60345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
61345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Date getReceivedDate() throws MessagingException;
62345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
63345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Date getSentDate() throws MessagingException;
64345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
65345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void setSentDate(Date sentDate) throws MessagingException;
66345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
67345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Address[] getRecipients(RecipientType type) throws MessagingException;
68345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
69345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void setRecipients(RecipientType type, Address[] addresses)
70345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            throws MessagingException;
71345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
72345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public void setRecipient(RecipientType type, Address address) throws MessagingException {
73345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        setRecipients(type, new Address[] {
74345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            address
75345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        });
76345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
77345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
78345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Address[] getFrom() throws MessagingException;
79345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
80345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void setFrom(Address from) throws MessagingException;
81345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
82345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Address[] getReplyTo() throws MessagingException;
83345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
84345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void setReplyTo(Address[] from) throws MessagingException;
85345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
86345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    // Always use these instead of getHeader("Message-ID") or setHeader("Message-ID");
87345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void setMessageId(String messageId) throws MessagingException;
88345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract String getMessageId() throws MessagingException;
89345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
90aa27bc0e1c3bb6be4609b00007637a9d3e960f5eScott Kennedy    @Override
91345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public boolean isMimeType(String mimeType) throws MessagingException {
92345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return getContentType().startsWith(mimeType);
93345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
94345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
95345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    private HashSet<Flag> getFlagSet() {
96345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        if (mFlags == null) {
97345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            mFlags = new HashSet<Flag>();
98345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        }
99345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return mFlags;
100345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
101345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
102345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /*
103345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * TODO Refactor Flags at some point to be able to store user defined flags.
104345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
105345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public Flag[] getFlags() {
106345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return getFlagSet().toArray(new Flag[] {});
107345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
108345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
109345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
110345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Set/clear a flag directly, without involving overrides of {@link #setFlag} in subclasses.
111345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Only used for testing.
112345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
113345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public final void setFlagDirectlyForTest(Flag flag, boolean set) throws MessagingException {
114345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        if (set) {
115345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            getFlagSet().add(flag);
116345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        } else {
117345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            getFlagSet().remove(flag);
118345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        }
119345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
120345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
121345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public void setFlag(Flag flag, boolean set) throws MessagingException {
122345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        setFlagDirectlyForTest(flag, set);
123345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
124345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
125345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
126345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * This method calls setFlag(Flag, boolean)
127345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param flags
128345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param set
129345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
130345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public void setFlags(Flag[] flags, boolean set) throws MessagingException {
131345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        for (Flag flag : flags) {
132345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            setFlag(flag, set);
133345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        }
134345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
135345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
136345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public boolean isSet(Flag flag) {
137345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return getFlagSet().contains(flag);
138345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
139345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
140345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void saveChanges() throws MessagingException;
141345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
142345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    @Override
143345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public String toString() {
144345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return getClass().getSimpleName() + ':' + mUid;
145345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
146345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein}
147