1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.voicemail.impl.mail; 17 18 import android.support.annotation.Nullable; 19 import android.support.annotation.VisibleForTesting; 20 import java.util.Date; 21 import java.util.HashSet; 22 23 public abstract class Message implements Part, Body { 24 public static final Message[] EMPTY_ARRAY = new Message[0]; 25 26 public static final String RECIPIENT_TYPE_TO = "to"; 27 public static final String RECIPIENT_TYPE_CC = "cc"; 28 public static final String RECIPIENT_TYPE_BCC = "bcc"; 29 30 public enum RecipientType { 31 TO, 32 CC, 33 BCC, 34 } 35 36 protected String uid; 37 38 private HashSet<String> flags = null; 39 40 protected Date internalDate; 41 42 public String getUid() { 43 return uid; 44 } 45 46 public void setUid(String uid) { 47 this.uid = uid; 48 } 49 50 public abstract String getSubject() throws MessagingException; 51 52 public abstract void setSubject(String subject) throws MessagingException; 53 54 public Date getInternalDate() { 55 return internalDate; 56 } 57 58 public void setInternalDate(Date internalDate) { 59 this.internalDate = internalDate; 60 } 61 62 public abstract Date getReceivedDate() throws MessagingException; 63 64 public abstract Date getSentDate() throws MessagingException; 65 66 public abstract void setSentDate(Date sentDate) throws MessagingException; 67 68 @Nullable 69 public abstract Long getDuration() throws MessagingException; 70 71 public abstract Address[] getRecipients(String type) throws MessagingException; 72 73 public abstract void setRecipients(String type, Address[] addresses) throws MessagingException; 74 75 public void setRecipient(String type, Address address) throws MessagingException { 76 setRecipients(type, new Address[] {address}); 77 } 78 79 public abstract Address[] getFrom() throws MessagingException; 80 81 public abstract void setFrom(Address from) throws MessagingException; 82 83 public abstract Address[] getReplyTo() throws MessagingException; 84 85 public abstract void setReplyTo(Address[] from) throws MessagingException; 86 87 // Always use these instead of getHeader("Message-ID") or setHeader("Message-ID"); 88 public abstract void setMessageId(String messageId) throws MessagingException; 89 90 public abstract String getMessageId() throws MessagingException; 91 92 @Override 93 public boolean isMimeType(String mimeType) throws MessagingException { 94 return getContentType().startsWith(mimeType); 95 } 96 97 private HashSet<String> getFlagSet() { 98 if (flags == null) { 99 flags = new HashSet<String>(); 100 } 101 return flags; 102 } 103 104 /* 105 * TODO Refactor Flags at some point to be able to store user defined flags. 106 */ 107 public String[] getFlags() { 108 return getFlagSet().toArray(new String[] {}); 109 } 110 111 /** 112 * Set/clear a flag directly, without involving overrides of {@link #setFlag} in subclasses. Only 113 * used for testing. 114 */ 115 @VisibleForTesting 116 private final void setFlagDirectlyForTest(String flag, boolean set) throws MessagingException { 117 if (set) { 118 getFlagSet().add(flag); 119 } else { 120 getFlagSet().remove(flag); 121 } 122 } 123 124 public void setFlag(String flag, boolean set) throws MessagingException { 125 setFlagDirectlyForTest(flag, set); 126 } 127 128 /** 129 * This method calls setFlag(String, boolean) 130 * 131 * @param flags 132 * @param set 133 */ 134 public void setFlags(String[] flags, boolean set) throws MessagingException { 135 for (String flag : flags) { 136 setFlag(flag, set); 137 } 138 } 139 140 public boolean isSet(String flag) { 141 return getFlagSet().contains(flag); 142 } 143 144 public abstract void saveChanges() throws MessagingException; 145 146 @Override 147 public String toString() { 148 return getClass().getSimpleName() + ':' + uid; 149 } 150 } 151