Allow flags to add metadata directly in code.

Bug: 279054964
Test: build and flash. Accessed in flipper app (updated app in a future cl)
Change-Id: Ia4a20ab4388936ccd09ffe80044bb99a1f841971
diff --git a/core/java/android/flags/BooleanFlag.java b/core/java/android/flags/BooleanFlag.java
index ae9ccf8..d4a35b2 100644
--- a/core/java/android/flags/BooleanFlag.java
+++ b/core/java/android/flags/BooleanFlag.java
@@ -43,4 +43,10 @@
     public Boolean getDefault() {
         return mDefault;
     }
+
+    @Override
+    public BooleanFlag defineMetaData(String label, String description, String categoryName) {
+        super.defineMetaData(label, description, categoryName);
+        return this;
+    }
 }
diff --git a/core/java/android/flags/BooleanFlagBase.java b/core/java/android/flags/BooleanFlagBase.java
index f4141ec..985dbe3 100644
--- a/core/java/android/flags/BooleanFlagBase.java
+++ b/core/java/android/flags/BooleanFlagBase.java
@@ -22,6 +22,9 @@
 
     private final String mNamespace;
     private final String mName;
+    private String mLabel;
+    private String mDescription;
+    private String mCategoryName;
 
     /**
      * @param namespace A namespace for this flag. See {@link android.provider.DeviceConfig}.
@@ -30,6 +33,7 @@
     BooleanFlagBase(String namespace, String name) {
         mNamespace = namespace;
         mName = name;
+        mLabel = name;
     }
 
     public abstract Boolean getDefault();
@@ -47,6 +51,30 @@
     }
 
     @Override
+    public BooleanFlagBase defineMetaData(String label, String description, String categoryName) {
+        mLabel = label;
+        mDescription = description;
+        mCategoryName = categoryName;
+        return this;
+    }
+
+    @Override
+    @NonNull
+    public String getLabel() {
+        return mLabel;
+    }
+
+    @Override
+    public String getDescription() {
+        return mDescription;
+    }
+
+    @Override
+    public String getCategoryName() {
+        return mCategoryName;
+    }
+
+    @Override
     @NonNull
     public String toString() {
         return getNamespace() + "." + getName() + "[" + getDefault() + "]";
diff --git a/core/java/android/flags/DynamicBooleanFlag.java b/core/java/android/flags/DynamicBooleanFlag.java
index 92009c6..271a8c5f4 100644
--- a/core/java/android/flags/DynamicBooleanFlag.java
+++ b/core/java/android/flags/DynamicBooleanFlag.java
@@ -41,4 +41,10 @@
     public Boolean getDefault() {
         return mDefault;
     }
+
+    @Override
+    public DynamicBooleanFlag defineMetaData(String label, String description, String categoryName) {
+        super.defineMetaData(label, description, categoryName);
+        return this;
+    }
 }
diff --git a/core/java/android/flags/Flag.java b/core/java/android/flags/Flag.java
index 0ab3c8a..b97a4c8 100644
--- a/core/java/android/flags/Flag.java
+++ b/core/java/android/flags/Flag.java
@@ -42,4 +42,41 @@
     default boolean isDynamic() {
         return false;
     }
+
+    /**
+     * Add human-readable details to the flag. Flag client's are not required to set this.
+     *
+     * See {@link #getLabel()}, {@link #getDescription()}, and {@link #getCategoryName()}.
+     *
+     * @return Returns `this`, to make a fluent api.
+     */
+    Flag<T> defineMetaData(String label, String description, String categoryName);
+
+    /**
+     * A human-readable name for the flag. Defaults to {@link #getName()}
+     *
+     * See {@link #defineMetaData(String, String, String)}
+     */
+    @NonNull
+    default String getLabel() {
+        return getName();
+    }
+
+    /**
+     * A human-readable description for the flag. Defaults to null if unset.
+     *
+     * See {@link #defineMetaData(String, String, String)}
+     */
+    default String getDescription() {
+        return null;
+    }
+
+    /**
+     * A human-readable category name for the flag. Defaults to null if unset.
+     *
+     * See {@link #defineMetaData(String, String, String)}
+     */
+    default String getCategoryName() {
+        return null;
+    }
 }
diff --git a/core/java/android/flags/FusedOffFlag.java b/core/java/android/flags/FusedOffFlag.java
index 5f435be..6844b8f 100644
--- a/core/java/android/flags/FusedOffFlag.java
+++ b/core/java/android/flags/FusedOffFlag.java
@@ -40,4 +40,10 @@
     public Boolean getDefault() {
         return false;
     }
+
+    @Override
+    public FusedOffFlag defineMetaData(String label, String description, String categoryName) {
+        super.defineMetaData(label, description, categoryName);
+        return this;
+    }
 }
diff --git a/core/java/android/flags/FusedOnFlag.java b/core/java/android/flags/FusedOnFlag.java
index ea8d9b2..e9adba7 100644
--- a/core/java/android/flags/FusedOnFlag.java
+++ b/core/java/android/flags/FusedOnFlag.java
@@ -40,4 +40,10 @@
     public Boolean getDefault() {
         return true;
     }
+
+    @Override
+    public FusedOnFlag defineMetaData(String label, String description, String categoryName) {
+        super.defineMetaData(label, description, categoryName);
+        return this;
+    }
 }