1c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen/* 2c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Copyright (C) 2015 The Android Open Source Project 3c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 4c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * you may not use this file except in compliance with the License. 6c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * You may obtain a copy of the License at 7c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 8c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * http://www.apache.org/licenses/LICENSE-2.0 9c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 10c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Unless required by applicable law or agreed to in writing, software 11c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * distributed under the License is distributed on an "AS IS" BASIS, 12c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * See the License for the specific language governing permissions and 14c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * limitations under the License. 15c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 16c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chenpackage com.android.phone.common.mail; 17c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 18c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chenimport com.android.internal.annotations.VisibleForTesting; 19c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 203f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chenimport java.util.Date; 21c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chenimport java.util.HashSet; 22c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 233f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chenpublic abstract class Message implements Part, Body { 243f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public static final Message[] EMPTY_ARRAY = new Message[0]; 253f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 263f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public static final String RECIPIENT_TYPE_TO = "to"; 273f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public static final String RECIPIENT_TYPE_CC = "cc"; 283f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public static final String RECIPIENT_TYPE_BCC = "bcc"; 293f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public enum RecipientType { 303f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen TO, CC, BCC, 313f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 32c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 33c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen protected String mUid; 343f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 35c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen private HashSet<String> mFlags = null; 36c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 373f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen protected Date mInternalDate; 383f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 39c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public String getUid() { 40c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return mUid; 41c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 42c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 43c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public void setUid(String uid) { 443f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen this.mUid = uid; 453f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 463f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 473f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract String getSubject() throws MessagingException; 483f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 493f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract void setSubject(String subject) throws MessagingException; 503f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 513f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public Date getInternalDate() { 523f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen return mInternalDate; 533f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 543f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 553f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public void setInternalDate(Date internalDate) { 563f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen this.mInternalDate = internalDate; 573f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 583f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 593f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract Date getReceivedDate() throws MessagingException; 603f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 613f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract Date getSentDate() throws MessagingException; 623f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 633f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract void setSentDate(Date sentDate) throws MessagingException; 643f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 653f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract Address[] getRecipients(String type) throws MessagingException; 663f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 673f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract void setRecipients(String type, Address[] addresses) 683f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen throws MessagingException; 693f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 703f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public void setRecipient(String type, Address address) throws MessagingException { 713f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen setRecipients(type, new Address[] { 723f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen address 733f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen }); 743f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 753f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 763f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract Address[] getFrom() throws MessagingException; 773f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 783f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract void setFrom(Address from) throws MessagingException; 793f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 803f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract Address[] getReplyTo() throws MessagingException; 813f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 823f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract void setReplyTo(Address[] from) throws MessagingException; 833f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 843f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen // Always use these instead of getHeader("Message-ID") or setHeader("Message-ID"); 853f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract void setMessageId(String messageId) throws MessagingException; 863f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract String getMessageId() throws MessagingException; 873f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 883f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen @Override 893f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public boolean isMimeType(String mimeType) throws MessagingException { 903f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen return getContentType().startsWith(mimeType); 91c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 92c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 93c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen private HashSet<String> getFlagSet() { 94c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen if (mFlags == null) { 95c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen mFlags = new HashSet<String>(); 96c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 97c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return mFlags; 98c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 99c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 1003f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen /* 1013f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen * TODO Refactor Flags at some point to be able to store user defined flags. 1023f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen */ 1033f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public String[] getFlags() { 1043f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen return getFlagSet().toArray(new String[] {}); 1053f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 1063f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 107c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen /** 108c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Set/clear a flag directly, without involving overrides of {@link #setFlag} in subclasses. 109c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Only used for testing. 110c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 111c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen @VisibleForTesting 112c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen private final void setFlagDirectlyForTest(String flag, boolean set) throws MessagingException { 113c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen if (set) { 114c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen getFlagSet().add(flag); 115c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } else { 116c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen getFlagSet().remove(flag); 117c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 118c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 119c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 120c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public void setFlag(String flag, boolean set) throws MessagingException { 121c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen setFlagDirectlyForTest(flag, set); 122c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 123c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 124c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen /** 1253f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen * This method calls setFlag(String, boolean) 126c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * @param flags 127c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * @param set 128c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 129c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public void setFlags(String[] flags, boolean set) throws MessagingException { 130c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen for (String flag : flags) { 131c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen setFlag(flag, set); 132c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 133c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 1343f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 1353f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public boolean isSet(String flag) { 1363f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen return getFlagSet().contains(flag); 1373f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 1383f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 1393f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public abstract void saveChanges() throws MessagingException; 1403f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen 1413f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen @Override 1423f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen public String toString() { 1433f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen return getClass().getSimpleName() + ':' + mUid; 1443f51d09afa61649a1bcf02599bc1df5aafccf088Nancy Chen } 145c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen} 146