# keep names that are used by reflection.
-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.email.activity.RecentMailboxManager {
  *** touch(long);
  *** getInstance(android.content.Context);
  *** getMostRecent(long, boolean);
}

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

-keepclasseswithmembers class com.android.email.SecurityPolicy {
  *** setContext(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.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.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.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();
}

-keepclasseswithmembers class com.android.email.FolderProperties {
  *** getDisplayName(int);
}

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