Add @UsesReflection to FeatureFactory reflection usage

Ensure FeatureFactory implementations are kept using a @UsesReflection
annotation at the callsite where they are instantiated via reflection.

Bug: 272041779
Test: m + validate FeatureFactoryImpl is kept
Change-Id: Ia9b8c4fd2c438805f33561dcacd5c10ed49dee19
diff --git a/Android.bp b/Android.bp
index fd97dc3..abd3e62 100644
--- a/Android.bp
+++ b/Android.bp
@@ -106,6 +106,7 @@
     plugins: ["androidx.room_room-compiler-plugin"],
 
     libs: [
+        "keepanno-annotations",
         "telephony-common",
         "ims-common",
     ],
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index 9d81baa..13e56ed 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -51,6 +51,9 @@
 import com.android.settings.wifi.WifiTrackerLibProvider;
 import com.android.settings.wifi.factory.WifiFeatureProvider;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.KeepTarget;
+import com.android.tools.r8.keepanno.annotations.UsesReflection;
 
 /**
  * Abstract class for creating feature controllers. Allows OEM implementations to define their own
@@ -70,6 +73,14 @@
      * already exist. Uses the value of {@link R.string#config_featureFactory} to instantiate
      * a factory implementation.
      */
+    @UsesReflection(
+            description = "This method instantiates subclasses of FeatureFactory via reflection.",
+            value = {
+                @KeepTarget(
+                    kind = KeepItemKind.CLASS_AND_MEMBERS,
+                    extendsClassConstant = FeatureFactory.class,
+                    methodName = "<init>")
+            })
     public static FeatureFactory getFactory(Context context) {
         if (sFactory != null) {
             return sFactory;