# (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. # ././spatial-sdk-proguard-rules.pro:1

# Proguard rules specific to the Meta Spatial SDK library.                          # ././spatial-sdk-proguard-rules.pro:3
#                                                                                   # ././spatial-sdk-proguard-rules.pro:4
# Strategy: rely on @DoNotStrip / @DoNotStripNative annotations to mark JNI-touched # ././spatial-sdk-proguard-rules.pro:5
# classes and members, plus narrow rules for items accessed from C++ by string name # ././spatial-sdk-proguard-rules.pro:6
# (FindClass/GetFieldID/GetMethodID/GetStaticFieldID) or via JVM reflection.        # ././spatial-sdk-proguard-rules.pro:7
# Avoid blanket package-wide `<fields>` / enum keeps so R8 can shrink, optimize,    # ././spatial-sdk-proguard-rules.pro:8
# and obfuscate the rest of the SDK.                                                # ././spatial-sdk-proguard-rules.pro:9

# The annotation interfaces themselves can be obfuscated; nothing references them # ././spatial-sdk-proguard-rules.pro:11
# at runtime — they are pure markers consumed at build time.                      # ././spatial-sdk-proguard-rules.pro:12
-keep,allowobfuscation @interface com.meta.spatial.core.DoNotStrip                # ././spatial-sdk-proguard-rules.pro:13
-keep,allowobfuscation @interface com.meta.spatial.core.DoNotStripNative          # ././spatial-sdk-proguard-rules.pro:14
-keep,allowobfuscation @interface com.meta.spatial.core.HoldsNativeHandle         # ././spatial-sdk-proguard-rules.pro:15

# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:17
# DoNotStrip / DoNotStripNative — primary mechanism                      # ././spatial-sdk-proguard-rules.pro:18
# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:19

# Native methods are wired up via env->RegisterNatives using the method's string # ././spatial-sdk-proguard-rules.pro:21
# name in JNINativeMethod[]; the class is located via env->FindClass with its    # ././spatial-sdk-proguard-rules.pro:22
# fully qualified name. Both names must NOT be obfuscated.                       # ././spatial-sdk-proguard-rules.pro:23
# Every class containing JNI-bound natives in this SDK is annotated              # ././spatial-sdk-proguard-rules.pro:24
# @DoNotStripNative (either on the class or on the @JvmStatic external fun).     # ././spatial-sdk-proguard-rules.pro:25
-keep,includedescriptorclasses @com.meta.spatial.core.DoNotStripNative class * { # ././spatial-sdk-proguard-rules.pro:26
    <init>(...);                                                                 # ././spatial-sdk-proguard-rules.pro:27
    native <methods>;                                                            # ././spatial-sdk-proguard-rules.pro:28
}                                                                                # ././spatial-sdk-proguard-rules.pro:29

# Some `external` natives carry the @DoNotStripNative annotation only on the    # ././spatial-sdk-proguard-rules.pro:31
# method itself (e.g. `@JvmStatic external fun` declared inside a companion     # ././spatial-sdk-proguard-rules.pro:32
# object). The OUTER class still hosts the static native at runtime, so it must # ././spatial-sdk-proguard-rules.pro:33
# be kept by name as well so FindClass succeeds at JNI_OnLoad.                  # ././spatial-sdk-proguard-rules.pro:34
-keepclasseswithmembers,includedescriptorclasses class * {                      # ././spatial-sdk-proguard-rules.pro:35
    @com.meta.spatial.core.DoNotStripNative <methods>;                          # ././spatial-sdk-proguard-rules.pro:36
}                                                                               # ././spatial-sdk-proguard-rules.pro:37

# DoNotStrip classes are constructed/inspected from C++ by name. Keep the class, # ././spatial-sdk-proguard-rules.pro:39
# its constructors (used via NewObject), and any native methods.                 # ././spatial-sdk-proguard-rules.pro:40
-keep,includedescriptorclasses @com.meta.spatial.core.DoNotStrip class * {       # ././spatial-sdk-proguard-rules.pro:41
    <init>(...);                                                                 # ././spatial-sdk-proguard-rules.pro:42
    native <methods>;                                                            # ././spatial-sdk-proguard-rules.pro:43
}                                                                                # ././spatial-sdk-proguard-rules.pro:44

# Members marked @DoNotStrip on any class — e.g. @get:DoNotStrip on Vector3.x # ././spatial-sdk-proguard-rules.pro:46
# generates a getX() that C++ calls via GetMethodID. Names must be preserved. # ././spatial-sdk-proguard-rules.pro:47
-keepclassmembers class * {                                                   # ././spatial-sdk-proguard-rules.pro:48
    @com.meta.spatial.core.DoNotStrip *;                                      # ././spatial-sdk-proguard-rules.pro:49
}                                                                             # ././spatial-sdk-proguard-rules.pro:50

