# JNI surface
-keepnames class com.transistorsoft.locationmanager.a.A
-keepclassmembers class com.transistorsoft.locationmanager.a.A {
    public static void r(boolean);
    public static boolean getDBFlag();
}

#######################################################################
# TSConfig reflection (metadata + state + editors)
#######################################################################
-keepattributes *Annotation*,Signature,EnclosingMethod,InnerClasses

# Keep the annotation TYPES so they exist at runtime
-keep class com.transistorsoft.locationmanager.config.meta.ConfigProp { *; }
-keep class com.transistorsoft.locationmanager.config.meta.ConfigSpec { *; }
-keep class com.transistorsoft.locationmanager.config.meta.ConfigGroup { *; }
-keep class com.transistorsoft.locationmanager.config.meta.CtorOrder { *; }

# Keep field names + ctors for state modules; FieldIndex uses getters/ctors by name/signature
-keepnames class com.transistorsoft.locationmanager.config.state.** { *; }
-keepclassmembers class com.transistorsoft.locationmanager.config.state.** {
    <fields>;
    <init>(...);
}

# Keep module field names on the aggregate ConfigState
-keepnames class com.transistorsoft.locationmanager.config.state.ConfigState {
    <fields>;
    <init>(...);
}

# Keep Editor and sub-editors members that routing may reflect
-keepnames class com.transistorsoft.locationmanager.config.edit.Editor { *; }
-keepclassmembers class com.transistorsoft.locationmanager.config.edit.Editor {
    <fields>;
    <init>(...);
}
-keepclassmembers class com.transistorsoft.locationmanager.config.edit.** {
    public <init>(...);
    public ** set*(...);
    <fields>;
}
-keepnames class com.transistorsoft.locationmanager.config.TSConfig
-keepclassmembers class com.transistorsoft.locationmanager.config.TSConfig { public static void r(boolean); }
-keepnames class com.transistorsoft.locationmanager.logger.TSLog
-keepclassmembers class com.transistorsoft.locationmanager.logger.TSLog { public static void r(boolean); }
-keepnames class com.transistorsoft.locationmanager.service.AbstractService
-keepclassmembers class com.transistorsoft.locationmanager.service.AbstractService { public static void r(boolean); }

# Services (names + ctors)
-keep class com.transistorsoft.locationmanager.service.** extends com.transistorsoft.locationmanager.service.AbstractService
-keepclassmembers class com.transistorsoft.locationmanager.service.** extends com.transistorsoft.locationmanager.service.AbstractService { <init>(...); }
# ServiceLaunchReceiver
-keep class com.transistorsoft.locationmanager.service.FgsLaunchGate { <init>(); *; }

# Scheduler components
-keep class com.transistorsoft.locationmanager.scheduler.ScheduleAlarmReceiver
-keep class com.transistorsoft.locationmanager.scheduler.ScheduleJobService
-keep class com.transistorsoft.locationmanager.scheduler.ScheduleService
-keepclassmembers class com.transistorsoft.locationmanager.scheduler.ScheduleAlarmReceiver { <init>(...); }
-keepclassmembers class com.transistorsoft.locationmanager.scheduler.ScheduleJobService { <init>(...); }
-keepclassmembers class com.transistorsoft.locationmanager.scheduler.ScheduleService { <init>(...); }

# Cross-module DTOs
-keepnames class com.transistorsoft.locationmanager.data.SQLQuery
-keepclassmembers class com.transistorsoft.locationmanager.data.SQLQuery { public static *; }
-keepnames class com.transistorsoft.locationmanager.data.LocationModel
-keepclassmembers class com.transistorsoft.locationmanager.data.LocationModel { public *; }

# EventBus reflection
-keepattributes *Annotation*
-keepclassmembers class * { @org.greenrobot.eventbus.Subscribe <methods>; }
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keep class org.greenrobot.eventbus.android.AndroidComponentsImpl

# PermissionManager public fragments.
-keep class com.transistorsoft.locationmanager.permissions.PermissionHostFragment { *; }
-keep class com.transistorsoft.locationmanager.permissions.PermissionHostFragment$PlatformPermissionHostFragment { *; }

# Use conditional keeps so rules only apply when the plugin is actually present.
-if class com.transistorsoft.flutter.backgroundgeolocation.FLTBackgroundGeolocationPlugin
-keepnames class com.transistorsoft.flutter.backgroundgeolocation.FLTBackgroundGeolocationPlugin
-if class com.transistorsoft.cordova.bggeo.CDVBackgroundGeolocation
-keepnames class com.transistorsoft.cordova.bggeo.CDVBackgroundGeolocation
-if class com.transistorsoft.rnbackgroundgeolocation.RNBackgroundGeolocation
-keepnames class com.transistorsoft.rnbackgroundgeolocation.RNBackgroundGeolocation
-if class com.transistorsoft.bggeo.capacitor.BackgroundGeolocationPlugin
-keepnames class com.transistorsoft.bggeo.capacitor.BackgroundGeolocationPlugin

# Kotlin API — keep public class names and members
-keepnames public class com.transistorsoft.locationmanager.kotlin.**
-keep public class com.transistorsoft.locationmanager.kotlin.** { public *; }
-keepclassmembers public class com.transistorsoft.locationmanager.kotlin.** { public static *; }

# OkHttp
-dontwarn okio.**
-dontwarn okhttp3.**
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase