Merge "dist-one flag should be a boolean, not a string" into main
diff --git a/core/config.mk b/core/config.mk
index d5fec33..4d79e2b 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -804,6 +804,10 @@
     PRODUCT_FULL_TREBLE \
     PRODUCT_NOTICE_SPLIT \
 
+ifneq ($(PRODUCT_FULL_TREBLE),true)
+    $(warning This device does not have Treble enabled. This is unsafe.)
+endif
+
 $(KATI_obsolete_var $(foreach req,$(requirements),$(req)_OVERRIDE) \
     ,This should be referenced without the _OVERRIDE suffix.)
 
diff --git a/tools/aconfig/src/commands.rs b/tools/aconfig/src/commands.rs
index 261acec..a121b5e 100644
--- a/tools/aconfig/src/commands.rs
+++ b/tools/aconfig/src/commands.rs
@@ -15,7 +15,9 @@
  */
 
 use anyhow::{bail, ensure, Context, Result};
+use itertools::Itertools;
 use protobuf::Message;
+use std::collections::HashMap;
 use std::io::Read;
 use std::path::PathBuf;
 
@@ -195,6 +197,7 @@
         bail!("no parsed flags, or the parsed flags use different packages");
     };
     let package = package.to_string();
+    let _flag_ids = assign_flag_ids(&package, modified_parsed_flags.iter())?;
     generate_java_code(&package, modified_parsed_flags.into_iter(), codegen_mode)
 }
 
@@ -205,6 +208,7 @@
         bail!("no parsed flags, or the parsed flags use different packages");
     };
     let package = package.to_string();
+    let _flag_ids = assign_flag_ids(&package, modified_parsed_flags.iter())?;
     generate_cpp_code(&package, modified_parsed_flags.into_iter(), codegen_mode)
 }
 
@@ -215,6 +219,7 @@
         bail!("no parsed flags, or the parsed flags use different packages");
     };
     let package = package.to_string();
+    let _flag_ids = assign_flag_ids(&package, modified_parsed_flags.iter())?;
     generate_rust_code(&package, modified_parsed_flags.into_iter(), codegen_mode)
 }
 
@@ -345,6 +350,21 @@
     Ok(modified_parsed_flags)
 }
 
+fn assign_flag_ids<'a, I>(package: &str, parsed_flags_iter: I) -> Result<HashMap<String, u32>>
+where
+    I: Iterator<Item = &'a ProtoParsedFlag> + Clone,
+{
+    assert!(parsed_flags_iter.clone().tuple_windows().all(|(a, b)| a.name() <= b.name()));
+    let mut flag_ids = HashMap::new();
+    for (id_to_assign, pf) in (0_u32..).zip(parsed_flags_iter) {
+        if package != pf.package() {
+            return Err(anyhow::anyhow!("encountered a flag not in current package"));
+        }
+        flag_ids.insert(pf.name().to_string(), id_to_assign);
+    }
+    Ok(flag_ids)
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;
@@ -655,4 +675,23 @@
             modify_parsed_flags_based_on_mode(parsed_flags, CodegenMode::Exported).unwrap_err();
         assert_eq!("exported library contains no exported flags", format!("{:?}", error));
     }
+
+    #[test]
+    fn test_assign_flag_ids() {
+        let parsed_flags = crate::test::parse_test_flags();
+        let package = find_unique_package(&parsed_flags.parsed_flag).unwrap().to_string();
+        let flag_ids = assign_flag_ids(&package, parsed_flags.parsed_flag.iter()).unwrap();
+        let expected_flag_ids = HashMap::from([
+            (String::from("disabled_ro"), 0_u32),
+            (String::from("disabled_rw"), 1_u32),
+            (String::from("disabled_rw_exported"), 2_u32),
+            (String::from("disabled_rw_in_other_namespace"), 3_u32),
+            (String::from("enabled_fixed_ro"), 4_u32),
+            (String::from("enabled_fixed_ro_exported"), 5_u32),
+            (String::from("enabled_ro"), 6_u32),
+            (String::from("enabled_ro_exported"), 7_u32),
+            (String::from("enabled_rw"), 8_u32),
+        ]);
+        assert_eq!(flag_ids, expected_flag_ids);
+    }
 }