libchromeos-ui: Block LL Privacy if specifies in cros config

This adds a new flag in cros config and check the flag to see if we
should allow LL Privacy feature from enabling in chrome.

BUG=b:327266366
TEST=manual verify with crrev/c/5499198
- for device with block-llprivacy-availability set,
  bluetooth-use-llprivacy is not searchable in chrome://flags
- for device w/o block-llprivacy-availability set,
  bluetooth-use-llprivacy is searchable in chrome://flags

Change-Id: I6b0e1b1f9e68050a00871ff73c439350e340939b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/5473477
Reviewed-by: Yun-hao Chung <howardchung@chromium.org>
Reviewed-by: Jesse McGuire <jessemcguire@google.com>
Reviewed-by: Michael Sun <michaelfsun@google.com>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Tested-by: Zhengping Jiang <jiangzp@google.com>
Commit-Queue: Zhengping Jiang <jiangzp@google.com>
diff --git a/chromeos-config/README.md b/chromeos-config/README.md
index 3459169..8566ef7 100644
--- a/chromeos-config/README.md
+++ b/chromeos-config/README.md
@@ -594,6 +594,7 @@
 | Attribute | Type   | RegEx     | Required | Oneof Group | Build-only | Description |
 | --------- | ------ | --------- | -------- | ----------- | ---------- | ----------- |
 | block-floss-availability | boolean |  | False |  | False | Block Floss from enablement by chrome. |
+| block-llprivacy-availability | boolean |  | False |  | False | Block LL Privacy from enablement by chrome. |
 | enable-bluetooth-offload | boolean |  | False |  | False | Enable audio offload path. |
 | enable-suspend-management | boolean |  | False |  | False | Enable powerd suspend management callbacks. |
 | reset-on-resume | boolean |  | False |  | False | Expect bluetooth chip to have reset on resume. |
diff --git a/chromeos-config/cros_config_host/cros_config_schema.yaml b/chromeos-config/cros_config_host/cros_config_schema.yaml
index 63cf8b3..71ea357 100644
--- a/chromeos-config/cros_config_host/cros_config_schema.yaml
+++ b/chromeos-config/cros_config_host/cros_config_schema.yaml
@@ -643,6 +643,9 @@
                     block-floss-availability:
                       description: Block Floss from enablement by chrome.
                       type: boolean
+                    block-llprivacy-availability:
+                      description: Block LL Privacy from enablement by chrome.
+                      type: boolean
                   additionalProperties: false
               additionalProperties: false
             wifi:
diff --git a/chromeos-config/cros_config_host/schema.json b/chromeos-config/cros_config_host/schema.json
index 7e5b813..9b5b381 100644
--- a/chromeos-config/cros_config_host/schema.json
+++ b/chromeos-config/cros_config_host/schema.json
@@ -224,6 +224,10 @@
                         "description": "Block Floss from enablement by chrome.",
                         "type": "boolean"
                       },
+                      "block-llprivacy-availability": {
+                        "description": "Block LL Privacy from enablement by chrome.",
+                        "type": "boolean"
+                      },
                       "enable-bluetooth-offload": {
                         "description": "Enable audio offload path.",
                         "type": "boolean"
diff --git a/libchromeos-ui/chromeos/ui/chromium_command_builder.cc b/libchromeos-ui/chromeos/ui/chromium_command_builder.cc
index 1d00cb0..f50cdbe 100644
--- a/libchromeos-ui/chromeos/ui/chromium_command_builder.cc
+++ b/libchromeos-ui/chromeos/ui/chromium_command_builder.cc
@@ -126,6 +126,8 @@
     "/bluetooth/flags";
 const char ChromiumCommandBuilder::kCrosConfigBlockFlossAvailability[] =
     "block-floss-availability";
+const char ChromiumCommandBuilder::kCrosConfigBlockLLPrivacyAvailability[] =
+    "block-llprivacy-availability";
 
 ChromiumCommandBuilder::ChromiumCommandBuilder() = default;
 
@@ -589,6 +591,15 @@
     AddFeatureDisableOverride("FlossIsAvailable");
   }
 
+  // Disable LLPrivacy if the cros config was specified.
+  std::string block_llprivacy_availability;
+  if (cros_config.GetString(kCrosConfigBluetoothFlagsPath,
+                            kCrosConfigBlockLLPrivacyAvailability,
+                            &block_llprivacy_availability) &&
+      block_llprivacy_availability == "true") {
+    AddFeatureDisableOverride("LLPrivacyIsAvailable");
+  }
+
   // Allow Chrome to access GPU memory information despite /sys/kernel/debug
   // being owned by debugd. This limits the security attack surface versus
   // leaving the whole debug directory world-readable: http://crbug.com/175828
diff --git a/libchromeos-ui/chromeos/ui/chromium_command_builder.h b/libchromeos-ui/chromeos/ui/chromium_command_builder.h
index 71f5109..c823244 100644
--- a/libchromeos-ui/chromeos/ui/chromium_command_builder.h
+++ b/libchromeos-ui/chromeos/ui/chromium_command_builder.h
@@ -55,6 +55,7 @@
 
   static const char kCrosConfigBluetoothFlagsPath[];
   static const char kCrosConfigBlockFlossAvailability[];
+  static const char kCrosConfigBlockLLPrivacyAvailability[];
 
   ChromiumCommandBuilder();
   ChromiumCommandBuilder(const ChromiumCommandBuilder&) = delete;