# This file defines consumer ProGuard rules for the "core" module.
# Be very specific here on keeping ONLY SDK related classes.
#
# Reason:
# When ProGuard processes an app, it aggregates rules from the app’s own ProGuard configuration
# and from each SDK’s "consumer-proguard-rules.pro" file.
# If we have too broad or generic rules in our consumer files, they may inadvertently match classes
# from app's code and it's dependent libraries, leading to enormous increase in its final APK size.

##---------- Begin: ProGuard rules for kotlinx serialization ----------
# Keep `Companion` object fields of serializable classes.
# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
-if @kotlinx.serialization.Serializable class com.linkedin.audiencenetwork.core.**
-keepclassmembers class <1> {
   static <1>$Companion Companion;
}

# Keep `serializer()` on companion objects (both default and named) of serializable classes.
-if @kotlinx.serialization.Serializable class com.linkedin.audiencenetwork.core.** {
   static **$* *;
}
-keepclassmembers class <2>$<3> {
   kotlinx.serialization.KSerializer serializer(...);
}

# Keep `INSTANCE.serializer()` of serializable objects.
-if @kotlinx.serialization.Serializable class com.linkedin.audiencenetwork.core.** {
   public static ** INSTANCE;
}
-keepclassmembers class <1> {
   public static <1> INSTANCE;
   kotlinx.serialization.KSerializer serializer(...);
}

# @Serializable and @Polymorphic are used at runtime for polymorphic serialization.
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault
##---------- End: ProGuard rules for kotlinx serialization ----------

# TODO(rkhinda): We aren't using reflection anymore, evaluate if we should delete these rules.
# These classes are accessed using reflection while initialising the SDK, hence adding rule to
# prevent it from being obfuscating
-keep, allowoptimization, allowshrinking class com.linkedin.audiencenetwork.core.CoreServiceProvider {
    public <methods>;
    public <fields>;
}
-keep class com.linkedin.audiencenetwork.core.ServiceProviderUtils { public *; }
