# ----------------------------------------------------------------------------
# 通用 Android & Kotlin 设置
# ----------------------------------------------------------------------------
# 2. 保证不被混淆的方法参数名不变：保留参数名称、局部变量表等调试信息
-keepattributes MethodParameters,LocalVariableTable,LocalVariableTypeTable

# 保持泛型、内部类、注解、异常等重要元数据
-keepattributes Signature,InnerClasses,EnclosingMethod,Exceptions,RuntimeVisibleAnnotations,RuntimeVisibleParameterAnnotations

# 说明：不允许包名被混淆（如 cn.qingin.sdk -> a.b.c），保证后续二次打包可替换整个目录。
-keeppackagenames cn.qingin.sdk

# -flattenpackagehierarchy cn.qingin.sdk
# 保证参数名不被混淆
-keepparameternames
# 保留泛型签名，这对于保留方法参数名至关重要
-keepattributes Signature

# 忽略 Kotlin 和协程相关的特定警告
-dontwarn kotlin.**
-dontwarn kotlinx.coroutines.**

# ----------------------------------------------------------------------------
# SDK 核心 & 公开 API
# ----------------------------------------------------------------------------
# 保留 SDK 主入口类及其公开方法
-keep class cn.qingin.sdk.BingoSdkCore {
    public <methods>;
}
# 2. 额外保护所有的 Kotlin object 单例字段特征，防止 R8 优化过度
-keepclassmembers class * {
    public static ** INSTANCE;
}

-keep class cn.qingin.sdk.util.LogHelper {
    public <methods>;
}
-keep class cn.qingin.sdk.util.LanguageHelper {
    public <methods>;
}
-keep class cn.qingin.sdk.util.TimeUtil {
    public <methods>;
}
-keep class cn.qingin.sdk.util.ThrottleUtils {
    public <methods>;
}
-keep class cn.qingin.sdk.util.DeviceUtil {
    public <methods>;
}

-keep class cn.qingin.sdk.util.PermissionHelper {
    *;
}
-keep class cn.qingin.sdk.util.PermissionHelper$* {
    *;
}

-keep class cn.qingin.sdk.constants.ApiStatusCode {
    public <fields>;
}


# 保留 SDK 核心接口 (被 BingoSdkCore 实现，宿主可能会间接引用)
# 显式保留 DefaultImpls 内部类，因为 Kotlin 接口(UserInterface) 有默认参数，编译器会生成此列
-keep interface cn.qingin.sdk.base.UserInterface { *; }
-keep interface cn.qingin.sdk.base.SdkInterface { *; }
-keep interface cn.qingin.sdk.base.LifecycleInterface { *; }


# 保留暴露给宿主 App 的所有回调接口
-keep interface cn.qingin.sdk.callback.** { *; }

# 保留 API、JSON 解析 (Moshi) 或反射中使用的数据类 (Bean/Model)
-keep class cn.qingin.sdk.bean.** { *; }
-keep class cn.qingin.sdk.model.** { *; }

# 保留 Manifest 中引用的 Android 组件 (Activity, Service, Provider)
-keep class cn.qingin.sdk.activity.** { *; }

# ----------------------------------------------------------------------------
# WebView & Javascript 接口
# ----------------------------------------------------------------------------
# 保留带有 @JavascriptInterface 注解的方法，允许 JS -> Native 调用
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}
# 保留 WebViewCommunication 中特定的内部类
-keep class cn.qingin.sdk.ui.WebViewCommunication$AndroidJavaScriptInterface {
    public <methods>;
}

# ----------------------------------------------------------------------------
# 内部库 & 模块 (防止宿主过度混淆导致 SDK 内部崩溃)
# ----------------------------------------------------------------------------

# --- PictureSelector (图片选择器) ---
# 优化：ClassFactory 已重构为显式调用，无需保留整个包。仅保留公开接口和数据模型。

# 保留入口类和配置类
-keep class cn.qingin.sdk.pictureselector.PictureSelector { *; }
-keep class cn.qingin.sdk.pictureselector.config.SelectorConfig { *; }

-keep interface cn.qingin.sdk.pictureselector.interfaces.** { *; }

# 保留数据实体（用户会直接访问字段）
-keep class cn.qingin.sdk.pictureselector.entity.** { *; }

# 保留一些可能被 XML 布局引用的自定义 View（虽然通常 R8 会检测到，但显式保留更稳妥）
-keep class cn.qingin.sdk.pictureselector.widget.** { *; }
-keep class cn.qingin.sdk.pictureselector.magical.** { *; }

# 如果还有残留的反射（如 Registry 中的 get 方法），保留 ClassFactory 以防万一
# -keep class cn.qingin.sdk.pictureselector.factory.ClassFactory { *; }

# LoadingIndicatorView 使用字符串反射加载 indicators 包下的动画类，必须保留
-keep class com.bingo.sdk.view.indicators.** { *; }

# [优化] 自定义 View (仅保留 XML 布局引用所需的构造函数，其他方法允许混淆)
-keep class com.bingo.sdk.view.** {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

# 保留生成的 JsonAdapters
-keep class cn.qingin.sdk.**JsonAdapter { *; }

# R8 缺失类警告忽略规则
-dontwarn cn.qingin.sdk.BuildConfig
-dontwarn cn.qingin.sdk.pictureselector.app.SelectorAppMaster
-dontwarn cn.qingin.sdk.pictureselector.app.SelectorEngine
-dontwarn cn.qingin.sdk.pictureselector.interfaces.OnFragmentLifecycleListener
-dontwarn cn.qingin.sdk.pictureselector.interfaces.OnItemClickListener
-dontwarn cn.qingin.sdk.pictureselector.widget.SlideSelectTouchListener
-dontwarn cn.qingin.sdk.security.Base64
-if class cn.qingin.sdk.bean.RechargeOptions
-keepnames class cn.qingin.sdk.bean.RechargeOptions
-if class cn.qingin.sdk.bean.RechargeOptions
-keep class cn.qingin.sdk.bean.RechargeOptionsJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.bean.RechargeOptions
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.bean.RechargeOptions
-keepclassmembers class cn.qingin.sdk.bean.RechargeOptions {
    public synthetic <init>(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,int,java.lang.String,java.lang.String,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.innner.bean.PayOrder
-keepnames class cn.qingin.sdk.innner.bean.PayOrder
-if class cn.qingin.sdk.innner.bean.PayOrder
-keep class cn.qingin.sdk.innner.bean.PayOrderJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}

-if class cn.qingin.sdk.innner.bean.PayResult
-keepnames class cn.qingin.sdk.innner.bean.PayResult
-if class cn.qingin.sdk.innner.bean.PayResult
-keep class cn.qingin.sdk.innner.bean.PayResultJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}

-if class cn.qingin.sdk.model.AdMapModel
-keepnames class cn.qingin.sdk.model.AdMapModel
-if class cn.qingin.sdk.model.AdMapModel
-keep class cn.qingin.sdk.model.AdMapModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}

-if class cn.qingin.sdk.model.BaseModel
-keepnames class cn.qingin.sdk.model.BaseModel
-if class cn.qingin.sdk.model.BaseModel
-keep class cn.qingin.sdk.model.BaseModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi,java.lang.reflect.Type[]);
}
-if class cn.qingin.sdk.model.BaseModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.BaseModel
-keepclassmembers class cn.qingin.sdk.model.BaseModel {
    public synthetic <init>(int,java.lang.String,java.lang.Object,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.BindThirdModel
-keepnames class cn.qingin.sdk.model.BindThirdModel
-if class cn.qingin.sdk.model.BindThirdModel
-keep class cn.qingin.sdk.model.BindThirdModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}

-if class cn.qingin.sdk.model.CustomerServiceModel
-keepnames class cn.qingin.sdk.model.CustomerServiceModel
-if class cn.qingin.sdk.model.CustomerServiceModel
-keep class cn.qingin.sdk.model.CustomerServiceModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}

