# keep names that are used by reflection.
-keep class com.android.emailcommon.provider.EmailContent$Account

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

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

-keepclasseswithmembers class * {
  public *** newInstance(android.content.Context, java.lang.String);
}

-keepclasseswithmembers class * {
  public *** newInstance(java.lang.String, android.content.Context, com.android.email.mail.Store$PersistentDataCallbacks);
}

-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.email.activity.setup.AccountSetupAccountType {
  *** checkAccountInstanceLimit(com.android.email.mail.Store$StoreInfo);
}

-keepclasseswithmembers class com.android.email.GroupMessagingListener {
  *** removeListener(com.android.email.MessagingListener);
}

-keepclasseswithmembers class com.android.email.Controller {
  *** setProviderContext(android.content.Context);
}

-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);
  *** legacyUnpack(java.lang.String);
}

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

-keep class com.android.emailcommon.service.PolicySet {
  <init>(com.android.emailcommon.provider.EmailContent$Account);
  <init>(int, int, int, int, boolean, int, int, boolean);
  *** writeAccount(com.android.emailcommon.provider.EmailContent$Account, java.lang.String, boolean, android.content.Context);
}

-keepclasseswithmembers class com.android.email.MessagingController {
  *** injectMockController(com.android.email.MessagingController);
}

-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.Account {
  *** getContentUri();
}

-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);
}

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

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

-keepclasseswithmembers class com.android.email.mail.store.ImapStore$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);
}

-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.EmailContent$Account {
  *** getShortcutSafeUri();
}

-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);
}
