# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.

-dontwarn android.support.v4.**
-dontwarn android.support.v13.**

# keep names that are used by reflection, from javascript or from unit tests

-keepclasseswithmembers class com.android.mail.compose.ComposeActivity {
  *** registerTestSendOrSaveCallback(...);
}

-keepclasseswithmembers class com.android.mail.providers.MockUiProvider {
  *** getAccountsUri(...);
}

-keepclasseswithmembers class com.android.mail.providers.UIProvider {
  *** getAccountsUri(...);
}

-keepclasseswithmembers class com.android.mail.utils.LogUtils {
  public <methods>;
}


-keepclasseswithmembers class com.google.common.collect.ImmutableMap {
  *** of(...);
}

-keepclasseswithmembers class com.google.common.collect.ImmutableList {
  *** of(...);
}

-keepclasseswithmembers class com.google.common.collect.Sets {
  *** of(...);
}

-keepclasseswithmembers class com.android.mail.UnifiedEmail {
  public <methods>;
}

-keepclasseswithmembers class com.android.mail.ui.AnimatingItemView {
  *** setAnimatedHeight(...);
}

-keepclasseswithmembers class com.android.mail.ui.LeaveBehindItem {
  *** setAnimatedHeight(...);
}

-keepclasseswithmembers class com.android.mail.ui.LeaveBehindItem {
  *** setAnimatedHeight(...);
}

-keepclasseswithmembers class com.android.mail.ui.ConversationViewFragment$MailJsBridge {
  public <methods>;
}

-keepclasseswithmembers class com.android.mail.ui.TwoPaneLayout {
  *** setFoldersLeft(...);
  *** setListBitmapLeft(...);
  *** setListBitmapAlpha(...);
  *** setListLeft(...);
  *** setListAlpha(...);
  *** setConversationLeft(...);
}

-keepclasseswithmembers class com.android.mail.browse.ConversationItemView {
  *** setAnimatedHeight(...);
  *** setItemAlpha(...);
}

-keepclasseswithmembers class com.android.mail.ui.MailActivity {
  *** doNothingClickHandler(...);
}