-if class cn.qingin.sdk.model.FloatWindowModel
-keepnames class cn.qingin.sdk.model.FloatWindowModel
-if class cn.qingin.sdk.model.FloatWindowModel
-keep class cn.qingin.sdk.model.FloatWindowModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.FloatWindowModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.FloatWindowModel
-keepclassmembers class cn.qingin.sdk.model.FloatWindowModel {
    public synthetic <init>(java.lang.String,int,java.lang.String,java.lang.String,java.lang.String,boolean,int,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.GameModel
-keepnames class cn.qingin.sdk.model.GameModel
-if class cn.qingin.sdk.model.GameModel
-keep class cn.qingin.sdk.model.GameModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.GameModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.GameModel
-keepclassmembers class cn.qingin.sdk.model.GameModel {
    public synthetic <init>(int,long,java.lang.String,java.lang.String,java.lang.String,cn.qingin.sdk.model.IndexIconModel,boolean,int,java.util.List,boolean,java.util.List,cn.qingin.sdk.model.ThirdPartyParamsModel,java.util.List,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.IndexIconModel
-keepnames class cn.qingin.sdk.model.IndexIconModel
-if class cn.qingin.sdk.model.IndexIconModel
-keep class cn.qingin.sdk.model.IndexIconModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.IndexIconModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.IndexIconModel
-keepclassmembers class cn.qingin.sdk.model.IndexIconModel {
    public synthetic <init>(java.lang.String,java.lang.Float,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.LogEventDataModel
-keepnames class cn.qingin.sdk.model.LogEventDataModel
-if class cn.qingin.sdk.model.LogEventDataModel
-keep class cn.qingin.sdk.model.LogEventDataModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.LogEventDataModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.LogEventDataModel
-keepclassmembers class cn.qingin.sdk.model.LogEventDataModel {
    public synthetic <init>(java.lang.String,java.lang.String,java.lang.String,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.LogEventModel
-keepnames class cn.qingin.sdk.model.LogEventModel
-if class cn.qingin.sdk.model.LogEventModel
-keep class cn.qingin.sdk.model.LogEventModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.LogEventModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.LogEventModel
-keepclassmembers class cn.qingin.sdk.model.LogEventModel {
    public synthetic <init>(long,cn.qingin.sdk.model.LogEventDataModel,java.lang.String,long,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.PrivacyModel
-keepnames class cn.qingin.sdk.model.PrivacyModel
-if class cn.qingin.sdk.model.PrivacyModel
-keep class cn.qingin.sdk.model.PrivacyModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.PrivacyModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.PrivacyModel
-keepclassmembers class cn.qingin.sdk.model.PrivacyModel {
    public synthetic <init>(java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,java.lang.String,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.ResetPasswordModel
-keepnames class cn.qingin.sdk.model.ResetPasswordModel
-if class cn.qingin.sdk.model.ResetPasswordModel
-keep class cn.qingin.sdk.model.ResetPasswordModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}

-if class cn.qingin.sdk.model.ThirdPartyParamsModel
-keepnames class cn.qingin.sdk.model.ThirdPartyParamsModel
-if class cn.qingin.sdk.model.ThirdPartyParamsModel
-keep class cn.qingin.sdk.model.ThirdPartyParamsModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.ThirdPartyParamsModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.ThirdPartyParamsModel
-keepclassmembers class cn.qingin.sdk.model.ThirdPartyParamsModel {
    public synthetic <init>(java.lang.String,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.UpdateModel
-keepnames class cn.qingin.sdk.model.UpdateModel
-if class cn.qingin.sdk.model.UpdateModel
-keep class cn.qingin.sdk.model.UpdateModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.UpdateModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.UpdateModel
-keepclassmembers class cn.qingin.sdk.model.UpdateModel {
    public synthetic <init>(java.lang.String,java.lang.String,java.lang.String,java.lang.Boolean,java.lang.Double,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.UserHeartbeatModel
-keepnames class cn.qingin.sdk.model.UserHeartbeatModel
-if class cn.qingin.sdk.model.UserHeartbeatModel
-keep class cn.qingin.sdk.model.UserHeartbeatModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.UserHeartbeatModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.UserHeartbeatModel
-keepclassmembers class cn.qingin.sdk.model.UserHeartbeatModel {
    public synthetic <init>(java.lang.Long,java.lang.Long,java.lang.Long,java.lang.Long,java.lang.Long,java.lang.Boolean,java.lang.String,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.UserModel
-keepnames class cn.qingin.sdk.model.UserModel
-if class cn.qingin.sdk.model.UserModel
-keep class cn.qingin.sdk.model.UserModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.UserModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.UserModel
-keepclassmembers class cn.qingin.sdk.model.UserModel {
    public synthetic <init>(java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,java.lang.String,java.lang.String,long,java.lang.String,int,boolean,java.lang.String,long,int,kotlin.jvm.internal.DefaultConstructorMarker);
}

-if class cn.qingin.sdk.model.UserMsgModel
-keepnames class cn.qingin.sdk.model.UserMsgModel
-if class cn.qingin.sdk.model.UserMsgModel
-keep class cn.qingin.sdk.model.UserMsgModelJsonAdapter {
    public <init>(com.squareup.moshi.Moshi);
}
-if class cn.qingin.sdk.model.UserMsgModel
-keepnames class kotlin.jvm.internal.DefaultConstructorMarker
-if class cn.qingin.sdk.model.UserMsgModel
-keepclassmembers class cn.qingin.sdk.model.UserMsgModel {
    public synthetic <init>(java.lang.String,int,java.util.List,int,kotlin.jvm.internal.DefaultConstructorMarker);
}
