summaryrefslogtreecommitdiffstats
path: root/src/com/android/emailcommon/mail/Folder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/emailcommon/mail/Folder.java')
-rw-r--r--src/com/android/emailcommon/mail/Folder.java257
1 files changed, 257 insertions, 0 deletions
diff --git a/src/com/android/emailcommon/mail/Folder.java b/src/com/android/emailcommon/mail/Folder.java
new file mode 100644
index 000000000..ea7fc5984
--- /dev/null
+++ b/src/com/android/emailcommon/mail/Folder.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.emailcommon.mail;
+
+
+public abstract class Folder {
+ public enum OpenMode {
+ READ_WRITE, READ_ONLY,
+ }
+
+ public enum FolderType {
+ HOLDS_FOLDERS, HOLDS_MESSAGES,
+ }
+
+ /**
+ * Identifiers of "special" folders.
+ */
+ public enum FolderRole {
+ INBOX, // NOTE: The folder's name must be INBOX
+ TRASH,
+ SENT,
+ DRAFTS,
+
+ OUTBOX, // Local folders only - not used in remote Stores
+ OTHER, // this folder has no specific role
+ UNKNOWN // the role of this folder is unknown
+ }
+
+ /**
+ * Callback for each message retrieval.
+ *
+ * Not all {@link Folder} implementation won't call it.
+ * (Currently {@link com.android.email.mail.store.LocalStore.LocalFolder} won't.)
+ */
+ public interface MessageRetrievalListener {
+ public void messageRetrieved(Message message);
+ public void loadAttachmentProgress(int progress);
+ }
+
+ /**
+ * Forces an open of the MailProvider. If the provider is already open this
+ * function returns without doing anything.
+ *
+ * @param mode READ_ONLY or READ_WRITE
+ * @param callbacks Pointer to callbacks class. This may be used by the folder between this
+ * time and when close() is called. This is only used for remote stores - should be null
+ * for LocalStore.LocalFolder.
+ */
+ public abstract void open(OpenMode mode, PersistentDataCallbacks callbacks)
+ throws MessagingException;
+
+ /**
+ * Forces a close of the MailProvider. Any further access will attempt to
+ * reopen the MailProvider.
+ *
+ * @param expunge If true all deleted messages will be expunged.
+ */
+ public abstract void close(boolean expunge) throws MessagingException;
+
+ /**
+ * @return True if further commands are not expected to have to open the
+ * connection.
+ */
+ // TODO not used, get rid of this - it's a transport function
+ public abstract boolean isOpen();
+
+ /**
+ * Get the mode the folder was opened with. This may be different than the mode the open
+ * was requested with.
+ * @return
+ */
+ public abstract OpenMode getMode() throws MessagingException;
+
+ /**
+ * Reports if the Store is able to create folders of the given type.
+ * Does not actually attempt to create a folder.
+ * @param type
+ * @return true if can create, false if cannot create
+ */
+ public abstract boolean canCreate(FolderType type);
+
+ /**
+ * Attempt to create the given folder remotely using the given type.
+ * @param type
+ * @return true if created, false if cannot create (e.g. server side)
+ */
+ public abstract boolean create(FolderType type) throws MessagingException;
+
+ public abstract boolean exists() throws MessagingException;
+
+ /**
+ * @return A count of the messages in the selected folder.
+ */
+ public abstract int getMessageCount() throws MessagingException;
+
+ public abstract int getUnreadMessageCount() throws MessagingException;
+
+ public abstract Message getMessage(String uid) throws MessagingException;
+
+ public abstract Message[] getMessages(int start, int end, MessageRetrievalListener listener)
+ throws MessagingException;
+
+ /**
+ * Fetches the given list of messages. The specified listener is notified as
+ * each fetch completes. Messages are downloaded as (as) lightweight (as
+ * possible) objects to be filled in with later requests. In most cases this
+ * means that only the UID is downloaded.
+ *
+ * @param uids
+ * @param listener
+ */
+ public abstract Message[] getMessages(MessageRetrievalListener listener)
+ throws MessagingException;
+
+ public abstract Message[] getMessages(String[] uids, MessageRetrievalListener listener)
+ throws MessagingException;
+
+ /**
+ * Return a set of messages based on the state of the flags.
+ * Note: Not typically implemented in remote stores, so not abstract.
+ *
+ * @param setFlags The flags that should be set for a message to be selected (can be null)
+ * @param clearFlags The flags that should be clear for a message to be selected (can be null)
+ * @param listener
+ * @return A list of messages matching the desired flag states.
+ * @throws MessagingException
+ */
+ public Message[] getMessages(Flag[] setFlags, Flag[] clearFlags,
+ MessageRetrievalListener listener) throws MessagingException {
+ throw new MessagingException("Not implemented");
+ }
+
+ public abstract void appendMessages(Message[] messages) throws MessagingException;
+
+ public abstract void copyMessages(Message[] msgs, Folder folder,
+ MessageUpdateCallbacks callbacks) throws MessagingException;
+
+ public abstract void setFlags(Message[] messages, Flag[] flags, boolean value)
+ throws MessagingException;
+
+ public abstract Message[] expunge() throws MessagingException;
+
+ public abstract void fetch(Message[] messages, FetchProfile fp,
+ MessageRetrievalListener listener) throws MessagingException;
+
+ public abstract void delete(boolean recurse) throws MessagingException;
+
+ public abstract String getName();
+
+ public abstract Flag[] getPermanentFlags() throws MessagingException;
+
+ /**
+ * This method returns a string identifying the name of a "role" folder
+ * (such as inbox, draft, sent, or trash). Stores that do not implement this
+ * feature can be used - the account UI will provide default strings. To
+ * let the server identify specific folder roles, simply override this method.
+ *
+ * @return The server- or protocol- specific role for this folder. If some roles are known
+ * but this is not one of them, return FolderRole.OTHER. If roles are unsupported here,
+ * return FolderRole.UNKNOWN.
+ */
+ public FolderRole getRole() {
+ return FolderRole.UNKNOWN;
+ }
+
+ /**
+ * This function will be called after the messaging controller has called
+ * getPersonalNamespaces() and has created a matching LocalFolder object. This can
+ * be used as a trigger for the folder to write back any folder-specific persistent data using
+ * callbacks.
+ *
+ * This is not abstract because most folders do not require this functionality and do not
+ * need to implement it.
+ */
+ @SuppressWarnings("unused")
+ public void localFolderSetupComplete(Folder localFolder) throws MessagingException {
+ // Do nothing - return immediately
+ }
+
+ /**
+ * Create an empty message of the appropriate type for the Folder.
+ */
+ public abstract Message createMessage(String uid) throws MessagingException;
+
+ /**
+ * Callback interface by which a Folder can read and write persistent data.
+ * TODO This needs to be made more generic & flexible
+ */
+ public interface PersistentDataCallbacks {
+
+ /**
+ * Provides keyed storage of strings. Should be used for per-folder data. Do not use for
+ * per-message data.
+ * @param key identifier for the data (e.g. "sync.key" or "folder.id")
+ * @param value Data to persist. All data must be encoded into a string,
+ * so use base64 or some other encoding if necessary.
+ */
+ public void setPersistentString(String key, String value);
+
+ /**
+ * @param key identifier for the data of interest
+ * @return the data saved by the Folder, or defaultValue if never set.
+ */
+ public String getPersistentString(String key, String defaultValue);
+
+ /**
+ * In a single transaction: Set a key/value pair for the folder, and bulk set or clear
+ * message flags. Typically used at the beginning or conclusion of a bulk sync operation.
+ *
+ * @param key if non-null, the transaction will set this folder persistent value
+ * @param value the value that will be stored for the key
+ * @param setFlags if non-null, flag(s) will be set for all messages in the folder
+ * @param clearFlags if non-null, flag(s) will be cleared for all messages in the folder
+ */
+ public void setPersistentStringAndMessageFlags(String key, String value,
+ Flag[] setFlags, Flag[] clearFlags) throws MessagingException;
+ }
+
+ /**
+ * Callback interface by which a folder can report UID changes caused by certain operations.
+ */
+ public interface MessageUpdateCallbacks {
+ /**
+ * The operation caused the message's UID to change
+ * @param message The message for which the UID changed
+ * @param newUid The new UID for the message
+ */
+ public void onMessageUidChange(Message message, String newUid) throws MessagingException;
+
+ /**
+ * The operation could not be completed because the message doesn't exist
+ * (for example, it was already deleted from the server side.)
+ * @param message The message that does not exist
+ * @throws MessagingException
+ */
+ public void onMessageNotFound(Message message) throws MessagingException;
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+}