# Enums marked @DoNotStrip — native code calls Enum.valueOf or reads ordinal().      # ././spatial-sdk-proguard-rules.pro:52
-keepclassmembers @com.meta.spatial.core.DoNotStrip class * extends java.lang.Enum { # ././spatial-sdk-proguard-rules.pro:53
    <fields>;                                                                        # ././spatial-sdk-proguard-rules.pro:54
    public static **[] values();                                                     # ././spatial-sdk-proguard-rules.pro:55
    public static ** valueOf(java.lang.String);                                      # ././spatial-sdk-proguard-rules.pro:56
}                                                                                    # ././spatial-sdk-proguard-rules.pro:57

# All other Spatial SDK enums must keep values()/valueOf because              # ././spatial-sdk-proguard-rules.pro:59
# ComponentManager.registerComponent calls Class.getEnumConstants() (which    # ././spatial-sdk-proguard-rules.pro:60
# invokes values() reflectively) on every enum-typed component attribute. The # ././spatial-sdk-proguard-rules.pro:61
# enum class name itself can still be obfuscated; we only need the methods.   # ././spatial-sdk-proguard-rules.pro:62
-keepclassmembers class com.meta.spatial.** extends java.lang.Enum {          # ././spatial-sdk-proguard-rules.pro:63
    public static **[] values();                                              # ././spatial-sdk-proguard-rules.pro:64
    public static ** valueOf(java.lang.String);                               # ././spatial-sdk-proguard-rules.pro:65
}                                                                             # ././spatial-sdk-proguard-rules.pro:66

# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:68
# Activity callbacks invoked from C++ via GetMethodID by name.           # ././spatial-sdk-proguard-rules.pro:69
# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:70
-keepclassmembers class * extends android.app.Activity {                 # ././spatial-sdk-proguard-rules.pro:71
    public void onVRReady();                                             # ././spatial-sdk-proguard-rules.pro:72
    public void onVRPause();                                             # ././spatial-sdk-proguard-rules.pro:73
    public void onRecenter(boolean);                                     # ././spatial-sdk-proguard-rules.pro:74
    public void internalOnSessionStateChanged(int);                      # ././spatial-sdk-proguard-rules.pro:75
    public void onHMDMounted();                                          # ././spatial-sdk-proguard-rules.pro:76
    public void onHMDUnmounted();                                        # ././spatial-sdk-proguard-rules.pro:77
    public void setBaseHref(java.lang.String);                           # ././spatial-sdk-proguard-rules.pro:78
}                                                                        # ././spatial-sdk-proguard-rules.pro:79

# DataModel.nativeDeleteCallback(long) is invoked from C++ via GetMethodID. # ././spatial-sdk-proguard-rules.pro:81
-keepclassmembers class com.meta.spatial.core.DataModel {                   # ././spatial-sdk-proguard-rules.pro:82
    private void nativeDeleteCallback(long);                                # ././spatial-sdk-proguard-rules.pro:83
}                                                                           # ././spatial-sdk-proguard-rules.pro:84

# ----------------------------------------------------------------------     # ././spatial-sdk-proguard-rules.pro:86
# RAII: keep finalize() on classes that release native handles. The relevant # ././spatial-sdk-proguard-rules.pro:87
# classes carry @HoldsNativeHandle (the source-of-truth marker for "this     # ././spatial-sdk-proguard-rules.pro:88
# wrapper owns a native lifetime"); this guards against R8 removing the      # ././spatial-sdk-proguard-rules.pro:89
# finalize override during method-level optimization.                        # ././spatial-sdk-proguard-rules.pro:90
# ----------------------------------------------------------------------     # ././spatial-sdk-proguard-rules.pro:91
-keepclassmembers @com.meta.spatial.core.HoldsNativeHandle class * {         # ././spatial-sdk-proguard-rules.pro:92
    protected void finalize();                                               # ././spatial-sdk-proguard-rules.pro:93
}                                                                            # ././spatial-sdk-proguard-rules.pro:94

# CRITICAL: keep field-name (and getter accessor name) for any field whose  # ././spatial-sdk-proguard-rules.pro:96
# declared type owns a native handle. Without this rule, R8's dead-store    # ././spatial-sdk-proguard-rules.pro:97
# elimination can drop a "write-only" field of an annotated wrapper type,   # ././spatial-sdk-proguard-rules.pro:98
# the wrapper becomes GC-eligible, finalize() runs, and the native handle   # ././spatial-sdk-proguard-rules.pro:99
# is destroyed while still in use elsewhere. Driven from                    # ././spatial-sdk-proguard-rules.pro:100
# @com.meta.spatial.core.HoldsNativeHandle so adding a new wrapper requires # ././spatial-sdk-proguard-rules.pro:101
# only annotating the class, not editing this file.                         # ././spatial-sdk-proguard-rules.pro:102
-if @com.meta.spatial.core.HoldsNativeHandle class *                        # ././spatial-sdk-proguard-rules.pro:103
-keepclassmembers class * { <1> *; }                                        # ././spatial-sdk-proguard-rules.pro:104

# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:106
# Reflection-accessed members                                            # ././spatial-sdk-proguard-rules.pro:107
# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:108

# SceneLayer.id_ is read reflectively via getDeclaredField("id_").      # ././spatial-sdk-proguard-rules.pro:110
# Both the class and the id_ field are annotated @DoNotStrip in source, # ././spatial-sdk-proguard-rules.pro:111
# so the @DoNotStrip rule above keeps them — no extra rule needed here. # ././spatial-sdk-proguard-rules.pro:112

# Entity.getAttributeName loads the Kotlin-generated `Companion` static field on # ././spatial-sdk-proguard-rules.pro:114
# every ComponentBase subclass via reflection (getDeclaredField("Companion")).   # ././spatial-sdk-proguard-rules.pro:115
-keepclassmembers class * extends com.meta.spatial.core.ComponentBase {          # ././spatial-sdk-proguard-rules.pro:116
    public static ** Companion;                                                  # ././spatial-sdk-proguard-rules.pro:117
}                                                                                # ././spatial-sdk-proguard-rules.pro:118

# C++ (Constants.cpp) reads `id` and `<name>Id` static int fields on every # ././spatial-sdk-proguard-rules.pro:120
# generated ComponentBase subclass via GetStaticIntField.                  # ././spatial-sdk-proguard-rules.pro:121
-keep class * extends com.meta.spatial.core.ComponentBase {                # ././spatial-sdk-proguard-rules.pro:122
    static int id;                                                         # ././spatial-sdk-proguard-rules.pro:123
    static int **Id;                                                       # ././spatial-sdk-proguard-rules.pro:124
}                                                                          # ././spatial-sdk-proguard-rules.pro:125

# BaseLoader uses Class.forName(...) + getDeclaredConstructor().newInstance() to   # ././spatial-sdk-proguard-rules.pro:127
# instantiate XML inflater loaders. Two name-resolution paths in BaseLoader.parse: # ././spatial-sdk-proguard-rules.pro:128
#  - Fully-qualified tag (e.g. "com.meta.spatial.toolkit.Mesh") resolves to        # ././spatial-sdk-proguard-rules.pro:129
#    "<tag>Loader" (e.g. "com.meta.spatial.toolkit.MeshLoader") — used by          # ././spatial-sdk-proguard-rules.pro:130
#    scenes that inflate built-in toolkit components (e.g. an app's                # ././spatial-sdk-proguard-rules.pro:131
#    floor/skybox declared in a scene layout XML).                                 # ././spatial-sdk-proguard-rules.pro:132
#  - Unqualified tag (e.g. "Root", "Entity") resolves under                        # ././spatial-sdk-proguard-rules.pro:133
#    "com.meta.spatial.toolkit.inflate.<tag>Loader".                               # ././spatial-sdk-proguard-rules.pro:134
-keep class com.meta.spatial.toolkit.**Loader {                                    # ././spatial-sdk-proguard-rules.pro:135
    <init>();                                                                      # ././spatial-sdk-proguard-rules.pro:136
}                                                                                  # ././spatial-sdk-proguard-rules.pro:137

# R$id resource ids referenced by name from generated component code. # ././spatial-sdk-proguard-rules.pro:139
-keep public class **.R$id {                                          # ././spatial-sdk-proguard-rules.pro:140
    public protected *;                                               # ././spatial-sdk-proguard-rules.pro:141
}                                                                     # ././spatial-sdk-proguard-rules.pro:142

# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:144
# Misc                                                                   # ././spatial-sdk-proguard-rules.pro:145
# ---------------------------------------------------------------------- # ././spatial-sdk-proguard-rules.pro:146
-dontwarn vros.os.VrosBuild                                              # ././spatial-sdk-proguard-rules.pro:147
-dontwarn horizonos.**                                                   # ././spatial-sdk-proguard-rules.pro:148

# OKHttp dependency                    # ././spatial-sdk-proguard-rules.pro:150
-dontwarn okhttp3.internal.platform.** # ././spatial-sdk-proguard-rules.pro:151
-dontwarn org.bouncycastle.**          # ././spatial-sdk-proguard-rules.pro:152
-dontwarn org.conscrypt.**             # ././spatial-sdk-proguard-rules.pro:153
-dontwarn org.openjsse.**              # ././spatial-sdk-proguard-rules.pro:154
