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