#Email-specific proguard flags that are not covered by UnifiedEmail go here

-keep class com.android.emailcommon.provider.Account

-keepclasseswithmembers class * {
  public static void actionEditIncomingSettings(android.app.Activity, int, com.android.emailcommon.provider.Account);
}

-keepclasseswithmembers class * {
  public static void actionEditOutgoingSettings(android.app.Activity, int, com.android.emailcommon.provider.Account);
}

-keepclasseswithmembers class * {
  public *** newInstance(com.android.emailcommon.provider.Account, android.content.Context);
}

-keepclasseswithmembers class * {
  public *** newInstance(com.android.emailcommon.provider.Account, android.content.Context);
}

-keepclasseswithmembers class android.content.SharedPreferences$Editor {
  *** apply();
}

-keepclasseswithmembers class com.android.emailcommon.utility.Utility$CloseTraceCursorWrapper {
  *** getTraceIfAvailable(android.database.Cursor);
  *** log(android.database.Cursor);
}

-keep class * extends org.apache.james.mime4j.util.TempStorage

# Keep names that are used only by unit tests or by animators
-keep class ** {
  *** *ForTest(...);
  *** *Anim(...);
}

-keepclasseswithmembers class com.android.emailcommon.internet.Rfc822Output {
  *** getHtmlBody(java.lang.String);
  *** buildBodyText(android.content.Context, com.android.emailcommon.provider.EmailContent$Message, boolean);
}

-keepclasseswithmembers class com.android.emailcommon.mail.Address {
  <init>(java.lang.String);
  <init>(java.lang.String,java.lang.String);
  *** parseAndPack(java.lang.String);
}

-keepclasseswithmembers class com.android.email.SecurityPolicy {
  *** setContext(android.content.Context);
}

-keepclasseswithmembers class com.android.emailcommon.utility.Utility {
  *** dumpCursor(android.database.Cursor);
  *** fromUtf8(byte[]);
  *** isFirstUtf8Byte(byte);
  *** replaceBareLfWithCrlf(java.lang.String);
}
-keepclasseswithmembers class com.android.emailcommon.utility.Utility$CloseTraceCursorWrapper {
  *** getTraceIfAvailable(android.database.Cursor);
  *** log(android.database.Cursor);
}

-keepclasseswithmembers class com.android.email.provider.EmailProvider {
  *** getReadableDatabase(android.content.Context);
}

-keepclasseswithmembers class com.android.emailcommon.provider.EmailContent$Attachment {
  *** createUniqueFile(java.lang.String);
}

-keepclasseswithmembers class com.android.email.service.AttachmentDownloadService {
  *** addServiceClass(long, java.lang.Class);
}

-keepclasseswithmembers class com.android.email.service.AttachmentDownloadService$AccountManagerStub {
  *** setNumberOfAccounts(int);
}

-keepclasseswithmembers class com.android.email.Preferences {
  *** getAccountByContentUri(android.net.Uri);
}

-keep class com.android.emailcommon.mail.Message$RecipientType

-keepclasseswithmembers class com.android.emailcommon.mail.Message {
  *** setRecipient(com.android.emailcommon.mail.Message$RecipientType, com.android.emailcommon.mail.Address);
}

-keepclasseswithmembers class com.android.emailcommon.internet.MimeHeader {
  *** writeToString();
}

-keepclasseswithmembers class com.android.emailcommon.internet.MimeMessage {
  <init>();
  <init>(java.io.InputStream);
  *** getExtendedHeader(java.lang.String);
  *** setExtendedHeader(java.lang.String, java.lang.String);
  *** getExtendedHeaders();
  *** setExtendedHeaders(java.lang.String);
}

-keepclasseswithmembers class com.android.emailcommon.internet.MimeUtility {
  *** foldAndEncode(java.lang.String);
  *** findPartByContentId(com.android.emailcommon.mail.Part, java.lang.String);
  *** findFirstPartByMimeType(com.android.emailcommon.mail.Part, java.lang.String);
}

-keepclasseswithmembers class com.android.email.mail.transport.SmtpSender {
  *** setTransport(com.android.email.mail.transport.MailTransport);
}

-keepclasseswithmembers class com.android.email.mail.Store {
  *** requireStructurePrefetch();
}

-keepclasseswithmembers class com.android.email.mail.store.ImapStore {
  *** setTransport(com.android.email.mail.transport.MailTransport);
}

-keepclasseswithmembers class com.android.email.mail.store.ImapFolder {
  *** getMessages(int, int, com.android.emailcommon.mail.Folder$MessageRetrievalListener);
  *** getMessages(com.android.emailcommon.mail.Folder$MessageRetrievalListener);
  *** getMessages(java.lang.String[], com.android.emailcommon.mail.Folder$MessageRetrievalListener);
  *** getUnreadMessageCount();
}

-keepclasseswithmembers class com.android.email.mail.store.Pop3Store {
  *** setTransport(com.android.email.mail.transport.MailTransport);
}

-keepclasseswithmembers class com.android.email.mail.store.Pop3Store$Pop3Folder {
  *** getMessages(int, int, com.android.emailcommon.mail.Folder$MessageRetrievalListener);
  *** getMessages(com.android.emailcommon.mail.Folder$MessageRetrievalListener);
  *** getMessages(java.lang.String[], com.android.emailcommon.mail.Folder$MessageRetrievalListener);
  *** getUnreadMessageCount();
  *** isOpen();
}

-keep class com.android.emailcommon.mail.Flag

-keepclasseswithmembers class com.android.emailcommon.mail.Folder {
  *** getUnreadMessageCount();
  *** delete(boolean);
  *** getRole();
}

-keep class com.android.emailcommon.mail.Folder$FolderRole

-keepclasseswithmembers class com.android.emailcommon.mail.PackedString$Builder {
  <init>();
  <init>(java.lang.String);
  *** get(java.lang.String);
  *** put(java.lang.String, java.lang.String);
}

-keepclasseswithmembers class com.android.email.provider.ContentCache$CounterMap {
  *** getCount(...);
  *** size();
}

-keepclasseswithmembers class com.android.emailcommon.provider.Account {
  *** getShortcutSafeUri();
  *** refresh(android.content.Context);
}

-keepclasseswithmembers class com.android.emailcommon.provider.Policy {
  *** setAttachmentFlagsForNewPolicy(android.content.Context,
    com.android.emailcommon.provider.Account,
    com.android.emailcommon.provider.Policy);
  *** clearAccountPolicy(android.content.Context,
    com.android.emailcommon.provider.Account);
}

-keep class org.apache.james.mime4j.field.Field {
  *** getBody();
}

# The following classes are used only by unit tests.
# We should move them into tests/ if possible.

-keep class org.apache.james.mime4j.message.Message {
  *;
}

-keepclasseswithmembers class org.apache.commons.io.IOUtils {
  *** toByteArray(java.io.InputStream);
  *** toByteArray(java.io.Reader);
  *** toByteArray(java.io.Reader, java.lang.String);
  *** toByteArray(java.lang.String);
}
