#Email-specific proguard flags, required for tests, that are not covered by UnifiedEmail go here

-keepclasseswithmembers class com.android.emailcommon.internet.Rfc822Output {
  *** getHtmlBody(java.lang.String);
}

-keepclasseswithmembers class com.android.emailcommon.utility.Utility {
  *** fromUtf8(byte[]);
}

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

-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.MimeMessage {
  *** 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);
}

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

-keepclasseswithmembers class com.android.email.mail.store.ImapFolder {
  *** 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(java.lang.String[], com.android.emailcommon.mail.Folder$MessageRetrievalListener);
  *** getUnreadMessageCount();
  *** isOpen();
}

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

-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 org.apache.james.mime4j.field.Field {
  *** getBody();
}

# The following classes are used only by unit tests.
# We should move them into tests/ if possible.
-keepclasseswithmembers class org.apache.james.mime4j.message.Message {
  <init>(java.io.InputStream);
}

-keepclasseswithmembers class com.android.mail.utils.Throttle {
  *** getTimeoutForTest();
}

-keepclasseswithmembers class com.android.emailcommon.VendorPolicyLoader {
  *** clearInstanceForTest();
  *** injectPolicyForTest(android.content.Context, java.lang.String, java.lang.Class);
}

-keepclasseswithmembers class com.android.email.mail.store.imap.ImapElement {
  *** equalsForTest(com.android.email.mail.store.imap.ImapElement);
}

-keepclasseswithmembers class com.android.email.mail.store.imap.ImapTempFileLiteral {
  *** tempFileExistsForTest();
}

-keepclasseswithmembers class com.android.emailcommon.utility.EmailAsyncTask$Tracker {
  <init>();
  *** getTaskCountForTest();
  *** containsTaskForTest(com.android.emailcommon.utility.EmailAsyncTask);
}
