Merge "LmkKillOccurred: Adding new kill reason" into main
diff --git a/OWNERS b/OWNERS
index 965a1de..441f92f 100644
--- a/OWNERS
+++ b/OWNERS
@@ -12,4 +12,4 @@
 per-file settings_enums.proto=edgarwang@google.com
 
 # Adservices
-per-file adservices_enums.proto=binhnguyen@google.com
\ No newline at end of file
+per-file adservices_enums.proto=binhnguyen@google.com,pdevpura@google.com
diff --git a/stats/Android.bp b/stats/Android.bp
index ebff253..bf28866 100644
--- a/stats/Android.bp
+++ b/stats/Android.bp
@@ -23,9 +23,11 @@
 
 enum_protos = [
     "enums/adservices/common/*.proto",
+    "enums/adservices/enrollment/*.proto",
     "enums/adservices/fledge/*.proto",
-    "enums/anr/*.proto",
     "enums/adservices/measurement/*.proto",
+    "enums/anr/*.proto",
+    "enums/apex/*.proto",
     "enums/app/**/*.proto",
     "enums/autofill/**/*.proto",
     "enums/contexthub/*.proto",
@@ -33,6 +35,7 @@
     "enums/debug/*.proto",
     "enums/display/*.proto",
     "enums/dnd/*.proto",
+    "enums/federatedcompute/*.proto",
     "enums/hardware/**/*.proto",
     "enums/healthfitness/**/*.proto",
     "enums/hotword/*.proto",
@@ -73,9 +76,12 @@
     "enums/telephony/*.proto",
     "enums/telephony/qns/*.proto",
     "enums/telephony/satellite/*.proto",
+    "enums/transparency/*.proto",
     "enums/uwb/*.proto",
     "enums/view/**/*.proto",
+    "enums/wear/connectivity/*.proto",
     "enums/wear/media/*.proto",
+    "enums/wear/modes/*.proto",
     "enums/wifi/*.proto",
     ":data_stall_event_proto",
     ":device_policy_proto",
@@ -95,8 +101,10 @@
     "attribution_node.proto",
     "atoms/adpf/*.proto",
     "atoms/agif/*.proto",
+    "atoms/apex/*.proto",
     "atoms/aiwallpapers/*.proto",
     "atoms/art/*.proto",
+    "atoms/appsearch/*.proto",
     "atoms/bluetooth/*.proto",
     "atoms/corenetworking/**/*.proto",
     "atoms/autofill/*.proto",
@@ -110,6 +118,7 @@
     "atoms/gps/*.proto",
     "atoms/grammaticalinflection/*.proto",
     "atoms/hardware/biometrics/*.proto",
+    "atoms/hdmi/*.proto",
     "atoms/healthfitness/**/*.proto",
     "atoms/hotword/*.proto",
     "atoms/ike/*.proto",
@@ -120,6 +129,7 @@
     "atoms/view/inputmethod/*.proto",
     "atoms/permissioncontroller/*.proto",
     "atoms/placeholder/*.proto",
+    "atoms/power/*.proto",
     "atoms/rkpd/*.proto",
     "atoms/settings/*.proto",
     "atoms/sysui/*.proto",
@@ -130,8 +140,10 @@
     "atoms/kernel/*.proto",
     "atoms/wearservices/*.proto",
     "atoms/wear/media/*.proto",
+    "atoms/wear/prototiles/*.proto",
     "atoms/media/*.proto",
     "atoms/adservices/*.proto",
+    "atoms/wear/modes/*.proto",
     "atoms/wearpas/*.proto",
     "atoms/statsd/*.proto",
     "atoms/telecomm/*.proto",
@@ -142,8 +154,15 @@
     "atoms/telephony/satellite/*.proto",
     "atoms/automotive/caruilib/*.proto",
     "atoms/uwb/*.proto",
+    "atoms/ondevicepersonalization/*.proto",
+    "atoms/federatedcompute/*.proto",
+    "atoms/wear/connectivity/*.proto",
+    "atoms/devicelock/*.proto",
+    "atoms/cpu/*.proto",
     "atoms/sdksandbox/*.proto",
     "atoms/threadnetwork/*.proto",
+    "atoms/automotive/carlauncher/*.proto",
+    "atoms/transparency/*.proto",
 ]
 
 cc_library_host_shared {
diff --git a/stats/TEST_MAPPING b/stats/TEST_MAPPING
new file mode 100644
index 0000000..468045c
--- /dev/null
+++ b/stats/TEST_MAPPING
@@ -0,0 +1,15 @@
+{
+  "presubmit": [
+    {
+      "name": "stats-log-api-gen-test"
+    },
+    {
+      "name": "VendorAtomCodeGenJavaTest",
+      "options": [
+        {
+          "exclude-annotation": "org.junit.Ignore"
+        }
+      ]
+    }
+  ]
+}
diff --git a/stats/atom_field_options.proto b/stats/atom_field_options.proto
index 3b13d08..bfd50ad 100644
--- a/stats/atom_field_options.proto
+++ b/stats/atom_field_options.proto
@@ -87,8 +87,12 @@
     // BLE scans are to be turned off.
     optional int32 trigger_state_reset_value = 5;
 
-    // If the state change needs to count nesting.
-    optional bool nested = 6 [default = true];
+    // If the state change needs to count nesting. For example, given an exclusive_state field with
+    // possible states of OFF and ON, a sequence of N OFF events will require N ON events for the
+    // tracked state to change back to ON.
+    // Note: only valid for fields marked with exclusive_state where there are only 2 possible
+    // states.
+    optional bool nested = 6 [default = false];
 }
 
 // Used to generate StatsLog.write APIs.
diff --git a/stats/atoms.proto b/stats/atoms.proto
index 65540d0..8ed4420 100644
--- a/stats/atoms.proto
+++ b/stats/atoms.proto
@@ -44,8 +44,8 @@
 import "frameworks/proto_logging/stats/atoms/view/inputmethod/inputmethod_atoms.proto";
 import "frameworks/proto_logging/stats/atom_field_options.proto";
 import "frameworks/proto_logging/stats/enums/adservices/fledge/enums.proto";
-import "frameworks/proto_logging/stats/enums/anr/enums.proto";
 import "frameworks/proto_logging/stats/enums/adservices/measurement/enums.proto";
+import "frameworks/proto_logging/stats/enums/anr/enums.proto";
 import "frameworks/proto_logging/stats/enums/app/enums.proto";
 import "frameworks/proto_logging/stats/enums/app/job/enums.proto";
 import "frameworks/proto_logging/stats/enums/app/remoteprovisioner_enums.proto";
@@ -109,6 +109,7 @@
 import "frameworks/proto_logging/stats/enums/system/security/keystore2/enums.proto";
 import "frameworks/proto_logging/stats/enums/telecomm/enums.proto";
 import "frameworks/proto_logging/stats/enums/telephony/enums.proto";
+import "frameworks/proto_logging/stats/enums/transparency/enums.proto";
 import "frameworks/proto_logging/stats/enums/uwb/enums.proto";
 import "frameworks/proto_logging/stats/enums/view/enums.proto";
 import "frameworks/proto_logging/stats/enums/wifi/enums.proto";
@@ -160,8 +161,9 @@
                 14 [(module) = "framework"];
         MemoryFactorStateChanged memory_factor_state_changed = 15 [(module) = "framework"];
         ExcessiveCpuUsageReported excessive_cpu_usage_reported = 16 [(module) = "framework"];
-        CachedKillReported cached_kill_reported = 17 [(module) = "framework"];
-        ProcessMemoryStatReported process_memory_stat_reported = 18 [(module) = "framework"];
+        CachedKillReported cached_kill_reported = 17 [(module) = "framework", deprecated = true];
+        ProcessMemoryStatReported process_memory_stat_reported =
+                18 [(module) = "framework", deprecated = true];
         sysui.LauncherUIChanged launcher_event = 19 [(module) = "sysui"];
         BatterySaverModeStateChanged battery_saver_mode_state_changed =
                 20 [(module) = "framework", (module) = "statsdtest"];
@@ -212,7 +214,6 @@
         AppStartMemoryStateCaptured app_start_memory_state_captured = 55 [(module) = "framework"];
         ShutdownSequenceReported shutdown_sequence_reported = 56 [(module) = "framework"];
         BootSequenceReported boot_sequence_reported = 57;
-        DaveyOccurred davey_occurred = 58 [deprecated = true];
         OverlayStateChanged overlay_state_changed =
                 59 [(module) = "framework", (module) = "statsdtest"];
         ForegroundServiceStateChanged foreground_service_state_changed
@@ -658,7 +659,6 @@
         PrivacyToggleDialogInteraction privacy_toggle_dialog_interaction = 382 [(module) = "framework"];
         AppSearchOptimizeStatsReported app_search_optimize_stats_reported = 383 [(module) = "appsearch"];
         NonA11yToolServiceWarningReported non_a11y_tool_service_warning_report = 384 [(module) = "framework"];
-        AppSearchSetSchemaStatsReported app_search_set_schema_stats_reported = 385 [(module) = "appsearch"];
         AppCompatStateChanged app_compat_state_changed = 386 [(module) = "framework"];
         SizeCompatRestartButtonEventReported size_compat_restart_button_event_reported = 387 [(module) = "framework"];
         SplitscreenUIChanged splitscreen_ui_changed = 388 [(module) = "framework"];
@@ -906,8 +906,6 @@
         hardware.biometrics.BiometricTouchReported biometric_touch_reported = 577 [(module) = "sysui"];
         hotword.HotwordAudioEgressEventReported hotword_audio_egress_event_reported = 578
             [(module) = "framework"];
-        AppSearchSchemaMigrationStatsReported
-          app_search_schema_migration_stats_reported = 579 [(module) = "appsearch"];
         location.LocationEnabledStateChanged location_enabled_state_changed = 580 [(module) = "framework"];
         view.inputmethod.ImeRequestFinished ime_request_finished = 581 [(module) = "framework"];
         usb.UsbComplianceWarningsReported usb_compliance_warnings_reported = 582 [(module) = "framework"];
@@ -932,19 +930,21 @@
         corenetworking.connectivity.NetworkValidationFailureStatsDailyReported
             network_validation_failure_stats_daily_reported = 601 [(module) = "connectivity"];
         wearservices.WsComplicationTapped ws_complication_tapped = 602 [(module) = "wearservices"];
-        wearservices.WsWearTimeSession ws_wear_time_session = 610 [(module) = "wearservices"];
+        wearservices.WsNotificationBlocking ws_notification_blocking = 780 [(module) = "wearservices"];
     }
 
     // Pushed atom extensions.
     // The atom definitions are under atoms/<feature>/<feature>_extension_atoms.proto
     extensions 332; // ArtDatumReported art_datum_reported
     extensions 366; // OdrefreshReported odrefresh_reported
+    extensions 385; // AppSearchSetSchemaStatsReported app_search_set_schema_stats_reported
     extensions 467; // BackgroundDexoptJobEnded background_dexopt_job_ended
     extensions 488; // SandboxApiCalled sandbox_api_called
     extensions 528; // ExpressEventReported express_event_reported
     extensions 548; // OdsignReported odsign_reported
     extensions 550; // ArtDeviceDatumReported art_device_datum_reported
     extensions 565; // ArtDatumDeltaReported art_datum_delta_reported
+    extensions 579; // AppSearchSchemaMigrationStatsReported app_search_schema_migration_stats_reported
     extensions 585; // CredentialManagerApiCalled credential_manager_api_called
     extensions 593; // ExpressHistogramSampleReported express_histogram_sample_reported
     extensions 598; // AdServicesBackCompatGetTopicsReported ad_services_back_compat_get_topics_reported
@@ -957,6 +957,7 @@
     extensions 607; // AutofillSessionCommitted autofill_session_committed
     extensions 608; // MediaActionReported media_action_reported
     extensions 609; // MediaControlsLaunched media_controls_launched
+    extensions 610; // WsWearTimeSession ws_wear_time_session
     extensions 611; // LockscreenShortcutSelected lockscreen_shortcut_selected
     extensions 612; // LockscreenShortcutTriggered lockscreen_shortcut_triggered
     extensions 613; // BluetoothHashedDeviceNameReported bluetooth_hashed_device_name_reported
@@ -1041,8 +1042,13 @@
     extensions 692; // WifiLocalOnlyRequestReceived wifi_local_only_request_received
     extensions 693; // WifiLocalOnlyRequestScanTriggered wifi_local_only_request_scan_triggered
     extensions 694; // WifiThreadTaskExecuted wifi_thread_task_executed
+    extensions 695; // AdServicesMeasurementAdIdMatchForDebugKeys ad_services_ad_id_match_for_debug_keys
     extensions 696; // BluetoothProfileConnectionAttempted bluetooth_profile_connection_attempted
+    extensions 697; // AdServicesEnrollmentDataStored ad_services_enrollment_data_stored
+    extensions 698; // AdServicesEnrollmentFileDownloaded ad_services_enrollment_file_downloaded
+    extensions 699; // AdServicesEnrollmentMatched ad_services_enrollment_matched
     extensions 700; // WifiStateChanged wifi_state_changed
+    extensions 701; // HdmiEarcStatusReported hdmi_earc_status_reported
     extensions 702; // AdServicesConsentMigrated ad_services_consent_migrated
     extensions 703; // CronetEngineCreated cronet_engine_created
     extensions 704; // CronetTrafficReported cronet_traffic_reported
@@ -1052,25 +1058,81 @@
     extensions 708; // AiWallpapersTermSelected ai_wallpapers_term_selected
     extensions 709; // AiWallpapersWallpaperSet ai_wallpapers_wallpaper_set
     extensions 710; // AiWallpapersSessionSummary ai_wallpapers_session_summary
+    extensions 711; // OnDevicePersonalizationApiCalled ondevicepersonalization_api_called
+    extensions 712; // FederatedComputeApiCalled federated_compute_api_called
+    extensions 713; // CellularRadioPowerStateChanged cellular_radio_power_state_changed
+    extensions 714; // AdServicesEnrollmentFailed ad_services_enrollment_failed
+    extensions 715; // WearModeStateChanged wear_mode_state_changed
     extensions 716; // LauncherImpressionEventV2 launcher_impression_event_v2
+    extensions 717; // ExternalTvInputEvent external_tv_input_event
     extensions 718; // StylusPredictionMetricsReported stylus_prediction_metrics_reported
+    extensions 719; // PnoScanStarted pno_scan_started
+    extensions 720; // PnoScanStopped pno_scan_stopped
+    extensions 721; // MediatorUpdated mediator_updated
+    extensions 722; // WifiIsUnusableReported wifi_is_unusable_reported
+    extensions 723; // WifiApCapabilitiesReported wifi_ap_capabilities_reported
+    extensions 724; // HdmiSoundbarModeStatusReported hdmi_soundbar_mode_status_reported
+    extensions 725; // UserRiskEventReported user_risk_event_reported
+    extensions 726; // DeviceLockCheckInRequestReported device_lock_check_in_request_reported
+    extensions 727; // DeviceLockProvisioningCompleteReported device_lock_provisioning_complete_reported
+    extensions 728; // DeviceLockKioskAppRequestReported device_lock_kiosk_app_request_reported
     extensions 729; // MediaProjectionStateChanged media_projection_state_changed
     extensions 730; // MediaProjectionTargetChanged media_projection_target_changed
+    extensions 731; // WearPowerMenuOpened wear_power_menu_opened
+    extensions 732; // ApexInstallationRequested apex_installation_requested
+    extensions 733; // ApexInstallationStaged apex_installation_staged
+    extensions 734; // ApexInstallationEnded apex_installation_ended
     extensions 735; // SandboxActivityEventOccurred sandbox_activity_event_occurred
+    extensions 736; // RendererInitialized renderer_initialized
+    extensions 737; // SchemaVersionReceived schema_version_received
     extensions 738; // ThreadnetworkTelemetryDataReported threadnetwork_telemetry_data_reported
     extensions 739; // ThreadnetworkTopoEntryRepeated threadnetwork_topo_entry_repeated
     extensions 740; // ThreadnetworkDeviceInfoReported threadnetwork_device_info_reported
+    extensions 741; // LayoutInspected layout_inspected
+    extensions 742; // LayoutExpressionsInspected layout_expression_inspected
+    extensions 743; // LayoutAnimationsInspected layout_animations_inspected
+    extensions 744; // MaterialComponentsInspected material_components_inspected
+    extensions 745; // TileRequested tile_requested
+    extensions 746; // StateResponseReceived state_response_received
+    extensions 747; // TileResponseReceived tile_response_received
+    extensions 748; // InflationFinished inflation_finished
+    extensions 749; // InflationFailed inflation_failed
+    extensions 750; // IgnoredInflationFailuresReported ignored_inflation_failures_reported
+    extensions 751; // DrawableRendered drawable_rendered
     extensions 752; // StatsSocketLossReported stats_socket_loss_reported
+    extensions 753; // DisplaySwitchLatencyTracked display_switch_latency_tracked
+    extensions 754; // KernelOomKillOccurred kernel_oom_kill_occurred
+    extensions 755; // WearAssistantOpened wear_assistant_opened
+    extensions 756; // AdServicesMeasurementClickVerification ad_services_measurement_click_verification
+    extensions 757; // WearMediaOutputSwitcherDeviceScanApiLatency wear_media_output_switcher_device_scan_api_latency
+    extensions 758; // WearMediaOutputSwitcherSassDeviceUnavailable wear_media_output_switcher_sass_device_unavailable
+    extensions 759; // WearMediaOutputSwitcherFastPairApiTimeout wear_media_output_switcher_fastpair_api_timeout
     extensions 760; // IkeLivenessCheckSessionValidated ike_liveness_check_session_validated
+    extensions 761; // HotwordEventEgressSize hotword_egress_size_atom_reported
     extensions 762; // CronetEngineBuilderInitialized cronet_engine_builder_initialized
     extensions 763; // CronetHttpFlagsInitialized cronet_http_flags_initialized
     extensions 764; // CronetInitialized cronet_initialized
+    extensions 765; // AdServicesEncryptionKeyFetched ad_services_encryption_key_fetched
+    extensions 766; // AdServicesEncryptionKeyDbTransactionEnded ad_services_encryption_key_db_transaction_ended
+    extensions 767; // DestinationRegisteredBeacons destination_registered_beacons
+    extensions 768; // ReportInteractionApiCalled report_interaction_api_called
+    extensions 769; // InteractionReportingTableCleared interaction_reporting_table_cleared
+    extensions 770; // CarRecentsEventReported car_recents_event_reported
+    extensions 771; // FederatedComputeTrainingEventReported federated_compute_training_event_reported
+    extensions 772; // ThermalStatusCalled thermal_status_called
+    extensions 773; // ThermalHeadroomCalled thermal_headroom_called
+    extensions 774; // ThermalHeadroomThresholdsCalled thermal_headroom_thresholds_called
+    extensions 775; // BootIntegrityInfoReported boot_integrity_info_reported
+    extensions 776; // ScreenOffReported screen_off_reported
     extensions 777; // ApfSessionInfoReported apf_session_info_reported
     extensions 778; // IpClientRaInfoReported ip_client_ra_info_reported
     extensions 779; // NetworkRequestStateChanged network_request_state_changed
     extensions 781; // BluetoothContentProfileErrorReported bluetooth_content_profile_error_reported
     extensions 782; // BluetoothRfcommConnectionAttempted bluetooth_rfcomm_connection_attempted
     extensions 783; // NetworkStatsRecorderFileOperated network_stats_recorder_file_operated
+    extensions 821; // NegotiatedSecurityAssociation negotiated_security_association
+    extensions 850; // VpnConnectionStateChanged vpn_connection_state_changed
+    extensions 851; // VpnConnectionReported vpn_connection_reported
     extensions 9999; // Atom9999 atom_9999
     // StatsdStats tracks platform atoms with ids up to 900.
     // Update StatsdStats::kMaxPushedAtomId when atom ids here approach that value.
@@ -1306,13 +1368,24 @@
     extensions 10191; // TouchpadUsage touchpad_usage
     extensions 10192; // DreamSettingSnapshot dream_setting_snapshot
     extensions 10193; // WifiModuleInfo wifi_module_info
+    extensions 10194; // WifiSettingInfo wifi_setting_info
+    extensions 10195; // WifiComplexSettingInfo wifi_complex_setting_info
+    extensions 10196; // SysproxyBluetoothBytesTransfer sysproxy_bluetooth_bytes_transfer
+    extensions 10197; // WsStandaloneModeSnapshot ws_standalone_mode_snapshot
+    extensions 10198; // WifiConfiguredNetworkInfo wifi_configured_network_info;
+    extensions 10199; // CpuPolicy cpu_policy
+    extensions 10200; // ProxyBytesTransferByFgBg proxy_bytes_transfer_by_fg_bg
+    extensions 10201; // ThermalHeadroomThresholds thermal_headroom_thresholds
+    extensions 10202; // Reserved for b/308823939.
+    extensions 10203; // Reserved for b/308823939.
+    extensions 10204; // Reserved for b/309512867.
     extensions 10205; // ArtDeviceStatus art_device_status
     extensions 99999; // Atom99999 atom_99999
 
     // DO NOT USE field numbers above 100,000 in AOSP.
     // Field numbers 100,000 - 199,999 are reserved for non-AOSP (e.g. OEMs) to use.
     // Field numbers 200,000 and above are reserved for future use; do not use them at all.
-    reserved 83, 360 to 363, 492, 597, 10008, 10036, 10040, 10041, 21004, 21005;
+    reserved 58, 83, 360 to 363, 492, 597, 10008, 10036, 10040, 10041, 21004, 21005;
 }
 
 /*
@@ -1331,9 +1404,8 @@
  *     underscore_separated name as defined in Atom.
  *   - If an atom represents work that can be attributed to an app, there can
  *     be exactly one AttributionChain field. It must be field number 1.
- *   - A field that is a uid should be a string field, tagged with the [xxx]
- *     annotation. The generated code on android will be represented by UIDs,
- *     and those UIDs will be translated in xxx to those strings.
+ *   - A field that is a uid should be an int32 field, tagged with the
+ *     [(is_uid) = true] annotation.
  *
  * CONVENTIONS:
  *   - Events are past tense. e.g. ScreenStateChanged, not ScreenStateChange.
@@ -1517,7 +1589,7 @@
   optional int32 fgs_seconds = 7;
   optional int32 bound_top_seconds = 8;
   optional int32 bound_fgs_seconds = 9;
-  optional int32 important_foreground_seconds = 10;
+  optional int32 important_fg_bg_seconds = 10;
   optional int32 cached_seconds = 11;
   optional int32 frozen_seconds = 12;
   optional int32 other_seconds = 13;
@@ -1585,7 +1657,10 @@
         CRITICAL = 4;   // critical memory.
 
     }
-    optional State factor = 1 [(state_field_option).exclusive_state = true];
+    optional State factor = 1 [
+        (state_field_option).exclusive_state = true,
+        (state_field_option).nested = false
+    ];
 }
 
 /**
@@ -1656,6 +1731,14 @@
     optional int32 tx_kbps = 6 [default = -1];
     // estimated rx throughput in kbps
     optional int32 rx_kbps = 7 [default = -1];
+   // External scorer UID if external scorer is enabled. Otherwise WIFI_UID for
+   // AOSP scorer.
+   optional int32 scorer_uid = 8;
+   // Whether or not Wi-Fi is predicted as usable by the scorer
+   // Note: 'is_wifi_predicted_as_usable' is deprectaed by 'wifi_predicted_usability_state'.
+   optional bool is_wifi_predicted_as_usable = 9;
+   // Wi-Fi usability state as predicted by the scorer
+   optional android.net.wifi.WifiPredictedUsabilityState wifi_predicted_usability_state = 10;
 }
 
 /**
@@ -1749,6 +1832,21 @@
     optional bool is_oob_pseudonym_enabled = 11;
     // The client mode role for the connection, can use to determine the connection type.
     optional android.net.wifi.ClientModeRole role = 12;
+    // The status code specific to each failure code.
+    // - For FAILURE_ASSOCIATION_REJECTION, the value should be one of
+    //   SupplicantStaIfaceHal.StaIfaceStatusCode.
+    // - For FAILURE_NETWORK_DISCONNECTION, the value should be
+    //   one of SupplicantStaIfaceHal.StaIfaceReasonCode.
+    // - For FAILURE_AUTHENTICATION_EAP, the value should be a EAP failure code.
+    // For all other failure codes, this should be 0.
+    optional int32 failure_specific_status_code = 13;
+    // Information only applicable for EAP networks.
+    optional android.net.wifi.EapType eap_type = 14;
+    optional android.net.wifi.EapInnerMethod eap_inner_method = 15;
+    optional android.net.wifi.RoamingType passpoint_roaming_type = 16;
+    // carrier ID of the network
+    optional int32 carrier_id = 17;
+    optional android.net.wifi.TofuConfiguration tofu_configuration = 18;
 }
 
 /**
@@ -1832,6 +1930,40 @@
         SUPPLICANT_DISCONNECTED = 10002;
         CONNECTING_WATCHDOG_TIMER = 10003;
         ROAM_WATCHDOG_TIMER = 10004;
+
+        // New reasons tracking disconnections initiated by wifi framework
+        DISCONNECT_GENERAL = 10005; // Framework disconnect, generic reason
+        // Disconnecting due to unspecified IP reachability lost.
+        DISCONNECT_NUD_FAILURE_GENERIC = 10006;
+        // Disconnecting due to IP reachability lost from roaming
+        DISCONNECT_NUD_FAILURE_ROAM = 10007;
+        // Disconnecting due to IP reachability lost from the CONFIRM command
+        DISCONNECT_NUD_FAILURE_CONFIRM = 10008;
+        // Disconnecting due to IP reachability lost from kernel check
+        DISCONNECT_NUD_FAILURE_ORGANIC = 10009;
+        // Connectivity no longer wants this network
+        DISCONNECT_UNWANTED_BY_CONNECTIVITY = 10010;
+        // Timeout creating the IP client
+        DISCONNECT_CREATE_IP_CLIENT_TIMEOUT = 10011;
+        DISCONNECT_IP_PROVISIONING_FAILURE = 10012; // IP provisioning failure
+        DISCONNECT_P2P_REQUESTED_DISCONNECT = 10013; // Disconnect by P2P
+        // Network is removed from the WifiConfigManager
+        DISCONNECT_NETWORK_REMOVED = 10014;
+        DISCONNECT_NETWORK_UNTRUSTED = 10015; // Network is marked as untrusted
+        DISCONNECT_NETWORK_METERED = 10016; // Network is marked as metered
+        DISCONNECT_TEMP_DISABLED = 10017; // Network is temporarily disabled
+        DISCONNECT_PERM_DISABLED = 10018; // Network is permanently disabled
+        DISCONNECT_CARRIER_OFFLOAD_DISABLED = 10019;
+        // Disconnecting due to Passpoint terms and conditions page
+        DISCONNECT_PASSPOINT_TAC = 10020;
+        // Disconnecting due to issues with terms and conditions URL
+        DISCONNECT_VNC_REQUEST = 10021;
+        // Connected to a network that is already removed
+        DISCONNECT_UNKNOWN_NETWORK = 10022;
+        // User initiated a new connection
+        DISCONNECT_NEW_CONNECTION_USER = 10023;
+        // New connection triggered by non-user
+        DISCONNECT_NEW_CONNECTION_OTHERS = 10024;
     }
 
     // How long the session lasted from successful connection to disconnect.
@@ -1851,6 +1983,26 @@
 
     // Last seen link speed before the disconnect.
     optional int32 last_link_speed = 6;
+
+    // Time since the last RSSI and link speed update.
+    // Useful for filtering out very old data
+    optional int32 time_since_last_rssi_poll_seconds = 7;
+
+    // Time from the last NETWORK_CONNECTION_EVENT to the disconnect
+    optional int32 connected_time_since_last_roam_seconds = 8;
+
+    // The purpose the of the connection
+    optional android.net.wifi.ClientModeRole role = 9;
+
+    // The type of EAP authentication. Only applicable for EAP networks.
+    optional android.net.wifi.EapType eap_type = 10;
+
+    optional android.net.wifi.EapInnerMethod eap_inner_method = 11;
+
+    optional android.net.wifi.RoamingType passpoint_roaming_type = 12;
+
+    // Carrier id of the network.
+    optional int32 carrier_id = 13;
 }
 
 /**
@@ -1861,7 +2013,9 @@
  */
 message WifiConnectionStateChanged {
     optional bool is_connected = 1 [
-            (state_field_option).exclusive_state = true];
+        (state_field_option).exclusive_state = true,
+        (state_field_option).nested = false
+    ];
 
     // Band bucket the connected network was on.
     // Filled for both connected and disconnected cases.
@@ -2333,6 +2487,26 @@
 
     // Hash of the namespace set via JobScheduler.forNamespace(String).
     optional string namespace_hash = 40;
+
+    // System estimated/measured bytes that the job
+    // downloaded over its runtime. Only valid for FINISHED
+    // state. We measure here for the SOURCE UID
+    optional int64 system_measured_source_download_bytes = 41;
+
+    // System estimated/measured uploaded bytes that the job
+    // uploaded over its runtime. Only valid for FINISHED
+    // state. We measure here for the SOURCE UID
+    optional int64 system_measured_source_upload_bytes = 42;
+
+    // System estimated/measured bytes that the job
+    // downloaded over its runtime. Only valid for FINISHED
+    // state. We measure here for the CALLING UID
+    optional int64 system_measured_calling_download_bytes = 43;
+
+    // System estimated/measured uploaded bytes that the job
+    // uploaded over its runtime. Only valid for FINISHED
+    // state. We measure here for the CALLING UID
+    optional int64 system_measured_calling_upload_bytes = 44;
 }
 
 /**
@@ -3284,6 +3458,7 @@
         REASON_APP_NOT_RESPONDING = 4;
         REASON_NATIVE_CRASH_DURING_BOOT = 5;
         REASON_NETWORK_RELATED_CRASH = 6;
+        REASON_BOOT_LOOPING = 7;
     }
     optional RollbackReasonType rollback_reason = 4;
 
@@ -4427,20 +4602,6 @@
 }
 
 /**
- * Logs the duration of a davey (jank of >=700ms) when it occurs
- *
- * Logged from:
- *   frameworks/base/libs/hwui/JankTracker.cpp
- */
-message DaveyOccurred {
-    // The UID that logged this atom.
-    optional int32 uid = 1 [(is_uid) = true];
-
-    // Amount of time it took to render the frame. Should be >=700ms.
-    optional int64 jank_duration_millis = 2;
-}
-
-/**
  * Logs phone signal strength changes.
  *
  * Logged from:
@@ -4524,6 +4685,15 @@
     optional int32 color_variant = 20;
     optional int64 time_elapsed_millis = 21;
     optional int32 effect_status_code = 22;
+    optional int32 app_session_id = 23;
+    optional android.stats.style.SetWallpaperEntryPoint set_wallpaper_entry_point = 24;
+    optional android.stats.style.WallpaperDestination wallpaper_destination = 25;
+    optional android.stats.style.ColorSource color_source = 26;
+    optional int32 seed_color = 27;
+    optional android.stats.style.ClockSize clock_size = 28;
+    optional bool toggle_on = 29;
+    optional string shortcut = 30;
+    optional string shortcut_slot_id = 31;
 }
 
 /**
@@ -5130,6 +5300,9 @@
 
     // The stopped state (if any) the package was in before the launch
     optional PackageStoppedState package_stopped_state = 25;
+
+    // Reserved for b/281564325.
+    reserved 26;
 }
 
 message AppStartCanceled {
@@ -5743,7 +5916,7 @@
  */
 message AppDied {
     // timestamp(elapsedRealtime) of record creation
-    optional uint64 timestamp_millis = 1 [(state_field_option).exclusive_state = true];
+    optional uint64 timestamp_millis = 1;
 }
 
 /**
@@ -6726,7 +6899,10 @@
         DIALOG_LINE_ITEM = 5;
     }
 
-    optional Type type = 1 [(state_field_option).exclusive_state = true];
+    optional Type type = 1 [
+        (state_field_option).exclusive_state = true,
+        (state_field_option).nested = false
+    ];
 }
 
 /**
@@ -7431,13 +7607,15 @@
  * Logged from:
  *  frameworks/base/core/java/com/android/internal/jank/FrameTracker.java
  *
- * Next Tag: 9
+ * Next Tag: 10
  */
 message UIInteractionFrameInfoReported {
     optional android.jank.InteractionType interaction_type = 1;
 
     optional android.jank.DisplayResolution display_resolution = 8;
 
+    optional android.jank.DisplayRefreshRate display_refresh_rate = 9;
+
     // Number of frames rendered during the interaction.
     optional int64 total_frames = 2;
 
@@ -9262,8 +9440,24 @@
     message UidBatteryConsumer {
         optional int32 uid = 1 [(is_uid) = true];
         optional BatteryConsumerData battery_consumer_data = 2;
-        optional int64 time_in_foreground_millis = 3;
-        optional int64 time_in_background_millis = 4;
+        // DEPRECATED Use time_in_state instead.
+        optional int64 time_in_foreground_millis = 3 [deprecated = true];
+        // DEPRECATED Use time_in_state instead.
+        optional int64 time_in_background_millis = 4 [deprecated = true];
+
+        message TimeInState {
+            enum ProcessState {
+                UNSPECIFIED = 0;
+                FOREGROUND = 1;
+                BACKGROUND = 2;
+                FOREGROUND_SERVICE = 3;
+            }
+
+            optional ProcessState process_state = 1;
+            optional int64 time_in_state_millis = 2;
+        }
+
+        repeated TimeInState time_in_state = 5;
     }
     repeated UidBatteryConsumer uid_battery_consumers = 5;
 
@@ -10682,6 +10876,7 @@
         CHILD_TASK_ENTER_PIP = 9;
         RECREATE_SPLIT = 10;
         FULLSCREEN_SHORTCUT = 11;
+        ENTER_DESKTOP = 12;
     }
 
     // The event action
@@ -10966,7 +11161,7 @@
  *   frameworks/av/media/libstagefright/MediaCodec.cpp
  *   frameworks/av/services/mediaanalytics/statsd_codec.cpp
  *
- * Next Tag: 80
+ * Next Tag: 79
  */
 message MediaCodecReported {
     optional int64 timestamp_nanos = 1;
@@ -13360,157 +13555,6 @@
     optional int64 native_time_since_last_optimize_millis = 13;
 }
 
-/**
- * Logs detailed stats for setting schema in AppSearch.
- *
- * stats pushed from:
- *   frameworks/base/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
- *
- * Next tag: 26
- */
-message AppSearchSetSchemaStatsReported {
-    // The sampling interval for this specific type of stats
-    // For example, sampling_interval=10 means that one out of every 10 stats was logged.
-    optional int32 sampling_interval = 1;
-
-    // # of previous skipped sample for this specific type of stats
-    // We can't push atoms too closely, so some samples might be skipped
-    // In order to extrapolate the counts, we need to save the number of skipped stats and add it back
-    // For example, the true count of an event could be estimated as:
-    //   SUM(sampling_interval * (num_skipped_sample + 1)) as est_count
-    optional int32 num_skipped_sample = 2;
-
-    // Package UID of the application.
-    optional int32 uid = 3 [(is_uid) = true];
-
-    // Hash of the database name within AppSearch
-    optional int32 database = 4;
-
-    // Needs to be sync with AppSearchResult#ResultCode in
-    // frameworks/base/apex/appsearch/framework/java/android/app/appsearch/AppSearchResult.java
-    optional int32 status_code = 5;
-
-    // Overall time used for setting schema including the binder latency
-    optional int32 total_latency_millis = 6;
-
-    // Number of newly added schema types
-    optional int32 new_type_count = 7;
-
-    // Number of deleted schema types
-    optional int32 deleted_type_count = 8;
-
-    // Number of compatible schema type changes
-    optional int32 compatible_type_change_count = 9;
-
-    // Number of index-incompatible schema type changes
-    optional int32 index_incompatible_type_change_count = 10;
-
-    // Number of backwards-incompatible schema type changes
-    optional int32 backwards_incompatible_type_change_count = 11;
-
-    // Time used for verifying the incoming call.
-    optional int32  verify_incoming_call_latency_millis = 12;
-
-    // Time used for creating or waiting the user executor.
-    optional int32  executor_acquisition_latency_millis = 13;
-
-    // Time used for rebuilding objects from bundles.
-    optional int32  rebuild_from_bundle_latency_millis = 14;
-
-    // Time passed while waiting to acquire the lock during Java function calls.
-    optional int32  java_lock_acquisition_latency_millis = 15;
-
-    // Time used for the rewrite schema to proto.
-    optional int32  rewrite_schema_latency_millis = 16;
-
-    // Overall time used for the native function call.
-    optional int32  total_native_latency_millis = 17;
-
-    // Time used for the apply visibility settings function call.
-    optional int32  visibility_setting_latency_millis = 18;
-
-    // Time used for the dispatch change notification function call.
-    optional int32  dispatch_change_notifications_latency_millis = 19;
-
-    // Time used for the optimization function call.
-    optional int32  mOptimize_latency_millis = 20;
-
-    /** Whether this package is observed. */
-    optional bool is_package_observed = 21;
-
-    /** Time used for the get old schema. */
-    optional int32  get_old_schema_latency_millis = 22;
-
-    /** Time used for the get registered observer function call. */
-    optional int32  get_observer_latency_millis = 23;
-
-    /** Time used for the preparing change notification action. */
-    optional int32  preparing_change_notification_latency_millis = 24;
-
-    // Type of the SetSchema call relative to SchemaMigration case.
-    // This is in sync with
-    // packages/modules/AppSearch/service/java/com/android/server/appsearch/external/localstorage/stats/SetSchemaStats.java
-    optional int32 schema_migration_call_type = 25;
-}
-
-/**
- * Logs detailed stats for schema migration in AppSearch.
- *
- * stats pushed from:
- *   packages/modules/AppSearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
- *
- * Next tag: 15
- */
-message AppSearchSchemaMigrationStatsReported {
-    // The sampling interval for this specific type of stats
-    // For example, sampling_interval=10 means that one out of every 10 stats was logged.
-    optional int32 sampling_interval = 1;
-
-    // # of previous skipped sample for this specific type of stats
-    // We can't push atoms too closely, so some samples might be skipped
-    // In order to extrapolate the counts, we need to save the number of skipped stats and add it back
-    // For example, the true count of an event could be estimated as:
-    //   SUM(sampling_interval * (num_skipped_sample + 1)) as est_count
-    optional int32 num_skipped_sample = 2;
-
-    // Package UID of the application.
-    optional int32 uid = 3 [(is_uid) = true];
-
-    // Hash of the database name within AppSearch
-    optional int32 database = 4;
-
-    // Needs to be sync with AppSearchResult#ResultCode in
-    // packages/modules/AppSearch/framework/java/external/android/app/appsearch/AppSearchResult.java
-    optional int32 status_code = 5;
-
-    // Overall time used for setting schema including the binder latency
-    optional int32 total_latency_millis = 6;
-
-    // Overall time used for getting schema during schema migration
-    optional int32 schema_migration_get_schema_latency_millis = 7;
-
-    // Overall time used for querying and transforming documents during schema migration
-    optional int32 schema_migration_query_and_transform_latency_millis = 8;
-
-    // Overall time used for first setSchema during schema migration
-    optional int32 schema_migration_first_set_schema_latency_millis = 9;
-
-    // Overall time used for second setSchema during schema migration
-    optional int32 schema_migration_second_set_schema_latency_millis = 10;
-
-    // Overall time used for saving documents during schema migration
-    optional int32 schema_migration_save_document_latency_millis = 11;
-
-    // Number of document that need to be migrated to another version
-    optional int32 total_need_migrated_document_count = 12;
-
-    // Number of successfully migrated and saved in Icing
-    optional int32 total_success_migrated_document_count = 13;
-
-    // Number of migration failure during schema migration
-    optional int32 schema_migration_failure_count = 14;
-}
-
 // Reports information in external/icing/proto/icing/proto/storage.proto#DocumentStorageInfoProto
 // Next tag: 15
 message AppSearchDocumentStorageInfo {
@@ -13657,7 +13701,7 @@
  * Reported from:
  *   packages/modules/AppSearch/service/java/com/android/server/appsearch/contactsindexer/ContactsIndexerManagerService.java
  *
- * Next tag: 11
+ * Next tag: 18
  */
 message ContactsIndexerUpdateStatsReported {
     enum UpdateType {
@@ -13701,6 +13745,30 @@
 
     // Number of old contacts failed to be deleted
     optional int32 number_of_contacts_delete_failed = 10;
+
+    // Number of old contacts to be deleted that were not found
+    optional int32 number_of_contacts_delete_not_found = 11;
+
+    // Start timestamp of the update in millis
+    optional int64 update_start_timestamp_millis = 12;
+
+    // Timestamp of the last full update in millis (not including this update)
+    optional int64 last_full_update_timestamp_millis = 13;
+
+    // Timestamp of the last delta update in millis (not including this update)
+    optional int64 last_delta_update_timestamp_millis = 14;
+
+    // Timestamp of the last contact to be updated from CP2 in millis
+    optional int64 last_contact_updated_timestamp_millis = 15;
+
+    // Timestamp of the last contact to be deleted from CP2 in millis
+    optional int64 last_contact_deleted_timestamp_millis = 16;
+
+    // The previous update's last_contact_updated_timestamp_millis
+    // This field is only set for a full update and expected to match
+    // last_contacted_update_timestamp_millis. If the fields do not match, then we
+    // were unexpectedly not synced up with CP2 at the time of the update.
+    optional int64 previous_last_contact_updated_timestamp_millis = 17;
 }
 
 /**
@@ -14207,6 +14275,10 @@
     // Whether advanced extensions session is being used
     optional bool ext_is_advanced = 25;
     // End: Extension Metrics
+
+    optional bool used_ultrawide = 26;
+
+    optional bool used_zoom_override = 27;
 }
 
 /**
@@ -15258,6 +15330,18 @@
 
     // Handover state of the device
     optional bool handover_in_progress = 37;
+
+    // When the RAT is IWLAN, if it used cross-SIM calling when call started.
+    optional bool is_iwlan_cross_sim_at_start = 38;
+
+    // When the RAT is IWLAN, if it used cross-SIM calling when call ended.
+    optional bool is_iwlan_cross_sim_at_end = 39;
+
+    // When the RAT is IWLAN, if it used cross-SIM calling when call connected.
+    optional bool is_iwlan_cross_sim_at_connected = 40;
+
+    // Whether Vonr is enabled
+    optional bool vonr_enabled = 41;
 }
 
 /**
@@ -15344,6 +15428,10 @@
 
     // Whether mobile data is enable.
     optional bool isDataEnabled = 14;
+
+    // When the voice RAT is NETWORK_TYPE_IWLAN, determines whether it is over
+    // cross-SIM calling (WiFi calling over other SIM's cellular data).
+    optional bool is_iwlan_cross_sim = 15;
 }
 
 /**
@@ -15395,6 +15483,12 @@
     // Number of active eSIM profiles.
     // This number is always equal to or less than the number of SIMs.
     optional int32 esim_count = 3;
+
+    // Number of active eSIM slots in the device.
+    optional int32 active_esim_slot_count = 4;
+
+    // Number of active slots using Multiple Enabled Profiles in the device.
+    optional int32 active_mep_slot_count = 5;
 }
 
 /**
@@ -15427,6 +15521,8 @@
     optional int32 auto_data_switch_toggle_count = 3;
     // True if work profile is enabled on the device
     optional bool has_managed_profile_dedicated_sub = 4;
+    // Number of SIM slots with support for Multiple Enabled Profiles on the device
+    optional int32 mep_supported_slot_count = 5;
 }
 
 /**
@@ -15786,6 +15882,10 @@
 
     // Whether the call is for internet on nonDDS due to auto data switch feature
     optional bool is_non_dds = 22;
+
+    // When the 'rat_at_end' field is IWLAN, determines if the data call setup was
+    // over cross-SIM calling (Wifi calling over cellular data).
+    optional bool is_iwlan_cross_sim = 23;
 }
 
 /**
@@ -15896,6 +15996,10 @@
 
     // Total number of instances of registration termination that matches the above conditions.
     optional int32 count = 8;
+
+    // When the 'rat_at_end' field is IWLAN, indicates whether the ImsRegistrationTech is
+    // REGISTRATION_TECH_CROSS_SIM.
+    optional bool is_iwlan_cross_sim = 9;
 }
 
 /**
@@ -15935,6 +16039,15 @@
     optional int32 video_available_seconds = 10;
     optional int32 ut_capable_seconds = 11;
     optional int32 ut_available_seconds = 12;
+
+    // Total time IMS was registering (connecting time), rounded to 5 minutes
+    optional int32 registering_seconds = 13;
+    // Total time IMS was unregistered (unconnected time), rounded to 5 minutes
+    optional int32 unregistered_seconds = 14;
+
+    // When the 'rat' field is IWLAN, indicates whether the ImsRegistrationTech is
+    // REGISTRATION_TECH_CROSS_SIM.
+    optional bool is_iwlan_cross_sim = 15;
 }
 
 /*
@@ -16383,6 +16496,7 @@
         PROFILE_MANAGED = 6;
         SYSTEM_HEADLESS = 7;
         PROFILE_CLONE = 8;
+        PROFILE_PRIVATE = 9;
     }
     optional UserType user_type = 5;
     // What are the flags attached to the target user
@@ -17941,6 +18055,8 @@
     optional int32 handshake_duration_millis = 4;
 
     optional android.stats.tls.Source source = 5;
+
+    repeated int32 uid = 6 [(is_uid) = true];
 }
 
 /**
@@ -19156,6 +19272,10 @@
     // Android U
     // The UID of the client.
     optional int32 uid = 22 [(is_uid) = true];
+
+    // Android U
+    // The sample rate used by the client.
+    optional int32 sample_rate_client = 23;
 }
 
 /**
@@ -19636,7 +19756,10 @@
     }
 
     // The state of the provider.
-    optional State state = 2 [(state_field_option).exclusive_state = true];
+    optional State state = 2 [
+        (state_field_option).exclusive_state = true,
+        (state_field_option).nested = false
+    ];
 }
 
 /*
@@ -21200,6 +21323,10 @@
 
     // Indicates whether VoNR is enabled
     optional bool vonr_enabled = 18;
+
+    // Indicates whether cross-SIM calling (WiFi calling over cellular data) is
+    // enabled.
+    optional bool cross_sim_calling_enabled = 19;
 }
 
 /*
@@ -21425,16 +21552,8 @@
     // we are deprecating the use of this going forward
     optional string content_digest = 3;
 
-    enum DigestAlgorithmType {
-        UNKNOWN = 0;
-        CHUNKED_SHA256 = 1;
-        CHUNKED_SHA512 = 2;
-        VERITY_CHUNKED_SHA256 = 3;
-        SHA256 = 4;
-    }
-
     // the algorithm that the content digest is computed
-    optional DigestAlgorithmType algo_type = 4;
+    optional com.android.os.transparency.DigestAlgorithmType algo_type = 4;
 
     // the SHA256 digest(s) of the APEX's signer certificate(s)
     repeated string signer_sha256_digest = 5;
@@ -21459,17 +21578,10 @@
     // the split name (empty if it's the base)
     optional string split_name = 11;
 
-    enum DigestAlgorithmType {
-        UNKNOWN = 0;
-        CHUNKED_SHA256 = 1;
-        CHUNKED_SHA512 = 2;
-        VERITY_CHUNKED_SHA256 = 3;
-        SHA256 = 4;
-    }
     // the hex encoded value of digest of the content of the MBA
     optional string content_digest = 3;
     // the algorithm that the content_digest is computed
-    optional DigestAlgorithmType algo_type = 4;
+    optional com.android.os.transparency.DigestAlgorithmType algo_type = 4;
     // the SHA256 digest(s) of the APEX's signer certificate(s)
     repeated string signer_sha256_digest = 5;
 
@@ -21822,7 +21934,7 @@
  */
 message AdServicesApiCalled {
     // The name of the api that was called.
-    // Can be classified as one of the three:
+    // Can be classified as one of the following:
     //
     // Targeting
     //  * GetTopics()
@@ -21841,6 +21953,7 @@
     //  * setAppInstallAdvertisers()
     //  * reportInteraction()
     //  * updateAdCounterHistogram()
+    //  * fetchAndJoinCustomAudience()
     //
     // Measurement - client side
     //   * register() : SOURCE
@@ -21849,12 +21962,17 @@
     //   * registerWebSource()
     //   * registerWebTrigger()
     //   * getMeasurementApiStatus()
+    //   * registerSource() : accepts a list of source registration URIs
     //
     // AdId
     //   * GetAdId()
     //
     // AppsetId
     //   * GetAppsetId()
+    //
+    // AdExtDataService
+    //   * onGetAdServicesExtData()
+    //   * onPutAdServicesExtData()
 
 
     enum AdServicesApiClassType {
@@ -21864,6 +21982,7 @@
         MEASUREMENT = 3;
         ADID = 4;
         APPSETID = 5;
+        ADEXT_DATA_SERVICE = 6;
     }
 
     enum AdServicesApiName {
@@ -21892,6 +22011,10 @@
         SET_APP_INSTALL_ADVERTISERS = 22;
         REPORT_INTERACTION = 23;
         UPDATE_AD_COUNTER_HISTOGRAM = 24;
+        FETCH_AND_JOIN_CUSTOM_AUDIENCE = 25;
+        REGISTER_SOURCES = 26;
+        GET_AD_SERVICES_EXT_DATA = 27;
+        PUT_AD_SERVICES_EXT_DATA = 28;
     }
 
     optional AdServicesApiClassType api_class = 1 [deprecated = true];
@@ -21899,7 +22022,7 @@
     // The actual name of the api within the 3 classes described above.
     optional AdServicesApiName  api_name = 2;
 
-    optional string app_package_name = 3;
+    optional string app_package_name = 3; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
     optional string sdk_package_name = 4;
 
     optional int32 latency_millis = 5;
@@ -21916,6 +22039,33 @@
         UNKNOWN_REPORT = 0;
         EVENT = 1;
         AGGREGATE = 2;
+        DEBUG_EVENT = 3;
+        DEBUG_AGGREGATE = 4;
+        VERBOSE_DEBUG_SOURCE_DESTINATION_LIMIT = 5;
+        VERBOSE_DEBUG_SOURCE_NOISED = 6;
+        VERBOSE_DEBUG_SOURCE_STORAGE_LIMIT = 7;
+        VERBOSE_DEBUG_SOURCE_SUCCESS = 8;
+        VERBOSE_DEBUG_SOURCE_UNKNOWN_ERROR = 9;
+        VERBOSE_DEBUG_SOURCE_FLEXIBLE_EVENT_REPORT_VALUE_ERROR = 10;
+        VERBOSE_DEBUG_TRIGGER_AGGREGATE_DEDUPLICATED = 11;
+        VERBOSE_DEBUG_TRIGGER_AGGREGATE_INSUFFICIENT_BUDGET = 12;
+        VERBOSE_DEBUG_TRIGGER_AGGREGATE_NO_CONTRIBUTIONS = 13;
+        VERBOSE_DEBUG_TRIGGER_AGGREGATE_REPORT_WINDOW_PASSED = 14;
+        VERBOSE_DEBUG_TRIGGER_ATTRIBUTIONS_PER_SOURCE_DESTINATION_LIMIT = 15;
+        VERBOSE_DEBUG_TRIGGER_EVENT_DEDUPLICATED = 16;
+        VERBOSE_DEBUG_TRIGGER_EVENT_EXCESSIVE_REPORTS = 17;
+        VERBOSE_DEBUG_TRIGGER_EVENT_LOW_PRIORITY = 18;
+        VERBOSE_DEBUG_TRIGGER_EVENT_NO_MATCHING_CONFIGURATIONS = 19;
+        VERBOSE_DEBUG_TRIGGER_EVENT_NOISE = 20;
+        VERBOSE_DEBUG_TRIGGER_EVENT_REPORT_WINDOW_PASSED = 21;
+        VERBOSE_DEBUG_TRIGGER_NO_MATCHING_FILTER_DATA = 22;
+        VERBOSE_DEBUG_TRIGGER_NO_MATCHING_SOURCE = 23;
+        VERBOSE_DEBUG_TRIGGER_REPORTING_ORIGIN_LIMIT = 24;
+        VERBOSE_DEBUG_TRIGGER_EVENT_STORAGE_LIMIT = 25;
+        VERBOSE_DEBUG_TRIGGER_UNKNOWN_ERROR = 26;
+        VERBOSE_DEBUG_TRIGGER_AGGREGATE_STORAGE_LIMIT = 27;
+        VERBOSE_DEBUG_TRIGGER_AGGREGATE_EXCESSIVE_REPORTS = 28;
+        VERBOSE_DEBUG_UNKNOWN = 29;
     }
 
     optional ReportType type = 1;
@@ -21931,6 +22081,10 @@
     optional android.adservices.service.measurement.ReportUploadMethod upload_method = 4;
     // delay (in milliseconds) between scheduled delivery time and actual delivery time.
     optional int64 reporting_delay_millis = 5;
+    optional string app_package_name = 6; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
+    optional int32 retry_count = 7;
+    optional int32 http_response_code = 8;
+    optional bool is_marked_for_deletion = 9;
 }
 
 /**
@@ -21952,6 +22106,10 @@
     optional android.adservices.service.measurement.RegistrationFailureType failure_type = 7;
     // delay (in milliseconds) between registration queue request and the time it gets processed
     optional int64 registration_delay_millis = 8;
+    optional string app_package_name = 9; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
+    optional int32 retry_count = 10;
+    optional int32 http_response_code = 11;
+    optional bool is_redirect = 12;
 }
 
 /**
@@ -23471,6 +23629,10 @@
         GA_UX_LANDING_PAGE_OPT_OUT = 65;
         // user clicked opt out on the landing page.
         LANDING_PAGE_OPT_OUT = 66;
+        // (enrolled) user clicked on the privacy sandbox entry point.
+        PRIVACY_SANDBOX_ENTRY_POINT_CLICKED = 67;
+        // daily maintenance job was run.
+        DAILY_MAINTENANCE_JOB_FINISHED = 68;
     }
     // UI action performed by user.
     optional AdServiceSettingsName action = 2;
@@ -23511,7 +23673,7 @@
     // Default ad id state when consent notification was first sent.
     optional AdServicesSettingsDefaultAdIdState default_ad_id_state = 4;
 
-    // Type of AdService feature running on device.
+    // (Deprecated) Type of AdService feature running on device.
     enum PrivacySandboxFeatureType {
         // fallback when getFeature failed.
         FEATURE_UNSPECIFIED = 0;
@@ -23529,8 +23691,48 @@
         PRIVACY_SANDBOX_RECONSENT_FF = 6;
     }
 
-    // Privacy sandbox feature currently running on the device.
-    optional PrivacySandboxFeatureType feature_type = 5;
+    // (Deprecated) Privacy sandbox feature currently running on the device.
+    optional PrivacySandboxFeatureType feature_type = 5 [deprecated = true];
+
+    // Type of privacy sandbox UX.
+    enum PrivacySandboxUx {
+        // fallback when no UX can be selected.
+        UNSUPPORTED_UX = 0;
+        // all UXs that are not unspecified.
+        UNSPECIFIED_UX = 1;
+        // GA UX.
+        GA_UX = 2;
+        // Beta UX.
+        BETA_UX = 3;
+        // UX for Android RVC.
+        RVC_UX = 4;
+    }
+
+    // Type of privacy sandbox UX.
+    optional PrivacySandboxUx ux = 6;
+
+    // Type of privacy sandbox enrollment channel.
+    enum PrivacySandboxUxEnrollmentChannel {
+        // fallback when no enrollment channel can be selected.
+        UNSUPPORTED_CHANNEL = 0;
+        // all enrollment channels that are unspecified.
+        UNSPECIFIED_CHANNEL = 1;
+        // already enrolled channel.
+        ALREADY_ENROLLED_CHANNEL = 2;
+        // consent notification debug channel.
+        CONSENT_NOTIFICATION_DEBUG_CHANNEL = 3;
+        // first consent notification.
+        FIRST_CONSENT_NOTIFICATION_CHANNEL = 4;
+        // reconsent notification.
+        RECONSENT_NOTIFICATION_CHANNEL = 5;
+        // consent notification reset channel.
+        CONSENT_NOTIFICATION_RESET_CHANNEL = 6;
+        // 2nd GA notification post R OTA.
+        RVC_POST_OTA_NOTIFICATION_CHANNEL = 7;
+    }
+
+    // Type of privacy sandbox enrollment channel.
+    optional PrivacySandboxUxEnrollmentChannel enrollment_channel = 7;
 }
 
 // Logs daily ambient brightness stats.
@@ -24455,6 +24657,10 @@
 
   // Active watch face package uid.
   optional int32 watch_face_package_uid = 3 [(is_uid) = true];
+
+  /* Active watch face class name. This will be
+  null for Declarative WF packages, as these packages have only one WF. */
+  optional string watch_face_class_name = 5;
 }
 
 message UnsafeIntentEventReported {
diff --git a/stats/atoms/adpf/adpf_extension_atoms.proto b/stats/atoms/adpf/adpf_extension_atoms.proto
new file mode 100644
index 0000000..9c8da67
--- /dev/null
+++ b/stats/atoms/adpf/adpf_extension_atoms.proto
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.adpf;
+
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/attribution_node.proto";
+import "frameworks/proto_logging/stats/enums/os/enums.proto";
+
+option java_package = "com.android.os.adpf";
+option java_multiple_files = true;
+
+extend Atom {
+    optional ThermalStatusCalled thermal_status_called = 772 [(module) = "framework"];
+    optional ThermalHeadroomCalled thermal_headroom_called = 773 [(module) = "framework"];
+    optional ThermalHeadroomThresholdsCalled thermal_headroom_thresholds_called = 774 [(module) = "framework"];
+    optional ThermalHeadroomThresholds thermal_headroom_thresholds = 10201 [(module) = "framework"];
+}
+
+enum ThermalApiStatus {
+    UNSPECIFIED_THERMAL_API_FAILURE = 0;
+    SUCCESS = 1;
+    HAL_NOT_READY = 2;
+    FEATURE_NOT_SUPPORTED = 3;
+    INVALID_ARGUMENT = 4;
+    // if the thermal HAL reports no temperature for SKIN type
+    NO_TEMPERATURE = 5;
+    // if the thermal HAL reports no matching threshold for the SKIN temperature
+    NO_TEMPERATURE_THRESHOLD = 6;
+}
+
+/**
+ * Logs the PowerManager#getCurrentThermalStatus API usage.
+ *  Logged from frameworks/base/services/core/java/com/android/server/power/ThermalManagerService.java.
+ */
+message ThermalStatusCalled {
+    // UID of the package.
+    optional int32 uid = 1 [(is_uid) = true];
+
+    // API call status.
+    optional ThermalApiStatus api_status = 2;
+
+    // Thermal throttling status.
+    optional android.os.ThrottlingSeverityEnum status = 3;
+}
+
+/**
+ * Logs the PowerManager#getThermalHeadroom API usage.
+ *  Logged from frameworks/base/services/core/java/com/android/server/power/ThermalManagerService.java.
+ */
+message ThermalHeadroomCalled {
+    // UID of the package.
+    optional int32 uid = 1 [(is_uid) = true];
+
+    // API call status.
+    optional ThermalApiStatus api_status = 2;
+
+    // Thermal headroom.
+    optional float headroom = 3;
+}
+
+/**
+ * Logs the PowerManager#getThermalHeadroomThresholds API usage.
+ * Logged from frameworks/base/services/core/java/com/android/server/power/ThermalManagerService.java.
+ */
+message ThermalHeadroomThresholdsCalled {
+    // UID of the package.
+    optional int32 uid = 1 [(is_uid) = true];
+
+    // API call status.
+    optional ThermalApiStatus api_status = 2;
+}
+
+/**
+ * Logs the current thermal headroom thresholds of a device.
+ * Logged from frameworks/base/services/core/java/com/android/server/power/ThermalManagerService.java.
+ */
+message ThermalHeadroomThresholds {
+    // Thermal headroom threshold for that status.
+    repeated float headroom = 1;
+}
diff --git a/stats/atoms/adservices/adservices_extension_atoms.proto b/stats/atoms/adservices/adservices_extension_atoms.proto
index 19d5d28..c2e6c75 100644
--- a/stats/atoms/adservices/adservices_extension_atoms.proto
+++ b/stats/atoms/adservices/adservices_extension_atoms.proto
@@ -22,7 +22,9 @@
 import "frameworks/proto_logging/stats/atom_field_options.proto";
 import "frameworks/proto_logging/stats/enums/adservices/common/adservices_enums.proto";
 import "frameworks/proto_logging/stats/enums/app/job/enums.proto";
+import "frameworks/proto_logging/stats/enums/adservices/enrollment/enums.proto";
 import "frameworks/proto_logging/stats/enums/adservices/measurement/enums.proto";
+import "frameworks/proto_logging/stats/enums/adservices/fledge/enums.proto";
 
 option java_package = "com.android.os.adservices";
 option java_multiple_files = true;
@@ -57,9 +59,38 @@
   optional AdServicesMeasurementWipeout
       ad_services_measurement_wipeout = 676
         [(module) = "adservices", (truncate_timestamp) = true];
+  optional AdServicesMeasurementAdIdMatchForDebugKeys
+      ad_services_measurement_ad_id_match_for_debug_keys = 695
+        [(module) = "adservices", (truncate_timestamp) = true];
+
+  optional AdServicesEnrollmentDataStored ad_services_enrollment_data_stored = 697
+      [(module) = "adservices", (truncate_timestamp) = true];
+  optional AdServicesEnrollmentFileDownloaded
+      ad_services_enrollment_file_downloaded = 698
+      [(module) = "adservices", (truncate_timestamp) = true];
+  optional AdServicesEnrollmentMatched ad_services_enrollment_matched = 699
+      [(module) = "adservices", (truncate_timestamp) = true];
 
   optional AdServicesConsentMigrated ad_services_consent_migrated = 702
   [(module) = "adservices", (truncate_timestamp) = true];
+
+  optional AdServicesEnrollmentFailed ad_services_enrollment_failed = 714
+      [(module) = "adservices", (truncate_timestamp) = true];
+
+  optional AdServicesMeasurementClickVerification ad_services_measurement_click_verification = 756
+      [(module) = "adservices", (truncate_timestamp) = true];
+
+  optional AdServicesEncryptionKeyFetched ad_services_encryption_key_fetched = 765
+      [(module) = "adservices", (truncate_timestamp) = true];
+  optional AdServicesEncryptionKeyDbTransactionEnded ad_services_encryption_key_db_transaction_ended = 766
+      [(module) = "adservices", (truncate_timestamp) = true];
+
+  optional DestinationRegisteredBeacons destination_registered_beacons = 767
+      [(module) = "adservices", (truncate_timestamp) = true];
+  optional ReportInteractionApiCalled report_interaction_api_called = 768
+      [(module) = "adservices", (truncate_timestamp) = true];
+  optional InteractionReportingTableCleared interaction_reporting_table_cleared = 769
+      [(module) = "adservices", (truncate_timestamp) = true];
 }
 
 /**
@@ -124,6 +155,7 @@
   optional bool is_matched = 3;
   optional int64 join_key_hash = 4;
   optional int64 join_key_hash_limit = 5;
+  optional string app_package_name = 6; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
 }
 
 /**
@@ -178,6 +210,7 @@
   optional android.adservices.service.measurement.DelayedSourceRegistrationStatus registration_status = 1;
   // delay (in milliseconds) between a source registration and a previously registered trigger with matching attribution destination
   optional int64 missed_source_delay_millis = 2;
+  optional string app_package_name = 3; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
 }
 
 /**
@@ -192,6 +225,12 @@
   optional bool is_install_attribution = 6;
   // delay (in milliseconds) between trigger registration and a trigger becoming attributed.
   optional int64 trigger_to_attribution_delay_millis = 7;
+  optional string app_package_name = 8; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
+  optional int32 aggregate_report_count = 9;
+  optional int32 aggregate_debug_report_count = 10;
+  optional int32 event_report_count = 11;
+  optional int32 event_debug_report_count = 12;
+  optional int32 retry_count = 13;
 }
 
 /**
@@ -207,6 +246,55 @@
  */
 message AdServicesMeasurementWipeout {
   optional android.adservices.service.measurement.WipeoutCause wipeout_cause = 1;
+  optional string app_package_name = 2; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
+}
+
+/**
+ * Logs Ad Id match state for debug keys when measurement reports are being generated.
+ */
+message AdServicesMeasurementAdIdMatchForDebugKeys {
+  optional string adtech_enrollment_id = 1;
+  optional android.adservices.AttributionType attribution_type = 2;
+  optional bool is_matched = 3;
+  optional int64 num_unique_ad_ids_used = 4;
+  optional int64 num_unique_ad_id_limit = 5;
+  optional string app_package_name = 6; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
+}
+
+/**
+ * Logs when AdServices enrollment data is stored.
+ */
+message AdServicesEnrollmentDataStored {
+  optional android.stats.adservices.enrollment.TransactionType transaction_type = 1;
+  optional bool success = 2;
+  optional int32 build_id = 3; // id of the enrollment file downloaded via mdd
+}
+
+/**
+ * Logs when AdServices enrollment file get downloaded.
+ */
+message AdServicesEnrollmentFileDownloaded {
+  optional bool success = 1;
+  optional int32 build_id = 2; // id of the enrollment file downloaded via mdd
+}
+
+/**
+ * Logs when AdServices enrollment match occurs.
+ */
+message AdServicesEnrollmentMatched {
+  optional bool success = 1;
+  optional int32 build_id = 2; // id of the enrollment file downloaded via mdd
+}
+
+/**
+ * Logs when AdServices enrollment fails.
+ */
+message AdServicesEnrollmentFailed {
+  optional int32 build_id = 1; // id of the enrollment file downloaded via mdd
+  optional android.stats.adservices.enrollment.DataFileGroupStatus data_file_group_status = 2;
+  optional int32 enrollment_record_count_in_table = 3;
+  optional string query_parameter = 4;
+  optional android.stats.adservices.enrollment.ErrorCause error_cause = 5;
 }
 
 /**
@@ -239,6 +327,12 @@
 
     // Migrating consent from App Search to system service
     APPSEARCH_TO_SYSTEM_SERVICE = 2;
+
+    // Migrating consent from AdServicesExtDataStorageService to system service
+    ADEXT_SERVICE_TO_SYSTEM_SERVICE = 3;
+
+    // Migrating consent from AdServicesExtDataStorageService to App Search
+    ADEXT_SERVICE_TO_APPSEARCH = 4;
   }
 
   // Logs the opt-in/ opt-out value of measurement app
@@ -261,6 +355,169 @@
 
   // Logs the Migration status
   optional MigrationStatus migration_status = 7;
+}
 
+/**
+ * Logs for AdServices click verification for measurement API calls.
+ */
+ message AdServicesMeasurementClickVerification {
+  //  The final source type of the source.
+  optional android.adservices.service.measurement.SourceType source_type = 1;
 
+  // If an input event was included with the registration.
+  // The calling app wanted a click event if an input event is present.
+  optional bool input_event_present = 2;
+
+  // If the system click verification passed.
+  optional bool system_click_verification_passed = 3;
+
+  // If the flag is set to enable the system click verification check.
+  optional bool system_click_verification_enabled = 4;
+
+  // The delay (in millis) from when the input event was created to when the API was called.
+  optional int64 input_event_delay_millis = 5;
+
+  // The max difference (in millis) between input event creation and API call for the source to not get downgraded.
+  optional int64 valid_delay_window_millis = 6;
+
+  // The package calling the API.
+  optional string app_package_name = 7; // [(datapol.semantic_type) = ST_SOFTWARE_ID, (contains_pii) = false]
+}
+
+/**
+ * Logs for AdServices encryption key background job status.
+ */
+message AdServicesEncryptionKeyFetched {
+
+  // Encryption key fetch job type.
+  enum FetchJobType {
+    UNKNOWN_JOB = 0;
+    ENCRYPTION_KEY_DAILY_FETCH_JOB = 1;
+    MDD_DOWNLOAD_JOB = 2;
+  }
+
+  // Encryption key fetch status.
+  enum FetchStatus {
+    UNKNOWN = 0;
+    NULL_ENDPOINT = 1;
+    INVALID_ENDPOINT = 2;
+    IO_EXCEPTION = 3;
+    BAD_REQUEST_EXCEPTION = 4;
+    KEY_NOT_MODIFIED = 5;
+    SUCCESS = 6;
+  }
+
+  // Encryption key fetch job type.
+  optional FetchJobType fetch_job_type = 1;
+  // Encryption key fetch status.
+  optional FetchStatus fetch_status = 2;
+  // Whether the key is fetched for the first time.
+  optional bool is_first_time_fetch = 3;
+  // Enrollment id for the adtech corresponding to the encryption key.
+  // Example: "XYZABC"
+  optional string adtech_enrollment_id = 4;
+  // Company id for the adtech corresponding to this encryption key.
+  // Example: "XYZCompany"
+  optional string company_id = 5;
+  // Encryption key url.
+  optional string encryption_key_url = 6;
+}
+
+/**
+ * Logs for AdServices encryption key datastore transaction status.
+ */
+message AdServicesEncryptionKeyDbTransactionEnded {
+
+  // Encryption key datastore transaction type.
+  enum DbTransactionType {
+    UNKNOWN = 0;
+    READ_TRANSACTION_TYPE = 1;
+    WRITE_TRANSACTION_TYPE = 2;
+  }
+
+  // Encryption key datastore transaction status.
+  enum DbTransactionStatus {
+    UNKNOWN_EXCEPTION = 0;
+    INVALID_KEY= 1;
+    INSERT_EXCEPTION = 2;
+    DELETE_EXCEPTION = 3;
+    SEARCH_EXCEPTION = 4;
+    SUCCESS = 5;
+  }
+
+  // Encryption key dao method names.
+  enum MethodName {
+    UNKNOWN_METHOD = 0;
+    GET_KEY_FROM_ENROLLMENT_ID = 1;
+    GET_KEY_FROM_ENROLLMENT_ID_AND_KEY_TYPE = 2;
+    GET_KEY_FROM_ENROLLMENT_ID_AND_KEY_ID = 3;
+    GET_KEY_FROM_REPORTING_ORIGIN = 4;
+    GET_ALL_KEYS = 5;
+    INSERT_KEY = 6;
+    INSERT_KEYS = 7;
+    DELETE_KEY = 8;
+  }
+
+  // Encryption key datastore transaction type.
+  optional DbTransactionType db_transaction_type = 1;
+  // Encryption key datastore transaction status.
+  optional DbTransactionStatus  db_transaction_status = 2;
+  // Encryption key DAO method name.
+  optional MethodName method_name = 3;
+}
+
+/**
+ * Logs for beacon level reporting for destination registered beacons.
+ */
+message DestinationRegisteredBeacons {
+
+  // Logs the range of key size for interaction key.
+  enum InteractionKeySizeRangeType {
+    UNSET_TYPE = 0;
+    // The key size is smaller than 50% maximum key size.
+    MUCH_SMALLER_THAN_MAXIMUM_KEY_SIZE = 1;
+    // The key size is equal or greater than 50% maximum key size but smaller than maximum key size.
+    SMALLER_THAN_MAXIMUM_KEY_SIZE = 2;
+    // The key size is equal to maximum key size.
+    EQUAL_TO_MAXIMUM_KEY_SIZE = 3;
+    // The key size is greater than maximum key size.
+    LARGER_THAN_MAXIMUM_KEY_SIZE = 4;
+  }
+
+  // The entity who registered the beacons.
+  optional android.adservices.service.BeaconReportingDestinationType destination = 1;
+
+  // Number of beacons ad-tech tries to register during reportImpression.
+  optional int32 attempted_registered_beacons = 2;
+
+  // Key size range for interactionKey in every registerAdBeacon call.
+  repeated InteractionKeySizeRangeType attempted_key_sizes = 3;
+
+  // Size of registered_ad_interactions database after each update to it.
+  optional int32 table_num_rows = 4;
+
+  // The status response code in AdServices.
+  optional int32 status_code = 5;
+}
+
+/**
+ * Logs for beacon level reporting for ReportInteraction API.
+ */
+message ReportInteractionApiCalled {
+  // The entity who registered the beacons.
+  optional android.adservices.service.BeaconReportingDestinationType destination = 1;
+
+  // Number of matching uris for the reportInteraction request is found.
+  optional int32 num_matching_uris = 2;
+}
+
+/**
+ * Logs for beacon level reporting for clearing interaction reporting table.
+ */
+message InteractionReportingTableCleared {
+  // Number of registered URIs cleared every 24 hours.
+  optional int32 num_uris_cleared = 1;
+
+  // Number of unreported URIs before clearing.
+  optional int32 num_unreported_uris = 2;
 }
\ No newline at end of file
diff --git a/stats/atoms/apex/apex_extension_atoms.proto b/stats/atoms/apex/apex_extension_atoms.proto
new file mode 100644
index 0000000..2f8ac15
--- /dev/null
+++ b/stats/atoms/apex/apex_extension_atoms.proto
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// This file contains extension atoms for apex and vendor apex installation events.
+
+syntax = "proto2";
+
+package android.os.statsd.apex;
+
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/enums/apex/enums.proto";
+
+option java_package = "com.android.os.apex";
+
+extend Atom {
+    optional ApexInstallationRequested apex_installation_requested = 732 [(module) = "apex"];
+    optional ApexInstallationStaged apex_installation_staged = 733 [(module) = "apex"];
+    optional ApexInstallationEnded apex_installation_ended = 734 [(module) = "apex"];
+}
+
+/**
+ * APEXs can installed by either Google or OEMs. These atoms capture basic
+ * metadata of APEXs being installed on a device.
+ *
+ * Logs when an apex installation is started, staged, and ended.
+ * Pushed from:
+ *    system/apex/apexd/apexd.cpp
+ */
+
+message ApexInstallationRequested {
+    // Module in the APEX
+    optional string module_name = 1;
+    // The version code of the APEX
+    optional int64 version_code = 2;
+    // Byte size of the APEX file
+    optional int64 package_size_bytes = 3;
+    // The hex encoded SHA256 digest of the APEX file
+    optional string file_hash = 4;
+    // Lets us determine if apex is a vendor apex
+    optional android.apex.PreinstallPartition apex_preinstall_partition = 5;
+    // Was a Staged or a Rebootless install requested
+    optional android.apex.InstallationType installation_type = 6;
+    // Is this request a rollback?
+    optional bool request_is_rollback = 7;
+    // Apex's FileInfo's Manifest provides these data points
+    optional bool provides_shared_apex_libs = 8;
+    // HAL's provided by this apex
+    repeated string provided_hals = 9;
+}
+
+message ApexInstallationStaged {
+    optional string file_hash = 1;
+}
+
+message ApexInstallationEnded {
+    optional string file_hash = 1;
+    optional android.apex.InstallResultType installation_result = 2;
+}
diff --git a/stats/atoms/appsearch/appsearch_extension_atoms.proto b/stats/atoms/appsearch/appsearch_extension_atoms.proto
new file mode 100644
index 0000000..1249b18
--- /dev/null
+++ b/stats/atoms/appsearch/appsearch_extension_atoms.proto
@@ -0,0 +1,165 @@
+package android.os.statsd.appsearch;
+
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/atoms.proto";
+
+option java_package = "com.android.os.appsearch";
+option java_multiple_files = true;
+
+extend Atom {
+  // Pushed atoms
+  optional AppSearchSetSchemaStatsReported app_search_set_schema_stats_reported = 385 [(module) = "appsearch"];
+  optional AppSearchSchemaMigrationStatsReported
+          app_search_schema_migration_stats_reported = 579 [(module) = "appsearch"];
+}
+
+/**
+ * Logs detailed stats for setting schema in AppSearch.
+ *
+ * stats pushed from:
+ *   frameworks/base/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+ *
+ * Next tag: 26
+ */
+message AppSearchSetSchemaStatsReported {
+    // The sampling interval for this specific type of stats
+    // For example, sampling_interval=10 means that one out of every 10 stats was logged.
+    optional int32 sampling_interval = 1;
+
+    // # of previous skipped sample for this specific type of stats
+    // We can't push atoms too closely, so some samples might be skipped
+    // In order to extrapolate the counts, we need to save the number of skipped stats and add it back
+    // For example, the true count of an event could be estimated as:
+    //   SUM(sampling_interval * (num_skipped_sample + 1)) as est_count
+    optional int32 num_skipped_sample = 2;
+
+    // Package UID of the application.
+    optional int32 uid = 3 [(is_uid) = true];
+
+    // Hash of the database name within AppSearch
+    optional int32 database = 4;
+
+    // Needs to be sync with AppSearchResult#ResultCode in
+    // frameworks/base/apex/appsearch/framework/java/android/app/appsearch/AppSearchResult.java
+    optional int32 status_code = 5;
+
+    // Overall time used for setting schema including the binder latency
+    optional int32 total_latency_millis = 6;
+
+    // Number of newly added schema types
+    optional int32 new_type_count = 7;
+
+    // Number of deleted schema types
+    optional int32 deleted_type_count = 8;
+
+    // Number of compatible schema type changes
+    optional int32 compatible_type_change_count = 9;
+
+    // Number of index-incompatible schema type changes
+    optional int32 index_incompatible_type_change_count = 10;
+
+    // Number of backwards-incompatible schema type changes
+    optional int32 backwards_incompatible_type_change_count = 11;
+
+    // Time used for verifying the incoming call.
+    optional int32  verify_incoming_call_latency_millis = 12;
+
+    // Time used for creating or waiting the user executor.
+    optional int32  executor_acquisition_latency_millis = 13;
+
+    // Time used for rebuilding objects from bundles.
+    optional int32  rebuild_from_bundle_latency_millis = 14;
+
+    // Time passed while waiting to acquire the lock during Java function calls.
+    optional int32  java_lock_acquisition_latency_millis = 15;
+
+    // Time used for the rewrite schema to proto.
+    optional int32  rewrite_schema_latency_millis = 16;
+
+    // Overall time used for the native function call.
+    optional int32  total_native_latency_millis = 17;
+
+    // Time used for the apply visibility settings function call.
+    optional int32  visibility_setting_latency_millis = 18;
+
+    // Time used for the dispatch change notification function call.
+    optional int32  dispatch_change_notifications_latency_millis = 19;
+
+    // Time used for the optimization function call.
+    optional int32  optimize_latency_millis = 20;
+
+    /** Whether this package is observed. */
+    optional bool is_package_observed = 21;
+
+    /** Time used for the get old schema. */
+    optional int32  get_old_schema_latency_millis = 22;
+
+    /** Time used for the get registered observer function call. */
+    optional int32  get_observer_latency_millis = 23;
+
+    /** Time used for the preparing change notification action. */
+    optional int32  preparing_change_notification_latency_millis = 24;
+
+    // Type of the SetSchema call relative to SchemaMigration case.
+    // This is in sync with
+    // packages/modules/AppSearch/service/java/com/android/server/appsearch/external/localstorage/stats/SetSchemaStats.java
+    optional int32 schema_migration_call_type = 25;
+}
+
+/**
+ * Logs detailed stats for schema migration in AppSearch.
+ *
+ * stats pushed from:
+ *   packages/modules/AppSearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+ *
+ * Next tag: 15
+ */
+message AppSearchSchemaMigrationStatsReported {
+    // The sampling interval for this specific type of stats
+    // For example, sampling_interval=10 means that one out of every 10 stats was logged.
+    optional int32 sampling_interval = 1;
+
+    // # of previous skipped sample for this specific type of stats
+    // We can't push atoms too closely, so some samples might be skipped
+    // In order to extrapolate the counts, we need to save the number of skipped stats and add it back
+    // For example, the true count of an event could be estimated as:
+    //   SUM(sampling_interval * (num_skipped_sample + 1)) as est_count
+    optional int32 num_skipped_sample = 2;
+
+    // Package UID of the application.
+    optional int32 uid = 3 [(is_uid) = true];
+
+    // Hash of the database name within AppSearch
+    optional int32 database = 4;
+
+    // Needs to be sync with AppSearchResult#ResultCode in
+    // packages/modules/AppSearch/framework/java/external/android/app/appsearch/AppSearchResult.java
+    optional int32 status_code = 5;
+
+    // Overall time used for setting schema including the binder latency
+    optional int32 total_latency_millis = 6;
+
+    // Overall time used for getting schema during schema migration
+    optional int32 schema_migration_get_schema_latency_millis = 7;
+
+    // Overall time used for querying and transforming documents during schema migration
+    optional int32 schema_migration_query_and_transform_latency_millis = 8;
+
+    // Overall time used for first setSchema during schema migration
+    optional int32 schema_migration_first_set_schema_latency_millis = 9;
+
+    // Overall time used for second setSchema during schema migration
+    optional int32 schema_migration_second_set_schema_latency_millis = 10;
+
+    // Overall time used for saving documents during schema migration
+    optional int32 schema_migration_save_document_latency_millis = 11;
+
+    // Number of document that need to be migrated to another version
+    optional int32 total_need_migrated_document_count = 12;
+
+    // Number of successfully migrated and saved in Icing
+    optional int32 total_success_migrated_document_count = 13;
+
+    // Number of migration failure during schema migration
+    optional int32 schema_migration_failure_count = 14;
+}
\ No newline at end of file
diff --git a/stats/atoms/art/art_extension_atoms.proto b/stats/atoms/art/art_extension_atoms.proto
index 8815b2f..127b118 100644
--- a/stats/atoms/art/art_extension_atoms.proto
+++ b/stats/atoms/art/art_extension_atoms.proto
@@ -9,7 +9,7 @@
 option java_multiple_files = true;
 
 extend Atom {
-    // Pushed atomes
+    // Pushed atoms
     optional ArtDatumReported art_datum_reported = 332 [(module) = "art"];
     // Deprecated in favour of the ArtDeviceStatus pulled atom
     optional ArtDeviceDatumReported art_device_datum_reported = 550 [(module) = "art", deprecated = true];
@@ -350,4 +350,3 @@
     }
     optional BootImageStatus boot_image_status = 1;
 }
-
diff --git a/stats/atoms/automotive/carlauncher/automotive_carlauncher_atoms.proto b/stats/atoms/automotive/carlauncher/automotive_carlauncher_atoms.proto
new file mode 100644
index 0000000..ae5375b
--- /dev/null
+++ b/stats/atoms/automotive/carlauncher/automotive_carlauncher_atoms.proto
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+syntax = "proto2";
+
+package android.os.statsd.automotive.carlauncher;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+
+option java_package = "com.android.os.automotive.carlauncher";
+option java_multiple_files = true;
+
+extend Atom {
+  optional CarRecentsEventReported car_recents_event_reported = 770 [(module) = "carlauncher"];
+}
+
+/**
+ * Logs when an recents event occurs in carlauncher.
+ *
+ * Logged from package: packages/apps/Car/Launcher
+ */
+message CarRecentsEventReported {
+  enum RECENTS_EVENT_TYPE {
+    UNSPECIFIED = 0;
+    SESSION_STARTED = 1;
+    SESSION_FINISHED = 2;
+    APP_LAUNCHED = 3;
+    APP_DISMISSED = 4;
+    CLEAR_ALL = 5;
+  }
+  optional int64 session_id = 1;
+  optional int64 event_id = 2;
+  optional RECENTS_EVENT_TYPE event_type = 3;
+  optional int32 total_task_count = 4;
+  optional int32 event_task_index = 5;
+  optional int64 time_to_event_millis = 6;
+  optional int32 package_uid = 7 [(is_uid) = true];
+}
diff --git a/stats/atoms/bluetooth/bluetooth_extension_atoms.proto b/stats/atoms/bluetooth/bluetooth_extension_atoms.proto
index ed10dea..ed7ecb4 100644
--- a/stats/atoms/bluetooth/bluetooth_extension_atoms.proto
+++ b/stats/atoms/bluetooth/bluetooth_extension_atoms.proto
@@ -259,6 +259,17 @@
   optional int32 tag = 4;
 }
 
+message BluetoothRemoteDeviceInformation {
+  // SHA256 hashed Bluetooth device name.
+  optional string allowlisted_device_name_hash = 1;
+
+  // Class of Device
+  optional int32 class_of_device = 2;
+
+  // The first three bytes of MAC address
+  optional int32 oui = 3;
+}
+
 /**
 * Logs RFCOMM connection attempts
 *
@@ -283,4 +294,9 @@
 
   // Uid of the app that calls RFCOMM connection API
   optional int32 uid = 6 [(is_uid) = true]; // [(datapol.semantic_type) = ST_SOFTWARE_ID]
+
+  // Remote Device Information
+  optional BluetoothRemoteDeviceInformation remote_device_information = 7 [(log_mode) = MODE_BYTES];
 }
+
+
diff --git a/stats/atoms/corenetworking/platform/vpn_extension_atoms.proto b/stats/atoms/corenetworking/platform/vpn_extension_atoms.proto
new file mode 100644
index 0000000..ebc0978
--- /dev/null
+++ b/stats/atoms/corenetworking/platform/vpn_extension_atoms.proto
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.corenetworking.platform;
+
+option java_package = "com.android.os.corenetworking.platform";
+option java_multiple_files = true;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/enums/corenetworking/platform/enums.proto";
+
+extend Atom {
+    // pushed atom
+    optional VpnConnectionStateChanged vpn_connection_state_changed = 850
+        [(module) = "framework"];
+
+    // pushed atom
+    optional VpnConnectionReported vpn_connection_reported = 851 [(module) = "framework"];
+}
+
+/**
+ * Log VPN connection events to develop metrics analyzing the effect of VPN usage on device
+ * performance and battery life.
+ *
+ * Logs from: services/core/java/com/android/server/connectivity/Vpn.java.
+ *
+ */
+message VpnConnectionStateChanged {
+
+  // The VPN connection state(connected/disconnected)
+  optional android.corenetworking.platform.ConnectionState connection_state = 1 [
+        (state_field_option).exclusive_state = true,
+        (state_field_option).nested = false
+    ];
+}
+
+
+/**
+ * Logs the VPN connection stats for analysis performance of VPN
+ *
+ * Logs from: services/core/java/com/android/server/connectivity/Vpn.java.
+ *
+ */
+message VpnConnectionReported {
+  // VPN connection types defined in
+  // frameworks/base/core/java/android/net/VpnManager.java
+  optional android.corenetworking.platform.VpnType vpn_type = 1;
+
+  // The IP address type in the VPN connection(IPv4/IPv6/IPv4v6)
+  optional android.corenetworking.platform.IpType conn_ip_protocol = 2;
+
+  // The IP protocol of the VPN server(IPv4/IPv6/IPv4v6)
+  optional android.corenetworking.platform.IpType server_ip_protocol = 3;
+
+  // UDP Encapsulation/ESP
+  optional android.corenetworking.platform.EncapType encap_type = 4;
+
+  // Is the VPN a bypassable VPN
+  optional bool bypassability = 5;
+
+  // Is the VPN opt-in to do network validation
+  optional bool validation_required = 6;
+
+  optional android.corenetworking.platform.VpnProfileType vpn_profile_type = 7;
+
+  // Bitmasked value for allowed algorithms
+  optional int32 allowed_alogithms = 8;
+
+  // The MTU configuration of the VPN network
+  optional int32 mtu = 9;
+
+  // True if the local networks will be excluded from VPN. This
+  // should only work with bypassable VPNs.
+  optional bool local_route_excluded = 10;
+
+  // Is the VPN a metered VPN
+  optional bool metered = 11;
+
+  // Is the VPN configured with a proxy
+  optional bool proxy_setup = 12;
+
+  // Is the VPN connection a always-on VPN
+  optional bool always_on_vpn = 13;
+
+  // Is the VPN connection a lockdown VPN
+  optional bool lockdown_vpn = 14;
+
+  // The dnses for a VPN network can either come from network side
+  // or use user pre-configured dnses. True if the VPN uses user
+  // preconfigured dnses, false otherwise.
+  optional bool preconfigured_dns = 15;
+
+  // The route for a VPN network can either come from network side
+  // or use user pre-configured routes. True if the VPN uses user
+  // preconfigured routes, false otherwise.
+  optional bool preconfigured_routes = 16;
+
+  // Is the NAT keepalive controllled by the system to send the
+  // keepalive dynamically
+  optional int32 is_auto_keepalive = 17;
+
+  // The duration of connected period in seconds
+  optional int32 connected_period_seconds = 18;
+
+  // The list of underlying network type during the VPN connection
+  repeated int32 underlying_network_type = 19;
+
+  // The duration of VPN validated period in seconds
+  optional int32 vpn_validated_period_seconds = 20;
+
+  // Count of the validation attempts
+  optional int32 validation_attempts = 21;
+
+  // Count of the successful validation attempts
+  optional int32 validation_attempts_success = 22;
+
+  // The list of session lost reason during the VPN connection
+  // 0 for success, or other errors for session lost reason
+  repeated android.corenetworking.platform.ErrorCode error_code = 23;
+
+  // The all attempt recovery informations in the VPN connection
+  optional RecoveryInfoPerAttempt recovery_info_per_attempt = 24[(log_mode) = MODE_BYTES];
+
+  // The recovery latency is approxymiate to un-validated period
+  optional int32 recovery_latency = 25;
+
+  // Control plane health
+  // The list of each ike attempt informations during the VPN connection
+  optional IkeAttempts ike_attempts = 26[(log_mode) = MODE_BYTES];
+
+  // The list of each network switch info during the VPN connection
+  optional SwitchAttempts switch_attempts = 27[(log_mode) = MODE_BYTES];
+}
+
+/**
+ * Log one ike attempt event informations
+ */
+message IkeAttemptEvent {
+  // Result of the ike attempt
+  optional bool success = 1;
+
+  // The latency of ike attempt in milliseconds
+  optional int32 latency_milliseconds = 2;
+}
+
+/**
+ * Log all ike attempt informations during the VPN connection
+ */
+message IkeAttempts {
+   repeated IkeAttemptEvent ike_attempt_event = 1;
+}
+
+/**
+ * Log one network switch attempt event informations
+ */
+message SwitchAttemptEvent {
+  // Result of the network switch attempt
+  optional bool success = 1;
+
+  // The latency of the network switch attempt in milliseconds
+  optional int32 latency_milliseconds = 2;
+}
+
+/**
+ * Log all network switch attempt informations during the VPN connection
+ */
+message SwitchAttempts {
+  repeated SwitchAttemptEvent switch_attempt_event = 1;
+}
+
+/**
+ * Log the recovery info for the attempt
+ */
+message RecoveryInfoForAttempt {
+  // Type of recover action for the attempt
+  optional android.corenetworking.platform.RecoverAction type = 1;
+
+  // Recovery count
+  optional int32 count = 2;
+}
+
+
+/**
+ * Log all attempted recovery informations on the VPN connection
+ */
+message RecoveryInfoPerAttempt {
+  // The list of recovery info per each attempt in the connection
+  repeated RecoveryInfoForAttempt recovery_info_for_attempt = 1;
+}
diff --git a/stats/atoms/cpu/cpu_atoms.proto b/stats/atoms/cpu/cpu_atoms.proto
new file mode 100644
index 0000000..808aece
--- /dev/null
+++ b/stats/atoms/cpu/cpu_atoms.proto
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.cpu;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+
+option java_package = "com.android.os.cpu";
+option java_multiple_files = true;
+
+extend Atom {
+    optional CpuPolicy cpu_policy = 10199 [(module) = "framework"];
+}
+
+/**
+ * Logs information related to CPU policies such as frequency limits.
+ */
+message CpuPolicy {
+    // The cpufreq policy ID.
+    optional int32 policy = 1;
+
+    // The current maximum frequency.
+    optional int32 scaling_max_freq_khz = 2;
+
+    // The normal maximum frequency.
+    optional int32 cpuinfo_max_freq_khz = 3;
+}
\ No newline at end of file
diff --git a/stats/atoms/devicelock/devicelock_extension_atoms.proto b/stats/atoms/devicelock/devicelock_extension_atoms.proto
new file mode 100644
index 0000000..5af5df6
--- /dev/null
+++ b/stats/atoms/devicelock/devicelock_extension_atoms.proto
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.devicelock;
+
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/atoms.proto";
+
+option java_package = "com.android.os.devicelock";
+option java_multiple_files = true;
+
+extend Atom {
+  optional DeviceLockCheckInRequestReported device_lock_check_in_request_reported = 726
+          [(module) = "devicelock"];
+  optional DeviceLockProvisioningCompleteReported device_lock_provisioning_complete_reported = 727
+          [(module) = "devicelock"];
+  optional DeviceLockKioskAppRequestReported device_lock_kiosk_app_request_reported = 728
+          [(module) = "devicelock"];
+}
+
+message DeviceLockCheckInRequestReported {
+  enum RequestType {
+    // Default value for the request type
+    UNKNOWN = 0;
+    // The Check-in request is getDeviceCheckInStatus
+    GET_DEVICE_CHECK_IN_STATUS = 1;
+    // The Check-in request is pauseDeviceProvisioning
+    PAUSE_DEVICE_PROVISIONING = 2;
+    // The Check-in request is reportDeviceProvisioningComplete
+    // DEPRECATED, because the gRPC call for this log type is removed
+    REPORT_DEVICE_PROVISIONING_COMPLETE = 3 [deprecated = true];
+    // The Check-in request is reportDeviceProvisionState
+    REPORT_DEVICE_PROVISION_STATE = 4;
+    // The Check-in request is isDeviceInApprovedCountry
+    IS_DEVICE_IN_APPROVED_COUNTRY = 5;
+  }
+
+  optional RequestType type= 1;
+}
+
+message DeviceLockProvisioningCompleteReported {
+  optional int64 time_spent_on_provisioning_seconds = 1;
+}
+
+message DeviceLockKioskAppRequestReported {
+  optional int32 kiosk_app_uid = 1 [(is_uid) = true];
+}
diff --git a/stats/atoms/dnd/dnd_atoms.proto b/stats/atoms/dnd/dnd_atoms.proto
index e6863ba..e22709e 100644
--- a/stats/atoms/dnd/dnd_atoms.proto
+++ b/stats/atoms/dnd/dnd_atoms.proto
@@ -66,4 +66,6 @@
     optional android.stats.dnd.PeopleType allow_messages_from = 18;
 
     optional android.stats.dnd.ConversationType allow_conversations_from = 19;
+
+    optional android.stats.dnd.ChannelType allow_channels = 20;
 }
diff --git a/stats/atoms/federatedcompute/federatedcompute_extension_atoms.proto b/stats/atoms/federatedcompute/federatedcompute_extension_atoms.proto
new file mode 100644
index 0000000..c9dbccb
--- /dev/null
+++ b/stats/atoms/federatedcompute/federatedcompute_extension_atoms.proto
@@ -0,0 +1,94 @@
+
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.os.statsd.federatedcompute;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/enums/federatedcompute/enums.proto";
+
+option java_package = "com.android.os.federatedcompute";
+option java_multiple_files = true;
+
+extend Atom {
+  optional FederatedComputeApiCalled federated_compute_api_called =
+            712 [(module) = "ondevicepersonalization", (truncate_timestamp) = true];
+  optional FederatedComputeTrainingEventReported federated_compute_training_event_reported =
+            771 [(module) = "ondevicepersonalization", (truncate_timestamp) = true];
+}
+
+/**
+ * Logs when an FederatedCompute api is called.
+ */
+message FederatedComputeApiCalled {
+    enum FederatedComputeApiClassType {
+        API_CLASS_UNKNOWN = 0;
+    }
+
+    enum FederatedComputeApiName {
+        API_NAME_UNKNOWN = 0;
+        SCHEDULE = 1;
+        CANCEL = 2;
+    }
+
+    optional FederatedComputeApiClassType api_class = 1;
+
+    optional FederatedComputeApiName api_name = 2;
+
+    optional int32 latency_millis = 3;
+
+    // response_code is the error/failure code for the given api.
+    optional int32 response_code = 4;
+}
+
+/**
+ * Logs when an federated computation training event occurs.
+ */
+message FederatedComputeTrainingEventReported {
+  optional int64 client_version = 1; // [(datapol.semantic_type) = ST_SOFTWARE_ID]
+
+  // The kind of train event.
+  optional android.federatedcompute.TrainingEventKind
+      kind = 2;
+
+  // The task id of this run.
+  optional int64 task_id = 3;
+
+  // For TRAIN_INTERRUPTED and TRAIN_COMPLETED:
+  // the wall time of the duration, in milliseconds, since the matching
+  // STARTED event.  (Note: This is a time duration, not a timestamp, so
+  // annotating it with ST_TIMESTAMP is not necessary and would be inaccurate.)
+  optional int64 duration_millis = 4;
+
+  // For TRAIN_INTERRUPTED and TRAIN_COMPLETED:
+  // the number of bytes (of serialized example protos) which had been fed
+  // since the matching started event.
+  optional int64 example_size = 5;
+
+  /////////////////////////////////////////////////////////
+  // Information about data transfer for TRAIN_DOWNLOADED/TRAIN_UPLOADED events
+
+  // How long it took client to transfer the data
+  optional int64 data_transfer_duration_millis = 6;
+
+  // Number of bytes sent from the client to the server.
+  optional int64 bytes_uploaded = 7;
+
+  // Number of bytes sent from the server to the client.
+  optional int64 bytes_downloaded = 8;
+}
diff --git a/stats/atoms/framework/framework_extension_atoms.proto b/stats/atoms/framework/framework_extension_atoms.proto
index 7457886..a7d9df4 100644
--- a/stats/atoms/framework/framework_extension_atoms.proto
+++ b/stats/atoms/framework/framework_extension_atoms.proto
@@ -29,8 +29,10 @@
     optional InTaskActivityStarted in_task_activity_started = 685 [(module) = "framework"];
     optional CachedAppsHighWaterMark cached_apps_high_watermark = 10189 [(module) = "framework"];
     optional StylusPredictionMetricsReported stylus_prediction_metrics_reported = 718 [(module) = "libinput"];
+    optional UserRiskEventReported user_risk_event_reported = 725 [(module) = "framework"];
     optional MediaProjectionStateChanged media_projection_state_changed = 729 [(module) = "framework"];
     optional MediaProjectionTargetChanged media_projection_target_changed = 730 [(module) = "framework"];
+    optional ProxyBytesTransferByFgBg proxy_bytes_transfer_by_fg_bg = 10200 [(module) = "framework"];
 }
 
 /**
@@ -174,6 +176,70 @@
 }
 
 /**
+ * Logs user risk events sent to UserRiskManager
+ */
+message UserRiskEventReported {
+  optional EventType event_type = 1;
+
+  // Call Details
+
+  // time that an active call was connected (picked up), -1 if a call is not active
+  optional int64 call_connected_timestamp_millis = 2;
+  optional CallDirection call_direction = 3;
+  optional NumberVerificationStatus call_number_verification_status = 4;
+  // time of the last update to the contact associated with the call, -1 if there is no contact
+  optional int64 call_contact_last_updated_timestamp_millis = 5;
+  optional int32 call_log_previous_incoming_count = 6;
+  optional int32 call_log_previous_outgoing_count = 7;
+
+  // Media Projection Details
+
+  // time of MP start, -1 if MP is not active
+  optional int64 mp_start_timestamp_millis = 8;
+  optional int32 mp_app_uid = 9 [(is_uid) = true];
+  optional int32 mp_installing_app_uid = 10 [(is_uid) = true];
+  // time that the MP app was installed
+  optional int64 mp_app_first_install_timestamp_millis = 11;
+
+  // A11y details
+
+  // time of A11y grant, -1 if not granted
+  optional int64 a11y_capability_granted_timestamp_millis = 12;
+  optional int32 a11y_app_uid = 13 [(is_uid) = true];
+  optional int32 a11y_installing_app_uid = 14 [(is_uid) = true];
+  // time that the A11y app was installed
+  optional int64 a11y_app_first_install_timestamp_mills = 15;
+
+  enum EventType {
+    UNKNOWN = 0;
+    A11Y_CONSENT_DIALOG_SHOWN = 1;
+    A11Y_GRANTED = 2;
+    A11Y_DENIED = 3;
+    A11Y_APP_UNINSTALLED = 4;
+    MEDIA_PROJECTION_CONSENT_DIALOG_SHOWN = 5;
+    MEDIA_PROJECTION_GRANTED = 6;
+    MEDIA_PROJECTION_DENIED = 7;
+    MEDIA_PROJECTION_STARTED = 8;
+    ACTIVE_CALL_STARTED = 9;
+    ACTIVE_CALL_CHANGED = 10;
+    ACTIVE_CALL_ENDED = 11;
+  }
+
+  enum CallDirection {
+    UNKNOWN_DIRECTION = 0;
+    INCOMING = 1;
+    OUTGOING = 2;
+  }
+
+  enum NumberVerificationStatus {
+    UNKNOWN_STATUS = 0;
+    NOT_VERIFIED = 1;
+    PASSED = 2;
+    FAILED = 3;
+  }
+}
+
+/**
  * Logs when MediaProjection goes through state changes.
  *
  * MediaProjection API allows apps to capture the contents of a display
@@ -310,3 +376,23 @@
     WINDOWING_MODE_FREEFORM = 4;
   }
 }
+
+/**
+ * Pulls bytes transferred via network with TYPE_PROXY from NetworkStats. Each pull produces atoms
+ * that record stats of all processes that used sysproxy since device boot.
+ * Network with TYPE_PROXY is used on Wear OS to enable internet access via Bluetooth when the
+ * companion phone is connected to the watch.
+ */
+message ProxyBytesTransferByFgBg {
+  optional int32 uid = 1 [(is_uid) = true];
+
+  optional bool is_foreground = 2;
+
+  optional int64 rx_bytes = 3;
+
+  optional int64 rx_packets = 4;
+
+  optional int64 tx_bytes = 5;
+
+  optional int64 tx_packets = 6;
+}
diff --git a/stats/atoms/hdmi/hdmi_extension_atoms.proto b/stats/atoms/hdmi/hdmi_extension_atoms.proto
new file mode 100644
index 0000000..e1ba773
--- /dev/null
+++ b/stats/atoms/hdmi/hdmi_extension_atoms.proto
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.hdmi;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/enums/stats/hdmi/enums.proto";
+
+option java_package = "com.android.os.hdmi";
+option java_multiple_files = true;
+
+extend Atom {
+  optional HdmiEarcStatusReported hdmi_earc_status_reported = 701 [(module) = "framework"];
+  optional HdmiSoundbarModeStatusReported hdmi_soundbar_mode_status_reported
+      = 724 [(module) = "framework"];
+}
+/**
+* Push atom that logs the status of the eARC feature in 3 dimensions: whether the
+* hardware supports it, whether the setting is enabled and whether a connection is
+* established.
+*
+* Logged whenever the device wakes up and when the HAL reports an update in the
+* connection state.
+**/
+message HdmiEarcStatusReported {
+  // whether the hardware supports eARC
+  optional bool is_supported = 1;
+  // whether eARC is enabled
+  optional bool is_enabled = 2;
+  // If log_reason == LOG_REASON_EARC_STATUS_CHANGED, the state just before the change.
+  // Otherwise, the current state.
+  optional android.stats.hdmi.ConnectionState old_connected_state = 3;
+  // If log_reason == LOG_REASON_EARC_STATUS_CHANGED, the state just after the change.
+  // Otherwise, the current state.
+  optional android.stats.hdmi.ConnectionState new_connected_state = 4;
+  // The event that triggered the log.
+  optional android.stats.hdmi.LogReason log_reason = 5;
+}
+
+/**
+* Push atom that logs the status of the Dynamic Soundbar mode feature in 2 dimensions: whether the
+* hardware supports it and whether the setting is enabled.
+*
+* Logged whenever the device wakes up or the Dynamic Soundbar mode setting is toggled.
+**/
+message HdmiSoundbarModeStatusReported {
+  // whether the hardware supports Dynamic soundbar mode
+  optional bool is_supported = 1;
+  // whether the Dynamic soundbar mode setting is enabled
+  optional bool is_enabled = 2;
+  // the event that triggered the log.
+  optional android.stats.hdmi.DynamicSoundbarModeLogReason log_reason = 3;
+}
diff --git a/stats/atoms/healthfitness/api/api_extension_atoms.proto b/stats/atoms/healthfitness/api/api_extension_atoms.proto
index e4e48d5..1562687 100644
--- a/stats/atoms/healthfitness/api/api_extension_atoms.proto
+++ b/stats/atoms/healthfitness/api/api_extension_atoms.proto
@@ -57,6 +57,9 @@
 
   // Type of rate limiting being used (If any)
   optional android.healthfitness.api.RateLimit rate_limit = 6;
+
+  // The API caller's foreground status
+  optional android.healthfitness.api.ForegroundState caller_foreground_state = 7;
 }
 
 // Track if users are connecting apps with Health Connect
@@ -68,6 +71,8 @@
   // Number of apps on device that can be connected to Health Connect.
   optional int32 available_apps_count = 2;
 
+  // Set true is the user has one app reading or writing in past 30 days
+  optional bool isMonthlyActiveUser = 3;
 }
 
 // Monitor Health Connect database
@@ -141,4 +146,4 @@
   optional android.healthfitness.api.DataType data_type_six = 11
   [(field_restriction_option).health_connect = true];
 
-}
\ No newline at end of file
+}
diff --git a/stats/atoms/hotword/hotword_atoms.proto b/stats/atoms/hotword/hotword_atoms.proto
index f24d96d..5ea02ed 100644
--- a/stats/atoms/hotword/hotword_atoms.proto
+++ b/stats/atoms/hotword/hotword_atoms.proto
@@ -87,8 +87,8 @@
         // Indicates that the service was restarted regularly.
         SCHEDULE = 2;
 
-        // Indicates that the service was restarted due to service crashed.
-        CRASH = 3;
+        // Deprecated. Indicates that the service was restarted due to service crashed.
+        CRASH = 3 [deprecated = true];
     }
     optional Reason reason = 2;
 
@@ -108,8 +108,8 @@
         // Indicates that the system got the keyphrase from DSP.
         KEYPHRASE_TRIGGER = 0;
 
-        // Indicates that the system can not inform the service to verify the keyphrase.
-        FAILED_TO_INFORM_SERVICE = 1;
+        // Deprecated. Indicates that the system can not inform the service to verify the keyphrase.
+        FAILED_TO_INFORM_SERVICE = 1 [deprecated = true];
 
         // Indicates that the callback was not invoked within timeout after informing
         // the service.
@@ -139,6 +139,18 @@
         // Indicates that the system called rejected callback when the trusted process was
         // restarted.
         REJECTED_FROM_RESTART = 10;
+
+        // Indicates keyphrase was classified as training data.
+        TRAINING_DATA = 11;
+
+        // Indicates training data egress limit was reached.
+        TRAINING_DATA_EGRESS_LIMIT_REACHED = 12;
+
+        // Indicates that system got security exception when handling training data callback.
+        TRAINING_DATA_SECURITY_EXCEPTION = 13;
+
+        // Indicates that system got remote exception when handling training data callback.
+        TRAINING_DATA_REMOTE_EXCEPTION = 14;
     }
     // What result after detecting.
     optional Result result = 2;
@@ -218,44 +230,56 @@
         // Indicates that the updateState was not invoked successfully.
         CALL_UPDATE_STATE_EXCEPTION = 19;
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the audio egress starts.
-        AUDIO_EGRESS_START = 20;
+        AUDIO_EGRESS_START = 20 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the audio egress ends.
-        AUDIO_EGRESS_END = 21;
+        AUDIO_EGRESS_END = 21 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the audio egress got interrupted exception.
-        AUDIO_EGRESS_INTERRUPTED_EXCEPTION = 22;
+        AUDIO_EGRESS_INTERRUPTED_EXCEPTION = 22 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the client is not granted permission to access audio egress.
-        AUDIO_EGRESS_NO_PERMISSION = 23;
+        AUDIO_EGRESS_NO_PERMISSION = 23 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the client is inactive over a period of time.
-        AUDIO_EGRESS_INACTIVE_CLIENT = 24;
+        AUDIO_EGRESS_INACTIVE_CLIENT = 24 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the HotwordDetectionService is inactive over a period
         // of time.
-        AUDIO_EGRESS_INACTIVE_HOTWORD_DETECTION_SERVICE = 25;
+        AUDIO_EGRESS_INACTIVE_HOTWORD_DETECTION_SERVICE = 25 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the list of audio stream is empty.
-        AUDIO_EGRESS_EMPTY_AUDIO_STREAM_LIST = 26;
+        AUDIO_EGRESS_EMPTY_AUDIO_STREAM_LIST = 26 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that there is no data from the system audio stream.
-        AUDIO_EGRESS_SOURCE_IS_EMPTY = 27;
+        AUDIO_EGRESS_SOURCE_IS_EMPTY = 27 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the copy buffer size the client sets is illegal.
-        AUDIO_EGRESS_ILLEGAL_COPY_BUFFER_SIZE = 28;
+        AUDIO_EGRESS_ILLEGAL_COPY_BUFFER_SIZE = 28 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the audio egress is closed with error from the system.
-        AUDIO_EGRESS_CLOSE_ERROR_FROM_SYSTEM = 29;
+        AUDIO_EGRESS_CLOSE_ERROR_FROM_SYSTEM = 29 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the audio egress is closed with error from the client
         // side.
-        AUDIO_EGRESS_CLOSE_ERROR_FROM_CLIENT = 30;
+        AUDIO_EGRESS_CLOSE_ERROR_FROM_CLIENT = 30 [deprecated = true];
 
+        // Deprecated. Use HotwordAudioEgressEventReported instead.
         // Indicates that the audio egress is closed with error from the
         // HotwordDetectionService.
-        AUDIO_EGRESS_CLOSE_ERROR_FROM_HOTWORD_DETECTION_SERVICE = 31;
+        AUDIO_EGRESS_CLOSE_ERROR_FROM_HOTWORD_DETECTION_SERVICE = 31 [deprecated = true];
     }
     optional Event event = 2;
 
diff --git a/stats/atoms/hotword/hotword_extension_atoms.proto b/stats/atoms/hotword/hotword_extension_atoms.proto
new file mode 100644
index 0000000..efde4f2
--- /dev/null
+++ b/stats/atoms/hotword/hotword_extension_atoms.proto
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.hotword;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/enums/hotword/enums.proto";
+
+option java_package = "com.android.os.hotword";
+option java_multiple_files = true;
+
+extend Atom {
+  optional HotwordEventEgressSize hotword_egress_size_atom_reported = 761 [(module) = "framework"];
+}
+
+/**
+ * Logs data size for events egressed from hotword detection service to default assistant.
+ */
+message HotwordEventEgressSize {
+  // Type of event being egressed.
+  enum HotwordEventType {
+    // Represents an unspecified event.
+    HOTWORD_EVENT_UNSPECIFIED = 0;
+
+    // Represents a hotword detection event.
+    HOTWORD_DETECTION = 1;
+
+    // Represents a hotword rejection event.
+    HOTWORD_REJECTION = 2;
+
+    // Represents a hotword training data event.
+    HOTWORD_TRAINING_DATA = 3;
+  }
+
+  // Event that was egressed.
+  optional HotwordEventType event_type = 1;
+
+  // Size of the event that was egressed in bytes.
+  optional int64 event_size_bytes = 2;
+
+  // The type of detector.
+  optional android.hotword.HotwordDetectorType detector_type = 3;
+
+  // The UID for which the assistant application is active.
+  optional int32 uid = 4 [(is_uid) = true];
+}
diff --git a/stats/atoms/ike/ike_extension_atoms.proto b/stats/atoms/ike/ike_extension_atoms.proto
index 2661276..c25e48d 100644
--- a/stats/atoms/ike/ike_extension_atoms.proto
+++ b/stats/atoms/ike/ike_extension_atoms.proto
@@ -29,6 +29,8 @@
     optional IkeSessionTerminated ike_session_terminated = 678 [(module) = "ike"];
     optional IkeLivenessCheckSessionValidated ike_liveness_check_session_validated =
             760 [(module) = "ike"];
+    optional NegotiatedSecurityAssociation negotiated_security_association =
+            821 [(module) = "ike"];
 }
 
 /**
@@ -57,7 +59,8 @@
     optional android.stats.ike.IkeCaller ike_caller = 1;
 
     // To determine task at which liveness check was initiated.
-    optional android.stats.ike.IkeTask ike_task = 2;
+    // Deprecated: use IkeState instead to use more precise IKE state
+    optional android.stats.ike.IkeTask ike_task = 2 [deprecated = true];
 
     // Underlying network type that checked the Liveness.
     optional android.stats.ike.IkeUnderlyingNetworkType ike_underlying_network_type = 3;
@@ -71,5 +74,40 @@
 
     // True if the Liveness check is successful. False if the Liveness check is failed.
     optional bool result_success = 6;
+
+    // To determine the state at which liveness check was initiated.
+    optional android.stats.ike.IkeState ike_state = 7;
+}
+
+/**
+ * Log that the IKE or Child session SA negotiated or failed
+ */
+message NegotiatedSecurityAssociation {
+    /** Calling module IWLAN or VPN or VCN */
+    optional android.stats.ike.IkeCaller ike_caller = 1;
+
+    /** IKE session or Child session */
+    optional android.stats.ike.SessionType session_type = 2;
+
+    /** Initial session setup or Rekey session */
+    optional android.stats.ike.SessionState session_state = 3;
+
+    /** negotiated DH-Groups */
+    optional android.stats.ike.DhGroups dh_group = 4;
+
+    /** negotiated encryption algorithms */
+    optional android.stats.ike.EncryptionAlgorithms encryption_algorithm = 5;
+
+    /** negotiated encryption algorithms key length */
+    optional android.stats.ike.KeyLengths key_length = 6;
+
+    /** negotiated integrity algorithms */
+    optional android.stats.ike.IntegrityAlgorithms integrity_algorithm = 7;
+
+    /** negotiated Prf algorithms */
+    optional android.stats.ike.PrfAlgorithms prf_algorithms = 8;
+
+    /** negotiation failures */
+    optional android.stats.ike.IkeError ike_error = 9;
 }
 
diff --git a/stats/atoms/input/input_extension_atoms.proto b/stats/atoms/input/input_extension_atoms.proto
index 123eedb..cb226f2 100644
--- a/stats/atoms/input/input_extension_atoms.proto
+++ b/stats/atoms/input/input_extension_atoms.proto
@@ -74,6 +74,8 @@
     optional int32 product_id = 3;
     // Keyboard configuration details
     optional RepeatedKeyboardLayoutConfig repeated_keyboard_layout_config = 4 [(log_mode) = MODE_BYTES];
+    // The Input Device Bus ID
+    optional android.input.InputDeviceBus device_bus = 5;
 }
 
 /**
@@ -95,7 +97,10 @@
     // Key pressed to trigger the keyboard event
     repeated int32 key_code = 4;
     // Flag based modifier state when keyboard event was triggered
+    // This field represents the decimal version of the flag in binary
     optional int32 modifier_state = 5;
+    // The Input Device Bus ID
+    optional android.input.InputDeviceBus device_bus = 6;
 }
 
 /**
@@ -121,19 +126,21 @@
     // The Input Device Bus ID
     optional android.input.InputDeviceBus device_bus = 4;
 
-    // The duration of the aggregated usage session for this Input Device.
+    // The duration of the aggregated usage session for this Input Device, in
+    // milliseconds.
     // (The int32_t will overflow at ~25 days)
     optional int32 usage_duration_millis = 5;
 
     // The breakdown of this usage session by source.
     repeated android.input.InputDeviceUsageType usage_sources = 6;
     // The breakdown of usage duration for each of the {@link usage_sources}
-    // reported above.
+    // reported above, in milliseconds.
     repeated int32 usage_durations_per_source = 7;
 
     // The breakdown of this usage session by uid.
     repeated int32 uids = 8 [(is_uid) = true];
-    // The breakdown of usage duration for each of the {@link uids} reported above.
+    // The breakdown of usage duration for each of the {@link uids} reported
+    // above, in milliseconds.
     repeated int32 usage_durations_per_uid = 9;
 }
 
diff --git a/stats/atoms/kernel/kernel_extension_atoms.proto b/stats/atoms/kernel/kernel_extension_atoms.proto
new file mode 100644
index 0000000..8b6ae30
--- /dev/null
+++ b/stats/atoms/kernel/kernel_extension_atoms.proto
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.kernel;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+
+option java_package = "com.android.os.kernel";
+option java_multiple_files = true;
+
+extend Atom {
+    optional KernelOomKillOccurred kernel_oom_kill_occurred = 754
+        [(module) = "framework"];
+}
+
+/**
+ * Logs each time the kernel's out-of-memory (OOM) killer claims a victim.
+ * Logged from:
+ *  frameworks/base/services/core/java/com/android/server/am/OomStatsReporter.java
+ */
+message KernelOomKillOccurred {
+    // The uid if available. -1 means not available.
+    optional int32 uid = 1 [(is_uid) = true];
+
+    // The pid if available. -1 means not available.
+    optional int32 pid = 2;
+
+    // Recorded oom score when getting killed.
+    optional int32 oom_score_adj = 3;
+
+    // Millisecond timestamp of when the kill was detected by the memhealth driver.
+    optional int64 timestamp_millis = 4;
+
+    // Name of the killed process.
+    optional string process_name = 5;
+}
diff --git a/stats/atoms/location/location_atoms.proto b/stats/atoms/location/location_atoms.proto
index 69402db..24de049 100644
--- a/stats/atoms/location/location_atoms.proto
+++ b/stats/atoms/location/location_atoms.proto
@@ -30,6 +30,8 @@
  *   frameworks/base/services/core/java/com/android/server/location/LocationManagerService.java
  */
 message LocationEnabledStateChanged {
-  optional bool location_enabled = 1
-                [(state_field_option).exclusive_state = true];
+  optional bool location_enabled = 1 [
+     (state_field_option).exclusive_state = true,
+     (state_field_option).nested = false
+  ];
 }
diff --git a/stats/atoms/location/location_extension_atoms.proto b/stats/atoms/location/location_extension_atoms.proto
index d322e67..ea1d3c5 100644
--- a/stats/atoms/location/location_extension_atoms.proto
+++ b/stats/atoms/location/location_extension_atoms.proto
@@ -36,6 +36,8 @@
  *   frameworks/base/services/core/java/com/android/server/location/LocationManagerService.java
  */
 message EmergencyStateChanged {
-  optional bool is_in_emergency = 1
-      [(state_field_option).exclusive_state = true];
+  optional bool is_in_emergency = 1 [
+     (state_field_option).exclusive_state = true,
+     (state_field_option).nested = false
+  ];
 }
diff --git a/stats/atoms/ondevicepersonalization/ondevicepersonalization_extension_atoms.proto b/stats/atoms/ondevicepersonalization/ondevicepersonalization_extension_atoms.proto
new file mode 100644
index 0000000..d3c570e
--- /dev/null
+++ b/stats/atoms/ondevicepersonalization/ondevicepersonalization_extension_atoms.proto
@@ -0,0 +1,56 @@
+
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+syntax = "proto2";
+package android.os.statsd.ondevicepersonalization;
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+option java_package = "com.android.os.ondevicepersonalization";
+option java_multiple_files = true;
+extend Atom {
+  optional OnDevicePersonalizationApiCalled ondevicepersonalization_api_called =
+            711 [(module) = "ondevicepersonalization", (truncate_timestamp) = true];
+}
+/**
+ * Logs when an OnDevicePersonalization api is called.
+ */
+message OnDevicePersonalizationApiCalled {
+    enum OnDevicePersonalizationApiClassType {
+        UNKNOWN = 0;
+        DOWNLOADING = 1;
+        SERVING = 2;
+        OPTIMIZATION = 3;
+        REPORTING = 4;
+    }
+    enum OnDevicePersonalizationApiName {
+        API_NAME_UNKNOWN = 0;
+        EXECUTE = 1;
+        REQUEST_SURFACE_PACKAGE = 2;
+        SERVICE_ON_EXECUTE = 3;
+        SERVICE_ON_DOWNLOAD_COMPLETED = 4;
+        SERVICE_ON_RENDER = 5;
+        SERVICE_ON_EVENT = 6;
+        SERVICE_ON_TRAINING_EXAMPLE = 7;
+    }
+    optional OnDevicePersonalizationApiClassType api_class = 1;
+    optional OnDevicePersonalizationApiName api_name = 2;
+    // end to end latency of the operation
+    optional int32 latency_millis = 3;
+    // response_code is the error/failure code for the given api.
+    optional int32 response_code = 4;
+    // latency excluding time spent in user code
+    optional int32 overhead_latency_millis = 5;
+}
diff --git a/stats/atoms/power/power_extension_atoms.proto b/stats/atoms/power/power_extension_atoms.proto
new file mode 100644
index 0000000..a0e0eb3
--- /dev/null
+++ b/stats/atoms/power/power_extension_atoms.proto
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.power;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+
+extend Atom {
+  optional ScreenOffReported screen_off_reported = 776 [(module) = "framework"];
+}
+
+/**
+ * Logs when the screen is turned off.
+ *
+ * Logged from:
+ *   frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
+ */
+message ScreenOffReported {
+  enum Reason {
+    UNKNOWN = 0;
+    POWER_BUTTON = 1;
+    TIMEOUT = 2;
+  }
+  enum TimeoutReason {
+    UNKNOWN_REASON = 0;
+    DEFAULT = 1;
+    FACE_DOWN = 2;
+    ENCLOSED = 3;
+  }
+  optional Reason screen_off_reason = 1;
+  optional TimeoutReason timeout_reason = 2;
+  optional int64 millis_until_normal_timeout = 3;
+}
diff --git a/stats/atoms/sysui/sysui_atoms.proto b/stats/atoms/sysui/sysui_atoms.proto
index 67d88f2..fb31d6d 100644
--- a/stats/atoms/sysui/sysui_atoms.proto
+++ b/stats/atoms/sysui/sysui_atoms.proto
@@ -189,7 +189,8 @@
     // e.g., SEARCHBOX_ALLAPPS, FOLDER_WORKSPACE
     optional int32 hierarchy = 18;
 
-    optional bool is_work_profile = 19;
+    // deprecated, use user_type field instead
+    optional bool is_work_profile = 19 [deprecated = true];
 
     // Used to store the predicted rank of the target
     optional int32 rank = 20 [default = -1];
@@ -221,6 +222,16 @@
         TRACKPAD = 2;
     }
     optional InputType input_type = 28;
+
+    // Specifies the type of the user the event connected with
+    enum UserType {
+         TYPE_UNKNOWN = 0;
+         TYPE_MAIN = 1;
+         TYPE_WORK = 2;
+         TYPE_CLONED = 3;
+         TYPE_PRIVATE = 4;
+    }
+    optional UserType user_type = 29;
 }
 
 message LauncherAttributes {
diff --git a/stats/atoms/sysui/sysui_extension_atoms.proto b/stats/atoms/sysui/sysui_extension_atoms.proto
index c58ba33..c7da6d5 100644
--- a/stats/atoms/sysui/sysui_extension_atoms.proto
+++ b/stats/atoms/sysui/sysui_extension_atoms.proto
@@ -20,11 +20,14 @@
 
 import "frameworks/proto_logging/stats/atoms.proto";
 import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/enums/telephony/enums.proto";
+import "frameworks/proto_logging/stats/enums/os/enums.proto";
 
 extend Atom {
   optional LockscreenShortcutSelected lockscreen_shortcut_selected = 611 [(module) = "sysui"];
   optional LockscreenShortcutTriggered lockscreen_shortcut_triggered = 612 [(module) = "sysui"];
   optional LauncherImpressionEventV2 launcher_impression_event_v2 = 716 [(module) = "sysui"];
+  optional DisplaySwitchLatencyTracked display_switch_latency_tracked = 753 [(module) = "sysui"];
 }
 
 /**
@@ -87,3 +90,88 @@
     // The result source of the search result as defined in vendor/unbundled_google/libraries/searchuilib/src/com/android/app/search/SearchTargetExtras.java
     optional int32 result_source = 8;
 }
+
+/**
+ * Logs for Display Switch Latency Tracking.
+ *
+ * Next Tag: 22
+*/
+message DisplaySwitchLatencyTracked {
+
+    // Latency tracked between device state change is received in SysUI and the switched display
+    // being unblocked and turned on (onScreenTurnedOn received in sysui from power manager)
+    optional int32 latency_ms = 1;
+
+    // The state of device before the Display Switch event.
+    // This field defines the fold-state of the device.
+    optional android.telephony.FoldState from_foldable_device_state = 2;
+    // This field provides additional information about device state
+    optional StateEnum from_state = 3;
+    // This field will store the uid of the top running task(app only).
+    optional int32 from_focused_app_uid = 4 [(is_uid) = true];
+    // This field will have the uid of the app being used in picture-in-picture mode. The value
+    // will be -1 if no picture-in-picture is ongoing*/
+    optional int32 from_pip_app_uid = 5 [(is_uid) = true];
+    // At the moment of Display Switch if screen_state is equal to
+    // SPLIT_SCREEN_APPS/ OVERVIEW/ FREEFORM_APPS or pip_app_uid is not -1, then this field will
+    // store the uids of apps present in split-screen mode.
+    repeated int32 from_visible_apps_uid = 6 [(is_uid) = true];
+    // Density of the display for the device being tracked in dpi.
+    optional int32 from_density_dpi = 7;
+
+    // The state of the device after the Display Switch event.
+    optional StateEnum to_state = 8;
+    optional android.telephony.FoldState to_foldable_device_state = 9;
+    optional int32 to_focused_app_uid = 10 [(is_uid) = true];
+    optional int32 to_pip_app_uid = 11 [(is_uid) = true];
+    repeated int32 to_visible_apps_uid = 12 [(is_uid) = true];
+    optional int32 to_density_dpi = 13;
+
+    // Additional data useful for analyzing latency issues
+    // Total number of notifications present in Notification panel during Display Switch event.
+    optional int32 notification_count = 14;
+    // Number of TYPE_EXTERNAL displays at the moment of Display Switch.
+    optional int32 external_display_count = 15;
+    // Throttling level at the moment of Display Switch provided by thermal api.
+    optional android.os.ThrottlingSeverityEnum throttling_level = 16;
+    // Virtual-skin temperature in Celsius of the device at the moment of Display Switch.
+    optional int32 vskin_temperature_c = 17;
+
+    // Fields tracking time elapsed between relevant events in milliseconds. Default values of
+    // below fields will be -1 in case they are not tracked.
+    // The time elapsed between the hall sensor unfold event and the first hinge angle event.
+    optional int32 hall_sensor_to_first_hinge_angle_change_ms = 18;
+    // The time elapsed between the hall sensor unfold/fold event and the device state change
+    // event.
+    optional int32 hall_sensor_to_device_state_change_ms = 19;
+    // The time elapsed between the onScreenTurningOn call and the onDrawn callback in SystemUI.
+    optional int32 onscreenturningon_to_ondrawn_ms = 20;
+    // The time elapsed between the onDrawn callback and the onScreenTurnedOn call in SystemUI.
+    optional int32 ondrawn_to_onscreenturnedon_ms = 21;
+
+    enum StateEnum {
+      // The device is in none of the above mentioned states.
+      UNKNOWN = 0;
+      // When the device is sleeping with AOD enabled (Always on display).
+      AOD = 1;
+      // Device folded/unfolded when on lockscreen.
+      LOCKSCREEN = 2;
+      // Notification shade is open currently.
+      NOTIFICATION_SHADE = 3;
+      // When an app is being used in full-screen mode.
+      FULL_SCREEN_APP = 4;
+      // When 2 apps are being used in split-screen mode.
+      SPLIT_SCREEN_APPS = 5;
+      // Launcher app is being displayed currently.
+      LAUNCHER = 6;
+      // Overview/Recent apps screen is being displayed on the screen
+      // currently
+      OVERVIEW = 7;
+      // Freeform apps are currently being used, i.e. single or multiple apps are being
+      // displayed on screen in which the window size of each app is resizable.
+      FREEFORM_APPS = 8;
+      // Screen is off currently.
+      SCREEN_OFF = 9;
+    }
+
+}
diff --git a/stats/atoms/telephony/satellite/satellite_extension_atoms.proto b/stats/atoms/telephony/satellite/satellite_extension_atoms.proto
index 669cd5a..f584ffd 100644
--- a/stats/atoms/telephony/satellite/satellite_extension_atoms.proto
+++ b/stats/atoms/telephony/satellite/satellite_extension_atoms.proto
@@ -150,4 +150,10 @@
   optional android.telephony.ServiceStateEnum cellular_service_state = 4;
   // Total count of times this event has occurred.
   optional int32 count = 5;
+  // Whether the device supports multiple SIMs.
+  optional bool is_multi_sim = 6;
+  // Handover type from emergency call to satellite messaging
+  optional android.telephony.RecommendingHandoverType recommending_handover_type = 7;
+  // Whether satellite communication is allowed in current location.
+  optional bool is_satellite_allowed_in_current_location = 8;
 }
\ No newline at end of file
diff --git a/stats/atoms/telephony/telephony_extension_atoms.proto b/stats/atoms/telephony/telephony_extension_atoms.proto
index 75ad180..5c247f0 100644
--- a/stats/atoms/telephony/telephony_extension_atoms.proto
+++ b/stats/atoms/telephony/telephony_extension_atoms.proto
@@ -26,9 +26,15 @@
 option java_multiple_files = true;
 
 extend Atom {
+    optional CellularRadioPowerStateChanged cellular_radio_power_state_changed = 713 [(module) = "telephony"];
     optional EmergencyNumbersInfo emergency_numbers_info = 10180 [(module) = "telephony"];
 }
 
+message CellularRadioPowerStateChanged {
+    optional android.telephony.CellularRadioPowerStateEnum state = 1
+            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
+}
+
 /**
  * pulled atom to capture all emergency numbers information stored.
  */
diff --git a/stats/atoms/transparency/boot_integrity_extension_atoms.proto b/stats/atoms/transparency/boot_integrity_extension_atoms.proto
new file mode 100644
index 0000000..b7ce3eb
--- /dev/null
+++ b/stats/atoms/transparency/boot_integrity_extension_atoms.proto
@@ -0,0 +1,30 @@
+syntax = "proto2";
+
+package android.os.statsd.transparency;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+
+option java_package = "com.android.os.transparency";
+option java_multiple_files = true;
+
+extend Atom {
+    optional BootIntegrityInfoReported boot_integrity_info_reported = 775 [(module) = "framework"];
+}
+
+/**
+ * Boot integrity related information.
+ *
+ * * Sepolicy hash is calculated from /sys/fs/selinux/policy.
+ *
+ * Logs when boot is complete.
+ * Pushed from:
+ *    frameworks/base/services/core/java/com/android/server/BinaryTransparencyService.java
+ */
+message BootIntegrityInfoReported {
+    // the hex encoded string of sepolicy (from sysfs) hash
+    optional string sepolicy_hash = 1;
+    // the hex encoded string of VBMeta Digest value
+    optional string vbmeta_digest = 2;
+}
+
diff --git a/stats/atoms/tv/tv_extension_atoms.proto b/stats/atoms/tv/tv_extension_atoms.proto
index 8482e32..2a8edb6 100644
--- a/stats/atoms/tv/tv_extension_atoms.proto
+++ b/stats/atoms/tv/tv_extension_atoms.proto
@@ -26,6 +26,7 @@
 
 extend Atom {
   optional TvLowPowerStandbyPolicy tv_low_power_standby_policy = 679 [(module) = "tv_settings"];
+  optional ExternalTvInputEvent external_tv_input_event = 717 [(module) = "framework"];
 }
 
 /**
@@ -38,3 +39,58 @@
    repeated string allowed_features = 4;
    optional bool is_selected = 5;
 }
+
+/**
+ * Logs external TV input events.
+ */
+message ExternalTvInputEvent {
+    enum EventType {
+        UNKNOWN = 0;
+        // a specific input is selected by user/TV App to be displayed on the screen.
+        TUNED = 1;
+        // the currently tuned input is released from the screen by selecting a
+        // new input, TV powering off, going to Home screen, etc.
+        RELEASED = 2;
+        // connection state of the current input is changed,
+        // e.g. connecting/disconnecting the cable.
+        CONNECTION_STATE_CHANGED = 3;
+        // device info is updated for the currently selected HDMI-CEC input.
+        DEVICE_INFO_UPDATED = 4;
+    }
+    enum InputState {
+        // keep in sync with TvInputManager.InputState.
+        CONNECTED = 0;
+        CONNECTED_STANDBY = 1;
+        DISCONNECTED = 2;
+    }
+    enum InputType {
+        // keep in sync with TvinputInfo.Type.
+        TUNER = 0;
+        OTHER = 1000;
+        COMPOSITE = 1001;
+        SVIDEO = 1002;
+        SCART = 1003;
+        COMPONENT = 1004;
+        VGA = 1005;
+        DVI = 1006;
+        HDMI = 1007;
+        DISPLAY_PORT = 1008;
+    }
+    // Type of the event.
+    optional EventType event_type = 1;
+    // Connection state of this input.
+    optional InputState input_state = 2;
+    // type of the input.
+    optional InputType input_type = 3;
+    // Vendor id of the external device for HDMI-CEC input.
+    // For non-CEC input, the value is 0xFFFFFF (16777215 in decimal).
+    optional int32 device_vendor_id = 4;
+    // HDMI port number on TV for HDMI input.
+    // For non-HDMI input, the value is -1.
+    optional int32 hdmi_port = 5;
+    // ID of this TIF (TV Input Framework) session.
+    optional string tif_session_id = 6;
+    // OSD display name of the external device for HDMI-CEC input,
+    // or user-displayed label for other TV inputs.
+    optional string display_name = 7;
+}
diff --git a/stats/atoms/wear/connectivity/wear_connectivity_extension_atoms.proto b/stats/atoms/wear/connectivity/wear_connectivity_extension_atoms.proto
new file mode 100644
index 0000000..a421d33
--- /dev/null
+++ b/stats/atoms/wear/connectivity/wear_connectivity_extension_atoms.proto
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.wear.connectivity;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/enums/wear/connectivity/enums.proto";
+
+option java_package = "com.android.os.wear.connectivity";
+option java_multiple_files = true;
+
+extend Atom {
+  optional MediatorUpdated mediator_updated = 721 [(module) = "wearconnectivity"];
+  optional SysproxyBluetoothBytesTransfer sysproxy_bluetooth_bytes_transfer = 10196
+      [(module) = "wearconnectivity"];
+}
+
+/**
+ * Logged whenever WearXMediator changes status, for example ON -> OFF.
+ *
+ * Logged from package:
+ * frameworks/opt/wear/src/com/android/clockwork/connectivity
+ */
+message MediatorUpdated {
+  // e.g. Bluetooth, Wifi, Wifi Scan, Cellular Radio, Cellular Data
+  optional com.google.android.wearable.connectivity.MediatorType mediatorType = 1;
+
+  // The mediator action taken. e.g. ON/OFF
+  optional com.google.android.wearable.connectivity.MediatorAction action = 2;
+
+  // The reason of mediator state change
+  optional com.google.android.wearable.connectivity.Reason reason = 3;
+
+  // The event that triggers mediator state change
+  optional com.google.android.wearable.connectivity.TriggerEvent triggerEvent = 4;
+
+  // Timestamp of the event log time in ElapsedRealtime
+  optional int64 timestamp_millis = 5;
+}
+
+/**
+ * Pulls bytes transferred via Sysproxy. Each pull produces atoms that record stats of all processes
+ * that used sysproxy since device boot. Sysproxy is a process that runs on Wear OS and that enables
+ * internet access via Bluetooth when the companion phone is connected to the watch.
+ */
+message SysproxyBluetoothBytesTransfer {
+  // UID of a process that had some bytes received or transmitted via sysproxy.
+  // UID is set to -1 if it impossible to identify which process the bytes should be attributed to.
+  optional int32 uid = 1 [(is_uid) = true];
+
+  // Number of bytes received since device boot.
+  optional int64 rx_bytes = 2;
+
+  // Number of bytes transmitted since device boot.
+  optional int64 tx_bytes = 3;
+}
diff --git a/stats/atoms/wear/media/wear_media_atoms.proto b/stats/atoms/wear/media/wear_media_atoms.proto
index 91e69fd..6f953a0 100644
--- a/stats/atoms/wear/media/wear_media_atoms.proto
+++ b/stats/atoms/wear/media/wear_media_atoms.proto
@@ -36,4 +36,6 @@
   optional string media_player_package_name = 1;
   // Depicts source of the request. Values : (PHONE/WATCH)
   optional android.app.wearservices.RequestSource source = 2;
+  // Version of the media session apk installed in the device.
+  optional int64 version_code = 3;
 }
diff --git a/stats/atoms/wear/media/wear_media_extension_atoms.proto b/stats/atoms/wear/media/wear_media_extension_atoms.proto
index cfe4c17..5df1d31 100644
--- a/stats/atoms/wear/media/wear_media_extension_atoms.proto
+++ b/stats/atoms/wear/media/wear_media_extension_atoms.proto
@@ -21,6 +21,7 @@
 import "frameworks/proto_logging/stats/atom_field_options.proto";
 import "frameworks/proto_logging/stats/atoms.proto";
 import "frameworks/proto_logging/stats/enums/wear/media/enums.proto";
+import "frameworks/proto_logging/stats/enums/media/outputswitcher/enums.proto";
 
 option java_package = "com.android.os.wear.media";
 option java_multiple_files = true;
@@ -33,6 +34,18 @@
 
   optional MediaControlsLaunched media_controls_launched = 609
       [(module) = "wearmedia"];
+
+  optional MediaSessionStateChanged media_session_state_changed = 677
+      [(module) = "wearmedia"];
+
+  optional WearMediaOutputSwitcherDeviceScanApiLatency
+      wear_media_output_switcher_device_scan_api_latency = 757 [(module) = "MediaOutputSwitcher"];
+
+  optional WearMediaOutputSwitcherSassDeviceUnavailable
+      wear_media_output_switcher_sass_device_unavailable = 758 [(module) = "MediaOutputSwitcher"];
+
+  optional WearMediaOutputSwitcherFastPairApiTimeout
+      wear_media_output_switcher_fastpair_api_timeout = 759 [(module) = "MediaOutputSwitcher"];
 }
 
 message MediaActionReported {
@@ -50,13 +63,14 @@
 
   // Depicts is the media session being referred is remote or local.
   optional bool is_remote_session = 4;
+
+  // Version of the media session apk installed in the device.
+  optional int64 version_code = 5;
 }
 
 message MediaControlsLaunched {
-  // Package name of the app that the user used to perform the action (eg: UMO
-  // or a 3p media app)
-
-  optional int32 media_controls_package_uid = 1;
+  // Deprecated circa 6/2023
+  optional int32 media_controls_package_uid = 1 [deprecated=true];
 
   // Package name of the app that owns the media session. (This app is on the
   // paired phone, and not on the watch, hence cannot use uid)
@@ -68,4 +82,93 @@
 
   optional com.google.android.wearable.media.sessions.LaunchSource
       launch_source = 3;
+
+  // Version of the media session apk installed in the device.
+  optional int64 version_code = 4;
+}
+
+message MediaSessionStateChanged {
+  // States of the media session
+  enum SessionStateEnum {
+    SESSION_UNKNOWN = 0;
+    SESSION_IDLE = 1;
+    SESSION_BUFFERING = 2;
+    SESSION_READY = 3;
+    SESSION_ENDED = 4;
+    SESSION_DESTROYED = 5;
+  }
+
+  enum PlaybackSuppressionReason {
+    PLAYBACK_SUPPRESSION_REASON_UNKNOWN = 0;
+    PLAYBACK_SUPPRESSION_REASON_NONE = 1;
+    PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS = 2;
+    PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_ROUTE = 3;
+    PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT = 4;
+  }
+
+  // Package name of the app that owns the media session. (If is_remote_session
+  // = True, then the app is on the phone and we can’t use uid)
+  optional string media_player_package_name = 1;
+
+  // Deprecated circa 5/2023
+  optional int32 session_id = 2 [deprecated=true];
+
+  // Depicts is the media session being referred to as remote or local.
+  optional bool is_remote_session = 3;
+
+  // State of the media session
+  optional SessionStateEnum state = 4;
+
+  // Depicts if the media session should play when ready.
+  optional bool is_play_when_ready = 5;
+
+  optional PlaybackSuppressionReason playback_suppression_reason = 6;
+
+  // Depicts if the playback was suppressed previously due to unsuitable output
+  // and then resolved.
+  optional bool has_playback_suppression_due_to_unsuitable_output_resolved = 7;
+
+  // Version of the media session apk installed in the device.
+  optional int64 version_code = 8;
+
+}
+
+/**
+ * Logs the latency of different device scan APIs used in OutputSwitcher.
+ *
+ * Logged from:
+ * package: vendor/google_clockwork/packages/Media
+ */
+message WearMediaOutputSwitcherDeviceScanApiLatency {
+  // Latency of notifying OutputSwitcher that a SASS device is available to connect to.
+  optional int32 latency_in_millis = 1;
+
+  // Name of the media app package from where Output Switcher got triggered.
+  optional string triggering_package_name = 2;
+
+  optional com.google.android.wearable.media.routing.MediaDeviceType media_device_type = 3;
+
+  optional com.google.android.wearable.media.routing.MediumType medium_type = 4;
+}
+
+/**
+ * Logs data when no SASS device is available.
+ *
+ * Logged from:
+ * package: vendor/google_clockwork/packages/Media
+ */
+message WearMediaOutputSwitcherSassDeviceUnavailable {
+  // Name of the media app package from where Output Switcher got triggered.
+  optional string triggering_package_name = 1;
+}
+
+/**
+ * Logs data when FastPair API times out.
+ *
+ * Logged from:
+ * package: vendor/google_clockwork/packages/Media
+ */
+message WearMediaOutputSwitcherFastPairApiTimeout {
+  // Name of the media app package from where Output Switcher got triggered.
+  optional string triggering_package_name = 1;
 }
diff --git a/stats/atoms/wear/modes/wear_modes_extension_atoms.proto b/stats/atoms/wear/modes/wear_modes_extension_atoms.proto
new file mode 100644
index 0000000..81e98e3
--- /dev/null
+++ b/stats/atoms/wear/modes/wear_modes_extension_atoms.proto
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.wear.modes;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/enums/wear/modes/enums.proto";
+
+option java_package = "com.android.os.wear.modes";
+option java_multiple_files = true;
+
+extend Atom {
+  optional WearModeStateChanged wear_mode_state_changed = 715 [(module) = "framework"];
+}
+
+// This file contains atom related to Modes in Wear.
+
+message WearModeStateChanged {
+  // ModeId of the mode being toggled
+  optional com.google.android.wearable.modes.telemetry.ModeId mode_id = 1;
+
+  // ModeState of the mode being toggled [MODE_STATE_OFF, MODE_STATE_ON]
+  optional com.google.android.wearable.modes.telemetry.ModeState mode_state = 2;
+
+  // Current Wifi state when mode is toggled
+  optional com.google.android.wearable.modes.telemetry.NetworkState current_wifi_state = 3;
+
+  // Current LTE state when mode is toggled
+  optional com.google.android.wearable.modes.telemetry.NetworkState current_cellular_state = 4;
+
+  // Current BT state when mode is toggled
+  optional com.google.android.wearable.modes.telemetry.NetworkState current_bluetooth_state = 5;
+
+  // Current Battery level. Should be in [0, 100].
+  optional int32 battery_level = 6;
+}
diff --git a/stats/atoms/wear/prototiles/prototiles_extension_atoms.proto b/stats/atoms/wear/prototiles/prototiles_extension_atoms.proto
new file mode 100644
index 0000000..b720ad3
--- /dev/null
+++ b/stats/atoms/wear/prototiles/prototiles_extension_atoms.proto
@@ -0,0 +1,417 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless optional by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+syntax = "proto2";
+
+package android.os.statsd.wear.prototiles;
+
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+import "frameworks/proto_logging/stats/atoms.proto";
+
+option java_package = "com.android.os.wear.prototiles";
+option java_multiple_files = true;
+
+extend Atom {
+  optional RendererInitialized renderer_initialized = 736
+  [(module) = "prototiles"];
+  optional SchemaVersionReceived schema_version_received = 737
+  [(module) = "prototiles"];
+  optional LayoutInspected layout_inspected = 741
+  [(module) = "prototiles"];
+  optional LayoutExpressionsInspected layout_expression_inspected = 742
+  [(module) = "prototiles"];
+  optional LayoutAnimationsInspected layout_animations_inspected = 743
+  [(module) = "prototiles"];
+  optional MaterialComponentsInspected material_components_inspected = 744
+  [(module) = "prototiles"];
+  optional TileRequested tile_requested = 745
+  [(module) = "prototiles"];
+  optional StateResponseReceived state_response_received = 746
+  [(module) = "prototiles"];
+  optional TileResponseReceived tile_response_received = 747
+  [(module) = "prototiles"];
+  optional InflationFinished inflation_finished = 748
+  [(module) = "prototiles"];
+  optional InflationFailed inflation_failed = 749
+  [(module) = "prototiles"];
+  optional IgnoredInflationFailuresReported ignored_inflation_failures_reported = 750
+  [(module) = "prototiles"];
+  optional DrawableRendered drawable_rendered = 751
+  [(module) = "prototiles"];
+
+}
+
+/**
+ * This atom captures the initialization duration and the renderer version when
+ * the renderer finish initializing.
+ */
+message RendererInitialized {
+  // Renderer initializing duration.
+  optional int32 renderer_initialization_duration_millis = 1;
+  // Version of the renderer installed in the device.
+  optional int64 version_code = 2;
+}
+
+/**
+ * This atom captures the tile schema version when the tile get rendered for the
+ * first time.
+ */
+message SchemaVersionReceived {
+  optional int32 package_uid = 1 [(is_uid) = true];
+  // Layout schema version used by the tile.
+  optional int32 tile_schema_version_major = 2;
+  optional int32 tile_schema_version_minor = 3;
+}
+
+/**
+ * This atom captures the structure of the inspected layout. We do inspect every
+ * layout before it starts rendering.
+ */
+message LayoutInspected {
+  enum LayoutDepthBucket {
+    LAYOUT_DEPTH_BUCKET_UNSPECIFIED = 0;
+    LAYOUT_DEPTH_BUCKET_UNDER_FIVE_NODES = 1;
+    LAYOUT_DEPTH_BUCKET_FIVE_TO_TEN_NODES = 2;
+    LAYOUT_DEPTH_BUCKET_TEN_TO_TWENTY_FIVE_NODES = 3;
+    LAYOUT_DEPTH_BUCKET_TWENTY_FIVE_TO_FIFTY_NODES = 4;
+    LAYOUT_DEPTH_BUCKET_OVER_FIFTY_NODES = 5;
+  }
+  enum LayoutElementCountBucket {
+    LAYOUT_ELEMENT_COUNT_BUCKET_UNSPECIFIED = 0;
+    LAYOUT_ELEMENT_COUNT_BUCKET_UNDER_TEN_ELEMENTS = 1;
+    LAYOUT_ELEMENT_COUNT_BUCKET_TEN_TO_TWENTY_FIVE_ELEMENTS = 2;
+    LAYOUT_ELEMENT_COUNT_BUCKET_TWENTY_FIVE_TO_FIFTY_ELEMENTS = 3;
+    LAYOUT_ELEMENT_COUNT_BUCKET_FIFTY_TO_HUNDRED_ELEMENTS = 4;
+    LAYOUT_ELEMENT_COUNT_BUCKET_OVER_HUNDRED_ELEMENTS = 5;
+  }
+  enum LayoutBinarySizeBucket {
+    LAYOUT_BINARY_SIZE_BUCKET_UNSPECIFIED = 0;
+    LAYOUT_BINARY_SIZE_BUCKET_UNDER_ONE_KIB = 1;
+    LAYOUT_BINARY_SIZE_BUCKET_ONE_TO_TEN_KIB = 2;
+    LAYOUT_BINARY_SIZE_BUCKET_TEN_TO_TWENTY_FIVE_KIB = 3;
+    LAYOUT_BINARY_SIZE_BUCKET_TWENTY_FIVE_TO_FIFTY_KIB = 4;
+    LAYOUT_BINARY_SIZE_BUCKET_FIFTY_TO_HUNDRED_KIB = 5;
+    LAYOUT_BINARY_SIZE_BUCKET_OVER_HUNDRED_KIB = 6;
+  }
+
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // The depth of the inspected layout.
+  optional LayoutDepthBucket layout_depth_bucket = 3;
+  // The node count fo the inspected layout.
+  optional LayoutElementCountBucket layout_element_count_bucket = 4;
+  // The binary size of the inspected layout.
+  optional LayoutBinarySizeBucket layout_size_bucket = 5;
+}
+
+/**
+ * This atom captures the structure of nodes in the inspected layout. We do
+ * inspect every expression when inspecting the layout.
+ */
+message LayoutExpressionsInspected {
+  enum TotalExpressionNodeCountBucket {
+    TOTAL_EXPRESSION_NODE_COUNT_BUCKET_UNSPECIFIED = 0;
+    TOTAL_EXPRESSION_NODE_COUNT_BUCKET_UNDER_TEN_NODES = 1;
+    TOTAL_EXPRESSION_NODE_COUNT_BUCKET_TEN_TO_TWENTY_FIVE_NODES = 2;
+    TOTAL_EXPRESSION_NODE_COUNT_BUCKET_TWENTY_FIVE_TO_FIFTY_NODES = 3;
+    TOTAL_EXPRESSION_NODE_COUNT_BUCKET_OVER_FIFTY_NODES = 4;
+  }
+  enum MaxNodesCountPerExpressionBucket {
+    MAX_NODES_COUNT_PER_EXPRESSION_BUCKET_UNSPECIFIED = 0;
+    MAX_NODES_COUNT_PER_EXPRESSION_BUCKET_UNDER_FIVE_NODES = 1;
+    MAX_NODES_COUNT_PER_EXPRESSION_BUCKET_FIVE_TO_TEN_NODES = 2;
+    MAX_NODES_COUNT_PER_EXPRESSION_BUCKET_TEN_TO_TWENTY_FIVE_NODES = 3;
+    MAX_NODES_COUNT_PER_EXPRESSION_BUCKET_OVER_TWENTY_FIVE_NODES = 5;
+  }
+  enum MaxNodesDepthPerExpressionBucket {
+    MAX_NODES_DEPTH_PER_EXPRESSION_BUCKET_UNSPECIFIED = 0;
+    MAX_NODES_DEPTH_PER_EXPRESSION_BUCKET_UNDER_FIVE_NODES = 1;
+    MAX_NODES_DEPTH_PER_EXPRESSION_BUCKET_FIVE_TO_TEN_NODES = 2;
+    MAX_NODES_DEPTH_PER_EXPRESSION_BUCKET_TEN_TO_TWENTY_FIVE_NODES = 3;
+    MAX_NODES_DEPTH_PER_EXPRESSION_BUCKET_OVER_TWENTY_FIVE_NODES = 5;
+  }
+
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // Count of expression nodes in the inspected layout.
+  optional TotalExpressionNodeCountBucket total_expression_node_count_bucket =
+    3;
+  // Maximum count of nodes among all expression in inspected layout.
+  optional MaxNodesCountPerExpressionBucket
+    max_nodes_count_per_expression_bucket = 4;
+  // Maximum expression depth among all expression in inspected layout.
+  optional MaxNodesDepthPerExpressionBucket
+    max_nodes_depth_per_expression_bucket = 5;
+  // Platform data sources used in the inspected expressions (Bitset instead of repeated enum).
+  optional int32 platform_data_source = 6;
+}
+
+/**
+ * This atom captures the animation objects structure in the inspected layout.
+ * We do inspect every animation when inspecting the layout.
+ */
+message LayoutAnimationsInspected {
+
+  enum MaxAnimationDurationBucket {
+    MAX_ANIMATION_DURATION_BUCKET_UNSPECIFIED = 0;
+    MAX_ANIMATION_DURATION_BUCKET_UNDER_ONE_HUNDRED_MS = 1;
+    MAX_ANIMATION_DURATION_BUCKET_ONE_HUNDRED_MS_TO_FIVE_HUNDRED_MS = 2;
+    MAX_ANIMATION_DURATION_BUCKET_FIVE_HUNDRED_MS_TO_ONE_S = 3;
+    MAX_ANIMATION_DURATION_BUCKET_ONE_S_TO_FIVE_S = 4;
+    MAX_ANIMATION_DURATION_BUCKET_OVER_FIVE_S = 5;
+  }
+
+  enum AnimationCountBucket {
+    ANIMATION_COUNT_BUCKET_UNSPECIFIED = 0;
+    ANIMATION_COUNT_BUCKET_ZERO = 1;
+    ANIMATION_COUNT_BUCKET_ONE_TO_THREE = 2; // [1:3[
+    ANIMATION_COUNT_BUCKET_THREE_TO_FIVE = 3; // [3:5[
+    ANIMATION_COUNT_BUCKET_FIVE_TO_TEN = 4; // [5:10[
+    ANIMATION_COUNT_BUCKET_OVER_TEN = 5;
+  }
+
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // Count of animations in the inspected layout.
+  optional AnimationCountBucket animation_count_bucket = 3;
+  // The maximum duration of an animation in the inspected layout.
+  optional MaxAnimationDurationBucket max_animation_duration_bucket = 4;
+  // Animation types that are used in the inspected layout (Bitset instead of repeated enum).
+  optional int32 animation_type = 5;
+  // Whether the layout has a continues animation.
+  optional bool has_continuous_animation = 6;
+}
+
+/**
+ * This atom captures the material components structure in the inspected layout.
+ * We do inspect every material component when inspecting the layout.
+ */
+message MaterialComponentsInspected {
+
+  enum MaterialComponentCountBucket {
+    MATERIAL_COMPONENT_COUNT_BUCKET_UNSPECIFIED = 0;
+    MATERIAL_COMPONENT_COUNT_BUCKET_ZERO = 1;
+    MATERIAL_COMPONENT_COUNT_BUCKET_ONE_TO_FIVE = 2; // [1:5[
+    MATERIAL_COMPONENT_COUNT_BUCKET_FIVE_TO_TEN = 3; // [5:10[
+    MATERIAL_COMPONENT_COUNT_BUCKET_OVER_TEN = 4;
+  }
+
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // Number of material components used in the layout.
+  optional MaterialComponentCountBucket material_component_count_bucket = 3;
+  // Material component types used in the layout (Bitset instead of repeated enum).
+  optional int32 material_component_type = 4;
+}
+
+/**
+ * This atom captures the tile requests.
+ */
+message TileRequested {
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // The reason of firing a tile request.
+  optional int32 count_of_freshness_based_request = 3;
+  optional int32 count_of_user_interaction_based_request = 4;
+  optional int32 count_of_visibility_change_based_request = 5;
+}
+
+/**
+ * This atom captures the received State response.
+ */
+message StateResponseReceived {
+  enum StateEntriesCountBucket {
+    STATE_ENTRIES_COUNT_BUCKET_UNSPECIFIED = 0;
+    STATE_ENTRIES_COUNT_BUCKET_UNDER_TEN_ENTRIES = 1;
+    STATE_ENTRIES_COUNT_BUCKET_TEN_TO_TWENTY_FIVE_ENTRIES = 2;
+    STATE_ENTRIES_COUNT_BUCKET_TWENTY_FIVE_TO_FIFTY_ENTRIES = 3;
+    STATE_ENTRIES_COUNT_BUCKET_FIFTY_TO_HUNDRED_ENTRIES = 4;
+    STATE_ENTRIES_COUNT_BUCKET_OVER_HUNDRED_ENTRIES = 5;
+  }
+  enum StateBinarySizeBucket {
+    STATE_BINARY_SIZE_BUCKET_UNSPECIFIED = 0;
+    STATE_BINARY_SIZE_BUCKET_UNDER_ONE_KIB = 1;
+    STATE_BINARY_SIZE_BUCKET_ONE_TO_TEN_KIB = 2;
+    STATE_BINARY_SIZE_BUCKET_TEN_TO_TWENTY_FIVE_KIB = 3;
+    STATE_BINARY_SIZE_BUCKET_TWENTY_FIVE_TO_FIFTY_KIB = 4;
+    STATE_BINARY_SIZE_BUCKET_FIFTY_TO_HUNDRED_KIB = 5;
+    STATE_BINARY_SIZE_BUCKET_OVER_HUNDRED_KIB = 6;
+  }
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // Whether it is an initial state
+  optional bool is_initial_state = 3;
+  // Count of state entries.
+  optional StateEntriesCountBucket state_entries_count_bucket = 4;
+  // Binary size of the state object.
+  optional StateBinarySizeBucket state_binary_size_bucket = 5;
+}
+
+/**
+ * This atom captures the structure of the received tile response.
+ */
+message TileResponseReceived {
+  enum TimeLineEntriesCountBucket {
+    TIMELINE_ENTRIES_COUNT_BUCKET_UNSPECIFIED = 0;
+    TIMELINE_ENTRIES_COUNT_BUCKET_ONE_ENTRY = 1;
+    TIMELINE_ENTRIES_COUNT_BUCKET_TWO_TO_FIVE_ENTRIES = 2;
+    TIMELINE_ENTRIES_COUNT_BUCKET_FIVE_TO_TEN_ENTRIES = 3;
+    TIMELINE_ENTRIES_COUNT_BUCKET_TEN_TO_TWENTY_FIVE_ENTRIES = 4;
+    TIMELINE_ENTRIES_COUNT_BUCKET_TWENTY_FIVE_TO_FIFTY_ENTRIES = 5;
+    TIMELINE_ENTRIES_COUNT_BUCKET_FIFTY_TO_HUNDRED_ENTRIES = 6;
+    TIMELINE_ENTRIES_COUNT_BUCKET_OVER_HUNDRED_ENTRIES = 7;
+  }
+  enum AvgTimelineEntryDurationBucket {
+    TIMELINE_DURATION_BUCKET_UNSPECIFIED = 0;
+    TIMELINE_DURATION_BUCKET_UNDER_ONE_S = 1;
+    TIMELINE_DURATION_BUCKET_ONE_S_TO_TEN_S = 2;
+    TIMELINE_DURATION_BUCKET_TEN_S_TO_TWENTY_S = 3;
+    TIMELINE_DURATION_BUCKET_TWENTY_S_TO_FORTY_S = 4;
+    TIMELINE_DURATION_BUCKET_FORTY_S_TO_ONE_M = 5;
+    TIMELINE_DURATION_BUCKET_ONE_M_TO_TEN_M = 6;
+    TIMELINE_DURATION_BUCKET_TEN_M_TO_THIRTY_M = 7;
+    TIMELINE_DURATION_BUCKET_THIRTY_M_TO_ONE_H = 8;
+    TIMELINE_DURATION_BUCKET_ONE_H_TO_THREE_H = 9;
+    TIMELINE_DURATION_BUCKET_OVER_THREE_H = 10;
+  }
+  enum FreshnessBucket {
+    FRESHNESS_BUCKET_UNSPECIFIED = 0;
+    FRESHNESS_BUCKET_UNDER_ONE_S = 1;
+    FRESHNESS_BUCKET_ONE_S_TO_TEN_S = 2;
+    FRESHNESS_BUCKET_TEN_S_TO_TWENTY_S = 3;
+    FRESHNESS_BUCKET_TWENTY_S_TO_FORTY_S = 4;
+    FRESHNESS_BUCKET_FORTY_S_TO_ONE_M = 5;
+    FRESHNESS_BUCKET_ONE_M_TO_TEN_M = 6;
+    FRESHNESS_BUCKET_TEN_M_TO_THIRTY_M = 7;
+    FRESHNESS_BUCKET_THIRTY_M_TO_ONE_H = 8;
+    FRESHNESS_BUCKET_ONE_H_TO_THREE_H = 9;
+    FRESHNESS_BUCKET_OVER_THREE_H = 10;
+  }
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+
+  optional TimeLineEntriesCountBucket timeline_entries_count_bucket = 3;
+  // The avg duration of timelines in this tile response.
+  optional AvgTimelineEntryDurationBucket avg_timeline_entry_duration_bucket = 4;
+  // The freshness value for the tile.
+  optional FreshnessBucket freshness_bucket = 5;
+  // Whether the resource version changed.
+  optional bool resource_version_changed = 6;
+}
+
+/**
+ * This atom captures the result of layout inflation.
+ */
+message InflationFinished {// Layout
+  enum InflationDurationBucket {
+    INFLATION_DURATION_BUCKET_UNSPECIFIED = 0;
+    INFLATION_DURATION_BUCKET_UNDER_ONE_MS = 1;
+    INFLATION_DURATION_BUCKET_ONE_MS_TO_TEN_MS = 2;
+    INFLATION_DURATION_BUCKET_TEN_MS_TO_FIFTY_MS = 3;
+    INFLATION_DURATION_BUCKET_FIFTY_MS_TO_HUNDRED_MS = 4;
+    INFLATION_DURATION_BUCKET_HUNDRED_MS_TO_THREE_HUNDRED_MS = 5;
+    INFLATION_DURATION_BUCKET_THREE_HUNDRED_MS_TO_SIX_HUNDRED_MS = 6;
+    INFLATION_DURATION_BUCKET_SIX_HUNDRED_MS_TO_ONE_S = 7;
+    INFLATION_DURATION_BUCKET_OVER_ONE_S = 10;
+  }
+  enum NodeInfoCountBucket {
+    NODE_INFO_COUNT_BUCKET_UNSPECIFIED = 0;
+    NODE_INFO_COUNT_BUCKET_UNDER_FIVE_NODES = 1;
+    NODE_INFO_COUNT_BUCKET_FIVE_TO_TEN_NODES = 2;
+    NODE_INFO_COUNT_BUCKET_TEN_TO_TWENTY_FIVE_NODES = 3;
+    NODE_INFO_COUNT_BUCKET_TWENTY_FIVE_TO_FIFTY_NODES = 4;
+    NODE_INFO_COUNT_BUCKET_OVER_FIFTY_NODES = 5;
+  }
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // Inflation duration.
+  optional InflationDurationBucket inflation_duration_bucket = 3;
+  // Changed NodeInfo objects count. NodeInfo is the entity representing the
+  // rendered view.
+  optional NodeInfoCountBucket changed_nodes_count_bucket = 4;
+  // Total count of NodeInfo objects.
+  optional NodeInfoCountBucket total_node_count_bucket = 5;
+}
+
+/**
+ * This atom captures inflation blocking failures. These are failures that
+ causes the whole layout to be dropped.
+
+ */
+message InflationFailed {
+  enum BlockingFailure {
+    BLOCKING_FAILURE_UNKNOWN = 0;
+    BLOCKING_FAILURE_NO_FAILURES = 1;
+    BLOCKING_FAILURE_MAX_LAYOUT_DEPTH_EXCEEDED = 2;
+    BLOCKING_FAILURE_MAX_EXPRESSION_NODE_COUNT_EXCEEDED = 3;
+  }
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // A failure causing the rendering to abort.
+  optional BlockingFailure blocking_failure = 3;
+}
+
+// Atom to capture ignored failures during an inflation.
+message IgnoredInflationFailuresReported {
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // A list of ignored failures (Bitset instead of repeated enum).
+  optional int32 ignored_failure = 3;
+}
+
+/**
+ * This atom captures the drawables used for each layout.
+ */
+message DrawableRendered {
+  enum DrawableBinarySizeBucket {
+    DRAWABLE_BINARY_SIZE_BUCKET_UNSPECIFIED = 0;
+    DRAWABLE_BINARY_SIZE_BUCKET_UNDER_TEN_KIB = 1;
+    DRAWABLE_BINARY_SIZE_BUCKET_TEN_TO_FIFTY_KIB = 2;
+    DRAWABLE_BINARY_SIZE_BUCKET_FIFTY_TO_HUNDRED_KIB = 3;
+    DRAWABLE_BINARY_SIZE_BUCKET_HUNDRED_TO_THREE_HUNDRED_KIB = 4;
+    DRAWABLE_BINARY_SIZE_BUCKET_THREE_HUNDRED_TO_SIX_HUNDRED_KIB = 5;
+    DRAWABLE_BINARY_SIZE_BUCKET_SIX_HUNDRED_TO_ONE_MB = 6;
+    DRAWABLE_BINARY_SIZE_BUCKET_ONE_MB_TO_FIVE_MB = 7;
+    DRAWABLE_BINARY_SIZE_BUCKET_OVER_FIVE_MB = 8;
+  }
+
+  enum DrawablePixelsCountBucket {
+    DRAWABLE_PIXEL_SIZE_BUCKET_UNSPECIFIED = 0;
+    DRAWABLE_PIXEL_SIZE_BUCKET_UNDER_100_PX = 1;
+    DRAWABLE_PIXEL_SIZE_BUCKET_100_TO_1000_PX = 2;
+    DRAWABLE_PIXEL_SIZE_BUCKET_1000_TO_10000_PX = 3;
+    DRAWABLE_PIXEL_SIZE_BUCKET_10000_TO_100000_PX = 4;
+    DRAWABLE_PIXEL_SIZE_BUCKET_100000_TO_10000000_PX = 5;
+    DRAWABLE_PIXEL_SIZE_BUCKET_OVER_10000000_PX = 6;
+  }
+  optional int32 package_uid = 1 [(is_uid) = true];
+  optional int32 classname_hash = 2;
+  // Drawable types (Bitset instead of repeated enum).
+  // Bit to drawable type mapping is as follow:
+  //  - 0 -> UNKNOWN
+  //  - 1 -> BITMAP
+  //  - 2 -> VECTOR_DRAWABLE
+  //  - 3 -> ANIMATED_IMAGE_DRAWABLE
+  //  - 4 -> ANIMATED_VECTOR_DRAWABLE
+  //  - 5 -> STATE_BASED
+  //  For example, if the inflated layout contains a Bitmap and a state based
+  //  drawable, the drawable_type field will be equal to 34 = (100010)b.
+  optional int32 drawable_type = 3;
+  // Binary size of the largest drawable.
+  optional DrawableBinarySizeBucket binary_size_bucket = 4;
+  // Pixels count of the largest drawable. Calculated as Height (px) x width
+  // (px).
+  optional DrawablePixelsCountBucket drawable_pixels_count_bucket = 5;
+}
diff --git a/stats/atoms/wearpas/wearpas_extension_atoms.proto b/stats/atoms/wearpas/wearpas_extension_atoms.proto
index 2a5cc5a..d74b41d 100644
--- a/stats/atoms/wearpas/wearpas_extension_atoms.proto
+++ b/stats/atoms/wearpas/wearpas_extension_atoms.proto
@@ -162,36 +162,38 @@
   }
 
   enum Status {
+    STATUS_UNSPECIFIED = 0;
+
     /**
      * If the triggered anomaly rule does not have additional reactions beyond
      * "WW stats" and "bugreport", this will be sent once upon detection.
      */
-    NEW_NO_REACTIONS = 0;
+    NEW_NO_REACTIONS = 1;
 
     /**
      * If the triggered anomaly rule does have additional reactions, this will
      * be sent once upon detection and be followed by one of
      * {RESOLVED_POST_REACTIONS, UNRESOLVED_POST_REACTIONS}
      */
-    NEW_REACTIONS_PENDING = 1;
+    NEW_REACTIONS_PENDING = 2;
 
     /**
      * Following an anomaly with additional reactions, this will be sent if the
      * reactions have resolved the anomaly.
      */
-    RESOLVED_POST_REACTIONS = 2;
+    RESOLVED_POST_REACTIONS = 3;
 
     /**
      * Following an anomaly with additional reactions, this will be sent if the
      * reactions have not resolved the anomaly.
      */
-    UNRESOLVED_POST_REACTIONS = 3;
+    UNRESOLVED_POST_REACTIONS = 4;
 
     /**
      * Following an anomaly with bugreport triggering enabled, this will be sent
      * if a bugreport is actually triggered (e.g. if rate limiting allows).
      */
-    BUGREPORT_TRIGGERED = 4;
+    BUGREPORT_TRIGGERED = 5;
   }
 
   /* Power entity type for which an anomaly was detected */
@@ -207,7 +209,7 @@
   optional int32 rule_id = 3;
 
   /**
-   * Resource ID for standard Google stock apps/resources
+   * Resource ID (cross-device) for standard Google stock apps/resources
    * (ONLY FACTORY GOOGLE FLASHED APPS). Mapping is stored server-side.
    */
   optional int32 resource_holder_id = 4;
diff --git a/stats/atoms/wearservices/wearservices_atoms.proto b/stats/atoms/wearservices/wearservices_atoms.proto
index 03e9f99..8659efb 100644
--- a/stats/atoms/wearservices/wearservices_atoms.proto
+++ b/stats/atoms/wearservices/wearservices_atoms.proto
@@ -61,16 +61,85 @@
 
   // Importance of the notification after this update.
   optional android.app.wearservices.NotificationImportance importance = 4;
+
+  // The transport channel this notification is coming from.
+  optional android.app.wearservices.NotificationTransportChannel
+      transport_channel = 5;
+
+  // The alerting effect of the notification.
+  optional android.app.wearservices.NotificationAlertingEffect alerting_effect =
+      6;
+
+  // The group alert behavior of the notification.
+  optional android.app.wearservices.NotificationGroupAlertBehavior
+      group_alert_behavior = 7;
+
+  // The alert behavior controlled by the ALERT_ONLY_ONCE flag.
+  optional android.app.wearservices.NotificationAlertOnlyOnce alert_only_once =
+      8;
+
+  // The group type of the notification.
+  optional android.app.wearservices.NotificationGroupType group_type = 9;
+
+  // The style of the notification.
+  optional android.app.wearservices.NotificationStyle style = 10;
+
+  // The hidden reason of the notification.
+  optional android.app.wearservices.NotificationHiddenReason hidden_reason = 11;
+
+  // The categories for the notification.
+  optional android.app.wearservices.NotificationCategory category = 12;
+
+  // Whether this notification has set FLAG_ONGOING_EVENT. Which means there may
+  // be many updates for this notification. (eg. app download progress updates).
+  optional bool is_ongoing_notification = 13;
+
+  // Whether this notification is an emergency cell broadcast message.
+  optional bool is_emergency = 14;
+
+  // Whether this notification comes from apps running in the work profile.
+  optional bool is_work_profile = 15;
+
+  // The content intent actions for the notification.
+  optional android.app.wearservices.NotificationContentIntent content_intent =
+      16;
+
+  // Whether actions contain remote input (e.g. Reply).
+  optional bool has_remote_input = 17;
+
+  // Number value for all actions, including actions with remote input. Count
+  // wearable actions if they exist, otherwise counting the standard actions.
+  // Can be 0 or above, cap to 10 as we have this same limit in SysUI.
+  optional int32 action_count = 18;
+
+  // Whether this notification contains bigPicture image, largeIcon image, or
+  // message images.
+  optional bool has_big_images = 19;
+
+  // Whether this notification has set a dismissal-id.
+  optional bool has_dismissal_id = 20;
+
+  // Whether this notification has set FLAG_FOREGROUND_SERVICE. Which means the
+  // notification may be frequently updated.
+  optional bool is_foreground_service = 21;
 }
 
-/**
- * Atom used to log the wear time for Wearables.
- *
- * Logged from package :
- * vendor/google_clockwork_partners/packages/WearServices
- */
-message WsWearTimeSession {
-    optional int64 session_duration_millis = 1;
+/** Logged when a notification is blocked/unblocked in the WearServices application. */
+message WsNotificationBlocking {
+  // Package name of the application that created the notification event.
+  optional string package_name = 1;
+
+  // Device on which the notification event was created.
+  optional android.app.wearservices.RequestSource source_device = 2;
+
+  // Defines on which device the blocked state is changed.
+  optional android.app.wearservices.DeviceLocation device_location = 3;
+
+  // Defines in which profile the application is installed.
+  optional android.app.wearservices.Profile profile= 4;
+
+  // Blocking status of the notifications for the application.
+  optional android.app.wearservices.NotificationBlockingStatus notification_blocking_status = 5;
 }
 
 /** Logged when a complication is tapped by the user. */
diff --git a/stats/atoms/wearservices/wearservices_extension_atoms.proto b/stats/atoms/wearservices/wearservices_extension_atoms.proto
index 2170072..f545987 100644
--- a/stats/atoms/wearservices/wearservices_extension_atoms.proto
+++ b/stats/atoms/wearservices/wearservices_extension_atoms.proto
@@ -26,21 +26,28 @@
 option java_multiple_files = true;
 
 extend Atom {
+  // Pushed Atom
+  optional WsWearTimeSession ws_wear_time_session = 610
+      [(module) = "wearservices"];
 
   optional WsIncomingCallActionReported ws_incoming_call_action_reported = 626
-      [(module) = "wearservices_metrics"];
+      [(module) = "wearservices"];
 
   optional WsCallDisconnectionReported ws_call_disconnection_reported = 627
-      [(module) = "wearservices_metrics"];
+      [(module) = "wearservices"];
 
   optional WsCallDurationReported ws_call_duration_reported = 628
-      [(module) = "wearservices_metrics"];
+      [(module) = "wearservices"];
 
   optional WsCallUserExperienceLatencyReported ws_call_user_experience_latency_reported = 629
-      [(module) = "wearservices_metrics"];
+      [(module) = "wearservices"];
 
   optional WsCallInteractionReported ws_call_interaction_reported = 630
-      [(module) = "wearservices_metrics"];
+      [(module) = "wearservices"];
+
+  // Pulled Atom
+  optional WsStandaloneModeSnapshot ws_standalone_mode_snapshot = 10197
+      [(module) = "wearservices"];
 }
 
 /**
@@ -150,3 +157,25 @@
   // CALL_SOURCE_PHONE_COMPANION)
   optional android.app.wearservices.CallSource call_source = 2;
 }
+
+/**
+ * Atom used to log the wear time for Wearables.
+ *
+ * Logged from package :
+ * vendor/google_clockwork_partners/packages/WearServices
+ */
+message WsWearTimeSession {
+    optional int64 session_duration_millis = 1;
+}
+
+/**
+* A snapshot of the tether status on certain watches.
+* (go/wear-tether-mode-telemetry)
+*
+* Logged from package :
+* vendor/google_clockwork_partners/packages/WearServices
+*/
+message WsStandaloneModeSnapshot {
+  // Depicts the standalone/tether status of the watch.
+  optional android.app.wearservices.TetherConfigurationStatus tether_configuration_status = 1;
+}
diff --git a/stats/atoms/wearsysui/wearsysui_extension_atoms.proto b/stats/atoms/wearsysui/wearsysui_extension_atoms.proto
new file mode 100644
index 0000000..abf7551
--- /dev/null
+++ b/stats/atoms/wearsysui/wearsysui_extension_atoms.proto
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.statsd.wearsysui;
+
+import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/atom_field_options.proto";
+
+option java_package = "com.android.os.wearsysui";
+option java_multiple_files = true;
+
+extend Atom {
+  // Pushed Atom
+  optional WearPowerMenuOpened wear_power_menu_opened = 731
+  [(module) = "framework"];
+  optional WearAssistantOpened wear_assistant_opened = 755
+  [(module) = "framework"];
+}
+
+/**
+ * Logs whenever the Power Menu is opened for Wear
+ * Logged from :
+ * vendor/google_clockwork/packages/SystemUI/src/com/google/android/clockwork/systemui/statusbar/WearGlobalActionsProvider.java
+ */
+message WearPowerMenuOpened {
+  optional bool device_provisioned = 1;
+  optional bool setup_wizard_completed = 2;
+}
+
+/**
+ * Logs whenever Assistant is opened for Wear
+ * Logged from :
+ * vendor/google_clockwork/packages/SystemUI/src/com/google/android/clockwork/systemui/assist/WearAssistManager.java
+ */
+message WearAssistantOpened {
+  optional bool in_retail_mode = 1;
+}
\ No newline at end of file
diff --git a/stats/atoms/wifi/wifi_extension_atoms.proto b/stats/atoms/wifi/wifi_extension_atoms.proto
index 1151741..2dae6a7 100644
--- a/stats/atoms/wifi/wifi_extension_atoms.proto
+++ b/stats/atoms/wifi/wifi_extension_atoms.proto
@@ -20,6 +20,7 @@
 
 import "frameworks/proto_logging/stats/atom_field_options.proto";
 import "frameworks/proto_logging/stats/atoms.proto";
+import "frameworks/proto_logging/stats/enums/stats/connectivity/network_stack.proto";
 import "frameworks/proto_logging/stats/enums/wifi/enums.proto";
 import "frameworks/proto_logging/stats/attribution_node.proto";
 
@@ -45,10 +46,17 @@
         = 693 [(module) = "wifi"];
     optional WifiThreadTaskExecuted wifi_thread_task_executed = 694 [(module) = "wifi"];
     optional WifiStateChanged wifi_state_changed = 700 [(module) = "wifi"];
+    optional PnoScanStarted pno_scan_started = 719 [(module) = "wifi"];
+    optional PnoScanStopped pno_scan_stopped = 720 [(module) = "wifi"];
+    optional WifiIsUnusableReported wifi_is_unusable_reported = 722 [(module) = "wifi"];
+    optional WifiApCapabilitiesReported wifi_ap_capabilities_reported= 723 [(module) = "wifi"];
 
     // Pull metrics
     optional WifiAwareCapabilities wifi_aware_capabilities = 10190 [(module) = "wifi"];
     optional WifiModuleInfo wifi_module_info = 10193 [(module) = "wifi"];
+    optional WifiSettingInfo wifi_setting_info = 10194 [(module) = "wifi"];
+    optional WifiComplexSettingInfo wifi_complex_setting_info = 10195 [(module) = "wifi"];
+    optional WifiConfiguredNetworkInfo wifi_configured_network_info = 10198 [(module) = "wifi"];
 }
 
 /**
@@ -221,10 +229,6 @@
         STOP_EVENT_HOSTAPD_FAILURE = 4;
         // Stopped due to no usage timeout
         STOP_EVENT_NO_USAGE_TIMEOUT = 5;
-        // Single DBS instance stopped due to no usage timeout
-        STOP_EVENT_NO_USAGE_TIMEOUT_ONE_INSTANCE = 6;
-        // Single DBS instance stopped due to failure
-        STOP_EVENT_INSTANCE_FAILURE = 7;
     }
     // Soft AP stop event
     optional StopEvent stop_event = 1;
@@ -248,50 +252,52 @@
     optional android.net.wifi.WifiStandard standard = 10;
     // Max num of associated clients for the entire session
     optional int32 max_clients = 11;
+    // Whether or not the opportunistic no usage timeout for DBS is enabled
+    optional bool is_dbs_timeout_enabled = 12;
+    // Band of the DBS instance that failed, if any
+    optional int32 dbs_instance_failure_band = 13;
+    // Band of the DBS instance that timed out, if any
+    optional int32 dbs_instance_timeout_band = 14;
+    // Upstream transport type at the time of stopping
+    optional android.stats.connectivity.TransportType upstream_transport = 15;
 }
 
 /**
  * Logged when wifi lock is released
  */
 message WifiLockReleased {
-    // Attribution tag of the caller
-    optional string attribution_tag = 1;
-    // UID of the caller
-    optional int32 uid = 2;
+    // The AttributionNode to identify the caller
+    repeated AttributionNode attribution_node = 1;
     // Permission model of the caller
-    optional android.net.wifi.WifiCallerType caller_type = 3;
+    optional android.net.wifi.WifiCallerType caller_type = 2;
     // Lock mode
-    optional android.net.wifi.WifiModeEnum mode = 4;
+    optional android.net.wifi.WifiModeEnum mode = 3;
     // For how long the lock is acquired in milliseconds
-    optional int32 acquired_duration = 5;
+    optional int64 acquired_duration_ms = 4;
     // Whether power save disable is allowed during lock acquire
-    optional bool is_powersave_disable_allowed = 6;
+    optional bool is_powersave_disable_allowed = 5;
     // Whether the application which acquired the lock is exempted from screen ON
-    optional bool is_app_exempted_from_screen_on = 7;
+    optional bool is_app_exempted_from_screen_on = 6;
     // Whether the application which acquired the lock is exempted from being foreground
-    optional bool is_app_exempted_from_foreground = 8;
+    optional bool is_app_exempted_from_foreground = 7;
 }
 
 /**
  * Logged when wifi lock is deactivated
  */
 message WifiLockDeactivated {
-    // Attribution tag of the caller
-    optional string attribution_tag = 1;
-    // UID of the caller
-    optional int32 uid = 2;
-    // Permission model of the caller
-    optional android.net.wifi.WifiCallerType caller_type = 3;
+    // The AttributionNode to identify the caller
+    repeated AttributionNode attribution_node = 1;
     // Lock mode
-    optional android.net.wifi.WifiModeEnum mode = 4;
+    optional android.net.wifi.WifiModeEnum mode = 2;
     // For how long the lock is activated in milliseconds
-    optional int32 activated_duration = 5;
+    optional int64 activated_duration_ms = 3;
     // Whether power save disable is allowed during the lock activation
-    optional bool is_powersave_disable_allowed = 6;
+    optional bool is_powersave_disable_allowed = 4;
     // Whether the application which activated the lock is exempted from screen ON
-    optional bool is_exempted_from_screen_on = 7;
+    optional bool is_exempted_from_screen_on = 5;
     // Whether the application which activated the lock is exempted from being foreground
-    optional bool is_exempted_from_foreground = 8;
+    optional bool is_exempted_from_foreground = 6;
 }
 
 /**
@@ -386,4 +392,295 @@
     optional bool wifi_wake_enabled = 2;
     // If the state change was due to Wi-Fi Wake
     optional bool enabled_by_wifi_wake = 3;
-}
\ No newline at end of file
+}
+
+// Logged when a PNO scan is started.
+message PnoScanStarted {
+    // Whether this scan includes Passpoint SSIDs
+    optional bool includes_passpoint_ssids = 1;
+}
+
+// Logged when a PNO scan is stopped.
+message PnoScanStopped {
+    enum StopReason {
+        UNSPECIFIED = 0;
+        SCAN_FAILED = 1;
+        FOUND_RESULTS = 2;
+    }
+
+    enum FailureCode {
+        // Default value. Error is unknown
+        UNSPECIFIED_FAILURE = 0;
+        // No error occurred
+        NO_FAILURE = 1;
+        // Wificond scan returned a failure
+        WIFICOND_SCAN_FAILURE = 2;
+        // An error occurred while requesting the wificond scan
+        WIFICOND_REQUEST_FAILURE = 3;
+        // WifiScanningService returned a failure
+        WIFI_SCANNING_SERVICE_FAILURE = 4;
+    }
+
+    // Reason that this scan stopped
+    optional StopReason stop_reason = 1;
+    // Number of results found by this scan
+    optional int32 num_results = 2;
+    // Whether we were scanning for Passpoint SSIDs
+    optional bool scanned_for_passpoint_ssids = 3;
+    // Whether any Passpoint results were found
+    optional bool includes_passpoint_results = 4;
+    // Whether this scan led to the selection of a connection candidate
+    optional bool candidate_selected = 5;
+    // Whether the connection candidate is a Passpoint network
+    optional bool candidate_is_passpoint = 6;
+    // Failure code if this scan stopped due to a failure
+    optional FailureCode failure_code = 7;
+}
+
+/**
+ * Pulled to indicate a single boolean Wifi setting.
+ */
+message WifiSettingInfo {
+    enum SettingName {
+        UNSPECIFIED = 0;
+        WIFI_SCAN_ALWAYS_AVAILABLE = 1;
+        WIFI_SCAN_THROTTLE = 2;
+        WIFI_SCORING = 3;
+        WIFI_PASSPOINT = 4;
+        WIFI_WAKE = 5;
+        WIFI_ENHANCED_MAC_RANDOMIZATION = 6;
+        WIFI_NETWORKS_AVAILABLE_NOTIFICATION = 7;
+        LOCATION_MODE = 8;
+    }
+
+    // Name of the Wifi setting
+    optional SettingName setting_name = 1;
+    // Whether the setting is enabled
+    optional bool enabled = 2;
+}
+
+/**
+ * Pulled to indicate a single non-boolean Wifi setting.
+ */
+message WifiComplexSettingInfo {
+    enum MultiInternetMode {
+        // Default value. Mode is unknown.
+        MULTI_INTERNET_MODE_UNSPECIFIED = 0;
+        // Simultaneous connection to multiple APs is disabled
+        MULTI_INTERNET_MODE_DISABLED = 1;
+        // Enabled but restricted to a single network on multiple bands
+        MULTI_INTERNET_MODE_DBS_AP = 2;
+        // Enabled and allowed to connect to multiple APs using different bands
+        MULTI_INTERNET_MODE_MULTI_AP = 3;
+    }
+
+    // Wifi multi-internet mode
+    optional MultiInternetMode multi_internet_mode = 1;
+}
+
+/**
+ * Logged for every Wi-Fi unusable event.
+ */
+message WifiIsUnusableReported {
+   enum ReportType {
+      // Default/Invalid
+      TYPE_UNKNOWN = 0;
+      // There is a data stall from tx failures
+      TYPE_DATA_STALL_BAD_TX = 1;
+      // There is a data stall from rx failures
+      TYPE_DATA_STALL_TX_WITHOUT_RX = 2;
+      // There is a data stall from both tx and rx failures
+      TYPE_DATA_STALL_BOTH = 3;
+      // Firmware generated an alert
+      TYPE_FIRMWARE_ALERT = 4;
+      // IP Manager lost reachability to network neighbors
+      TYPE_IP_REACHABILITY_LOST = 5;
+   }
+   // Type of this report
+   optional ReportType type = 1;
+   // External scorer UID if external scorer is enabled. Otherwise WIFI_UID for
+   // AOSP scorer.
+   optional int32 scorer_uid = 2 [(is_uid) = true];
+   // Whether or not Wi-Fi is predicted as usable by the scorer
+   // Note: 'is_wifi_predicted_as_usable' is deprectaed by 'wifi_predicted_usability_state'.
+   optional bool is_wifi_predicted_as_usable = 3;
+   // Wi-Fi usability state as predicted by the scorer
+   optional android.net.wifi.WifiPredictedUsabilityState wifi_predicted_usability_state = 4;
+}
+
+/**
+ * AP capabilities logged for every Wi-Fi connection
+ */
+message WifiApCapabilitiesReported {
+    /**
+     * Online certificate status protocol stapling type
+     */
+    enum OcspType {
+        TYPE_OCSP_UNKNOWN = 0;
+        // Do not use OCSP stapling
+        TYPE_OCSP_NONE = 1;
+        // Try to use OCSP stapling, but not require response
+        TYPE_OCSP_REQUEST_CERT_STATUS = 2;
+        // Require valid OCSP stapling response
+        TYPE_OCSP_REQUIRE_CERT_STATUS = 3;
+        // Require valid OCSP stapling response for all not-trusted certificates
+        // in the server certificate chain
+        TYPE_OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS = 4;
+    }
+
+    /**
+     * 6 GHz AP type as encoded in 'HE operation -> 6 GHz operation info -> Control ->
+     * Regulatory info'
+     */
+    enum ApType6GHz {
+       AP_TYPE_6HZ_UNKNOWN = 0;
+       AP_TYPE_6GHZ_INDOOR = 1;
+       AP_TYPE_6GHZ_STANDARD_POWER = 2;
+       AP_TYPE_6GHZ_LOW_POWER_INDOOR = 3;
+       AP_TYPE_6GHZ_VERY_LOW_POWER = 4;
+    }
+
+    // Whether roaming is initiated by the framework to connect this AP
+    optional bool is_framework_initiated_roaming = 1;
+    // The center frequency of the primary 20 MHz frequency (in MHz) of the channel over which the
+    // connection was made.
+    optional int32 channel_frequency_mhz = 2;
+    // Band of the channel_frequency_mhz
+    optional android.net.wifi.WifiBandBucket band_mhz = 3;
+    // The DTIM period (in beacon periods) of the AP
+    optional int32 dtimPeriod = 4;
+    // Security mode of the connection
+    optional android.net.wifi.SecurityMode connected_security_mode = 5;
+    // Whether AP is hidden
+    optional bool is_hidden = 6;
+    // Whether the AP is configured incorrectly as hidden by the user
+    optional bool is_incorrectly_configured_as_hidden = 7;
+    // Wi-Fi standard of the connection
+    optional android.net.wifi.WifiStandard standard = 8;
+    // Whether IEEE 802.11b supported by the AP
+    optional bool is_11b_supported = 9;
+    // EAP type used by the AP
+    optional android.net.wifi.EapType eap_type = 10;
+    // EAP inner method used by the AP
+    optional android.net.wifi.EapInnerMethod eap_inner_method = 11;
+    // OCSP used by the AP
+    optional OcspType ocsp_type = 12;
+    // Whether the AP enabled PMK caching
+    optional bool is_pmk_caching_enabled = 13;
+    // Whether AP supports MBO
+    optional bool is_mbo_supported = 14;
+    // Whether AP supports OCE
+    optional bool is_oce_supported = 15;
+    // Whether the AP supports FILS
+    optional bool is_fils_supported = 16;
+    // Whether AP requires TWT support (individual or broadcast)
+    optional bool is_twt_required = 17;
+    // Whether the AP supports individual TWT agreements
+    optional bool is_individual_twt_supported = 18;
+    // Whether the AP supports broadcast TWT agreements
+    optional bool is_broadcast_twt_supported = 19;
+    // Whether the AP supports restricted TWT agreements
+    optional bool is_restricted_twt_supported = 20;
+    // Whether the AP supports IEEE 802.11mc
+    optional bool is_11mc_supported = 21;
+    // Whether the AP supports IEEE 802.11az
+    optional bool is_11az_supported = 22;
+    // Passpoint release version if a Passpoint connection, otherwise PassPointRelease.UNKNOWN
+    optional android.net.wifi.PasspointRelease passpoint_release = 23;
+    // If the Passpoint connection is provided by the Home provider or Roaming/visited network
+    optional bool is_passpoint_home_provider = 24;
+    // 6 GHz AP type
+    optional ApType6GHz ap_type_6ghz = 25;
+    // Whether AP supports ECPS priority access
+    optional bool is_ecps_priority_access_supported = 26;
+}
+
+/*
+ * Pulled to indicate a single configured network on the device.
+ */
+message WifiConfiguredNetworkInfo {
+    enum MacRandomization {
+        // Default value. Mode is unknown
+        MAC_RANDOMIZATION_UNSPECIFIED = 0;
+        // Factory MAC is used when connecting to this network
+        MAC_RANDOMIZATION_NONE = 1;
+        // Randomized MAC is generated once and reused for all connections to this network
+        MAC_RANDOMIZATION_PERSISTENT = 2;
+        // Randomized MAC is used and is not persisted across connections to this network
+        MAC_RANDOMIZATION_NON_PERSISTENT = 3;
+        // Framework decides on the MAC randomization strategy
+        MAC_RANDOMIZATION_AUTO = 4;
+    }
+
+    enum MeteredOverride {
+        // Default value. Mode is unknown
+        METERED_OVERRIDE_UNSPECIFIED = 0;
+        // No metered override
+        METERED_OVERRIDE_NONE = 1;
+        // Override network to be metered
+        METERED_OVERRIDE_METERED = 2;
+        // Override network to be unmetered
+        METERED_OVERRIDE_NOT_METERED = 3;
+    }
+
+    enum TofuConfiguration {
+        // Default value.
+        TOFU_CONFIGURATION_UNSPECIFIED = 0;
+        // TOFU is not enabled on the enterprise config.
+        TOFU_CONFIGURATION_NOT_ENABLED = 1;
+        // TOFU is enabled pre-connection.
+        TOFU_CONFIGURATION_ENABLED_PRE_CONNECTION = 2;
+        // Root CA was configured post-TOFU connection.
+        TOFU_CONFIGURATION_CONFIGURE_ROOT_CA = 3;
+        // Certificate pinning was used post-TOFU connection.
+        TOFU_CONFIGURATION_CERT_PINNING = 4;
+    }
+
+    enum TofuDialogState {
+        // Default value.
+        TOFU_DIALOG_STATE_UNSPECIFIED = 0;
+        // Dialog was rejected by the user.
+        TOFU_DIALOG_STATE_REJECTED = 1;
+        // Dialog was accepted by the user.
+        TOFU_DIALOG_STATE_ACCEPTED = 2;
+    }
+
+    // Unique ID for this network
+    optional int64 network_id = 1;
+    // Whether this is an Enterprise network
+    optional bool is_enterprise = 2;
+    // Whether this is a hidden network
+    optional bool is_hidden = 3;
+    // Whether this is a Passpoint network
+    optional bool is_passpoint = 4;
+    // Whether this is a suggestion network
+    optional bool is_suggestion = 5;
+    // Whether this network has a UTF-8 SSID
+    optional bool is_utf_8_ssid = 6;
+    // Whether the SSID translation feature is enabled
+    optional bool is_ssid_translation_enabled = 7;
+    // Whether this network was configured using TOFU
+    optional bool configured_using_tofu = 8;
+    // Whether this network has encountered a captive portal
+    optional bool encountered_captive_portal = 9;
+    // Whether this network has auto-join enabled
+    optional bool auto_join_enabled = 10;
+    // Security mode used by this network
+    optional android.net.wifi.SecurityMode connected_security_mode = 11;
+    // MAC randomization setting used by this network
+    optional MacRandomization mac_randomization = 12;
+    // Metered override setting used by this network
+    optional MeteredOverride metered_override = 13;
+    // EAP type used by this network
+    optional android.net.wifi.EapType eap_type = 14;
+    // EAP inner authentication method used by this network
+    optional android.net.wifi.EapInnerMethod eap_inner_auth_method = 15;
+    // Whether this network supports free OpenRoaming
+    optional bool free_open_roaming_supported = 16;
+    // Whether this network supports settled OpenRoaming
+    optional bool settled_open_roaming_supported = 17;
+    // Trust On First Use (TOFU) configuration for this network
+    optional TofuConfiguration tofu_configuration = 18;
+    // Whether the user accepted the TOFU dialog
+    optional TofuDialogState tofu_dialog_state = 19;
+}
diff --git a/stats/enums/adservices/common/adservices_enums.proto b/stats/enums/adservices/common/adservices_enums.proto
index e547f3d..13cf648 100644
--- a/stats/enums/adservices/common/adservices_enums.proto
+++ b/stats/enums/adservices/common/adservices_enums.proto
@@ -75,6 +75,11 @@
  * - Measurement errors: 2001-3000
  * - Fledge errors: 3001-4000
  * - UX errors: 4001-5000
+ * - FederatedCompute errors: 5001-6000
+ * - AdExtDataServiceErrors: 6001-7000
+ * - IAPC errors: 7001 - 8000
+ *
+ * NOTE: AdId / AdSetId don't have a range yet (because they're just using common codes)
  */
 enum ErrorCode {
   // Common Errors: 1-1000
@@ -98,6 +103,15 @@
   // Shared pref reset failure.
   SHARED_PREF_RESET_FAILURE = 8;
 
+  // Remote exception when calling the Cobalt upload API.
+  COBALT_UPLOAD_API_REMOTE_EXCEPTION = 9;
+
+  // Exception occurred when parsing the Adservices Config XML provided by an app.
+  APP_MANIFEST_CONFIG_PARSING_ERROR = 10;
+
+  // Generic exception when dealing with shared prefs.
+  SHARED_PREF_EXCEPTION = 11;
+
   // Topics errors: 1001-2000
   // Remote exception when calling get topics.
   GET_TOPICS_REMOTE_EXCEPTION = 1001;
@@ -219,10 +233,64 @@
   // Error occurred when unable to fetch job scheduler.
   TOPICS_FETCH_JOB_SCHEDULER_FAILURE = 1039;
 
+  // Error occurred while deleting a table for Topics.
+  TOPICS_DELETE_TABLE_FAILURE = 1040;
+
+  // Cobalt initialisation failure for Topics.
+  TOPICS_COBALT_LOGGER_INITIALIZATION_FAILURE = 1041;
+
+  // Failure to convert plaintext topic object to encrypted topic.
+  TOPICS_ENCRYPTION_FAILURE = 1042;
+
+  // Topics encryption key with invalid length.
+  TOPICS_ENCRYPTION_INVALID_KEY_LENGTH = 1043;
+
+  // Topics encryption with invalid response length.
+  TOPICS_ENCRYPTION_INVALID_RESPONSE_LENGTH = 1044;
+
+  // Topics encryption key failed to decode with Base64 decoder.
+  TOPICS_ENCRYPTION_KEY_DECODE_FAILURE = 1045;
+
+  // Topics encryption received null params in request for the encrypter.
+  TOPICS_ENCRYPTION_NULL_REQUEST = 1046;
+
+  // Topics encryption received null response from the encrypter.
+  TOPICS_ENCRYPTION_NULL_RESPONSE = 1047;
+
+  // Topics encryption received error while serialization to JSON.
+  TOPICS_ENCRYPTION_SERIALIZATION_ERROR = 1048;
+
+  // Topics encryption public key is missing.
+  TOPICS_ENCRYPTION_KEY_MISSING = 1049;
+
   // Measurement errors: 2001-3000
-  // Error eccurred when inserting enrollment data to DB.
+  // Error occurred when inserting enrollment data to DB.
   ENROLLMENT_DATA_INSERT_ERROR = 2001;
 
+  // Error occurred when deleting enrollment data to DB.
+  ENROLLMENT_DATA_DELETE_ERROR = 2002;
+
+  // Measurement foreground unknown failure.
+  MEASUREMENT_FOREGROUND_UNKNOWN_FAILURE = 2003;
+
+  // Measurement datastore failure.
+  MEASUREMENT_DATASTORE_FAILURE = 2004;
+
+  // Measurement datastore unknown failure.
+  MEASUREMENT_DATASTORE_UNKNOWN_FAILURE = 2005;
+
+  // Measurement invalid parameter fetching public keys.
+  MEASUREMENT_PUBLIC_KEY_FETCHER_INVALID_PARAMETER = 2006;
+
+  // Measurement IO exception while fetching public keys.
+  MEASUREMENT_PUBLIC_KEY_FETCHER_IO_ERROR = 2007;
+
+  // Measurement error while parsing public keys.
+  MEASUREMENT_PUBLIC_KEY_FETCHER_PARSING_ERROR = 2008;
+
+  // Failure to save seed in SharedPreferences
+  ENROLLMENT_SHARED_PREFERENCES_SEED_SAVE_FAILURE = 2009;
+
   // UX errors: 4001-5000
   CONSENT_REVOKED_ERROR = 4001;
 
@@ -262,8 +330,46 @@
   // App search consent data migration failure.
   APP_SEARCH_DATA_MIGRATION_FAILURE = 4013;
 
-  // Ad services entry point failure.
+  // Adservices entry point failure.
   AD_SERVICES_ENTRY_POINT_FAILURE = 4014;
+
+  // Used to be MEASUREMENT_FOREGROUND_UNKNOWN_FAILURE but renamed in
+  // commit 94af8756d2f03ff17924721ee1b7c4a4520377ff
+  RESERVED_ERROR_CODE_4015 = 4015;
+
+  // FederatedCompute errors: 5001-6000
+  // Datastore exception while deleting a federated task.
+  DELETE_TASK_FAILURE = 5001;
+
+  // Exception while trying to close file descriptor.
+  FILE_DESCRIPTOR_CLOSE_ERROR = 5002;
+
+  // Error message indicating invalid federated job plan type.
+  CLIENT_PLAN_SPEC_ERROR = 5003;
+
+  // Exception when trying to parse protobuf message.
+  INVALID_PROTOBUF_ERROR = 5004;
+
+  // Exception occurred when isolated training process runs.
+  ISOLATED_TRAINING_PROCESS_ERROR = 5005;
+
+  // Exception while trying to iterate data.
+  ITERATOR_NEXT_FAILURE = 5006;
+
+  // Timeout exception while trying to iterate data.
+  ITERATOR__NEXT_TIMEOUT = 5007;
+
+  // AdExtDataService get failed
+  GET_ADEXT_DATA_SERVICE_ERROR = 6001;
+
+  // AdExtDataService put failed
+  PUT_ADEXT_DATA_SERVICE_ERROR = 6002;
+
+  // IAPC errors: 7001-8000
+  // AdIdProviderService is not available.
+  IAPC_AD_ID_PROVIDER_NOT_AVAILABLE = 7001;
+  // Exception when calling UpdateAdId API in service side.
+  IAPC_UPDATE_AD_ID_API_ERROR = 7002;
 }
 
 /**
@@ -277,6 +383,11 @@
   AD_ID = 4;
   APP_SET_ID = 5;
   UX = 6;
+  // Use COMMON enum when the error happens in the common code path.
+  COMMON = 7;
+  // Represents federatedcompute APK in OnDevicePersonalization module.
+  FEDERATED_COMPUTE = 8;
+  ADEXT_DATA_SERVICE = 9;
 }
 
 /**
@@ -326,4 +437,3 @@
   // Non-European Union user (based on isoCountryInfo).
   ROW = 2;
 }
-
diff --git a/stats/enums/adservices/enrollment/enums.proto b/stats/enums/adservices/enrollment/enums.proto
new file mode 100644
index 0000000..88faa1a
--- /dev/null
+++ b/stats/enums/adservices/enrollment/enums.proto
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.stats.adservices.enrollment;
+
+option java_outer_classname = "EnrollmentProtoEnums";
+option java_multiple_files = true;
+
+/**
+ * Enum used by EnrollmentDataStats.
+ */
+enum TransactionType {
+  UNKNOWN_TRANSACTION_TYPE = 0;
+  READ_TRANSACTION_TYPE = 1;
+  WRITE_TRANSACTION_TYPE = 2;
+}
+
+/**
+ * Enum used by EnrollmentDataFailed.
+ */
+enum DataFileGroupStatus {
+  UNKNOWN_DATA_FILE_GROUP_STATUS = 0;
+  DOWNLOADED_DATA_FILE_GROUP_STATUS = 1;
+  PENDING_DATA_FILE_GROUP_STATUS = 2;
+  PENDING_CUSTOM_VALIDATION = 3;
+}
+
+/**
+ * Enum used by EnrollmentDataFailed.
+ */
+enum ErrorCause {
+  UNKNOWN_ERROR_CAUSE = 0;
+  ENROLLMENT_NOT_FOUND_ERROR_CAUSE = 1;
+  ENROLLMENT_BLOCKLISTED_ERROR_CAUSE = 2;
+}
\ No newline at end of file
diff --git a/stats/enums/adservices/fledge/enums.proto b/stats/enums/adservices/fledge/enums.proto
index 850454e..98370ab 100644
--- a/stats/enums/adservices/fledge/enums.proto
+++ b/stats/enums/adservices/fledge/enums.proto
@@ -27,4 +27,12 @@
   UNSET = 0;
   JAVASCRIPT = 1;
   WASM = 2;
+}
+
+// Logs the type of beacon reporting destination.
+enum BeaconReportingDestinationType {
+  UNSET_DESTINATION = 0;
+  SELLER_DESTINATION = 1;
+  BUYER_DESTINATION = 2;
+  SELLER_AND_BUYER_DESTINATION = 3;
 }
\ No newline at end of file
diff --git a/stats/enums/adservices/measurement/enums.proto b/stats/enums/adservices/measurement/enums.proto
index 261ccf7..c408522 100644
--- a/stats/enums/adservices/measurement/enums.proto
+++ b/stats/enums/adservices/measurement/enums.proto
@@ -25,8 +25,10 @@
  */
 enum SourceType {
   UNKNOWN_SOURCE_TYPE = 0;
-  EVENT_SOURCE_TYPE = 1;
-  NAVIGATION_SOURCE_TYPE = 2;
+  EVENT_SOURCE_TYPE = 1; // only deprecated for AdServicesMeasurementAttribution in favor of a VIEW_SOURCE_TYPE
+  NAVIGATION_SOURCE_TYPE = 2; // only deprecated for AdServicesMeasurementAttribution in favor of a CLICK_SOURCE_TYPE
+  VIEW_SOURCE_TYPE = 3;
+  CLICK_SOURCE_TYPE = 4;
 }
 
 /**
@@ -46,6 +48,9 @@
   UNKNOWN_STATUS = 0;
   SUCCESS_STATUS = 1;
   FAILURE_STATUS = 2;
+  AGGREGATE_REPORT_GENERATED_SUCCESS_STATUS = 3;
+  EVENT_REPORT_GENERATED_SUCCESS_STATUS = 4;
+  AGGREGATE_AND_EVENT_REPORTS_GENERATED_SUCCESS_STATUS = 5;
 }
 
 /**
@@ -58,6 +63,7 @@
   ENROLLMENT_REGISTRATION_FAILURE_TYPE = 3;
   REDIRECT_REGISTRATION_FAILURE_TYPE = 4;
   STORAGE_REGISTRATION_FAILURE_TYPE = 5;
+  JOB_RETRY_LIMIT_EXCEEDED_REGISTRATION_FAILURE_TYPE = 6;
 }
 
 /**
@@ -69,6 +75,11 @@
   NETWORK_ERROR_REPORT_UPLOAD_FAILURE_TYPE = 2;
   DATASTORE_ERROR_REPORT_UPLOAD_FAILURE_TYPE = 3;
   REPORT_NOT_PENDING_REPORT_UPLOAD_FAILURE_TYPE = 4;
+  JOB_RETRY_LIMIT_EXCEEDED_REPORT_UPLOAD_FAILURE_TYPE = 5;
+  SERIALIZATION_ERROR_REPORT_UPLOAD_FAILURE_TYPE = 6;
+  ENCRYPTION_ERROR_REPORT_UPLOAD_FAILURE_TYPE = 7;
+  UNSUCCESSFUL_HTTP_RESPONSE_CODE_FAILURE_TYPE = 8;
+  REPORT_NOT_FOUND_FAILURE_TYPE = 9;
 }
 
 /**
@@ -112,6 +123,8 @@
   NO_TOP_LEVEL_FILTER_MATCH_ATTRIBUTION_FAILURE_TYPE = 5;
   RATE_LIMIT_EXCEEDED_ATTRIBUTION_FAILURE_TYPE = 6;
   NO_REPORTS_GENERATED_ATTRIBUTION_FAILURE_TYPE = 7;
+  JOB_RETRY_LIMIT_EXCEEDED_ATTRIBUTION_FAILURE_TYPE = 8;
+  TRIGGER_NOT_FOUND_FAILURE_TYPE = 9;
 }
 
 /**
@@ -138,4 +151,7 @@
   UNINSTALL_WIPEOUT_CAUSE = 1;
   CONSENT_FLIP_WIPEOUT_CAUSE = 2;
   CLEAR_DATA_WIPEOUT_CAUSE = 3;
+  DELETE_REGISTRATIONS_API_CLEAR_DATA_WIPEOUT_CAUSE = 4;
+  PACKAGE_CHANGED_WIPEOUT_CAUSE = 5;
+  ROLLBACK_WIPEOUT_CAUSE = 6;
 }
\ No newline at end of file
diff --git a/stats/enums/anr/enums.proto b/stats/enums/anr/enums.proto
index 05d63b8..1b36438 100644
--- a/stats/enums/anr/enums.proto
+++ b/stats/enums/anr/enums.proto
@@ -33,4 +33,5 @@
     INPUT_DISPATCHING_TIMEOUT = 5;
     CONTENT_PROVIDER_NOT_RESPONDING = 6;
     SHORT_FGS_TIMEOUT = 7;
+    JOB_SERVICE = 8;
 }
diff --git a/stats/enums/apex/enums.proto b/stats/enums/apex/enums.proto
new file mode 100644
index 0000000..b4debcb
--- /dev/null
+++ b/stats/enums/apex/enums.proto
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.apex;
+
+enum InstallationType {
+    UNKNOWN_INSTALL_TYPE = 0;
+    STAGED = 1;
+    REBOOTLESS = 2;
+}
+
+enum InstallResultType {
+    UNKNOWN_INSTALL_RESULT = 0;
+    INSTALL_SUCCESSFUL = 1;
+    INSTALL_FAILURE_APEX_READING = 2;
+    INSTALL_FAILURE_APEX_VALIDATION = 3;
+    INSTALL_FAILURE_APEX_PREPARATION = 4;
+    INSTALL_FAILURE_APEX_STAGING = 5;
+    INSTALL_FAILURE_APEX_INSTALLATION = 6;
+    INSTALL_FAILURE_APEX_ACTIVATION = 7;
+}
+
+enum PreinstallPartition {
+    PARTITION_UNKNOWN = 0;
+    PARTITION_OTHER = 1;
+    PARTITION_PRODUCT = 2;
+    PARTITION_SYSTEM = 3;
+    PARTITION_SYSTEM_EXT = 4;
+    PARTITION_VENDOR = 5;
+}
diff --git a/stats/enums/app/enums.proto b/stats/enums/app/enums.proto
index 2e25db7..9abe224 100644
--- a/stats/enums/app/enums.proto
+++ b/stats/enums/app/enums.proto
@@ -272,6 +272,13 @@
     APP_OP_USE_FULL_SCREEN_INTENT = 133;
     APP_OP_CAMERA_SANDBOXED = 134;
     APP_OP_RECORD_AUDIO_SANDBOXED = 135;
+    APP_OP_RECEIVE_SANDBOX_TRIGGER_AUDIO = 136;
+    APP_OP_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA = 137;
+    APP_OP_CREATE_ACCESSIBILITY_OVERLAY = 138;
+    APP_OP_MEDIA_ROUTING_CONTROL = 139;
+    APP_OP_ENABLE_MOBILE_DATA_BY_USER = 140;
+    APP_OP_RESERVED_FOR_TESTING = 141;
+    APP_OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER = 142;
 }
 
 /**
@@ -567,6 +574,23 @@
      * was no longer being used; this would be set only when the reason is {@link #REASON_OTHER}.
      */
      SUBREASON_SDK_SANDBOX_NOT_NEEDED = 28;
+
+    /**
+     * The process was killed because the binder proxy limit for system server was exceeded.
+     */
+     SUBREASON_EXCESSIVE_BINDER_OBJECTS = 29;
+
+    /**
+     * The process was killed by the [kernel] Out-of-memory (OOM) killer; this
+     * would be set only when the reason is {@link #REASON_LOW_MEMORY}.
+     */
+    SUBREASON_OOM_KILL = 30;
+
+    /**
+     * The process was killed because its async kernel binder buffer is running out
+     * while being frozen.
+     */
+    SUBREASON_FREEZER_BINDER_ASYNC_FULL = 31;
 }
 
 /**
@@ -674,3 +698,50 @@
     BROADCAST_DELIVERY_GROUP_POLICY_MOST_RECENT = 1;
     BROADCAST_DELIVERY_GROUP_POLICY_MERGED = 2;
 }
+
+/**
+ * Most recent state of startup.
+ */
+enum AppStartStartupState {
+    STARTUP_STATE_STARTED = 0;
+    STARTUP_STATE_ERROR = 1;
+    STARTUP_STATE_FIRST_FRAME_DRAWN = 2;
+}
+
+/**
+ * The reason code of what triggered the process's start.
+ */
+enum AppStartReasonCode {
+    START_REASON_ALARM = 0;
+    START_REASON_BACKUP = 1;
+    START_REASON_BOOT_COMPLETE = 2;
+    START_REASON_BROADCAST = 3;
+    START_REASON_CONTENT_PROVIDER = 4;
+    START_REASON_JOB = 5;
+    START_REASON_LAUNCHER = 6;
+    START_REASON_OTHER = 7;
+    START_REASON_PUSH = 8;
+    START_REASON_RESUMED_ACTIVITY = 9;
+    START_REASON_SERVICE = 10;
+    START_REASON_START_ACTIVITY = 11;
+}
+
+/**
+ * Type of process start.
+ */
+enum AppStartStartType {
+    START_TYPE_COLD = 0;
+    START_TYPE_WARM = 1;
+    START_TYPE_HOT = 2;
+}
+
+/**
+ * An instruction on how the activity should be launched.
+ */
+enum AppStartLaunchMode {
+    LAUNCH_MODE_STANDARD = 0;
+    LAUNCH_MODE_SINGLE_TOP = 1;
+    LAUNCH_MODE_SINGLE_INSTANCE = 2;
+    LAUNCH_MODE_SINGLE_TASK = 3;
+    LAUNCH_MODE_SINGLE_INSTANCE_PER_TASK = 4;
+}
diff --git a/stats/enums/app/settings_enums.proto b/stats/enums/app/settings_enums.proto
index 5f8df41..44f3be8 100644
--- a/stats/enums/app/settings_enums.proto
+++ b/stats/enums/app/settings_enums.proto
@@ -1184,19 +1184,16 @@
 
     // ACTION: Settings > System > Languages > Regional preferences > First day of week > Set the
     // preferred first day of week.
-    // VALUE: first day of week.
     // OS: U
     ACTION_SET_FIRST_DAY_OF_WEEK = 1827;
 
     // ACTION: Settings > System > Languages > Regional preferences > Numbers preference >
     // Choose the language
-    // VALUE: language.
     // OS: U
     ACTION_CHOOSE_LANGUAGE_FOR_NUMBERS_PREFERENCES = 1828;
 
     // ACTION: Settings > System > Languages > Regional preferences > Numbers preference >
     // Choose the language > Set the preferred numbers preferences.
-    // VALUE: numbers preferences.
     // OS: U
     ACTION_SET_NUMBERS_PREFERENCES = 1829;
 
@@ -1205,17 +1202,14 @@
     ACTION_LANGUAGES_LEARN_MORE = 1830;
 
     // ACTION: Settings > System > Languages > System Languages > Add a language
-    // VALUE: language.
     // OS: U
     ACTION_ADD_LANGUAGE = 1831;
 
     // ACTION: Settings > System > Languages > System Languages > Remove a language
-    // VALUE: language.
     // OS: U
     ACTION_REMOVE_LANGUAGE = 1832;
 
     // ACTION: Settings > System > Languages > System Languages > Re-order a language
-    // VALUE: language.
     // OS: U
     ACTION_REORDER_LANGUAGE = 1833;
 
@@ -1230,7 +1224,6 @@
 
     // ACTION: Settings > System > Languages > System Languages > Select a not available language
     // as system language
-    // VALUE: language
     // OS: U
     ACTION_NOT_SUPPORTED_SYSTEM_LANGUAGE = 1836;
 
@@ -1327,6 +1320,22 @@
     // OS: U
     ACTION_LEARN_TOUCHPAD_GESTURE_CLICK = 1855;
 
+    // ACTION: Settings > System > Languages > System Languages > Terms of address > Not specified
+    // OS: V
+    ACTION_TERMS_OF_ADDRESS_NOT_SPECIFIED = 1856;
+
+    // ACTION: Settings > System > Languages > System Languages > Terms of address > Feminine
+    // OS: V
+    ACTION_TERMS_OF_ADDRESS_FEMININE = 1857;
+
+    // ACTION: Settings > System > Languages > System Languages > Terms of address > Masculine
+    // OS: V
+    ACTION_TERMS_OF_ADDRESS_MASCULINE = 1858;
+
+    // ACTION: Settings > System > Languages > System Languages > Terms of address > Neutral
+    // OS: V
+    ACTION_TERMS_OF_ADDRESS_NEUTRAL = 1859;
+
     // ACTION: Settings > Battery > Battery usage
     // CATEGORY: SETTINGS
     // OS: UQPR1
@@ -1341,6 +1350,164 @@
     // CATEGORY: SETTINGS
     // OS: UQPR1
     ACTION_BATTERY_TIPS_CARD_DISMISS = 1862;
+
+    // ACTION: Settings > Connected devices > Previously used with account -> Pair device
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    ACTION_SETTINGS_PREVIOUSLY_USED_WITH_ACCOUNT_BLUETOOTH_PAIR = 1863;
+    // ACTION: Settings > Connected devices > Previously used with account -> Pair device error
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    ACTION_SETTINGS_PREVIOUSLY_USED_WITH_ACCOUNT_BLUETOOTH_PAIR_ERROR = 1864;
+    // ACTION: Settings > Connected devices > Previously used with account -> Pair device not found
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    ACTION_SETTINGS_PREVIOUSLY_USED_WITH_ACCOUNT_BLUETOOTH_PAIR_NOT_FOUND = 1865;
+    // ACTION: Logged when user tries to pair a Fast pair Bluetooth device from Settings app
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    ACTION_SETTINGS_BLUETOOTH_PAIR_FAST_PAIR_DEVICE = 1866;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > App default selected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_APP_DEFAULT_SELECTED = 1867;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > App default unselected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_APP_DEFAULT_UNSELECTED = 1868;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > Full screen selected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_FULL_SCREEN_SELECTED = 1869;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > Full screen unselected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_FULL_SCREEN_UNSELECTED = 1870;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > Half screen selected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_HALF_SCREEN_SELECTED = 1871;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > Half screen unselected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_HALF_SCREEN_UNSELECTED = 1872;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > 4:3 selected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_4_3_SELECTED = 1873;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > 4:3 unselected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_4_3_UNSELECTED = 1874;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > 16:9 selected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_16_9_SELECTED = 1875;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > 16:9 unselected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_16_9_UNSELECTED = 1876;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > 3:2 selected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_3_2_SELECTED = 1877;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > 3:2 unselected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_3_2_UNSELECTED = 1878;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > Display size selected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_DISPLAY_SIZE_SELECTED = 1879;
+
+    // ACTION: Settings > Apps > App Info > Aspect Ratio > Display size unselected
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    ACTION_USER_ASPECT_RATIO_DISPLAY_SIZE_UNSELECTED = 1880;
+
+    // Action: Settings > Apps > AppInfo > Battery > allow background usage
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    ACTION_APP_BATTERY_USAGE_ALLOW_BACKGROUND = 1881;
+
+    // Action: Settings > Apps > AppInfo > Battery > disable background usage
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    ACTION_APP_BATTERY_USAGE_DISABLE_BACKGROUND = 1882;
+
+    // Action: Settings > Battery settings > Battery tip > Battery health
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    ACTION_BATTERY_HEALTH_TIP = 1883;
+
+    // Private space setup flow
+    // OPEN: Settings > Security&Privacy > Private Space > Set up
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_START = 1884;
+
+    // OPEN: Settings > Security&Privacy > Private Space > Cancel
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_CANCEL = 1885;
+
+    // OPEN: Settings > Security&Privacy > Private Space > Set up > Wait 15 sec
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED = 1886;
+
+    // OPEN: Settings > Security&Privacy > Private Space > Set up > Error > Try again
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_TRY_CREATE_SPACE_AGAIN = 1887;
+
+    // OPEN: Settings > Security&Privacy > Private Space > Set up > Error > Cancel
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_CANCEL_CREATE_SPACE = 1888;
+
+    // OPEN: Settings > Security&Privacy > Private Space >
+    // Set up > Wait 15 sec > Google account setup
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_SUCCESS = 1889;
+
+    // OPEN: Settings > Security&Privacy > Private Space >
+    // Set up > Wait 15 sec > Google account setup error > Try again
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_TRY_CREATE_ACCOUNT_AGAIN = 1890;
+
+    // OPEN: Settings > Security&Privacy > Private Space > Set up > Wait 15 sec >
+    // Google account setup  > Choose new lock
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_NEW_LOCK = 1891;
+
+    // OPEN: Settings > Security&Privacy > Private Space > Set up > Wait 15 sec >
+    // Google account setup  > Use screen lock
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_USE_SCREEN_LOCK = 1892;
+
+    // OPEN: Settings > Security&Privacy > Private Space >
+    // Set up > Google account setup > Screen lock setup > Done
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACTION_PRIVATE_SPACE_SETUP_DONE = 1893;
 }
 
 /**
@@ -4143,6 +4310,16 @@
     // OS: U
     VPN_APP_MANAGEMENT = 2033;
 
+    // OPEN: Settings > System > Languages > System Languages > Terms of address
+    // CATEGORY: SETTINGS
+    // OS: V
+    TERMS_OF_ADDRESS = 2034;
+
+    // OPEN: Settings > Notifications > Polite notifications
+    // CATEGORY: SETTINGS
+    // OS: U
+    SETTINGS_POLITE_NOTIFICATIONS = 2035;
+
     // OPEN: Settings > Display > Screen saver > When to start
     // CATEGORY: SETTINGS
     // OS: U
@@ -4158,9 +4335,135 @@
     // OS: U
     FOLD_LOCK_BEHAVIOR = 2038;
 
+    // OPEN: Settings > Connected devices > Previously used with account
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    FAST_PAIR_DEVICES = 2039;
+
+    // OPEN: Settings > Security & Privacy > Private Space
+    // CATEGORY: SETTINGS
+    // OS: V
+    PRIVATE_SPACE_SETTINGS = 2040;
+
+    // OPEN: Settings > System > Developer options > Quarantined Apps
+    // CATEGORY: SETTINGS
+    // OS: V
+    QUARANTINED_APPS_DEV_CONTROL = 2041;
+
     // OPEN: Settings > Developer Options > Enable 16k pages
     // CATEGORY: SETTINGS
     DIALOG_ENABLE_16K_PAGES = 2042;
+
+    // OPEN: Settings > Storage > Private profile tab
+    // CATEGORY: SETTINGS
+    // OS: V
+    SETTINGS_STORAGE_CATEGORY_PRIVATE = 2043;
+
+    // OPEN: Settings > Account > Private profile tab
+    // CATEGORY: SETTINGS
+    // OS: V
+    ACCOUNT_PRIVATE = 2044;
+
+    // OPEN: Settings > Privacy & Security > More security & privacy > Scanning for deceptive apps
+    // CATEGORY: SETTINGS
+    // OS: U
+    CONTENT_PROTECTION_PREFERENCE = 2045;
+
+    // ACTION: Allow Voice activation of an assistant app
+    // CATEGORY: SETTINGS
+    // OS: V
+    APP_SPECIAL_PERMISSION_RECEIVE_SANDBOX_TRIGGER_AUDIO_ALLOW = 2046;
+
+    // ACTION: Deny Voice activation of an assistant app
+    // CATEGORY: SETTINGS
+    // OS: V
+    APP_SPECIAL_PERMISSION_RECEIVE_SANDBOX_TRIGGER_AUDIO_DENY = 2047;
+
+    // OPEN: Settings > Connected devices > Connection preferences > Audio sharing
+    // CATEGORY: SETTINGS
+    // OS: V
+    AUDIO_SHARING_SETTINGS = 2048;
+
+    // Open: Audio sharing start dialog
+    // CATEGORY: SETTINGS
+    // OS: V
+    DIALOG_START_AUDIO_SHARING = 2049;
+
+    // Open: Audio sharing stop dialog
+    // CATEGORY: SETTINGS
+    // OS: V
+    DIALOG_STOP_AUDIO_SHARING = 2050;
+
+    // Open: Audio sharing switch device dialog
+    // CATEGORY: SETTINGS
+    // OS: V
+    DIALOG_AUDIO_SHARING_SWITCH_DEVICE = 2051;
+
+    // Open: Audio sharing switch active dialog
+    // CATEGORY: SETTINGS
+    // OS: V
+    DIALOG_AUDIO_SHARING_SWITCH_ACTIVE = 2052;
+
+    // OPEN: Settings > System > Developer options > Widevine settings
+    // CATEGORY: SETTINGS
+    // OS: V
+    WIDEVINE_SETTINGS = 2053;
+
+    // OPEN: Settings > Apps > App Info > Aspect Ratio
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    USER_ASPECT_RATIO_APP_INFO_SETTINGS = 2054;
+
+    // OPEN: Settings > Battery > [App Use details] > Manage background usage
+    // CATEGORY: SETTINGS
+    // OS: UQPR2
+    FUELGAUGE_POWER_USAGE_MANAGE_BACKGROUND = 2055;
+
+    // OPEN: Settings > Apps > Aspect Ratio
+    // CATEGORY: SETTINGS
+    // OS: UQPR1
+    USER_ASPECT_RATIO_APP_LIST_SETTINGS = 2056;
+
+    // OPEN: Settings > System > Developer options > Develop App picker
+    // CATEGORY: SETTINGS
+    // OS: V
+    DEVELOPMENT_APP_PICKER = 2057;
+
+    // OPEN: Settings > Security & Privacy > Private Space , when the feature is not set up
+    // CATEGORY: SETTINGS
+    // OS: V
+    PRIVATE_SPACE_SETUP_EDUCATION = 2058;
+
+    // OPEN: Settings > Security & Privacy > Private Space > Set up
+    // CATEGORY: SETTINGS
+    // OS: V
+    PRIVATE_SPACE_SETUP_SPACE_CREATION = 2059;
+
+    // OPEN: Settings > Security & Privacy > Private Space > Set up > Wait, Error
+    // CATEGORY: SETTINGS
+    // OS: V
+    PRIVATE_SPACE_SETUP_SPACE_CREATION_ERROR = 2060;
+
+    // OPEN: Settings > Security & Privacy > Private Space > Set up > Wait, Success
+    // CATEGORY: SETTINGS
+    // OS: V
+    PRIVATE_SPACE_SETUP_LOCK = 2061;
+
+    // OPEN: Settings > Security & Privacy > Private Space > Set up > Wait > Use screen lock > Error
+    // CATEGORY: SETTINGS
+    // OS: V
+    PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_ERROR = 2062;
+
+    // OPEN: Settings > Security & Privacy > Private Space > Set up > Wait >
+    // > Use screen lock > Set account
+    // CATEGORY: SETTINGS
+    // OS: V
+    PRIVATE_SPACE_SETUP_FINISH = 2063;
+
+    // OPEN: Settings > Apps > Special App Access > Change Media Output
+    // CATEGORY: SETTINGS
+    // OS: V
+    MEDIA_ROUTING_CONTROL = 2064;
 }
 
 // Battery Saver schedule types.
@@ -4176,13 +4479,13 @@
     // The client app doesn't set session source.
     SESSION_UNKNOWN = 0;
     // The session start from opening the Settings app.
-    BROWSE = 1;
+    SESSION_BROWSE = 1;
     // The session start from Settings Search result.
-    SEARCH = 2;
+    SESSION_SEARCH = 2;
     // The session start from other app via Intent.
-    EXTERNAL = 3;
+    SESSION_EXTERNAL = 3;
     // The session start from the Slice invoking.
-    SLICE_TYPE = 4;
+    SESSION_SLICE_TYPE = 4;
 }
 
 // Physical keyboard settings entrypoint type of the from source.
diff --git a/stats/enums/app/tvsettings_enums.proto b/stats/enums/app/tvsettings_enums.proto
index 666f71d..8ef24b3 100644
--- a/stats/enums/app/tvsettings_enums.proto
+++ b/stats/enums/app/tvsettings_enums.proto
@@ -1218,6 +1218,10 @@
     // TvSettings > Connected Devices (Slice) > [A connected device] > Forget
     CONNECTED_SLICE_DEVICE_ENTRY_FORGET = 0x18230000;
 
+    // TvSettings > Connected Devices (Slice) > [A connected audio device] >
+    // Listen to TV audio on this device
+    CONNECTED_SLICE_DEVICE_ENTRY_TOGGLE_ACTIVE_AUDIO_OUTPUT = 0x18240000;
+
     // TvSettings > Connected Devices (Slice) > HDMI-CEC
     CONNECTED_SLICE_HDMICEC = 0x18300000;
 
diff --git a/stats/enums/app/wearservices/wearservices_enums.proto b/stats/enums/app/wearservices/wearservices_enums.proto
index 1dca414..845674b 100644
--- a/stats/enums/app/wearservices/wearservices_enums.proto
+++ b/stats/enums/app/wearservices/wearservices_enums.proto
@@ -136,6 +136,19 @@
   NOTIFICATION_ACTION_REMOVE = 3;
 }
 
+// Describes which transport channel is this notification coming from.
+// Next ID: 3
+enum NotificationTransportChannel {
+  // Unknown notification transport channel
+  NOTIFICATION_TRANSPORT_UNKNOWN = 0;
+
+  // Notification comes from wearable API
+  NOTIFICATION_TRANSPORT_WEARABLE = 1;
+
+  // Notification comes from MCU (only exists on device supported offloading)
+  NOTIFICATION_TRANSPORT_MCU = 2;
+}
+
 // Importance of the notification after this update.
 // Next ID: 8
 enum NotificationImportance {
@@ -164,6 +177,222 @@
   NOTIFICATION_IMPORTANCE_MAX = 7;
 }
 
+// The alerting effect of the notification.
+// Next ID: 5
+enum NotificationAlertingEffect {
+  // Unknown value.
+  NOTIFICATION_ALERTING_EFFECT_UNKNOWN = 0;
+
+  // No alerting effect.
+  NOTIFICATION_ALERTING_EFFECT_NONE = 1;
+
+  // Alerting effect is HAPTICS.
+  NOTIFICATION_ALERTING_EFFECT_HAPTICS = 2;
+
+  // Alerting effect is SOUND.
+  NOTIFICATION_ALERTING_EFFECT_SOUND = 3;
+
+  // Alerting effect is HAPTICS together with SOUND.
+  NOTIFICATION_ALERTING_EFFECT_HAPTICS_AND_SOUND = 4;
+}
+
+// The group alert behavior of the notification.
+//
+// Note: In the Wear SysUI. Alerts will always happen on the child, for example,
+// 1). If summary is set to alert, but the first child is muted, the alert will
+// happen on the child item.
+// 2). If summary and first child both set to alert, there will be only 1 alerts
+// happening on the first child.
+// Therefore, we will overcount if we count alerting summary items, and we will
+// undercount if we skip alerting summary items. And unfortunately we can not
+// avoid this inaccuracy in the metrics.
+// Next ID: 4
+enum NotificationGroupAlertBehavior {
+  // Unknown value.
+  NOTIFICATION_GROUP_ALERT_BEHAVIOR_UNKNOWN = 0;
+
+  // The alert behavior set to ALL, or notification is not grouped, or the group
+  // type matches the alert behavior (e.g. group child, while the alert behavior
+  // is also set to child.)
+  // We collapsed these non-critical cases to reduce cardinality.
+  NOTIFICATION_GROUP_ALERT_BEHAVIOR_ALERT_ALLOWED = 1;
+
+  // The alert behavior is set to ALERT_SUMMARY, but the current notification is
+  // a child.
+  NOTIFICATION_GROUP_ALERT_BEHAVIOR_DELEGATED_TO_SUMMARY = 2;
+
+  // The alert behavior is set to ALERT_CHILD, but the current notification is a
+  // summary.
+  NOTIFICATION_GROUP_ALERT_BEHAVIOR_DELEGATED_TO_CHILD = 3;
+}
+
+// The alert behavior controlled by the ALERT_ONLY_ONCE flag.
+// Next ID: 4
+enum NotificationAlertOnlyOnce {
+  // Unknown value.
+  NOTIFICATION_ALERT_ONLY_ONCE_UNKNOWN = 0;
+
+  // The flag not set.
+  NOTIFICATION_ALERT_ONLY_ONCE_NOT_SET = 1;
+
+  // The flag set, and current item is the first update.
+  NOTIFICATION_ALERT_ONLY_ONCE_ALERT_ON_FIRST = 2;
+
+  // The flag set, and current item is not the first update.
+  NOTIFICATION_ALERT_ONLY_ONCE_MUTE_ON_UPDATES = 3;
+}
+
+// The group type of the notification.
+// Next ID: 4
+enum NotificationGroupType {
+  // Unknown value.
+  NOTIFICATION_GROUP_TYPE_UNKNOWN = 0;
+
+  // No group assigneed
+  NOTIFICATION_GROUP_TYPE_NO_GROUP = 1;
+
+  // This notification is a group summary
+  NOTIFICATION_GROUP_TYPE_GROUP_SUMMARY = 2;
+
+  // This notification is a group child
+  NOTIFICATION_GROUP_TYPE_GROUP_CHILD = 3;
+}
+
+// The style of the notification.
+// Next ID: 7
+enum NotificationStyle {
+  // Unknown value.
+  NOTIFICATION_STYLE_UNKNOWN = 0;
+
+  // The notification has not specific any style.
+  NOTIFICATION_STYLE_UNSPECIFIED = 1;
+
+  // The notification is InboxStyle.
+  NOTIFICATION_STYLE_INBOX = 2;
+
+  // The notification is BigTextStyle.
+  NOTIFICATION_STYLE_BIG_TEXT = 3;
+
+  // The notification is BigPictureStyle.
+  NOTIFICATION_STYLE_BIG_PICTURE = 4;
+
+  // The notification is MessagingStyle.
+  NOTIFICATION_STYLE_MESSAGING = 5;
+
+  // The notification is MediaStyle.
+  NOTIFICATION_STYLE_MEDIA = 6;
+}
+
+// The categories for the notification.
+// Next ID: 7
+enum NotificationCategory {
+  // Unknown value.
+  NOTIFICATION_CATEGORY_UNKNOWN = 0;
+
+  // No category set for the notificatioin.
+  NOTIFICATION_CATEGORY_NONE = 1;
+
+  // Notification set with other categories
+  NOTIFICATION_CATEGORY_OTHERS = 2;
+
+  // Notification set with CATEGORY_CALL.
+  NOTIFICATION_CATEGORY_CALL = 3;
+
+  // Notification set with CATEGORY_ALARM.
+  NOTIFICATION_CATEGORY_ALARM = 4;
+
+  // Notification set with CATEGORY_REMINDER.
+  NOTIFICATION_CATEGORY_REMINDER = 5;
+
+  // Notification set with CATEGORY_EVENT.
+  NOTIFICATION_CATEGORY_EVENT = 6;
+}
+
+// The ongoing type for the notification.
+// Next ID: 7
+enum NotificationHiddenReason {
+  // Unknown value.
+  NOTIFICATION_HIDDEN_REASON_UNKNOWN = 0;
+
+  // The notification is not hidden.
+  NOTIFICATION_HIDDEN_REASON_NONE = 1;
+
+  // The notification hidden with other reasons.
+  NOTIFICATION_HIDDEN_REASON_OTHERS = 2;
+
+  // The notification has set with ongoing activity. Which means it is hidden.
+  NOTIFICATION_HIDDEN_REASON_ONGOING_ACTIVITY = 3;
+
+  // The notification is media style.
+  NOTIFICATION_HIDDEN_REASON_MEDIA_STYLE = 4;
+
+  // The notification is bound with foreground service.
+  NOTIFICATION_HIDDEN_REASON_FOREGROUND_SERVICE = 5;
+
+  // The notification is hidden by dismissal id flow.
+  NOTIFICATION_HIDDEN_REASON_MANAGED_DISMISSAL = 6;
+}
+
+// The content intent button settings for the notification.
+// Next ID: 5
+enum NotificationContentIntent {
+  // Unknown value.
+  NOTIFICATION_CONTENT_INTENT_UNKNOWN = 0;
+
+  // No content intent set.
+  NOTIFICATION_CONTENT_INTENT_NONE = 1;
+
+  // Content intent set with OPEN_ON_WATCH.
+  NOTIFICATION_CONTENT_INTENT_OPEN_ON_WATCH = 2;
+
+  // Content intent set with OPEN_ON_PHONE.
+  NOTIFICATION_CONTENT_INTENT_OPEN_ON_PHONE = 3;
+
+  // Content intent set with BOTH actions.
+  NOTIFICATION_CONTENT_INTENT_BOTH = 4;
+}
+
+// Defines on which device the notification blocked state is changed for an application.
+// Next ID: 4
+enum DeviceLocation {
+  // Unknown value.
+  DEVICE_LOCATION_UNKNOWN = 0;
+
+  // The notification is blocked on the watch.
+  DEVICE_LOCATION_WATCH = 1;
+
+  // The notification is blocked on the phone.
+  DEVICE_LOCATION_PHONE = 2;
+
+  // The notification is blocked both on the watch and the phone.
+  DEVICE_LOCATION_WATCH_AND_PHONE = 3;
+}
+
+// Defines in which profile the application is installed.
+// Next ID: 3
+enum Profile {
+  // Unknown value.
+  PROFILE_UNKNOWN = 0;
+
+  // The application is installed in the personal profile.
+  PROFILE_PERSONAL = 1;
+
+  // The application is installed in the work profile.
+  PROFILE_WORK = 2;
+}
+
+// Defines the blocking status of the application for notifications.
+// Next ID: 3
+enum NotificationBlockingStatus {
+  // Unknown value.
+  NOTIFICATION_BLOCKING_STATUS_UNKNOWN = 0;
+
+  // The notifications for the applications are blocked on the device.
+  NOTIFICATION_BLOCKING_STATUS_BLOCKED = 1;
+
+  // The notifications for the applications are unblocked on the device.
+  NOTIFICATION_BLOCKING_STATUS_UNBLOCKED = 2;
+}
 
 // This enum depicts an action taken on a call
 // Next ID: 4
@@ -334,3 +563,20 @@
   // Depicts an error where creating an outgoing call failed
   DISCONNECTION_ERROR_CODE_OUTGOING_CALL_FAILURE = 5;
 }
+
+// This enum depicts the tether mode of certain watches, they are corresponding
+// to vendor/google_clockwork/sdk/lib/src/com/google/wear/tether/TetherConfigurationClient.java
+// Next ID: 4
+enum TetherConfigurationStatus {
+  // Depicts an unknown tether status
+  TETHER_CONFIGURATION_UNKNOWN = 0;
+
+  // Depicts the watch is in standalone mode
+  TETHER_CONFIGURATION_STANDALONE = 1;
+
+  // Depicts the watch is in tethered mode
+  TETHER_CONFIGURATION_TETHERED = 2;
+
+  // Depicts the watch is in restricted connection mode
+  TETHER_CONFIGURATION_RESTRICTED = 3;
+}
diff --git a/stats/enums/app/wearsettings_enums.proto b/stats/enums/app/wearsettings_enums.proto
index de89b6d..6cf7c2c 100644
--- a/stats/enums/app/wearsettings_enums.proto
+++ b/stats/enums/app/wearsettings_enums.proto
@@ -36,16 +36,28 @@
 }
 
 // IDs for settings UI elements.
-// Next ID: 408
+// Next ID: 497
 enum ItemId {
   // An unknown settings item. This may be set if no preference key is mapped to an enum value or as
   // a catch-all for values not yet added to this proto file.
   UNKNOWN = 0;
 
+  ACCESSIBILITY_COLOR_CORRECTION = 416;
+  ACCESSIBILITY_COLOR_CORRECTION_ENABLED = 417;
+  ACCESSIBILITY_COLOR_CORRECTION_DEUTERANOMALY = 418;
+  ACCESSIBILITY_GESTURES = 419;
   ACCESSIBILITY_COLOR_INVERSION = 103;
+  ACCESSIBILITY_GRAYSCALE_CORRECTION = 420;
+  ACCESSIBILITY_TALKBACK_SETTINGS = 421;
+  ACCESSIBILITY_SERVICE_TALKBACK = 422;
+  ACCESSIBILITY_PROTANOMALY_CORRECTION = 423;
+  ACCESSIBILITY_TRITANOMALY_CORRECTION = 424;
   ACCESSIBILITY_FONT_SIZE = 369;
   ACCESSIBILITY_LARGE_TEXT = 102;
   ACCESSIBILITY_MAGNIFICATION = 104;
+  ACCESSIBILITY_MAGNIFICATION_SIZE = 413;
+  ACCESSIBILITY_MAGNIFICATION_SETTINGS = 414;
+  ACCESSIBILITY_MAGNIFICATION_EDGE_HAPTIC = 415;
   ACCESSIBILITY_SERVICE = 314;
   ACCESSIBILITY_SIDE_BUTTON = 105;
   ACCESSIBILITY_SOUND = 370;
@@ -58,9 +70,11 @@
   ACCESSIBILITY_TTS_ENGINE_LISTENTOSAMPLE = 109;
   ACCESSIBILITY_TTS_RATES = 110;
   ACCESSIBILITY_VIBRATION = 371;
+  ACCESSIBILITY_REDUCE_ANIMATION = 412;
   ACCOUNTS_ADD_ACCOUNT = 115;
   ACCOUNT_REMOVE_ACCOUNT = 230;
   ACTIVE_DEVICE_ADMINS = 113;
+  ACTIVE_UNLOCK = 425;
   APPS_APP_NOTIFICATIONS = 342;
   APPS_APP_STORAGE = 367;
   APPS_ASSISTANT = 366;
@@ -83,6 +97,9 @@
   ASSISTANT_HOTWORD_DETECTION = 197;
   ASSISTANT_LONG_PRESS_TO_ASSISTANT = 336;
   ASSISTANT_VOICE_ASSISTANT = 309;
+  AUDIO_ADJUSTMENT = 409;
+  AUDIO_BALANCE_SLIDER_PREFERENCE = 410;
+  AUDIO_BALANCE_LEFT_RIGHT_TEXT = 411;
   BATTERY_SAVER_AUTO_BATTERY_SAVER_ENABLED = 324;
   BATTERY_SAVER_BATTERY_SAVER = 315;
   BLUETOOTH_ENABLED = 135;
@@ -138,6 +155,8 @@
   CONNECTIVITY_AIRPLANE_MODE = 120;
   CONNECTIVITY_BLUETOOTH = 133;
   CONNECTIVITY_CELLULAR = 20;
+  // WearOS only
+  CONNECTIVITY_CONNECTED_FITNESS = 496;
   CONNECTIVITY_NFC = 219;
   CONNECTIVITY_WIFI = 8;
   DATE_TIME_AUTO_DATE_TIME = 129;
@@ -166,9 +185,11 @@
   DEVELOPER_POINTER_LOCATION = 226;
   DEVELOPER_POWER_OPTIMIZATIONS = 227;
   DEVELOPER_SHOW_TOUCHES = 240;
+  DEVELOPER_SHOW_ROTARY_INPUT = 488;
   DEVELOPER_SMART_ILLUMINATE = 252;
   DEVELOPER_STAY_ON_WHILE_PLUGGED_IN = 255;
   DEVELOPER_TRANSITION_ANIMATION_SCALE = 303;
+  DEVELOPER_USE_DEVELOPER_OPTIONS = 489;
   DEVELOPER_WEAR_DEVELOPER_OPTIONS = 272;
   DEVELOPER_WIFI_LOGGING = 277;
   DEVELOPER_WINDOW_ANIMATION_SCALE = 304;
@@ -223,6 +244,7 @@
   ESIM_TEST_UTIL = 359;
   ESIM_TEST_VOICE_TWINNING_STATE = 362;
   FACTORY_RESET = 193;
+  FONT_BOLD_TEXT = 408;
   GESTURES_TILT_TO_BRIGHT = 344;
   GESTURES_TILT_TO_WAKE = 260;
   GESTURES_TOUCH_TO_WAKE = 320;
@@ -289,6 +311,7 @@
   SYSTEM_INPUT_METHODS = 201;
   SYSTEM_PHONE_SWITCH = 407;
   SYSTEM_SYSTEM_UPDATE = 257;
+  SYSTEM_TTS = 490;
   VIBRATION_LEVEL = 268;
   VIBRATION_MUTE_WHEN_OFF_BODY = 318;
   VIBRATION_VIBRATE_FOR_CALLS = 267;
@@ -307,4 +330,71 @@
   WIFI_TOGGLE = 280;
   WIFI_VIEW_IP_ADDRESS = 281;
   WIFI_VIEW_MAC_ADDRESS = 282;
+  SCREENSHOT_PREFERENCE = 426;
+  SCREEN_UNLOCK_SOUND = 427;
+  CHARGING_SOUNDS = 428;
+  MONO_AUDIO = 429;
+  ROTATORY_WAKE = 430;
+  WATCH_LICENSE = 431;
+  WATCH_SYSTEM_LICENSES = 432;
+  FONT_SLIDER = 433;
+  ASSISTANT_SETTING = 434;
+  ACCOUNT_SETTING = 435;
+  DIVIDER_PREFERENCE = 436;
+  ENTERPRISE_SET_DEFAULT_APPS = 437;
+  ENTERPRISE_INSTALLED_PACKAGES = 438;
+  LOCATION_ACCESS_PACKAGES = 439;
+  MICROPHONE_ACCESS_PACKAGES = 440;
+  CAMERA_ACCESS_PACKAGES = 441;
+  ENTERPRISE_PRIVACY = 442;
+  ESIM_SETTINGS = 443;
+  ESIM_PROFILE_NICKNAME = 444;
+  MAIN_SECURITY = 445;
+  ACCESSIBILITY_VIBRATION_WATCH = 446;
+  ACCESSIBILITY_VIBRATION_WATCH_SWITCH = 447;
+  ACCESSIBILITY_VIBRATION_WATCH_TYPE_DIGIT = 448;
+  ACCESSIBILITY_VIBRATION_WATCH_TYPE_TERSE = 449;
+  ACCESSIBILITY_VIBRATION_WATCH_SPEED = 450;
+  WEAR_BATTERY_SAVER_EXPLANATION_TEXT = 451;
+  BATTERY_SAVER_SECTION_TITLE_TEXT = 452;
+  BATTERY_SAVER_EXPLANATION_TEXT = 453;
+  HIGH_BRIGHTNESS_KEY = 454;
+  ACCESSIBILITY_RTT = 455;
+  DEFAULT_APPS = 456;
+  DEFAULT_ASSIST = 457;
+  USE_TEXT_CONTEXT = 458;
+  USE_TEXT_CONTEXT_SUMMARY = 459;
+  USE_SCREENSHOT = 460;
+  USE_SCREENSHOT_SUMMARY = 461;
+  WIRELESS_DEBUG = 462;
+  WIRELESS_DEBUG_TOGGLE = 463;
+  WIRELESS_DEBUG_DEVICE_NAME = 464;
+  WIRELESS_DEBUG_IP_PORT = 465;
+  WIRELESS_DEBUG_SUMMARY = 466;
+  WIRELESS_DEBUG_PAIRING = 467;
+  WIRELESS_ADB_DEVICE_NAME = 468;
+  WIRELESS_ADB_DEVICE_FINGERPRINT = 469;
+  USAGE_ACCESS = 470;
+  SMDP_ADDRESS = 471;
+  SYSTEM_STATE_OVERLAY_SETTINGS = 472;
+  SYSTEM_STATE_OVERLAY = 473;
+  LANGUAGE_PREFERENCE = 474;
+  FREE_MEM_OVERLAY = 475;
+  PSS_OVERLAY = 476;
+  MANAGE_PERMISSIONS = 477;
+  STEM_1 = 478;
+  STEM_2 = 479;
+  STEM_3 = 480;
+  OEM_UNLOCK_ENABLE = 481;
+  BACKUP_SETTING = 482;
+  ADVANCE_PERMISSIONS_INSTALL_UNKNOWN = 483;
+  WET_MODE = 484;
+  DIAGNOSTICS = 485;
+  PARENTAL_CONTROLS = 486;
+  VIBRATION_SWITCH = 487;
+  WEAR_POWER_ANOMALY_SERVICE = 491;
+  BATTERY_SAVER_SETTINGS = 492;
+  BATTERY_SAVER_AUTO_BATTERY_SAVER_ON = 493;
+  BATTERY_SAVER_AUTO_BATTERY_SAVER_OFF = 494;
+  PRIVACY_DASHBOARD = 495;
 }
diff --git a/stats/enums/bluetooth/enums.proto b/stats/enums/bluetooth/enums.proto
index 854a273..077f3e5 100644
--- a/stats/enums/bluetooth/enums.proto
+++ b/stats/enums/bluetooth/enums.proto
@@ -327,7 +327,7 @@
         LE_SCAN_DURATION_COUNT_BATCH_1H = 120108;
         LE_SCAN_DURATION_COUNT_BATCH_1HP = 120109;
 
-        // [120,200 - 120,300) LE scan radio active duration
+        // [120,200 - 120,250) LE scan radio active duration
         LE_SCAN_RADIO_DURATION_ALL = 120200;
         LE_SCAN_RADIO_DURATION_REGULAR = 120201;
         LE_SCAN_RADIO_DURATION_BATCH = 120202;
@@ -336,6 +336,22 @@
         LE_SCAN_RADIO_DURATION_BATCH_SCREEN_ON = 120205;
         LE_SCAN_RADIO_DURATION_BATCH_SCREEN_OFF = 120206;
 
+        // [120,250 - 120,300) LE scan radio scan mode count
+        LE_SCAN_RADIO_SCAN_MODE_OPPORTUNISTIC_COUNT = 120250;
+        LE_SCAN_RADIO_SCAN_MODE_LOW_POWER_COUNT = 120251;
+        LE_SCAN_RADIO_SCAN_MODE_BALANCED_COUNT = 120252;
+        LE_SCAN_RADIO_SCAN_MODE_LOW_LATENCY_COUNT = 120253;
+        LE_SCAN_RADIO_SCAN_MODE_AMBIENT_DISCOVERY_COUNT = 120254;
+        LE_SCAN_RADIO_SCAN_MODE_SCREEN_OFF_COUNT = 120255;
+        LE_SCAN_RADIO_SCAN_MODE_SCREEN_OFF_BALANCED_COUNT = 120256;
+        LE_SCAN_RADIO_SCAN_MODE_OPPORTUNISTIC_COUNT_SCREEN_OFF = 120257;
+        LE_SCAN_RADIO_SCAN_MODE_LOW_POWER_COUNT_SCREEN_OFF = 120258;
+        LE_SCAN_RADIO_SCAN_MODE_BALANCED_COUNT_SCREEN_OFF = 120259;
+        LE_SCAN_RADIO_SCAN_MODE_LOW_LATENCY_COUNT_SCREEN_OFF = 120260;
+        LE_SCAN_RADIO_SCAN_MODE_AMBIENT_DISCOVERY_COUNT_SCREEN_OFF = 120261;
+        LE_SCAN_RADIO_SCAN_MODE_SCREEN_OFF_COUNT_SCREEN_OFF = 120262;
+        LE_SCAN_RADIO_SCAN_MODE_SCREEN_OFF_BALANCED_COUNT_SCREEN_OFF = 120263;
+
         // [120,300 - 120,400) LE scan results count
         LE_SCAN_RESULTS_COUNT_ALL = 120300;
         LE_SCAN_RESULTS_COUNT_REGULAR = 120301;
@@ -388,7 +404,7 @@
         // [120,800 - 120,900) LE advertise error count
         LE_ADV_ERROR_ON_START_COUNT = 120800;
 
-  // [120,900 - 121,000) GATT Related Count
+   // [120,900 - 121,000) GATT Related Count
         GATT_CLIENT_CONNECT_IS_DIRECT = 120900;
         GATT_CLIENT_CONNECT_IS_AUTOCONNECT = 120901;
         GATT_CLIENT_CONNECT_IS_DIRECT_IN_FOREGROUND = 120902;
@@ -400,6 +416,7 @@
         GATT_SERVER_CONNECT_IS_AUTOCONNECT_IN_FOREGROUND = 120908;
         GATT_SERVER_CONNECT_IS_AUTOCONNECT_NOT_IN_FOREGROUND = 120909;
 
+   // [121,000 - 121,100) System state related
         // [121,000 - 121,010) Screen on/off count
         SCREEN_ON_EVENT = 121000;
         SCREEN_OFF_EVENT = 121001;
diff --git a/stats/enums/corenetworking/platform/enums.proto b/stats/enums/corenetworking/platform/enums.proto
new file mode 100644
index 0000000..af2a3fd
--- /dev/null
+++ b/stats/enums/corenetworking/platform/enums.proto
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.corenetworking.platform;
+
+option java_outer_classname = "platformProtoEnums";
+option java_multiple_files = true;
+
+enum IpType {
+  IT_UNKNOWN = 0;
+  IT_IPv4 = 1;
+  IT_IPv6 = 2;
+  IT_IPv4v6 = 3;
+}
+
+enum EncapType {
+  ET_UNKNOWN = 0;
+  ET_UDP = 1;
+  ET_ESP = 2;
+}
+
+enum ConnectionState {
+  CS_UNKNOWN = 0;
+  CS_CONNECTED = 1;     // vpn connection is connected
+  CS_DISCONNECTED = 2;   // vpn connection is disconnected
+}
+
+enum VpnType {
+  // Consider legacy ones as unknown
+  TYPE_VPN_NONE = 0;
+  TYPE_VPN_SERVICE = 1;
+  TYPE_VPN_PLATFORM = 2;
+  TYPE_VPN_LEGACY = 3;
+  TYPE_VPN_OEM = 4;
+}
+
+enum RecoverAction {
+  RA_NONE = 0;
+  RA_MOBIKE = 1;
+  RA_SESSION_RESET = 2;
+}
+
+enum VpnProfileType {
+  TYPE_UNKNOWN = 0;
+  TYPE_PPTP = 1;
+  TYPE_L2TP_IPSEC_PSK = 2;
+  TYPE_L2TP_IPSEC_RSA = 3;
+  TYPE_TYPE_IPSEC_XAUTH_PSK = 4;
+  TYPE_IPSEC_XAUTH_RSA = 5;
+  TYPE_IPSEC_HYBRID_RSA = 6;
+  TYPE_IKEV2_IPSEC_USER_PASS = 7;
+  TYPE_IKEV2_IPSEC_PSK = 8;
+  TYPE_IKEV2_IPSEC_RSA = 9;
+  TYPE_IKEV2_FROM_IKE_TUN_CONN_PARAMS = 10;
+}
+
+enum ErrorCode {
+  EC_UNKNOWN = 0;
+  EC_NO_ERROR = 1;
+  // ErrorType in IkeProtocolException.java
+  EC_UNSUPPORTED_CRITICAL_PAYLOAD = 2;
+  EC_INVALID_IKE_SPI = 3;
+  EC_INVALID_MAJOR_VERSION = 4;
+  EC_INVALID_SYNTAX = 5;
+  EC_INVALID_MESSAGE_ID = 6;
+  EC_NO_PROPOSAL_CHOSEN = 7;
+  EC_INVALID_KE_PAYLOAD = 8;
+  EC_AUTHENTICATION_FAILED = 9;
+  EC_SINGLE_PAIR_REQUIRED = 10;
+  EC_NO_ADDITIONAL_SAS = 11;
+  EC_INTERNAL_ADDRESS_FAILURE = 12;
+  EC_FAILED_CP_REQUIRED = 13;
+  EC_TS_UNACCEPTABLE = 14;
+  EC_INVALID_SELECTORS = 15;
+  EC_TEMPORARY_FAILURE = 16;
+  EC_CHILD_SA_NOT_FOUND = 17;
+  // ERROR_CODE_* in VpnManager.java
+  EC_NETWORK_UNKNOWN_HOST = 18;
+  EC_NETWORK_PROTOCOL_TIMEOUT = 19;
+  EC_NETWORK_LOST = 20;
+  EC_NETWORK_IO = 21;
+}
diff --git a/stats/enums/dnd/dnd_enums.proto b/stats/enums/dnd/dnd_enums.proto
index c47ebf2..8bef8c5 100644
--- a/stats/enums/dnd/dnd_enums.proto
+++ b/stats/enums/dnd/dnd_enums.proto
@@ -55,6 +55,14 @@
   CONV_NONE = 3;
 }
 
+// Enum used in DNDPolicyProto to indicate the type of channels permitted to
+// break through DND. Mirrors values in ZenPolicy.
+enum ChannelType {
+  CHANNEL_TYPE_UNSET = 0;
+  CHANNEL_TYPE_PRIORITY = 1;
+  CHANNEL_TYPE_NONE = 2;
+}
+
 // Enum used in DNDStateChanged to identify the type of rule that changed.
 enum RuleType {
   UNKNOWN_RULE = 0;
diff --git a/stats/enums/federatedcompute/enums.proto b/stats/enums/federatedcompute/enums.proto
new file mode 100644
index 0000000..06a92e3
--- /dev/null
+++ b/stats/enums/federatedcompute/enums.proto
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.federatedcompute;
+
+option java_outer_classname = "FederatedComputeProtoEnums";
+option java_multiple_files = true;
+
+// Enum used to track federated computation job stages.
+// Next Tag: 45
+enum TrainingEventKind {
+  // Undefined value.
+  TRAIN_UNDEFINED = 0;
+
+  // Indicates that training was scheduled but did not start due to runtime
+  // checks (e.g. insufficient battery levels).
+  TRAIN_NOT_STARTED = 1;
+
+  // Client started downloading train phase info from the server
+  TRAIN_DOWNLOAD_STARTED = 2;
+
+  // Client is about to issue an eligibility eval checkin request to the
+  // server.
+  TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED = 3;
+
+  // Client received eligibility eval plan & checkpoint URIs from the server,
+  // but hasn't downloaded them yet. Also logged when the plan/checkpoint
+  // resources were actually supplied inline in the protocol response message
+  // and no actual HTTP fetch needs to happen anymore. This ensures that this
+  // event can always be compared against
+  // TRAIN_ELIGIBILITY_EVAL_PLAN_RECEIVED.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_PLAN_URI_RECEIVED = 4;
+
+  // Client received an eligibility eval plan from the server.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_PLAN_URI_RECEIVED.
+  TRAIN_ELIGIBILITY_EVAL_PLAN_RECEIVED = 5;
+
+  // Client was told by the server that there is no eligibility eval plan for
+  // the given population.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_NOT_CONFIGURED = 6;
+
+  // Client was rejected from an eligibility eval checkin request.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_TURNED_AWAY = 7;
+
+  // Client issued an eligibility eval checkin request, but an IO error was
+  // encountered.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_ERROR_IO = 8;
+
+  // Client issued an eligibility eval checkin request, but an invalid payload
+  // was received.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_ERROR_INVALID_PAYLOAD = 9;
+
+  // Client issued an eligibility eval checkin request, but got interrupted on
+  // the client. Always preceded by TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_CLIENT_INTERRUPTED = 10;
+
+  // Client issued an eligibility eval checkin request, but server aborted.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_DOWNLOAD_SERVER_ABORTED = 11;
+
+  // Client issued a regular checkin request, but got an IO error.
+  // Always preceded by TRAIN_DOWNLOAD_STARTED.
+  TRAIN_DOWNLOAD_ERROR_IO = 12;
+
+  // Client issued a regular checkin request, but the server returned an
+  // invalid payload.
+  // Always preceded by TRAIN_DOWNLOAD_STARTED.
+  TRAIN_DOWNLOAD_ERROR_INVALID_PAYLOAD = 13;
+
+  // Client issued a regular checin request, but got interrupted on the
+  // client. Always preceded by TRAIN_DOWNLOAD_STARTED.
+  TRAIN_DOWNLOAD_CLIENT_INTERRUPTED = 14;
+
+  // Client issued a regular checin request, but got aborted by the server.
+  // Always preceded by TRAIN_DOWNLOAD_STARTED.
+  TRAIN_DOWNLOAD_SERVER_ABORTED = 15;
+
+  // Client received plan and checkpoint URIs from the server, but hasn't
+  // actually downloaded them yet. Also logged when the plan/checkpoint
+  // resources were actually supplied inline in the protocol response message
+  // and no actual HTTP fetch needs to happen anymore. This ensures that this
+  // event can always be compared against TRAIN_DOWNLOAD_PLAN_RECEIVED.
+  // Always preceded by TRAIN_DOWNLOAD_STARTED.
+  TRAIN_DOWNLOAD_PLAN_URI_RECEIVED = 16;
+
+  // Client received a plan from the server.
+  // Always preceded by TRAIN_DOWNLOADED_PLAN_URI_RECEIVED.
+  TRAIN_DOWNLOAD_PLAN_RECEIVED = 17;
+
+  // Client was rejected from a checkin request.
+  // Always preceded by TRAIN_DOWNLOAD_STARTED.
+  TRAIN_DOWNLOAD_TURNED_AWAY = 18;
+
+  // Client started eligibility eval computation.
+  TRAIN_ELIGIBILITY_EVAL_COMPUTATION_STARTED = 19;
+
+  // Client encountered a TensorFlow error during eligibility eval task
+  // computation.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_COMPUTATION_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_COMPUTATION_ERROR_TENSORFLOW = 20;
+
+  // Reading from disk failed during eligibility eval task computation.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_COMPUTATION_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_COMPUTATION_ERROR_IO = 21;
+
+  // Input parameters are invalid for eligibility eval task computation.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_COMPUTATION_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_COMPUTATION_ERROR_INVALID_ARGUMENT = 22;
+
+  // Client encountered an example selector error during eligibility eval task
+  // computation.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_COMPUTATION_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_COMPUTATION_ERROR_EXAMPLE_ITERATOR = 23;
+
+  // Eligibility eval computation was interrupted by the client.
+  TRAIN_ELIGIBILITY_EVAL_COMPUTATION_CLIENT_INTERRUPTED = 24;
+
+  // Client finished eligibility eval computation.
+  // Always preceded by TRAIN_ELIGIBILITY_EVAL_COMPUTATION_STARTED.
+  TRAIN_ELIGIBILITY_EVAL_COMPUTATION_COMPLETED = 25;
+
+  // Client started computation.
+  TRAIN_COMPUTATION_STARTED = 26;
+
+  // A TensorFlow error was encountered during computation, or the output from
+  // the computation was missing or of an unexpected type. Always preceded by
+  // TRAIN_COMPUTATION_STARTED.
+  TRAIN_COMPUTATION_ERROR_TENSORFLOW = 27;
+
+  // Reading from disk failed during computation.
+  // Always preceded by TRAIN_COMPUTATION_STARTED.
+  TRAIN_COMPUTATION_ERROR_IO = 28;
+
+  // Input parameters are invalid for the given computation.
+  // Always preceded by TRAIN_COMPUTATION_STARTED.
+  TRAIN_COMPUTATION_ERROR_INVALID_ARGUMENT = 29;
+
+  // An error occurred when processing the example selector.
+  // Always preceded by TRAIN_COMPUTATION_STARTED.
+  TRAIN_COMPUTATION_ERROR_EXAMPLE_ITERATOR = 30;
+
+  // Client got interrupted during computation.
+  // Always preceded by TRAIN_COMPUTATION_STARTED.
+  TRAIN_COMPUTATION_CLIENT_INTERRUPTED = 31;
+
+  // Client finished computation.
+  // Always preceded by TRAIN_COMPUTATION_STARTED.
+  TRAIN_COMPUTATION_COMPLETED = 32;
+
+  // Client starts to upload successfully computed results.
+  TRAIN_RESULT_UPLOAD_STARTED = 33;
+
+  // An error occurred during upload.
+  // Always preceded by TRAIN_RESULT_UPLOAD_STARTED.
+  TRAIN_RESULT_UPLOAD_ERROR_IO = 34;
+
+  // Upload was interrupted by the client.
+  // Always preceded by TRAIN_RESULT_UPLOAD_STARTED.
+  TRAIN_RESULT_UPLOAD_CLIENT_INTERRUPTED = 35;
+
+  // Upload was aborted by the server.
+  // Always preceded by TRAIN_RESULT_UPLOAD_STARTED.
+  TRAIN_RESULT_UPLOAD_SERVER_ABORTED = 36;
+
+  // Client uploaded training results to the server
+  // Always preceded by TRAIN_RESULT_UPLOAD_STARTED.
+  TRAIN_RESULT_UPLOADED = 37;
+
+  // Client starts to upload failure report.
+  TRAIN_FAILURE_UPLOAD_STARTED = 38;
+
+  // An error occurred during upload.
+  // Always preceded by TRAIN_FAILURE_UPLOAD_STARTED.
+  TRAIN_FAILURE_UPLOAD_ERROR_IO = 39;
+
+  // Upload was interrupted.
+  // Always preceded by TRAIN_FAILURE_UPLOAD_STARTED.
+  TRAIN_FAILURE_UPLOAD_CLIENT_INTERRUPTED = 40;
+
+  // Upload was interrupted.
+  // Always preceded by TRAIN_FAILURE_UPLOAD_STARTED.
+  TRAIN_FAILURE_UPLOAD_SERVER_ABORTED = 41;
+
+  // Client uploaded failure report to the server
+  // Always preceded by TRAIN_FAILURE_UPLOAD_STARTED.
+  TRAIN_FAILURE_UPLOADED = 42;
+
+  // Client failed to initialize a component, but execution was not halted.
+  TRAIN_INITIALIZATION_ERROR_NONFATAL = 43;
+
+  // Client failed to initialize a component, and execution was halted.
+  TRAIN_INITIALIZATION_ERROR_FATAL = 44;
+}
diff --git a/stats/enums/healthfitness/OWNERS b/stats/enums/healthfitness/OWNERS
new file mode 100644
index 0000000..4d65ae5
--- /dev/null
+++ b/stats/enums/healthfitness/OWNERS
@@ -0,0 +1,2 @@
+teog@google.com
+magdi@google.com
\ No newline at end of file
diff --git a/stats/enums/healthfitness/api/enums.proto b/stats/enums/healthfitness/api/enums.proto
index ae1aa94..a5e269e 100644
--- a/stats/enums/healthfitness/api/enums.proto
+++ b/stats/enums/healthfitness/api/enums.proto
@@ -114,4 +114,11 @@
   VO2_MAX = 32;
   WEIGHT = 33;
   WHEELCHAIR_PUSHES = 34;
-}
\ No newline at end of file
+}
+
+enum ForegroundState {
+  UNSPECIFIED = 0;
+  FOREGROUND = 1;
+  BACKGROUND = 2;
+}
+
diff --git a/stats/enums/healthfitness/ui/enums.proto b/stats/enums/healthfitness/ui/enums.proto
index 8d9eff7..670795d 100644
--- a/stats/enums/healthfitness/ui/enums.proto
+++ b/stats/enums/healthfitness/ui/enums.proto
@@ -33,7 +33,7 @@
     DATA_AND_ACCESS_BUTTON = 2;
     SEE_ALL_RECENT_ACCESS_BUTTON = 3;
     RECENT_ACCESS_ENTRY = 4;
-    BACKUP_DATA_BUTTON = 5;
+    MANAGE_DATA_BUTTON = 153;
 
     // Onboarding page
     ONBOARDING_COMPLETED_BUTTON = 6;
@@ -246,7 +246,24 @@
     ERROR_PAGE_STATE = 151;
     WITH_DATA_PAGE_STATE = 152;
 
-    // Next available: 153;
+    // Manage data page
+    BACKUP_DATA_BUTTON = 5;
+    DATA_SOURCES_AND_PRIORITY_BUTTON = 154;
+    SET_UNITS_BUTTON = 155;
+
+    // Data sources page
+    DATA_TYPE_SPINNER_BUTTON = 156;
+    DATA_TOTALS_CARD = 157;
+    APP_SOURCE_BUTTON = 158;
+    ADD_AN_APP_BUTTON = 159;
+    EDIT_SOURCE_LIST_BUTTON = 160;
+    REORDER_APP_SOURCE_BUTTON = 162;
+    REMOVE_APP_SOURCE_BUTTON = 163;
+
+    // Add an app page
+    POTENTIAL_PRIORITY_APP_BUTTON = 161;
+
+    // Next available: 162;
 
 }
 
@@ -282,6 +299,10 @@
     MIGRATION_MODULE_UPDATE_NEEDED_PAGE = 23;
     MIGRATION_MORE_SPACE_NEEDED_PAGE = 24;
     MIGRATION_PAUSED_PAGE = 25;
+    // New IA and Source controls
+    MANAGE_DATA_PAGE = 26;
+    DATA_SOURCES_PAGE = 27;
+    ADD_AN_APP_PAGE = 28;
 }
 
 enum Action {
diff --git a/stats/enums/input/enums.proto b/stats/enums/input/enums.proto
index 832b3be..6549783 100644
--- a/stats/enums/input/enums.proto
+++ b/stats/enums/input/enums.proto
@@ -114,8 +114,11 @@
 
 /**
  * Criteria for keyboard layout selection
+ * DEPRECATED: Since Enums should include a default UNSPECIFIED value
+ * as the first value in the declaration
  */
 enum KeyboardLayoutSelectionCriteria {
+    option deprecated = true;
     // Manual selection by user
     USER = 0;
     // Auto-detection based on device provided language tag and layout type
@@ -127,6 +130,40 @@
 }
 
 /**
+ * Criteria for keyboard layout selection
+ */
+enum LayoutSelectionCriteriaKeyboard {
+    // Unspecified
+    LAYOUT_SELECTION_CRITERIA_UNSPECIFIED = 0;
+    // Manual selection by user
+    LAYOUT_SELECTION_CRITERIA_USER = 1;
+    // Auto-detection based on device provided language tag and layout type
+    LAYOUT_SELECTION_CRITERIA_DEVICE = 2;
+    // Auto-detection based on IME provided language tag and layout type
+    LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD = 3;
+    // Default selection
+    LAYOUT_SELECTION_CRITERIA_DEFAULT = 4;
+}
+
+/**
+ * Keyboard Layout Type
+ * This enum is for layout types provided both by the physical keyboard
+ * and the  IME
+ */
+enum KeyboardLayoutType {
+    LAYOUT_TYPE_UNDEFINED = 0;
+    LAYOUT_TYPE_QWERTY = 1;
+    LAYOUT_TYPE_QWERTZ = 2;
+    LAYOUT_TYPE_AZERTY = 3;
+    LAYOUT_TYPE_DVORAK = 4;
+    LAYOUT_TYPE_COLEMAK = 5;
+    LAYOUT_TYPE_WORKMAN = 6;
+    LAYOUT_TYPE_TURKISH_F = 7;
+    LAYOUT_TYPE_TURKISH_Q = 8;
+    LAYOUT_TYPE_EXTENDED = 9;
+}
+
+/**
  * Contains usage type/category definitions.
  * Logged in InputDeviceUsageReported atom.
  */
diff --git a/stats/enums/jank/enums.proto b/stats/enums/jank/enums.proto
index 924bd36..ffd472f 100644
--- a/stats/enums/jank/enums.proto
+++ b/stats/enums/jank/enums.proto
@@ -95,11 +95,18 @@
     LOCKSCREEN_CLOCK_MOVE_ANIMATION = 71;
     LAUNCHER_OPEN_SEARCH_RESULT = 72;
     LAUNCHER_APP_CLOSE_TO_HOME_FALLBACK = 79;
-    SHADE_EXPAND_FROM_STATUS_BAR = 80;
     IME_INSETS_SHOW_ANIMATION = 81;
     IME_INSETS_HIDE_ANIMATION = 82;
     SPLIT_SCREEN_DOUBLE_TAP_DIVIDER = 83;
+    LAUNCHER_UNFOLD_ANIM = 84;
+    PREDICTIVE_BACK_CROSS_ACTIVITY = 85;
+    PREDICTIVE_BACK_CROSS_TASK = 86;
+    PREDICTIVE_BACK_HOME = 87;
+    LAUNCHER_SEARCH_QSB_OPEN = 88;
+
     reserved 2;
+    reserved 73 to 78; // For b/281564325.
+    reserved 80;
 }
 
 enum DisplayResolution {
@@ -110,6 +117,16 @@
     QHD = 4; // 2560x1440 <= x
 }
 
+enum DisplayRefreshRate {
+  UNKNOWN_REFRESH_RATE = 0;
+  VARIABLE_REFRESH_RATE = 1; // RR changed during the CUJ.
+  RR_30_HZ = 2;  //        x < 50
+  RR_60_HZ = 3;  //  50 <= x < 80
+  RR_90_HZ = 4;  //  80 <= x < 110
+  RR_120_HZ = 5; // 110 <= x < 180
+  RR_240_HZ = 6; // 180 <= x
+}
+
 /**
   * Enum used by UIActionLatencyReported.
   */
@@ -138,5 +155,8 @@
     ACTION_REQUEST_IME_SHOWN = 21;
     ACTION_REQUEST_IME_HIDDEN = 22;
     ACTION_SMARTSPACE_DOORBELL = 23;
+    reserved 24 to 26; // For b/281564325.
+    ACTION_NOTIFICATION_BIG_PICTURE_LOADED = 27;
+    ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME = 28;
+    ACTION_BACK_SYSTEM_ANIMATION = 29;
 }
-
diff --git a/stats/enums/media/outputswitcher/enums.proto b/stats/enums/media/outputswitcher/enums.proto
index 67e1861..151358e 100644
--- a/stats/enums/media/outputswitcher/enums.proto
+++ b/stats/enums/media/outputswitcher/enums.proto
@@ -55,6 +55,7 @@
   MEDIUMTYPE_CAST_OUTPUT = 2;
   MEDIUMTYPE_PROPRIETARY_OUTPUT = 3;
   MEDIUMTYPE_UNKNOWN = 4;
+  MEDIUMTYPE_BLE = 5;
 }
 
 // Indicates the scan state of list of available devices.
@@ -69,4 +70,5 @@
   MEDIADEVICETYPE_BLUETOOTH = 0;
   MEDIADEVICETYPE_FASTPAIR = 1;
   MEDIADEVICETYPE_BUILTIN_SPEAKER = 2;
+  MEDIADEVICETYPE_SASS = 3;
 }
diff --git a/stats/enums/mms/enums.proto b/stats/enums/mms/enums.proto
index 273d62f..807f3d5 100644
--- a/stats/enums/mms/enums.proto
+++ b/stats/enums/mms/enums.proto
@@ -35,4 +35,5 @@
   MMS_RESULT_ERROR_INVALID_SUBSCRIPTION_ID = 9;
   MMS_RESULT_ERROR_INACTIVE_SUBSCRIPTION = 10;
   MMS_RESULT_ERROR_DATA_DISABLED = 11;
+  MMS_RESULT_ERROR_MMS_DISABLED_BY_CARRIER = 12;
 }
\ No newline at end of file
diff --git a/stats/enums/os/enums.proto b/stats/enums/os/enums.proto
index 1cc3b8f..4c63a2a 100644
--- a/stats/enums/os/enums.proto
+++ b/stats/enums/os/enums.proto
@@ -105,6 +105,16 @@
 
     // Neural Processing Unit.
     TEMPERATURE_TYPE_NPU = 9;
+    TEMPERATURE_TYPE_TPU = 10;
+    TEMPERATURE_TYPE_DISPLAY = 11;
+    TEMPERATURE_TYPE_MODEM = 12;
+    TEMPERATURE_TYPE_SOC = 13;
+    TEMPERATURE_TYPE_WIFI = 14;
+    TEMPERATURE_TYPE_CAMERA = 15;
+    TEMPERATURE_TYPE_FLASHLIGHT = 16;
+    TEMPERATURE_TYPE_SPEAKER = 17;
+    TEMPERATURE_TYPE_AMBIENT = 18;
+    TEMPERATURE_TYPE_POGO = 19;
 }
 
 // Device throttling severity
@@ -140,6 +150,14 @@
     MODEM = 4;
     NPU = 5;
     COMPONENT = 6;
+    TPU = 7;
+    POWER_AMPLIFIER = 8;
+    DISPLAY = 9;
+    SPEAKER = 10;
+    WIFI = 11;
+    CAMERA = 12;
+    FLASHLIGHT = 13;
+    USB_PORT = 14;
 };
 
 // Wakelock types, primarily used by android/os/PowerManager.java.
diff --git a/stats/enums/service/enums.proto b/stats/enums/service/enums.proto
index c0c4242..f524b94 100644
--- a/stats/enums/service/enums.proto
+++ b/stats/enums/service/enums.proto
@@ -54,4 +54,9 @@
     COMPLIANCE_WARNING_BC_1_2 = 2;
     COMPLIANCE_WARNING_MISSING_RP = 3;
     COMPLIANCE_WARNING_OTHER = 4;
+    COMPLIANCE_WARNING_INPUT_POWER_LIMITED = 5;
+    COMPLIANCE_WARNING_MISSING_DATA_LINES = 6;
+    COMPLIANCE_WARNING_ENUMERATION_FAIL = 7;
+    COMPLIANCE_WARNING_FLAKY_CONNECTION = 8;
+    COMPLIANCE_WARNING_UNRELIABLE_IO = 9;
 }
diff --git a/stats/enums/stats/accessibility/accessibility_enums.proto b/stats/enums/stats/accessibility/accessibility_enums.proto
index 3303c01..3bef30a 100644
--- a/stats/enums/stats/accessibility/accessibility_enums.proto
+++ b/stats/enums/stats/accessibility/accessibility_enums.proto
@@ -28,6 +28,7 @@
   A11Y_FLOATING_MENU = 5;
   A11Y_GESTURE = 6;
   A11Y_WEAR_TRIPLE_PRESS_GESTURE = 7;
+  TWO_FINGER_TRIPLE_TAP = 8;
 }
 
 // The service status code.
diff --git a/stats/enums/stats/dnsresolver/dns_resolver.proto b/stats/enums/stats/dnsresolver/dns_resolver.proto
index fa7d370..b859ee9 100644
--- a/stats/enums/stats/dnsresolver/dns_resolver.proto
+++ b/stats/enums/stats/dnsresolver/dns_resolver.proto
@@ -195,6 +195,8 @@
     NT_ETHERNET_VPN = 11;
     // Indicates this network uses a Wi-Fi+Cellular+VPN transport.
     NT_WIFI_CELLULAR_VPN = 12;
+    // Indicates this network uses an Satellite transport.
+    NT_SATELLITE = 13;
 }
 
 enum CacheStatus{
diff --git a/stats/enums/stats/hdmi/enums.proto b/stats/enums/stats/hdmi/enums.proto
index 7621663..a7dc59a 100644
--- a/stats/enums/stats/hdmi/enums.proto
+++ b/stats/enums/stats/hdmi/enums.proto
@@ -122,4 +122,31 @@
     INVALID_OPERAND = 13;
     REFUSED = 14;
     UNABLE_TO_DETERMINE = 15;
+}
+
+// State of the eARC connection.
+// Values correspond to EarcStatus in com.android.server.hdmi.Constants, offset by 1.
+enum ConnectionState {
+    HDMI_EARC_STATUS_UNKNOWN = 0;
+    HDMI_EARC_STATUS_IDLE = 1;
+    HDMI_EARC_STATUS_EARC_PENDING = 2;
+    HDMI_EARC_STATUS_ARC_PENDING = 3;
+    HDMI_EARC_STATUS_EARC_CONNECTED = 4;
+
+}
+
+// Reason parameter of the eARC connection state logging.
+enum LogReason {
+    LOG_REASON_UNKNOWN = 0;
+    LOG_REASON_WAKE = 1;
+    LOG_REASON_EARC_STATUS_CHANGED = 2;
+    LOG_REASON_EARC_STATUS_CHANGED_UNSUPPORTED_PORT = 3;
+    LOG_REASON_EARC_STATUS_CHANGED_WRONG_STATE = 4;
+}
+
+// Reason parameter of the Dynamic soundbar mode state logging.
+enum DynamicSoundbarModeLogReason {
+    LOG_REASON_DSM_UNKNOWN = 0;
+    LOG_REASON_DSM_WAKE = 1;
+    LOG_REASON_DSM_SETTING_TOGGLED = 2;
 }
\ No newline at end of file
diff --git a/stats/enums/stats/ike/ike.proto b/stats/enums/stats/ike/ike.proto
index 91c0541..82b6bd0 100644
--- a/stats/enums/stats/ike/ike.proto
+++ b/stats/enums/stats/ike/ike.proto
@@ -29,6 +29,12 @@
     SESSION_CHILD = 2;
 }
 
+enum SessionState {
+    SESSION_STATE_UNKNOWN = 0;
+    SESSION_STATE_INITIAL = 1;
+    SESSION_STATE_REKEY = 2;
+}
+
 enum IkeState {
     STATE_UNKNOWN = 0;
     STATE_IKE_KILL = 1;
@@ -50,6 +56,7 @@
     STATE_IKE_DELETE_LOCAL_DELETE = 17;
     STATE_IKE_DPD_LOCAL_INFO = 18;
     STATE_IKE_MOBIKE_LOCAL_INFO = 19;
+    STATE_IKE_DPD_ON_DEMAND_LOCAL_INFO = 20;
 
     STATE_CHILD_KILL = 101;
     STATE_CHILD_INITIAL = 102;
@@ -66,6 +73,57 @@
     STATE_CHILD_REKEY_REMOTE_DELETE = 113;
 }
 
+enum DhGroups {
+    DH_GROUP_UNSPECIFIED = 0;
+    DH_GROUP_NONE = 1;
+    DH_GROUP_1024_BIT_MODP = 2;
+    DH_GROUP_1536_BIT_MODP = 5;
+    DH_GROUP_2048_BIT_MODP = 14;
+    DH_GROUP_3072_BIT_MODP = 15;
+    DH_GROUP_4096_BIT_MODP = 16;
+    DH_GROUP_CURVE_25519 = 31;
+}
+
+enum IntegrityAlgorithms {
+    INTEGRITY_ALGORITHM_UNSPECIFIED = 0;
+    INTEGRITY_ALGORITHM_NONE = 1;
+    INTEGRITY_ALGORITHM_HMAC_SHA1_96 = 2;
+    INTEGRITY_ALGORITHM_AES_XCBC_96 = 5;
+    INTEGRITY_ALGORITHM_AES_CMAC_96 = 8;
+    INTEGRITY_ALGORITHM_HMAC_SHA2_256_128 = 12;
+    INTEGRITY_ALGORITHM_HMAC_SHA2_384_192 = 13;
+    INTEGRITY_ALGORITHM_HMAC_SHA2_512_256 = 14;
+}
+
+enum PrfAlgorithms {
+    PSEUDORANDOM_FUNCTION_UNSPECIFIED = 0;
+    PSEUDORANDOM_FUNCTION_HMAC_SHA1 = 2;
+    PSEUDORANDOM_FUNCTION_AES128_XCBC = 4;
+    PSEUDORANDOM_FUNCTION_SHA2_256 = 5;
+    PSEUDORANDOM_FUNCTION_SHA2_384 = 6;
+    PSEUDORANDOM_FUNCTION_SHA2_512 = 7;
+    PSEUDORANDOM_FUNCTION_AES128_CMAC = 8;
+}
+
+enum EncryptionAlgorithms {
+    ENCRYPTION_ALGORITHM_UNSPECIFIED = 0;
+    ENCRYPTION_ALGORITHM_3DES = 3;
+    ENCRYPTION_ALGORITHM_AES_CBC = 12;
+    ENCRYPTION_ALGORITHM_AES_CTR = 13;
+    ENCRYPTION_ALGORITHM_AES_GCM_8 = 18;
+    ENCRYPTION_ALGORITHM_AES_GCM_12 = 19;
+    ENCRYPTION_ALGORITHM_AES_GCM_16 = 20;
+    ENCRYPTION_ALGORITHM_CHACHA20_POLY1305 = 28;
+}
+
+enum KeyLengths {
+    KEY_LEN_UNSPECIFIED = 0;
+    KEY_LEN_UNUSED = 1;
+    KEY_LEN_AES_128 = 128;
+    KEY_LEN_AES_192 = 192;
+    KEY_LEN_AES_256 = 256;
+}
+
 // IkeError consists of 32 bits with the top 4 bits always unset,
 // the next 12 bits representing the error categories and the
 // rest 16 bits representing the detailed error causes.
@@ -106,6 +164,7 @@
     ERROR_PROTOCOL_CHILD_SA_NOT_FOUND= 0x0004002C;
 }
 
+// Deprecated. Use IkeState instead.
 enum IkeTask {
     IKE_TASK_UNSPECIFIED = 0;
     IKE_TASK_ON_DEMAND_DPD = 1;
@@ -122,3 +181,4 @@
     NETWORK_CELLULAR = 2;
 }
 
+
diff --git a/stats/enums/stats/style/style_enums.proto b/stats/enums/stats/style/style_enums.proto
index 84cc8d6..f91599f 100644
--- a/stats/enums/stats/style/style_enums.proto
+++ b/stats/enums/stats/style/style_enums.proto
@@ -50,6 +50,16 @@
     SNAPSHOT = 28;
     WALLPAPER_EFFECT_PROBE = 29;
     WALLPAPER_EFFECT_FG_DOWNLOAD = 30;
+    THEME_COLOR_APPLIED = 31;
+    GRID_APPLIED = 32;
+    CLOCK_APPLIED = 33;
+    CLOCK_COLOR_APPLIED = 34;
+    CLOCK_SIZE_APPLIED = 35;
+    THEMED_ICON_APPLIED = 36;
+    LOCK_SCREEN_NOTIFICATION_APPLIED = 37;
+    SHORTCUT_APPLIED = 38;
+    DARK_THEME_APPLIED = 39;
+    RESET_APPLIED = 40;
 }
 
 enum LocationPreference {
@@ -75,6 +85,7 @@
     LAUNCHED_CROP_AND_SET_ACTION = 6;
     LAUNCHED_DEEP_LINK = 7;
     LAUNCHED_SETTINGS_SEARCH = 8;
+    LAUNCHED_KEYGUARD = 9;
 }
 
 enum EffectPreference {
@@ -85,3 +96,33 @@
     EFFECT_APPLIED_ABORTED = 4;
     EFFECT_APPLIED_STARTED = 5;
 }
+
+enum SetWallpaperEntryPoint {
+    SET_WALLPAPER_ENTRY_POINT_UNSPECIFIED = 0;
+    SET_WALLPAPER_ENTRY_POINT_WALLPAPER_PREVIEW = 1;
+    SET_WALLPAPER_ENTRY_POINT_WALLPAPER_QUICK_SWITCHER = 2;
+    SET_WALLPAPER_ENTRY_POINT_LAUNCHER_WALLPAPER_QUICK_SWITCHER = 3;
+    SET_WALLPAPER_ENTRY_POINT_ROTATION_WALLPAPER = 4;
+    SET_WALLPAPER_ENTRY_POINT_RESET = 5;
+    SET_WALLPAPER_ENTRY_POINT_RESTORE = 6;
+}
+
+enum WallpaperDestination {
+    WALLPAPER_DESTINATION_UNSPECIFIED = 0;
+    WALLPAPER_DESTINATION_HOME_SCREEN = 1;
+    WALLPAPER_DESTINATION_LOCK_SCREEN = 2;
+    WALLPAPER_DESTINATION_HOME_AND_LOCK_SCREEN = 3;
+}
+
+enum ColorSource {
+    COLOR_SOURCE_UNSPECIFIED = 0;
+    COLOR_SOURCE_HOME_SCREEN_WALLPAPER = 1;
+    COLOR_SOURCE_LOCK_SCREEN_WALLPAPER = 2;
+    COLOR_SOURCE_PRESET_COLOR = 3;
+}
+
+enum ClockSize {
+    CLOCK_SIZE_UNSPECIFIED = 0;
+    CLOCK_SIZE_DYNAMIC = 1;
+    CLOCK_SIZE_SMALL = 2;
+}
diff --git a/stats/enums/telephony/enums.proto b/stats/enums/telephony/enums.proto
index 38eb26f..6f73cb6 100644
--- a/stats/enums/telephony/enums.proto
+++ b/stats/enums/telephony/enums.proto
@@ -92,6 +92,14 @@
     NETWORK_TYPE_NR = 20;
 }
 
+// Cellular radio power state, see android/telephony/TelephonyManager.java for definitions.
+enum CellularRadioPowerStateEnum {
+    RADIO_POWER_STATE_UNKNOWN = 0;
+    RADIO_POWER_STATE_OFF = 1;
+    RADIO_POWER_STATE_ON = 2;
+    RADIO_POWER_STATE_UNAVAILABLE = 3;
+}
+
 // Roaming type enums, see android.telephony.ServiceState.RoamingType for definitions.
 enum RoamingTypeEnum {
     ROAMING_TYPE_NOT_ROAMING = 0;
@@ -293,6 +301,7 @@
     DEACTIVATE_REASON_RAT_NOT_ALLOWED = 10;
     DEACTIVATE_REASON_ROAMING_DISABLED = 11;
     DEACTIVATE_REASON_CONCURRENT_VOICE_DATA_NOT_ALLOWED = 12;
+    DEACTIVATE_REASON_DATA_SERVICE_OPTION_NOT_SUPPORTED = 13;
     DEACTIVATE_REASON_DATA_SERVICE_NOT_READY = 14;
     DEACTIVATE_REASON_POWER_OFF_BY_CARRIER = 15;
     DEACTIVATE_REASON_DATA_STALL = 16;
diff --git a/stats/enums/telephony/satellite/enums.proto b/stats/enums/telephony/satellite/enums.proto
index ab96e98..7bc20df 100644
--- a/stats/enums/telephony/satellite/enums.proto
+++ b/stats/enums/telephony/satellite/enums.proto
@@ -69,4 +69,11 @@
   NT_RADIO_TECHNOLOGY_EMTC_NTN = 3;
   /* Proprietary technology like Iridium or Bullitt */
   NT_RADIO_TECHNOLOGY_PROPRIETARY = 4;
-}
\ No newline at end of file
+}
+
+// Handover type from emergency call to satellite messaging
+enum RecommendingHandoverType {
+  RECOMMENDING_HANDOVER_TYPE_UNKNOWN = 0;
+  RECOMMENDING_HANDOVER_TYPE_SOS = 1;
+  RECOMMENDING_HANDOVER_TYPE_T911 = 2;
+}
diff --git a/stats/enums/transparency/enums.proto b/stats/enums/transparency/enums.proto
new file mode 100644
index 0000000..9155002
--- /dev/null
+++ b/stats/enums/transparency/enums.proto
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package com.android.os.transparency;
+
+option java_multiple_files = true;
+
+/**
+ * Digest algorithm types, used in BinaryTransparencyService.java.
+ */
+enum DigestAlgorithmType {
+    DIGEST_ALGORITHM_UNKNOWN = 0;
+    DIGEST_ALGORITHM_CHUNKED_SHA256 = 1;
+    DIGEST_ALGORITHM_CHUNKED_SHA512 = 2;
+    DIGEST_ALGORITHM_VERITY_CHUNKED_SHA256 = 3;
+    DIGEST_ALGORITHM_SHA256 = 4;
+}
diff --git a/stats/enums/uwb/enums.proto b/stats/enums/uwb/enums.proto
index f8ca532..daf5aea 100644
--- a/stats/enums/uwb/enums.proto
+++ b/stats/enums/uwb/enums.proto
@@ -26,6 +26,7 @@
     FIRA = 1;
     CCC = 2;
     CUSTOMIZED = 3;
+    ALIRO = 4;
 }
 // UWB scrambled timestamp sequence (STS) type
 enum Sts {
@@ -100,4 +101,4 @@
     TWO_WAY = 2;
     DL_TDOA = 3;
     OWR_AOA = 4;
-}
\ No newline at end of file
+}
diff --git a/stats/enums/view/inputmethod/OWNERS b/stats/enums/view/inputmethod/OWNERS
new file mode 100644
index 0000000..3870bb2
--- /dev/null
+++ b/stats/enums/view/inputmethod/OWNERS
@@ -0,0 +1,2 @@
+roosa@google.com
+cosminbaies@google.com
diff --git a/stats/enums/view/inputmethod/enums.proto b/stats/enums/view/inputmethod/enums.proto
index 67e6476..cca96de 100644
--- a/stats/enums/view/inputmethod/enums.proto
+++ b/stats/enums/view/inputmethod/enums.proto
@@ -62,6 +62,8 @@
     REASON_REMOVE_IME_SCREENSHOT_FROM_IMMS = 35;
     REASON_UPDATE_IME_PARENT_FROM_IMMS = 36;
     REASON_HIDE_WHEN_INPUT_TARGET_INVISIBLE = 37;
+    REASON_HIDE_CLOSE_CURRENT_SESSION = 38;
+    REASON_HIDE_SOFT_INPUT_FROM_VIEW = 39;
 }
 
 // The type of the IME request, used by android/view/inputmethod/ImeTracker.java.
@@ -174,7 +176,7 @@
     // Started the IME window insets show animation.
     PHASE_CLIENT_CONTROL_ANIMATION = 33;
     // Checked that the IME is controllable.
-    PHASE_CLIENT_DISABLED_USER_ANIMATION = 34;
+    PHASE_CLIENT_DISABLED_USER_ANIMATION = 34 [deprecated = true];
     // Collecting insets source controls.
     PHASE_CLIENT_COLLECT_SOURCE_CONTROLS = 35;
     // Reached the insets source consumer's show request method.
diff --git a/stats/enums/wear/connectivity/enums.proto b/stats/enums/wear/connectivity/enums.proto
new file mode 100644
index 0000000..dc7a6f0
--- /dev/null
+++ b/stats/enums/wear/connectivity/enums.proto
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package com.google.android.wearable.connectivity;
+
+option java_multiple_files = true;
+
+enum MediatorType {
+    WEAR_BLUETOOTH_MEDIATOR = 0;
+    WEAR_CELLULAR_DATA_MEDIATOR = 1;
+    WEAR_CELLULAR_MEDIATOR = 2;
+    WEAR_WIFI_MEDIATOR = 3;
+    WEAR_WIFI_SCAN_MEDIATOR = 4;
+}
+
+enum MediatorAction {
+    ACTION_UNKNOWN = 0;
+    DISABLE_PNO_SCAN = 1;
+    ENABLE_PNO_SCAN = 2;
+    MOBILE_DATA_OFF = 3;
+    MOBILE_DATA_ON = 4;
+    PROXY_CONNECTED = 5;
+    PROXY_DISCONNECTED = 6;
+    RADIO_OFF = 7;
+    RADIO_ON = 8;
+    BT_DISCONNECT_UX_FINISHED = 9;
+}
+
+/**
+ * Keep sorted order in each block. Last enum num is 60
+ */
+enum TriggerEvent {
+    TRIGGER_EVENT_UNKNOWN = 0;
+    BEDTIME_MODE_UPDATE = 1;
+    CELL_ONLY_MODE_UPDATE = 2;
+    DISABLE_MEDIATOR_SETTING_UPDATE = 3;
+    MODE_MANAGER_UPDATE = 4;
+    ON_BOOT_COMPLETED = 5;
+
+    // WearWifiMediator & WearCellularMediator
+    ACTIVITY_MODE_UPDATE = 6;
+    CALL_STATE_CHANGED_EMERGENCY_ENDED = 7;
+    COMPANION_CONNECTION_CHANGED = 8;
+    DEVICE_ENABLE_CHANGED = 9;
+    DEVICE_IDLE_MODE_CHANGED = 10;
+    ON_USER_UNLOCKED = 11;
+    POWER_SAVE_MODE_CHANGED = 12;
+    PROXY_CONNECTED_UPDATE = 13;
+    THERMAL_EMERGENCY_MODE_UPDATE = 14;
+
+    // WearWifiMediator Only
+    CHARGING_STATE_CHANGE = 15;
+    ENABLE_WIFI_WHILE_CHARGING_SETTING = 16;
+    HARDWARE_LOW_POWER_MODE_CHANGE = 17;
+    IN_WIFI_SETTING_MENU = 18;
+    NEW_EMERGENCY_OUTGOING_CALL = 19;
+    NUM_CONFIGURED_NETWORK_UPDATE = 20;
+    NUM_UNMETERED_REQ_UPDATE = 21;
+    NUM_WIFI_REQ_UPDATE = 22;
+    WIFI_BACKOFF_CHANGE = 23;
+    WIFI_ON_WHEN_PROXY_DISCONNECTED_SETTING = 24;
+    WIFI_SETTING_CHANGE = 25;
+    WIFI_STATE_DISABLED = 26;
+    WIFI_STATE_ENABLED = 27;
+    WIFI_STATE_ENABLED_UNEXPECTED = 28;
+
+    // WearCellularMediator Only
+    CELL_AUTO_SETTING = 29;
+    CELL_ON_SETTING = 30;
+    CONNECTION_STATE_CHANGED_PDN_DISCONNECTED = 31;
+    EMERGENCY_CALLBACK_MODE_CHANGED = 32;
+    EMERGENCY_RADIO_ON_TIMEOUT = 33;
+    ESIM_PROFILE_ACTIVATION_SETTING = 34;
+    ESIM_TEST_MODE = 35;
+    HFP_CONNECTION_CHANGED = 36;
+    MOBILE_SIGNAL_DETECTOR_SETTING = 37;
+    NUM_CELLULAR_REQ_UPDATE = 38;
+    SIGNAL_STATE_CHANGED = 39;
+    SIM_STATE_CHANGED = 40;
+    SUBSCRIPTIONS_CHANGED = 41;
+    SUBSCRIPTION_PHONE_STATE_CHANGED = 42;
+    VOWIFI_STATE_UPDATE = 43;
+    WIFI_CONNECTED_UPDATE = 44;
+    WIFI_DISCONNECTED_UPDATE = 45;
+    WIFI_SIGNAL_STRENGTH_CHANGE = 46;
+
+    // WearCellularDataMediator Only
+    FORCE_CELLULAR_DATA_UPDATE = 47;
+    ON_CELLULAR_SIGNAL_CHANGED = 48;
+    SUBSCRIPTION_UPDATE = 49;
+    WIFI_CONNECTION_UPDATE = 50;
+
+    BATTERY_SAVER_MODE_UPDATE = 51;
+    NO_DATA_UPDATE = 52;
+    INTERACTIVE_MODE_UPDATE = 53;
+    AIRPLANE_MODE_UPDATE = 54;
+    POOR_SIGNAL_DETECTION_UPDATE = 55;
+    CONNECTIVITY_KEEP_DATA_ON_UPDATE = 56;
+    UI_TIMEOUT_NO_INTERACTION = 57;
+    UI_BT_DISCONNECT_INTENDED = 58;
+    UI_WAIT_FOR_BT_RECONNECT = 59;
+    UI_CANCELLED = 60;
+}
+
+/**
+ * Keep sorted order in each block. Last enum num is 52
+ */
+enum Reason {
+    REASON_UNKNOWN = 0;
+    OFF_ACTIVITY_MODE = 1;
+    OFF_BEDTIME_MODE_ENABLED = 2;
+    OFF_CELL_ONLY_MODE = 3;
+    OFF_MODE_MANAGER = 4;
+    OFF_THERMAL_EMERGENCY = 5;
+    OFF_USER_ABSENT = 6;
+    OFF_WIFI_CONNECTED = 7;
+    ON_CELL_ONLY_MODE = 8;
+    ON_TEST_DEFAULT_STATE = 9;
+
+    // WearWifiMediator & WearCellularMediator
+    OFF_DEVICE_DISABLED = 10;
+    OFF_DIRECTBOOT = 11;
+    OFF_POWER_SAVE = 12;
+    ON_EMERGENCY = 13;
+    ON_NETWORK_REQUEST = 14;
+    ON_PROXY_DISCONNECTED = 15;
+
+    // WearBluetoothMediator Only
+    OFF_TIME_ONLY_MODE = 16;
+    OFF_SETTINGS_PREFERENCE = 17;
+    ON_AUTO = 18;
+    ON_BOOT_AUTO = 19;
+    OFF_HFP_ENABLE = 20;
+    ON_HFP_ENABLE = 21;
+    ON_CONNECTED = 22;
+    ON_CONNECTED_NO_INTERNET = 23;
+    OFF_DISCONNECTED = 24;
+
+    // WearWifiMediator Only
+    OFF_HARDWARE_LOW_POWER = 25;
+    OFF_NO_CONFIGURED_NETWORKS = 26;
+    OFF_NO_REQUESTS = 27;
+    OFF_WAIT_FOR_BT_ON_BOOT = 28;
+    OFF_WIFI_BACKOFF = 29;
+    OFF_WIFI_SETTING_OFF = 30;
+    ON_CHARGING = 31;
+    ON_IN_WIFI_SETTINGS = 32;
+
+    // WearWifiScanMediator Only
+    NO_DISABLE_REASONS = 33;
+    MODE_MANAGER_REQUEST = 34;
+
+    // WearCellularMediator Only
+    OFF_BEDTIME_HFP = 35;
+    OFF_CELL_SETTING = 36;
+    OFF_ESIM_DEACTIVATED = 37;
+    OFF_INITIAL_BOOT = 38;
+    OFF_NO_SIGNAL = 39;
+    OFF_PROXY_CONNECTED = 40;
+    OFF_SIM_ABSENT = 41;
+    OFF_UNSTABLE_SIGNAL = 42;
+    OFF_VOWIFI_AVAILABLE = 43;
+    ON_ESIM_TEST_MODE = 44;
+    ON_NO_CELL_AUTO = 45;
+    ON_PHONE_CALL = 46;
+
+    // WearCellularDataMediator Only
+    OFF_FORCE_CELLULAR_DATA_OFF = 47;
+    ON_NO_DISABLE_REASONS = 48;
+    OFF_CELL_POOR_SIGNAL = 49;
+
+    OFF_NO_DATA_ENABLED = 50;
+    OFF_POOR_SIGNAL = 51;
+    ON_PEEK_SIGNAL = 52;
+}
diff --git a/stats/enums/wear/media/enums.proto b/stats/enums/wear/media/enums.proto
index eba078f..e7789fc 100644
--- a/stats/enums/wear/media/enums.proto
+++ b/stats/enums/wear/media/enums.proto
@@ -30,6 +30,14 @@
   RESUME = 5;
   VOLUME_INCREASE = 6;
   VOLUME_DECREASE = 7;
+  SEEK_IN_CURRENT_MEDIA_ITEM = 8;
+  SEEK_BACK = 9;
+  SEEK_FORWARD = 10;
+  // CustomActions can be used to extend the capabilities of the standard transport controls
+  // by exposing app specific actions to Controllers. This is for app defined custom actions
+  // insteractions captured by wear media controls. For more information, see
+  // https://developer.android.com/reference/android/media/session/PlaybackState.CustomAction
+  CUSTOM_ACTION = 11;
 }
 
 // Indicates the type of launch source
diff --git a/stats/enums/wear/modes/enums.proto b/stats/enums/wear/modes/enums.proto
new file mode 100644
index 0000000..152be6c
--- /dev/null
+++ b/stats/enums/wear/modes/enums.proto
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package com.google.android.wearable.modes.telemetry;
+
+// Indicates type of Mode state
+enum ModeState {
+  MODE_STATE_UNKNOWN = 0;
+  MODE_STATE_OFF = 1;
+  MODE_STATE_ON = 2;
+}
+
+// Indicates Mode Id for a specific mode
+enum ModeId {
+  UNKNOWN_MODE = 0;
+  AIRPLANE_MODE = 1;
+  BEDTIME_MODE = 2;
+  BATTERY_SAVER_MODE = 3;
+  DO_NOT_DISTURB_MODE = 4;
+  THEATER_MODE = 5;
+  TOUCH_LOCK_MODE = 6;
+  SCHOOL_MODE = 7;
+  OFF_BODY = 8;
+}
+
+// Indicates Network state as being on or off
+enum NetworkState {
+  UNKNOWN = 0;
+  OFF = 1;
+  ON = 2;
+}
diff --git a/stats/enums/wifi/enums.proto b/stats/enums/wifi/enums.proto
index 9dd4a57..50cd220 100644
--- a/stats/enums/wifi/enums.proto
+++ b/stats/enums/wifi/enums.proto
@@ -50,7 +50,10 @@
     WIFI_MODE_FULL_LOW_LATENCY = 4;
 }
 
-// What permission model the caller has
+/**
+ * What permission model the caller has.
+ * Calculated with WifiPermissionsUtil#getWifiCallerType
+ */
 enum WifiCallerType {
     UNKNOWN = 0;
     SETTINGS = 1; // caller is SETTINGS or SETUP_WIZARD
@@ -203,6 +206,58 @@
     STA_STATUS_CONNECTED_6_GHZ = 4;
 }
 
+enum EapType {
+    // Unknown Type
+    TYPE_UNKNOWN = 0;
+    // EAP_TLS (13)
+    TYPE_EAP_TLS = 1;
+    // EAP_TTLS (21)
+    TYPE_EAP_TTLS = 2;
+    // EAP_SIM (18)
+    TYPE_EAP_SIM = 3;
+    // EAP_AKA (23)
+    TYPE_EAP_AKA = 4;
+    // EAP_AKA_PRIME (50)
+    TYPE_EAP_AKA_PRIME = 5;
+    TYPE_EAP_WAPI_CERT = 6;
+    TYPE_EAP_UNAUTH_TLS = 7;
+    TYPE_EAP_PEAP = 8;
+    TYPE_EAP_PWD = 9;
+    TYPE_EAP_OTHERS = 10;
+}
+
+enum EapInnerMethod {
+    METHOD_UNKNOWN = 0;
+    METHOD_PAP = 1;
+    METHOD_MSCHAP = 2;
+    METHOD_MSCHAP_V2 = 3;
+    METHOD_OTHERS = 4;
+    // Generic Token Card
+    METHOD_GTC = 5;
+    // EAP-Subscriber Identity Module [RFC-4186]
+    METHOD_SIM = 6;
+    // EAP-Authentication and Key Agreement [RFC-4187]
+    METHOD_AKA = 7;
+    // EAP-Authentication and Key Agreement Prime [RFC-5448]
+    METHOD_AKA_PRIME = 8;
+}
+
+enum RoamingType {
+    ROAMING_UNKNOWN = 0;
+    // Not a Passpoint network
+    ROAMING_NOT_PASSPOINT = 1;
+    // Non-Roaming
+    ROAMING_NONE = 2;
+    // Other RCOI Roaming
+    ROAMING_RCOI_OTHERS = 3;
+    // Free OpenRoaming
+    ROAMING_RCOI_OPENROAMING_FREE = 4;
+    // Settled OpenRoaming
+    ROAMING_RCOI_OPENROAMING_SETTLED = 5;
+    // Not RCOI roaming
+    ROAMING_NOT_RCOI = 6;
+}
+
 /**
  * Wi-Fi Standards
  */
@@ -263,4 +318,59 @@
     AWARE_INITIATE_BOOTSTRAPPING_REQUEST = 20;
     AWARE_RESPOND_TO_BOOTSTRAPPING_INDICATION_REQUEST = 21;
     AWARE_TERMINATE_PAIRING_REQUEST = 22;
-}
\ No newline at end of file
+}
+
+/**
+ * Wi-Fi Security modes defined by the combinations of cipher suite, AKM and PMF
+ */
+enum SecurityMode {
+    SECURITY_MODE_UNKNOWN = 0;
+    SECURITY_MODE_INVALID = 1;
+    SECURITY_MODE_WPA3_ENTERPRISE_192_BIT = 2;
+    SECURITY_MODE_WPA3_ENTERPRISE = 3;
+    SECURITY_MODE_WPA3_PERSONAL = 4;
+    SECURITY_MODE_WPA3_WPA2_PERSONAL_TRANSITION = 5;
+    SECURITY_MODE_DPP = 6;
+    SECURITY_MODE_WPA2_PERSONAL = 7;
+    SECURITY_MODE_WPA2_WPA_PERSONAL_TRANSITION = 8;
+    SECURITY_MODE_WAPI_CERT = 9;
+    SECURITY_MODE_WAPI_PSK = 10;
+    SECURITY_MODE_WPA_ENTERPRISE_LEGACY = 11;
+    SECURITY_MODE_WPA_PERSONAL_LEGACY = 12;
+    SECURITY_MODE_OWE = 13;
+    SECURITY_MODE_OWE_TRANSITION = 14;
+    SECURITY_MODE_WEP = 15;
+    SECURITY_MODE_NONE = 16;
+}
+
+enum TofuConfiguration {
+    // Default value.
+    TOFU_CONFIGURATION_UNSPECIFIED = 0;
+    // TOFU is not enabled on the enterprise config.
+    TOFU_CONFIGURATION_NOT_ENABLED = 1;
+    // TOFU is enabled pre-connection.
+    TOFU_CONFIGURATION_ENABLED_PRE_CONNECTION = 2;
+    // Root CA was configured post-TOFU connection.
+    TOFU_CONFIGURATION_CONFIGURE_ROOT_CA = 3;
+    // Certificate pinning was used post-TOFU connection.
+    TOFU_CONFIGURATION_CERT_PINNING = 4;
+}
+
+/**
+ * Passpoint release versions
+ */
+enum PasspointRelease {
+  PASSPOINT_RELEASE_UNKNOWN = 0;
+  PASSPOINT_RELEASE_1 = 1;
+  PASSPOINT_RELEASE_2 = 2;
+  PASSPOINT_RELEASE_3 = 3;
+}
+
+/**
+ * Wi-Fi usability state as predicted by the network scorer
+ */
+enum WifiPredictedUsabilityState {
+   WIFI_USABILITY_PREDICTED_UNKNOWN = 0;
+   WIFI_USABILITY_PREDICTED_USABLE = 1;
+   WIFI_USABILITY_PREDICTED_UNUSABLE = 2;
+ }
diff --git a/stats/express/catalog/bluetooth.cfg b/stats/express/catalog/bluetooth.cfg
index 6768534..600a001 100644
--- a/stats/express/catalog/bluetooth.cfg
+++ b/stats/express/catalog/bluetooth.cfg
@@ -14,7 +14,7 @@
     id: "bluetooth.value_cvsd_codec_usage_over_hfp"
     type: COUNTER
     display_name: "HFP codec usage -- CVSD"
-    description: "Counter on how many time CVSD codec is used for HFP."
+    description: "Counter on how many times CVSD codec is used for HFP."
     owner_email: "wescande@google.com"
     owner_email: "rotkiewicz@google.com"
     unit: UNIT_COUNT
@@ -24,7 +24,7 @@
     id: "bluetooth.value_msbc_codec_usage_over_hfp"
     type: COUNTER
     display_name: "HFP codec usage -- mSbc"
-    description: "Counter on how many time mSbc codec is used for HFP."
+    description: "Counter on how many times mSbc codec is used for HFP."
     owner_email: "wescande@google.com"
     owner_email: "rotkiewicz@google.com"
     unit: UNIT_COUNT
@@ -34,7 +34,7 @@
     id: "bluetooth.value_aptx_codec_usage_over_hfp"
     type: COUNTER
     display_name: "HFP codec usage -- AptX"
-    description: "Counter on how many time AptX codec is used for HFP."
+    description: "Counter on how many times AptX codec is used for HFP."
     owner_email: "wescande@google.com"
     owner_email: "rotkiewicz@google.com"
     unit: UNIT_COUNT
@@ -44,8 +44,53 @@
     id: "bluetooth.value_lc3_codec_usage_over_hfp"
     type: COUNTER
     display_name: "HFP codec usage -- LC3"
-    description: "Counter on how many time LC3 codec is used for HFP."
+    description: "Counter on how many times LC3 codec is used for HFP."
     owner_email: "wescande@google.com"
     owner_email: "rotkiewicz@google.com"
     unit: UNIT_COUNT
 }
+
+express_metric {
+    id: "bluetooth.value_auto_on_supported"
+    type: COUNTER
+    display_name: "Auto on -- support"
+    description: "How many times the Bluetooth start with AutoOnFeature supported"
+    owner_email: "wescande@google.com"
+    unit: UNIT_COUNT
+}
+
+express_metric {
+    id: "bluetooth.value_auto_on_triggered"
+    type: COUNTER
+    display_name: "Auto on -- trigger"
+    description: "How many times the Bluetooth restart because of AutoOnFeature"
+    owner_email: "wescande@google.com"
+    unit: UNIT_COUNT
+}
+
+express_metric {
+    id: "bluetooth.value_auto_on_disabled"
+    type: COUNTER
+    display_name: "Auto on -- disabled"
+    description: "How many times the user manually disable the AutoOnFeature"
+    owner_email: "wescande@google.com"
+    unit: UNIT_COUNT
+}
+
+express_metric {
+    id: "bluetooth.value_auto_on_enabled"
+    type: COUNTER
+    display_name: "Auto on -- enabled"
+    description: "How many times the user manually enable the AutoOnFeature"
+    owner_email: "wescande@google.com"
+    unit: UNIT_COUNT
+}
+
+express_metric {
+    id: "bluetooth.value_auto_on_hidden_usage"
+    type: COUNTER
+    display_name: "Auto on -- usage of pre-V hidden API"
+    description: "How many times the AutoOnFeature is used on device prior to V"
+    owner_email: "wescande@google.com"
+    unit: UNIT_COUNT
+}
diff --git a/stats/express/catalog/content_capture.cfg b/stats/express/catalog/content_capture.cfg
new file mode 100644
index 0000000..c1b2956
--- /dev/null
+++ b/stats/express/catalog/content_capture.cfg
@@ -0,0 +1,8 @@
+express_metric {
+    id: "content_capture.value_content_capture_wrong_thread_count"
+    display_name: "Content Capture running on wrong thread count"
+    description: "Number of times Content Capture running on the wrong thread"
+    owner_email: "mingweiliao@google.com"
+    unit: UNIT_COUNT
+    type: COUNTER
+}
diff --git a/stats/express/catalog/device_lock.cfg b/stats/express/catalog/device_lock.cfg
new file mode 100644
index 0000000..e9e571b
--- /dev/null
+++ b/stats/express/catalog/device_lock.cfg
@@ -0,0 +1,24 @@
+
+# Value metrics related to Device Lock
+
+express_metric {
+  id: "device_lock.value_resets_unsuccessful_provisioning_mandatory"
+  type: COUNTER
+  display_name: "Device Lock device reset for mandatory provisioning"
+  description: "The counter of device reset events due to unsuccessful MANDATORY provisioning logged in Device Lock"
+  owner_email: "bojiandu@google.com"
+  owner_email: "rajekumar@google.com"
+  owner_email: "zzhen@google.com"
+  unit: UNIT_COUNT
+}
+
+express_metric {
+  id: "device_lock.value_resets_unsuccessful_provisioning_deferred"
+  type: COUNTER
+  display_name: "Device Lock device reset for deferred provisioning"
+  description: "The counter of device reset events due to unsuccessful DEFERRED provisioning logged in Device Lock"
+  owner_email: "bojiandu@google.com"
+  owner_email: "rajekumar@google.com"
+  owner_email: "zzhen@google.com"
+  unit: UNIT_COUNT
+}
diff --git a/stats/express/catalog/speech_recognition.cfg b/stats/express/catalog/speech_recognition.cfg
new file mode 100644
index 0000000..79f5de1
--- /dev/null
+++ b/stats/express/catalog/speech_recognition.cfg
@@ -0,0 +1,17 @@
+express_metric {
+    id: "speech_recognition.value_exceed_service_connections_count"
+    display_name: "Refused session creations due to exceeding connected services"
+    description: "Counting how many sessions were dropped due to too many connected services"
+    owner_email: "hackz@google.com"
+    unit: UNIT_COUNT
+    type: COUNTER_WITH_UID
+}
+
+express_metric {
+    id: "speech_recognition.value_exceed_session_count"
+    display_name: "Refused session creations due to exceeding session limit"
+    description: "Counting how many sessions were dropped due to too many sessions"
+    owner_email: "hackz@google.com"
+    unit: UNIT_COUNT
+    type: COUNTER_WITH_UID
+}
diff --git a/stats/express/catalog/virtual_devices.cfg b/stats/express/catalog/virtual_devices.cfg
new file mode 100644
index 0000000..7d791b7
--- /dev/null
+++ b/stats/express/catalog/virtual_devices.cfg
@@ -0,0 +1,8 @@
+express_metric {
+    id: "virtual_devices.value_virtual_devices_created_count"
+    display_name: "Virtual Devices created count"
+    description: "Number of times Virtual Devices are created."
+    owner_email: "if-vdm@google.com"
+    unit: UNIT_COUNT
+    type: COUNTER
+}
diff --git a/stats/express/expresscatalogvalidator/Android.bp b/stats/express/expresscatalogvalidator/Android.bp
index 8caaf62..fe3f7a1 100644
--- a/stats/express/expresscatalogvalidator/Android.bp
+++ b/stats/express/expresscatalogvalidator/Android.bp
@@ -15,6 +15,7 @@
 //
 
 package {
+    default_team: "trendy_team_android_telemetry_infra",
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
diff --git a/stats/stats_log_api_gen/Android.bp b/stats/stats_log_api_gen/Android.bp
index a5705dc..c1791de 100644
--- a/stats/stats_log_api_gen/Android.bp
+++ b/stats/stats_log_api_gen/Android.bp
@@ -18,6 +18,7 @@
 // Build the host executable: stats-log-api-gen
 // ==========================================================
 package {
+    default_team: "trendy_team_android_telemetry_infra",
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
@@ -54,6 +55,32 @@
     proto: {
         type: "full",
     },
+
+    tidy: true,
+
+    tidy_checks: [
+        "android-*",
+        "bugprone-*",
+        "cert-*",
+        "clang-analyzer-security*",
+        "google-*",
+        "misc-*",
+        "performance-*",
+        "-bugprone-narrowing-conversions", // lots of unsigned -> int conversions
+        "-cert-err34-c",
+        "-cert-msc30-c", // warning: rand() has limited randomness; use C++11 random library
+        "-cert-msc50-cpp", // warning: rand() has limited randomness; use C++11 random library
+    ],
+
+    tidy_checks_as_errors: [
+        "android-*",
+        "bugprone-*",
+        "cert-*",
+        "clang-analyzer-security*",
+        "google-*",
+        "misc-*",
+        "performance-*",
+    ],
 }
 
 // ==========================================================
diff --git a/stats/stats_log_api_gen/Collation.cpp b/stats/stats_log_api_gen/Collation.cpp
index 32be56c..bc360e4 100644
--- a/stats/stats_log_api_gen/Collation.cpp
+++ b/stats/stats_log_api_gen/Collation.cpp
@@ -16,10 +16,13 @@
 
 #include "Collation.h"
 
+#include <google/protobuf/descriptor.h>
+#include <stdarg.h>
 #include <stdio.h>
 
 #include <map>
 
+#include "frameworks/proto_logging/stats/atom_field_options.pb.h"
 #include "frameworks/proto_logging/stats/atoms.pb.h"
 #include "frameworks/proto_logging/stats/attribution_node.pb.h"
 #include "utils.h"
@@ -30,7 +33,6 @@
 using google::protobuf::EnumDescriptor;
 using google::protobuf::FieldDescriptor;
 using google::protobuf::FileDescriptor;
-using google::protobuf::OneofDescriptor;
 using google::protobuf::SourceLocation;
 using std::make_shared;
 using std::map;
@@ -74,6 +76,7 @@
  * Print an error message for a FieldDescriptor, including the file name and
  * line number.
  */
+// NOLINTNEXTLINE(cert-dcl50-cpp)
 static void print_error(const FieldDescriptor& field, const char* format, ...) {
     const Descriptor* message = field.containing_type();
     const FileDescriptor* file = message->file();
@@ -95,9 +98,9 @@
 /**
  * Convert a protobuf type into a java type.
  */
-static java_type_t java_type(const FieldDescriptor& field) {
-    int protoType = field.type();
-    bool isRepeatedField = field.is_repeated();
+static java_type_t java_type(const FieldDescriptor& field, const bool isUintAllowed) {
+    const int protoType = field.type();
+    const bool isRepeatedField = field.is_repeated();
 
     switch (protoType) {
         case FieldDescriptor::TYPE_FLOAT:
@@ -127,9 +130,10 @@
         case FieldDescriptor::TYPE_BYTES:
             return isRepeatedField ? JAVA_TYPE_UNKNOWN_OR_INVALID : JAVA_TYPE_BYTE_ARRAY;
         case FieldDescriptor::TYPE_UINT64:
-            return isRepeatedField ? JAVA_TYPE_UNKNOWN_OR_INVALID : JAVA_TYPE_LONG;
+            return isRepeatedField || !isUintAllowed ? JAVA_TYPE_UNKNOWN_OR_INVALID
+                                                     : JAVA_TYPE_LONG;
         case FieldDescriptor::TYPE_UINT32:
-            return isRepeatedField ? JAVA_TYPE_UNKNOWN_OR_INVALID : JAVA_TYPE_INT;
+            return isRepeatedField || !isUintAllowed ? JAVA_TYPE_UNKNOWN_OR_INVALID : JAVA_TYPE_INT;
         default:
             return JAVA_TYPE_UNKNOWN_OR_INVALID;
     }
@@ -387,22 +391,27 @@
         expectedNumber++;
     }
 
+    // Check if atom is in uint type allowlist.
+    std::string atomName = atom.name();
+    bool isUintAllowed = !(find(begin(UINT_ATOM_ALLOWLIST), end(UINT_ATOM_ALLOWLIST), atomName) ==
+                           end(UINT_ATOM_ALLOWLIST));
+
     // Check that only allowed types are present. Remove any invalid ones.
     for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
          it++) {
         const FieldDescriptor& field = *it->second;
-        bool isBinaryField = field.options().GetExtension(os::statsd::log_mode) ==
-                             os::statsd::LogMode::MODE_BYTES;
+        const bool isBinaryField = field.options().GetExtension(os::statsd::log_mode) ==
+                                   os::statsd::LogMode::MODE_BYTES;
 
-        java_type_t javaType = java_type(field);
+        const java_type_t javaType = java_type(field, isUintAllowed);
 
         if (javaType == JAVA_TYPE_UNKNOWN_OR_INVALID) {
             if (field.is_repeated()) {
-                print_error(field, "Repeated field type %d is not allowed for field: %s\n",
-                            field.type(), field.name().c_str());
+                print_error(field, "Repeated field type %s is not allowed for field: %s\n",
+                            field.type_name(), field.name().c_str());
             } else {
-                print_error(field, "Field type %d is not allowed for field: %s\n", field.type(),
-                            field.name().c_str());
+                print_error(field, "Field type %s is not allowed for field: %s\n",
+                            field.type_name(), field.name().c_str());
             }
             errorCount++;
             continue;
@@ -435,10 +444,10 @@
     // Check that if there's an attribution chain, it's at position 1.
     for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
          it++) {
-        int number = it->first;
+        const int number = it->first;
         if (number != 1) {
             const FieldDescriptor& field = *it->second;
-            java_type_t javaType = java_type(field);
+            const java_type_t javaType = java_type(field, isUintAllowed);
             if (javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
                 print_error(field,
                             "AttributionChain fields must have field id 1, in message: '%s'\n",
@@ -452,9 +461,9 @@
     for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
          it++) {
         const FieldDescriptor& field = *it->second;
-        java_type_t javaType = java_type(field);
-        bool isBinaryField = field.options().GetExtension(os::statsd::log_mode) ==
-                             os::statsd::LogMode::MODE_BYTES;
+        const java_type_t javaType = java_type(field, isUintAllowed);
+        const bool isBinaryField = field.options().GetExtension(os::statsd::log_mode) ==
+                                   os::statsd::LogMode::MODE_BYTES;
 
         AtomField atField(field.name(), javaType);
 
@@ -506,7 +515,7 @@
     for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
          it++) {
         const FieldDescriptor& field = *it->second;
-        java_type_t javaType = java_type(field);
+        const java_type_t javaType = java_type(field, true);
         if (javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
             atomDecl.fields.insert(atomDecl.fields.end(), attributionDecl.fields.begin(),
                                    attributionDecl.fields.end());
@@ -590,7 +599,7 @@
     const AtomType atomType = getAtomType(atomField);
 
     const Descriptor& atom = *atomField.message_type();
-    shared_ptr<AtomDecl> atomDecl =
+    const shared_ptr<AtomDecl> atomDecl =
             make_shared<AtomDecl>(atomField.number(), atomField.name(), atom.name(), atomType);
 
     if (atomField.options().GetExtension(os::statsd::truncate_timestamp)) {
@@ -631,7 +640,7 @@
 
     atoms.decls.insert(atomDecl);
 
-    shared_ptr<AtomDecl> nonChainedAtomDecl =
+    const shared_ptr<AtomDecl> nonChainedAtomDecl =
             make_shared<AtomDecl>(atomField.number(), atomField.name(), atom.name(), atomType);
     vector<java_type_t> nonChainedSignature;
     if (get_non_chained_node(atom, *nonChainedAtomDecl, nonChainedSignature)) {
diff --git a/stats/stats_log_api_gen/Collation.h b/stats/stats_log_api_gen/Collation.h
index c1f4ee4..b5095f8 100644
--- a/stats/stats_log_api_gen/Collation.h
+++ b/stats/stats_log_api_gen/Collation.h
@@ -31,7 +31,6 @@
 
 using google::protobuf::Descriptor;
 using google::protobuf::FieldDescriptor;
-using google::protobuf::OneofDescriptor;
 using std::map;
 using std::set;
 using std::shared_ptr;
@@ -77,6 +76,31 @@
 
 const char DEFAULT_MODULE_NAME[] = "DEFAULT";
 
+const std::string UINT_ATOM_ALLOWLIST[22] = {
+        "AppDied",
+        "DevicePolicyEvent",
+        "NfcErrorOccurred",
+        "NfcHceTransactionOccurred",
+        "ScreenTimeoutExtensionReported",
+        "ThreadnetworkTelemetryDataReported",
+        "ThreadnetworkTopoEntryRepeated",
+        "SubsystemSleepState",
+        "BluetoothActivityInfo",
+        "CpuTimePerFreq",
+        "CpuTimePerUid",
+        "CpuTimePerUidFreq",
+        "WifiActivityInfo",
+        "ModemActivityInfo",
+        "SystemElapsedRealtime",
+        "SystemUptime",
+        "CpuActiveTime",
+        "CpuClusterTime",
+        "DiskSpace",
+        "OnDevicePowerMeasurement",
+        "GeneralExternalStorageAccessStats",
+        "CpuTimePerClusterFreq",
+};
+
 /**
  * The types for atom parameters.
  */
diff --git a/stats/stats_log_api_gen/java_writer.cpp b/stats/stats_log_api_gen/java_writer.cpp
index e2bae05..dae0c0e 100644
--- a/stats/stats_log_api_gen/java_writer.cpp
+++ b/stats/stats_log_api_gen/java_writer.cpp
@@ -16,6 +16,8 @@
 
 #include "java_writer.h"
 
+#include <stdio.h>
+
 #include "Collation.h"
 #include "java_writer_q.h"
 #include "utils.h"
@@ -40,27 +42,24 @@
     return 0;
 }
 
-static void write_java_annotation_constants(FILE* out, const int minApiLevel,
-                                            const int compileApiLevel) {
+static void write_java_annotation_constants(FILE* out, const int minApiLevel) {
     fprintf(out, "    // Annotation constants.\n");
 
     const map<AnnotationId, AnnotationStruct>& ANNOTATION_ID_CONSTANTS =
             get_annotation_id_constants(ANNOTATION_CONSTANT_NAME_PREFIX);
     for (const auto& [id, annotation] : ANNOTATION_ID_CONSTANTS) {
-        if (annotation.minApiLevel < API_U) {  // we don't generate annotation constants for U+
-            if (compileApiLevel <= API_R) {
-                fprintf(out, "    public static final byte %s = %hhu;\n", annotation.name.c_str(),
-                        id);
-            } else if (minApiLevel <= API_R) {  // compileApiLevel = S+
-                fprintf(out, "    public static final byte %s =\n", annotation.name.c_str());
-                fprintf(out, "            Build.VERSION.SDK_INT <= %s ?\n",
-                        get_java_build_version_code(API_R).c_str());
-                fprintf(out, "            %hhu : StatsLog.%s;\n", id, annotation.name.c_str());
-                fprintf(out, "\n");
-            } else {
-                fprintf(out, "    public static final byte %s = StatsLog.%s;\n",
-                        annotation.name.c_str(), annotation.name.c_str());
-            }
+        if (annotation.minApiLevel >= API_U) {  // we don't generate annotation constants for U+
+            continue;
+        }
+        if (minApiLevel <= API_R) {
+            fprintf(out, "    public static final byte %s =\n", annotation.name.c_str());
+            fprintf(out, "            Build.VERSION.SDK_INT <= %s ?\n",
+                    get_java_build_version_code(API_R).c_str());
+            fprintf(out, "            %hhu : StatsLog.%s;\n", id, annotation.name.c_str());
+            fprintf(out, "\n");
+        } else {
+            fprintf(out, "    public static final byte %s = StatsLog.%s;\n",
+                    annotation.name.c_str(), annotation.name.c_str());
         }
     }
 
@@ -69,7 +68,7 @@
 
 static void write_annotations(FILE* out, int argIndex,
                               const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet) {
-    FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
+    const FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
             fieldNumberToAtomDeclSet.find(argIndex);
     if (fieldNumberToAtomDeclSet.end() == fieldNumberToAtomDeclSetIt) {
         return;
@@ -226,13 +225,16 @@
     for (auto signatureInfoMapIt = signatureInfoMap.begin();
          signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
         const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second;
-        FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
-            fieldNumberToAtomDeclSet.find(ATOM_ID_FIELD_NUMBER);
-        if (fieldNumberToAtomDeclSetIt != fieldNumberToAtomDeclSet.end()
-            && requires_api_needed(fieldNumberToAtomDeclSetIt->second)) {
+        const FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
+                fieldNumberToAtomDeclSet.find(ATOM_ID_FIELD_NUMBER);
+        const AtomDeclSet* atomDeclSet =
+                fieldNumberToAtomDeclSetIt == fieldNumberToAtomDeclSet.end()
+                        ? nullptr
+                        : &fieldNumberToAtomDeclSetIt->second;
+        const int requiresApiLevel = get_requires_api_level(minApiLevel, atomDeclSet);
+        if (requiresApiLevel != API_LEVEL_CURRENT) {
             fprintf(out, "    @RequiresApi(%s)\n",
-                    get_java_build_version_code(
-                        get_min_api_level(fieldNumberToAtomDeclSetIt->second)).c_str());
+                    get_java_build_version_code(requiresApiLevel).c_str());
         }
         // Print method signature.
         fprintf(out, "    public static void write(int code");
@@ -248,8 +250,8 @@
             indent = "    ";
         }
 
-        int ret = write_method_body(out, signature, fieldNumberToAtomDeclSet, attributionDecl,
-                                    indent, minApiLevel);
+        const int ret = write_method_body(out, signature, fieldNumberToAtomDeclSet, attributionDecl,
+                                          indent, minApiLevel);
         if (ret != 0) {
             return ret;
         }
@@ -303,7 +305,7 @@
         fprintf(out, ") {\n");
 
         // Print method body.
-        string indent("");
+        const string indent("");
         ret = write_method_body(out, signature, fieldNumberToAtomDeclSet, attributionDecl,
                                     indent, minApiLevel);
         if (ret != 0) {
@@ -321,7 +323,7 @@
 
 int write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
                          const string& javaClass, const string& javaPackage, const int minApiLevel,
-                         const int compileApiLevel, const bool supportWorkSource) {
+                         const bool supportWorkSource) {
     // Print prelude
     fprintf(out, "// This file is autogenerated\n");
     fprintf(out, "\n");
@@ -335,7 +337,7 @@
 
     fprintf(out, "import android.util.StatsEvent;\n");
     fprintf(out, "import android.util.StatsLog;\n");
-    if (requires_api_needed(atoms.decls)) {
+    if (get_requires_api_level(minApiLevel, &atoms.decls) != API_LEVEL_CURRENT) {
         fprintf(out, "import androidx.annotation.RequiresApi;\n");
     }
 
@@ -348,7 +350,7 @@
 
     write_java_atom_codes(out, atoms);
     write_java_enum_values(out, atoms);
-    write_java_annotation_constants(out, minApiLevel, compileApiLevel);
+    write_java_annotation_constants(out, minApiLevel);
 
     int errors = 0;
 
diff --git a/stats/stats_log_api_gen/java_writer.h b/stats/stats_log_api_gen/java_writer.h
index f87be53..dea06f8 100644
--- a/stats/stats_log_api_gen/java_writer.h
+++ b/stats/stats_log_api_gen/java_writer.h
@@ -31,7 +31,7 @@
 
 int write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
                          const string& javaClass, const string& javaPackage, const int minApiLevel,
-                         const int compileApiLevel, const bool supportWorkSource);
+                         const bool supportWorkSource);
 
 }  // namespace stats_log_api_gen
 }  // namespace android
diff --git a/stats/stats_log_api_gen/java_writer_q.cpp b/stats/stats_log_api_gen/java_writer_q.cpp
index b9e7e21..05e7557 100644
--- a/stats/stats_log_api_gen/java_writer_q.cpp
+++ b/stats/stats_log_api_gen/java_writer_q.cpp
@@ -16,6 +16,9 @@
 
 #include "java_writer_q.h"
 
+#include <stdio.h>
+
+#include "Collation.h"
 #include "utils.h"
 
 namespace android {
diff --git a/stats/stats_log_api_gen/java_writer_vendor.cpp b/stats/stats_log_api_gen/java_writer_vendor.cpp
index d3c8239..11eb754 100644
--- a/stats/stats_log_api_gen/java_writer_vendor.cpp
+++ b/stats/stats_log_api_gen/java_writer_vendor.cpp
@@ -16,6 +16,16 @@
 
 #include "java_writer_vendor.h"
 
+#include <stdio.h>
+
+#include <algorithm>
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "Collation.h"
 #include "utils.h"
 
 namespace android {
@@ -128,15 +138,12 @@
                     annotationIdConstants.at(annotation->annotationId);
             switch (annotation->type) {
                 case ANNOTATION_TYPE_INT:
-                    if (ANNOTATION_ID_TRIGGER_STATE_RESET == annotation->annotationId) {
-                        break;
-                    } else if (ANNOTATION_ID_DEFAULT_STATE == annotation->annotationId) {
-                        break;
-                    } else if (ANNOTATION_ID_RESTRICTION_CATEGORY == annotation->annotationId) {
+                    if (ANNOTATION_ID_RESTRICTION_CATEGORY == annotation->annotationId) {
                         write_vendor_annotation_int_constant(
                                 out, annotationConstant.name,
                                 get_restriction_category_str(annotation->value.intValue), indent2);
-                    } else {
+                    } else if (ANNOTATION_ID_TRIGGER_STATE_RESET != annotation->annotationId &&
+                               ANNOTATION_ID_DEFAULT_STATE != annotation->annotationId) {
                         write_vendor_annotation_int(out, annotationConstant.name,
                                                     annotation->value.intValue, indent2);
                     }
@@ -388,7 +395,7 @@
 
     // Print write methods.
     fprintf(out, "    // Write methods\n");
-    int errors = write_java_pushed_methods_vendor(out, atoms.signatureInfoMap);
+    const int errors = write_java_pushed_methods_vendor(out, atoms.signatureInfoMap);
 
     fprintf(out, "}\n");
 
diff --git a/stats/stats_log_api_gen/main.cpp b/stats/stats_log_api_gen/main.cpp
index 179f894..7533708 100644
--- a/stats/stats_log_api_gen/main.cpp
+++ b/stats/stats_log_api_gen/main.cpp
@@ -1,20 +1,18 @@
 
-#include <getopt.h>
+#include <google/protobuf/compiler/importer.h>
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/stubs/common.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include <cstdlib>
 #include <filesystem>
-#include <map>
-#include <set>
-#include <vector>
 
 #include "Collation.h"
 #include "frameworks/proto_logging/stats/atoms.pb.h"
 #include "frameworks/proto_logging/stats/attribution_node.pb.h"
 #include "java_writer.h"
-#include "java_writer_q.h"
 #include "native_writer.h"
 #include "rust_writer.h"
 #include "utils.h"
@@ -63,9 +61,6 @@
     fprintf(stderr,
             "  --worksource         Include support for logging WorkSource "
             "objects.\n");
-    fprintf(stderr,
-            "  --compileApiLevel API_LEVEL           specify which API level generated code is "
-            "compiled against. (Java only).\n");
     fprintf(stderr, "                                        Default is \"current\".\n");
     fprintf(stderr,
             "  --bootstrap          If this logging is from a bootstrap process. "
@@ -95,7 +90,6 @@
     string vendorProto;
     bool supportWorkSource = false;
     int minApiLevel = API_LEVEL_CURRENT;
-    int compileApiLevel = API_LEVEL_CURRENT;
     bool bootstrap = false;
 
     int index = 1;
@@ -193,15 +187,6 @@
             if (0 != strcmp("current", argv[index])) {
                 minApiLevel = atoi(argv[index]);
             }
-        } else if (0 == strcmp("--compileApiLevel", argv[index])) {
-            index++;
-            if (index >= argc) {
-                print_usage();
-                return 1;
-            }
-            if (0 != strcmp("current", argv[index])) {
-                compileApiLevel = atoi(argv[index]);
-            }
         } else if (0 == strcmp("--bootstrap", argv[index])) {
             bootstrap = true;
 #ifdef WITH_VENDOR
@@ -229,40 +214,18 @@
         print_usage();
         return 1;
     }
-    if (DEFAULT_MODULE_NAME == moduleName &&
-        (minApiLevel != API_LEVEL_CURRENT || compileApiLevel != API_LEVEL_CURRENT)) {
+    if (DEFAULT_MODULE_NAME == moduleName && minApiLevel != API_LEVEL_CURRENT) {
         // Default module only supports current API level.
         fprintf(stderr, "%s cannot support older API levels\n", moduleName.c_str());
         return 1;
     }
 
-    if (compileApiLevel < API_R) {
-        // Cannot compile against pre-R.
-        fprintf(stderr, "compileApiLevel must be %d or higher.\n", API_R);
-        return 1;
-    }
-
     if (minApiLevel < API_Q) {
         // Cannot support pre-Q.
         fprintf(stderr, "minApiLevel must be %d or higher.\n", API_Q);
         return 1;
     }
 
-    if (minApiLevel == API_LEVEL_CURRENT) {
-        if (minApiLevel > compileApiLevel) {
-            // If minApiLevel is not specified, assume it is not higher than compileApiLevel.
-            minApiLevel = compileApiLevel;
-        }
-    } else {
-        if (minApiLevel > compileApiLevel) {
-            // If specified, minApiLevel should always be lower than compileApiLevel.
-            fprintf(stderr,
-                    "Invalid minApiLevel or compileApiLevel. If minApiLevel and"
-                    " compileApiLevel are specified, minApiLevel should not be higher"
-                    " than compileApiLevel.\n");
-            return 1;
-        }
-    }
     if (bootstrap) {
         if (cppFilename.empty() && headerFilename.empty()) {
             fprintf(stderr, "Bootstrap flag can only be used for cpp/header files.\n");
@@ -272,7 +235,7 @@
             fprintf(stderr, "Bootstrap flag does not support worksources");
             return 1;
         }
-        if ((minApiLevel != API_LEVEL_CURRENT) || (compileApiLevel != API_LEVEL_CURRENT)) {
+        if (minApiLevel != API_LEVEL_CURRENT) {
             fprintf(stderr, "Bootstrap flag does not support older API levels");
             return 1;
         }
@@ -330,7 +293,7 @@
             fprintf(stderr, "Must supply --headerImport if supplying a specific module\n");
             return 1;
         }
-        FILE* out = fopen(cppFilename.c_str(), "w");
+        FILE* out = fopen(cppFilename.c_str(), "we");
         if (out == nullptr) {
             fprintf(stderr, "Unable to open file for write: %s\n", cppFilename.c_str());
             return 1;
@@ -354,7 +317,7 @@
         if (moduleName != DEFAULT_MODULE_NAME && cppNamespace == DEFAULT_CPP_NAMESPACE) {
             fprintf(stderr, "Must supply --namespace if supplying a specific module\n");
         }
-        FILE* out = fopen(headerFilename.c_str(), "w");
+        FILE* out = fopen(headerFilename.c_str(), "we");
         if (out == nullptr) {
             fprintf(stderr, "Unable to open file for write: %s\n", headerFilename.c_str());
             return 1;
@@ -389,7 +352,7 @@
             return 1;
         }
 
-        FILE* out = fopen(javaFilename.c_str(), "w");
+        FILE* out = fopen(javaFilename.c_str(), "we");
         if (out == nullptr) {
             fprintf(stderr, "Unable to open file for write: %s\n", javaFilename.c_str());
             return 1;
@@ -398,7 +361,7 @@
         if (vendorProto.empty()) {
             errorCount = android::stats_log_api_gen::write_stats_log_java(
                     out, atoms, attributionDecl, javaClass, javaPackage, minApiLevel,
-                    compileApiLevel, supportWorkSource);
+                    supportWorkSource);
         } else {
 #ifdef WITH_VENDOR
             if (supportWorkSource) {
@@ -421,7 +384,7 @@
             return 1;
         }
 
-        FILE* out = fopen(rustFilename.c_str(), "w");
+        FILE* out = fopen(rustFilename.c_str(), "we");
         if (out == nullptr) {
             fprintf(stderr, "Unable to open file for write: %s\n", rustFilename.c_str());
             return 1;
@@ -440,7 +403,7 @@
             return 1;
         }
 
-        FILE* out = fopen(rustHeaderFilename.c_str(), "w");
+        FILE* out = fopen(rustHeaderFilename.c_str(), "we");
         if (out == nullptr) {
             fprintf(stderr, "Unable to open file for write: %s\n", rustHeaderFilename.c_str());
             return 1;
diff --git a/stats/stats_log_api_gen/native_writer.cpp b/stats/stats_log_api_gen/native_writer.cpp
index af55376..835b058 100644
--- a/stats/stats_log_api_gen/native_writer.cpp
+++ b/stats/stats_log_api_gen/native_writer.cpp
@@ -16,6 +16,8 @@
 
 #include "native_writer.h"
 
+#include <stdio.h>
+
 #include "Collation.h"
 #include "utils.h"
 
@@ -37,7 +39,7 @@
                               const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet,
                               const string& methodPrefix, const string& methodSuffix,
                               const int minApiLevel) {
-    FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
+    const FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
             fieldNumberToAtomDeclSet.find(argIndex);
     if (fieldNumberToAtomDeclSet.end() == fieldNumberToAtomDeclSetIt) {
         return;
@@ -222,7 +224,7 @@
         if (bootstrap) {
             fprintf(out, "    ::android::os::StatsBootstrapAtom atom;\n");
             fprintf(out, "    atom.atomId = code;\n");
-            FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
+            const FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
                     fieldNumberToAtomDeclSet.find(ATOM_ID_FIELD_NUMBER);
             if (fieldNumberToAtomDeclSet.end() != fieldNumberToAtomDeclSetIt) {
                 fprintf(stderr, "Bootstrap atoms do not support annotations\n");
@@ -273,7 +275,7 @@
                         fprintf(stderr, "Encountered unsupported type.\n");
                         return 1;
                 }
-                FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
+                const FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
                         fieldNumberToAtomDeclSet.find(argIndex);
                 if (fieldNumberToAtomDeclSet.end() != fieldNumberToAtomDeclSetIt) {
                     fprintf(stderr, "Bootstrap atoms do not support annotations\n");
@@ -335,8 +337,8 @@
             fprintf(out, "    return event.writeToSocket();\n");  // end method body.
         } else {
             fprintf(out, "    AStatsEvent* event = AStatsEvent_obtain();\n");
-            int ret = write_native_method_body(out, signature, fieldNumberToAtomDeclSet,
-                                               attributionDecl, minApiLevel);
+            const int ret = write_native_method_body(out, signature, fieldNumberToAtomDeclSet,
+                                                     attributionDecl, minApiLevel);
             if (ret != 0) {
                 return ret;
             }
@@ -390,8 +392,8 @@
                                       signature, attributionDecl, " {");
 
         fprintf(out, "    AStatsEvent* event = AStatsEventList_addStatsEvent(pulled_data);\n");
-        int ret = write_native_method_body(out, signature, fieldNumberToAtomDeclSet,
-                                           attributionDecl, minApiLevel);
+        const int ret = write_native_method_body(out, signature, fieldNumberToAtomDeclSet,
+                                                 attributionDecl, minApiLevel);
         if (ret != 0) {
             return ret;
         }
diff --git a/stats/stats_log_api_gen/native_writer_vendor.cpp b/stats/stats_log_api_gen/native_writer_vendor.cpp
index 5817629..f0fe0d3 100644
--- a/stats/stats_log_api_gen/native_writer_vendor.cpp
+++ b/stats/stats_log_api_gen/native_writer_vendor.cpp
@@ -16,11 +16,20 @@
 
 #include "native_writer_vendor.h"
 
+#include <stdio.h>
+
+#include <set>
+#include <string>
+#include <vector>
+
+#include "Collation.h"
 #include "utils.h"
 
 namespace android {
 namespace stats_log_api_gen {
 
+using std::string;
+
 static void write_native_vendor_annotation_header(FILE* out, const string& annotationName,
                                                   const char* indent) {
     fprintf(out, "%s{\n", indent);
@@ -296,7 +305,8 @@
     fprintf(out, "using std::vector;\n");
     fprintf(out, "using std::string;\n");
 
-    int ret = write_native_create_vendor_atom_methods(out, atoms.signatureInfoMap, attributionDecl);
+    const int ret =
+            write_native_create_vendor_atom_methods(out, atoms.signatureInfoMap, attributionDecl);
     if (ret != 0) {
         return ret;
     }
diff --git a/stats/stats_log_api_gen/rust_writer.cpp b/stats/stats_log_api_gen/rust_writer.cpp
index 181b1c9..b21d4a1 100644
--- a/stats/stats_log_api_gen/rust_writer.cpp
+++ b/stats/stats_log_api_gen/rust_writer.cpp
@@ -16,6 +16,12 @@
 
 #include "rust_writer.h"
 
+#include <stdio.h>
+
+#include <algorithm>
+#include <cctype>
+#include <map>
+
 #include "Collation.h"
 #include "utils.h"
 
@@ -60,7 +66,7 @@
     const int N = str.size();
     bool justSawUnderscore = false;
     for (int i = 0; i < N; i++) {
-        char c = str[i];
+        const char c = str[i];
         if (c == '_') {
             justSawUnderscore = true;
             // Don't add the underscore to our result
@@ -78,7 +84,7 @@
     string result;
     const int N = str.size();
     for (int i = 0; i < N; i++) {
-        char c = str[i];
+        const char c = str[i];
         if (isupper(c)) {
             if (i > 0) {
                 result += "_";
@@ -156,7 +162,7 @@
     fprintf(out, "\n");
 }
 
-static bool write_rust_usage(FILE* out, const string& method_name, const shared_ptr<AtomDecl> atom,
+static bool write_rust_usage(FILE* out, const string& method_name, const shared_ptr<AtomDecl>& atom,
                              const AtomDecl& attributionDecl, bool isNonChained,
                              const char* headerCrate) {
     fprintf(out, "    // Definition: ");
@@ -175,11 +181,11 @@
     build_non_chained_decl_map(atoms, &atom_code_to_non_chained_decl_map);
 
     for (const shared_ptr<AtomDecl>& atomDecl : atoms.decls) {
-        string constant = make_camel_case_name(atomDecl->name);
+        const string constant = make_camel_case_name(atomDecl->name);
         fprintf(out, "\n");
         fprintf(out, "    // %s %s\n", atomDecl->message.c_str(), atomDecl->name.c_str());
-        bool isSupported = write_rust_usage(out, "// stats_write", atomDecl, attributionDecl, false,
-                                            headerCrate);
+        const bool isSupported = write_rust_usage(out, "// stats_write", atomDecl, attributionDecl,
+                                                  false, headerCrate);
         if (!isSupported) {
             continue;
         }
@@ -390,7 +396,8 @@
         write_rust_method_signature(out, "add_astats_event", *atomDecl, attributionDecl, true,
                                     false, headerCrate);
     }
-    int ret = write_rust_method_body(out, *atomDecl, attributionDecl, minApiLevel, headerCrate);
+    const int ret =
+            write_rust_method_body(out, *atomDecl, attributionDecl, minApiLevel, headerCrate);
     if (ret != 0) {
         return ret;
     }
@@ -444,7 +451,7 @@
 static void write_rust_struct(FILE* out, const shared_ptr<AtomDecl>& atomDecl,
                               const AtomDecl& attributionDecl, const char* headerCrate) {
     // Write the struct.
-    bool lifetime = needs_lifetime(atomDecl);
+    const bool lifetime = needs_lifetime(atomDecl);
     if (lifetime) {
         fprintf(out, "    pub struct %s<'a> {\n", make_camel_case_name(atomDecl->name).c_str());
     } else {
@@ -469,7 +476,7 @@
     fprintf(out, "    }\n");
 
     // Write the impl
-    bool isPush = atomDecl->atomType == ATOM_TYPE_PUSHED;
+    const bool isPush = atomDecl->atomType == ATOM_TYPE_PUSHED;
     if (isPush) {
         if (lifetime) {
             fprintf(out, "    impl<'a> %s<'a> {\n", make_camel_case_name(atomDecl->name).c_str());
@@ -533,8 +540,8 @@
         fprintf(out, "\n");
         write_rust_atom_constant_values(out, atomDecl);
         write_rust_struct(out, atomDecl, attributionDecl, headerCrate);
-        int ret = write_rust_stats_write_method(out, atomDecl, attributionDecl, minApiLevel,
-                                                headerCrate);
+        const int ret = write_rust_stats_write_method(out, atomDecl, attributionDecl, minApiLevel,
+                                                      headerCrate);
         if (ret != 0) {
             return ret;
         }
@@ -592,7 +599,7 @@
 
     write_rust_annotation_constants(out);
 
-    int errorCount = write_rust_stats_write_atoms(
+    const int errorCount = write_rust_stats_write_atoms(
             out, atoms.decls, attributionDecl, atoms.non_chained_decls, minApiLevel, headerCrate);
 
     return errorCount;
diff --git a/stats/stats_log_api_gen/test.proto b/stats/stats_log_api_gen/test.proto
index 79cf870..889a906 100644
--- a/stats/stats_log_api_gen/test.proto
+++ b/stats/stats_log_api_gen/test.proto
@@ -39,21 +39,25 @@
     VALUE1 = 1;
 }
 
+message SubMessageWithUint {
+    optional uint32 field1 = 1;
+}
+
 message AllTypesAtom {
   repeated android.os.statsd.AttributionNode attribution_chain = 1;
   optional float float_field = 2;
   optional int64 int64_field = 3;
-  optional uint64 uint64_field = 4;
-  optional int32 int32_field = 5;
-  optional bool bool_field = 6;
-  optional string string_field = 7;
-  optional uint32 uint32_field = 8;
-  optional AnEnum enum_field = 9;
-  repeated float repeated_float_field = 10;
-  repeated int64 repeated_int64_field = 11;
-  repeated int32 repeated_int32_field = 12;
-  repeated bool repeated_bool_field = 13;
-  repeated string repeated_string_field = 14;
+  optional int32 int32_field = 4;
+  optional bool bool_field = 5;
+  optional string string_field = 6;
+  optional AnEnum enum_field = 7;
+  repeated float repeated_float_field = 8;
+  repeated int64 repeated_int64_field = 9;
+  repeated int32 repeated_int32_field = 10;
+  repeated bool repeated_bool_field = 11;
+  repeated string repeated_string_field = 12;
+  optional SubMessageWithUint sub_message_with_uint_field = 13
+          [(android.os.statsd.log_mode) = MODE_BYTES];
 }
 
 // Separated from AllTypesAtom because tests can't properly check atoms with multiple enum type
@@ -93,6 +97,8 @@
     repeated uint32 uint32_repeated_field = 18;
     repeated IntAtom bad_int_atom_repeated_field = 19;
     repeated bytes bad_bytes_repeated_field = 20;
+    optional uint32 uint32_field = 21;
+    optional uint64 uint64_field = 22;
 }
 
 message BadTypesEvent {
@@ -172,22 +178,18 @@
 
 message GoodRestrictedAtom {
     optional int64 int64_field = 1 [(android.os.statsd.field_restriction_option).app_usage = true];
-    optional uint64 uint64_field = 2
-        [(android.os.statsd.field_restriction_option).app_activity = true];
-    optional int32 int32_field_1 = 3
-        [(android.os.statsd.field_restriction_option).health_connect = true];
-    optional bool bool_field = 4
-        [(android.os.statsd.field_restriction_option).accessibility = true];
-    optional string string_field = 5
-        [(android.os.statsd.field_restriction_option).system_search = true];
-    optional AnEnum enum_field = 6
-        [(android.os.statsd.field_restriction_option).ambient_sensing = true];
-    optional uint32 uint32_field = 7
-        [(android.os.statsd.field_restriction_option).user_engagement = true];
-    optional float float_field = 8
-        [(android.os.statsd.field_restriction_option).peripheral_device_info = true];
-    optional int32 int32_field_2 = 9
-        [(android.os.statsd.field_restriction_option).demographic_classification = true];
+    optional int32 int32_field_1 = 2
+            [(android.os.statsd.field_restriction_option).health_connect = true];
+    optional bool bool_field = 3
+            [(android.os.statsd.field_restriction_option).accessibility = true];
+    optional string string_field = 4
+            [(android.os.statsd.field_restriction_option).system_search = true];
+    optional AnEnum enum_field = 5
+            [(android.os.statsd.field_restriction_option).ambient_sensing = true];
+    optional float float_field = 6
+            [(android.os.statsd.field_restriction_option).peripheral_device_info = true];
+    optional int32 int32_field_2 = 7
+            [(android.os.statsd.field_restriction_option).demographic_classification = true];
 }
 
 // Nonprimitive fields
@@ -368,6 +370,24 @@
         [(android.os.statsd.restriction_category) = RESTRICTION_FRAUD_AND_ABUSE];
 }
 
+// Allowed uint atoms.
+message AppDied {
+    optional uint32 uint32_field = 1;
+}
+
+message SystemUptime {
+    optional uint64 uint64_field = 1;
+}
+
+message GoodUintAtoms {
+    oneof pushed {
+        AppDied app_died = 1;
+    }
+    oneof pulled {
+        SystemUptime system_uptime = 2;
+    }
+}
+
 message ExtensionAtoms {
     oneof pushed {
         IntAtom int_atom_1 = 1;
diff --git a/stats/stats_log_api_gen/test_collation.cpp b/stats/stats_log_api_gen/test_collation.cpp
index 2d0b85d..e8bb667 100644
--- a/stats/stats_log_api_gen/test_collation.cpp
+++ b/stats/stats_log_api_gen/test_collation.cpp
@@ -120,6 +120,7 @@
             mBadRestrictedAtoms3 = BadRestrictedAtoms3::descriptor();
             mBadRestrictedAtoms4 = BadRestrictedAtoms4::descriptor();
             mBadRestrictedAtoms5 = BadRestrictedAtoms5::descriptor();
+            mGoodUintAtoms = GoodUintAtoms::descriptor();
         } else {
             mEvent = mFileDescriptor->FindMessageTypeByName("Event");
             mIntAtom = mFileDescriptor->FindMessageTypeByName("IntAtom");
@@ -147,6 +148,7 @@
             mBadRestrictedAtoms3 = mFileDescriptor->FindMessageTypeByName("BadRestrictedAtoms3");
             mBadRestrictedAtoms4 = mFileDescriptor->FindMessageTypeByName("BadRestrictedAtoms4");
             mBadRestrictedAtoms5 = mFileDescriptor->FindMessageTypeByName("BadRestrictedAtoms5");
+            mGoodUintAtoms = mFileDescriptor->FindMessageTypeByName("GoodUintAtoms");
         }
     }
 
@@ -176,6 +178,7 @@
     const Descriptor* mBadRestrictedAtoms3;
     const Descriptor* mBadRestrictedAtoms4;
     const Descriptor* mBadRestrictedAtoms5;
+    const Descriptor* mGoodUintAtoms;
 };
 
 INSTANTIATE_TEST_SUITE_P(ProtoProvider, CollationTest, testing::Values(true, false));
@@ -201,17 +204,16 @@
                                   JAVA_TYPE_ATTRIBUTION_CHAIN,  // AttributionChain
                                   JAVA_TYPE_FLOAT,              // float
                                   JAVA_TYPE_LONG,               // int64
-                                  JAVA_TYPE_LONG,               // uint64
                                   JAVA_TYPE_INT,                // int32
                                   JAVA_TYPE_BOOLEAN,            // bool
                                   JAVA_TYPE_STRING,             // string
-                                  JAVA_TYPE_INT,                // uint32
                                   JAVA_TYPE_INT,                // AnEnum
                                   JAVA_TYPE_FLOAT_ARRAY,        // repeated float
                                   JAVA_TYPE_LONG_ARRAY,         // repeated int64
                                   JAVA_TYPE_INT_ARRAY,          // repeated int32
                                   JAVA_TYPE_BOOLEAN_ARRAY,      // repeated bool
-                                  JAVA_TYPE_STRING_ARRAY        // repeated string
+                                  JAVA_TYPE_STRING_ARRAY,       // repeated string
+                                  JAVA_TYPE_BYTE_ARRAY          // SubMessageWithUint (mode bytes)
     );
 
     // RepeatedEnumAtom
@@ -275,7 +277,7 @@
     Atoms atoms;
     const int errorCount = collate_atoms(*mBadTypesEvent, DEFAULT_MODULE_NAME, atoms);
 
-    EXPECT_EQ(20, errorCount);
+    EXPECT_EQ(22, errorCount);
 }
 
 /**
@@ -616,19 +618,13 @@
     ASSERT_EQ(1ul, atoms.signatureInfoMap.size());
     ASSERT_EQ(0ul, atoms.pulledAtomsSignatureInfoMap.size());
 
-    EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_LONG,
-                                                          JAVA_TYPE_LONG,
-                                                          JAVA_TYPE_INT,
-                                                          JAVA_TYPE_BOOLEAN,
-                                                          JAVA_TYPE_STRING,
-                                                          JAVA_TYPE_INT,
-                                                          JAVA_TYPE_INT,
-                                                          JAVA_TYPE_FLOAT,
-                                                          JAVA_TYPE_INT);
+    EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_LONG, JAVA_TYPE_INT,
+                                  JAVA_TYPE_BOOLEAN, JAVA_TYPE_STRING, JAVA_TYPE_INT,
+                                  JAVA_TYPE_FLOAT, JAVA_TYPE_INT);
 
     // Validate signatureInfoMap
     FieldNumberToAtomDeclSet fieldNumberToAtomDeclSet = atoms.signatureInfoMap.begin()->second;
-    ASSERT_EQ(10ul, fieldNumberToAtomDeclSet.size());
+    ASSERT_EQ(8ul, fieldNumberToAtomDeclSet.size());
     const AtomDeclSet* atomDeclSet = &fieldNumberToAtomDeclSet[ATOM_ID_FIELD_NUMBER];
     ASSERT_EQ(2ul, atomDeclSet->size());
     AtomDeclSet::const_iterator atomDeclSetIt = atomDeclSet->begin();
@@ -638,7 +634,7 @@
     EXPECT_EQ("pushed_atom_1", atomDecl->name);
     EXPECT_EQ("GoodRestrictedAtom", atomDecl->message);
     FieldNumberToAnnotations fieldNumberToAnnotations = atomDecl->fieldNumberToAnnotations;
-    ASSERT_EQ(10ul, fieldNumberToAnnotations.size());
+    ASSERT_EQ(8ul, fieldNumberToAnnotations.size());
 
     const AnnotationSet* annotationSet = &fieldNumberToAnnotations[ATOM_ID_FIELD_NUMBER];
     ASSERT_EQ(1ul, annotationSet->size());
@@ -657,53 +653,39 @@
     annotationSet = &fieldNumberToAnnotations[2];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
-    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_APP_ACTIVITY, annotation->annotationId);
+    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_HEALTH_CONNECT, annotation->annotationId);
     EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
     EXPECT_TRUE(annotation->value.boolValue);
 
     annotationSet = &fieldNumberToAnnotations[3];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
-    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_HEALTH_CONNECT, annotation->annotationId);
+    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_ACCESSIBILITY, annotation->annotationId);
     EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
     EXPECT_TRUE(annotation->value.boolValue);
 
     annotationSet = &fieldNumberToAnnotations[4];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
-    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_ACCESSIBILITY, annotation->annotationId);
+    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_SYSTEM_SEARCH, annotation->annotationId);
     EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
     EXPECT_TRUE(annotation->value.boolValue);
 
     annotationSet = &fieldNumberToAnnotations[5];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
-    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_SYSTEM_SEARCH, annotation->annotationId);
+    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_AMBIENT_SENSING, annotation->annotationId);
     EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
     EXPECT_TRUE(annotation->value.boolValue);
 
     annotationSet = &fieldNumberToAnnotations[6];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
-    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_AMBIENT_SENSING, annotation->annotationId);
-    EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
-    EXPECT_TRUE(annotation->value.boolValue);
-
-    annotationSet = &fieldNumberToAnnotations[7];
-    ASSERT_EQ(1ul, annotationSet->size());
-    annotation = annotationSet->begin()->get();
-    EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_USER_ENGAGEMENT, annotation->annotationId);
-    EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
-    EXPECT_TRUE(annotation->value.boolValue);
-
-    annotationSet = &fieldNumberToAnnotations[8];
-    ASSERT_EQ(1ul, annotationSet->size());
-    annotation = annotationSet->begin()->get();
     EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_PERIPHERAL_DEVICE_INFO, annotation->annotationId);
     EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
     EXPECT_TRUE(annotation->value.boolValue);
 
-    annotationSet = &fieldNumberToAnnotations[9];
+    annotationSet = &fieldNumberToAnnotations[7];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
     EXPECT_EQ(ANNOTATION_ID_FIELD_RESTRICTION_DEMOGRAPHIC_CLASSIFICATION, annotation->annotationId);
@@ -716,7 +698,7 @@
     EXPECT_EQ("pushed_atom_2", atomDecl->name);
     EXPECT_EQ("GoodRestrictedAtom", atomDecl->message);
     fieldNumberToAnnotations = atomDecl->fieldNumberToAnnotations;
-    ASSERT_EQ(10ul, fieldNumberToAnnotations.size());
+    ASSERT_EQ(8ul, fieldNumberToAnnotations.size());
     annotationSet = &fieldNumberToAnnotations[ATOM_ID_FIELD_NUMBER];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
@@ -734,7 +716,7 @@
     EXPECT_EQ("pushed_atom_1", (*atomIt)->name);
     EXPECT_EQ("GoodRestrictedAtom", (*atomIt)->message);
     fieldNumberToAnnotations = (*atomIt)->fieldNumberToAnnotations;
-    ASSERT_EQ(10ul, fieldNumberToAnnotations.size());
+    ASSERT_EQ(8ul, fieldNumberToAnnotations.size());
 
     annotationSet = &fieldNumberToAnnotations[ATOM_ID_FIELD_NUMBER];
     ASSERT_EQ(1ul, annotationSet->size());
@@ -748,7 +730,7 @@
     EXPECT_EQ("pushed_atom_2", (*atomIt)->name);
     EXPECT_EQ("GoodRestrictedAtom", (*atomIt)->message);
     fieldNumberToAnnotations = (*atomIt)->fieldNumberToAnnotations;
-    ASSERT_EQ(10ul, fieldNumberToAnnotations.size());
+    ASSERT_EQ(8ul, fieldNumberToAnnotations.size());
     annotationSet = &fieldNumberToAnnotations[ATOM_ID_FIELD_NUMBER];
     ASSERT_EQ(1ul, annotationSet->size());
     annotation = annotationSet->begin()->get();
@@ -777,7 +759,7 @@
 
     // Field restriction without restriction category
     errorCount = collate_atoms(*mBadRestrictedAtoms3, DEFAULT_MODULE_NAME, atoms);
-    EXPECT_EQ(9, errorCount);
+    EXPECT_EQ(7, errorCount);
 
     // Field restriction option on top level atom field
     errorCount = collate_atoms(*mBadRestrictedAtoms4, DEFAULT_MODULE_NAME, atoms);
@@ -788,5 +770,36 @@
     EXPECT_EQ(2, errorCount);
 }
 
+TEST_P(CollationTest, CollateGoodUintAtoms) {
+    Atoms atoms;
+    int errorCount = collate_atoms(*mGoodUintAtoms, DEFAULT_MODULE_NAME, atoms);
+    EXPECT_EQ(0, errorCount);
+
+    EXPECT_EQ(2ul, atoms.signatureInfoMap.size());
+
+    // AppDied
+    EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_INT);
+
+    // SystemUptime
+    EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_LONG);
+
+    EXPECT_EQ(2ul, atoms.decls.size());
+
+    AtomDeclSet::const_iterator atomIt = atoms.decls.begin();
+    EXPECT_EQ(1, (*atomIt)->code);
+    EXPECT_EQ("app_died", (*atomIt)->name);
+    EXPECT_EQ("AppDied", (*atomIt)->message);
+    EXPECT_NO_ENUM_FIELD((*atomIt));
+    atomIt++;
+
+    EXPECT_EQ(2, (*atomIt)->code);
+    EXPECT_EQ("system_uptime", (*atomIt)->name);
+    EXPECT_EQ("SystemUptime", (*atomIt)->message);
+    EXPECT_NO_ENUM_FIELD((*atomIt));
+    atomIt++;
+
+    EXPECT_EQ(atoms.decls.end(), atomIt);
+}
+
 }  // namespace stats_log_api_gen
 }  // namespace android
diff --git a/stats/stats_log_api_gen/test_external.proto b/stats/stats_log_api_gen/test_external.proto
index b61d33f..a31f2c7 100644
--- a/stats/stats_log_api_gen/test_external.proto
+++ b/stats/stats_log_api_gen/test_external.proto
@@ -39,21 +39,25 @@
     VALUE1 = 1;
 }
 
+message SubMessageWithUint {
+    optional uint32 field1 = 1;
+}
+
 message AllTypesAtom {
   repeated android.os.statsd.AttributionNode attribution_chain = 1;
   optional float float_field = 2;
   optional int64 int64_field = 3;
-  optional uint64 uint64_field = 4;
-  optional int32 int32_field = 5;
-  optional bool bool_field = 6;
-  optional string string_field = 7;
-  optional uint32 uint32_field = 8;
-  optional AnEnum enum_field = 9;
-  repeated float repeated_float_field = 10;
-  repeated int64 repeated_int64_field = 11;
-  repeated int32 repeated_int32_field = 12;
-  repeated bool repeated_bool_field = 13;
-  repeated string repeated_string_field = 14;
+  optional int32 int32_field = 4;
+  optional bool bool_field = 5;
+  optional string string_field = 6;
+  optional AnEnum enum_field = 7;
+  repeated float repeated_float_field = 8;
+  repeated int64 repeated_int64_field = 9;
+  repeated int32 repeated_int32_field = 10;
+  repeated bool repeated_bool_field = 11;
+  repeated string repeated_string_field = 12;
+  optional SubMessageWithUint sub_message_with_uint_field = 13
+          [(android.os.statsd.log_mode) = MODE_BYTES];
 }
 
 // Separated from AllTypesAtom because tests can't properly check atoms with multiple enum type
@@ -93,6 +97,8 @@
     repeated uint32 uint32_repeated_field = 18;
     repeated IntAtom bad_int_atom_repeated_field = 19;
     repeated bytes bad_bytes_repeated_field = 20;
+    optional uint32 uint32_field = 21;
+    optional uint64 uint64_field = 22;
 }
 
 message BadTypesEvent {
@@ -172,22 +178,18 @@
 
 message GoodRestrictedAtom {
     optional int64 int64_field = 1 [(android.os.statsd.field_restriction_option).app_usage = true];
-    optional uint64 uint64_field = 2
-        [(android.os.statsd.field_restriction_option).app_activity = true];
-    optional int32 int32_field_1 = 3
-        [(android.os.statsd.field_restriction_option).health_connect = true];
-    optional bool bool_field = 4
-        [(android.os.statsd.field_restriction_option).accessibility = true];
-    optional string string_field = 5
-        [(android.os.statsd.field_restriction_option).system_search = true];
-    optional AnEnum enum_field = 6
-        [(android.os.statsd.field_restriction_option).ambient_sensing = true];
-    optional uint32 uint32_field = 7
-        [(android.os.statsd.field_restriction_option).user_engagement = true];
-    optional float float_field = 8
-        [(android.os.statsd.field_restriction_option).peripheral_device_info = true];
-    optional int32 int32_field_2 = 9
-        [(android.os.statsd.field_restriction_option).demographic_classification = true];
+    optional int32 int32_field_1 = 2
+            [(android.os.statsd.field_restriction_option).health_connect = true];
+    optional bool bool_field = 3
+            [(android.os.statsd.field_restriction_option).accessibility = true];
+    optional string string_field = 4
+            [(android.os.statsd.field_restriction_option).system_search = true];
+    optional AnEnum enum_field = 5
+            [(android.os.statsd.field_restriction_option).ambient_sensing = true];
+    optional float float_field = 6
+            [(android.os.statsd.field_restriction_option).peripheral_device_info = true];
+    optional int32 int32_field_2 = 7
+            [(android.os.statsd.field_restriction_option).demographic_classification = true];
 }
 
 // Nonprimitive fields
@@ -368,6 +370,24 @@
         [(android.os.statsd.restriction_category) = RESTRICTION_FRAUD_AND_ABUSE];
 }
 
+// Allowed uint atoms.
+message AppDied {
+    optional uint32 uint32_field = 1;
+}
+
+message SystemUptime {
+    optional uint64 uint64_field = 1;
+}
+
+message GoodUintAtoms {
+    oneof pushed {
+        AppDied app_died = 1;
+    }
+    oneof pulled {
+        SystemUptime system_uptime = 2;
+    }
+}
+
 message ExtensionAtoms {
     oneof pushed {
         IntAtom int_atom_1 = 1;
diff --git a/stats/stats_log_api_gen/test_java/Android.bp b/stats/stats_log_api_gen/test_java/Android.bp
index ad4ddd5..39f07ae 100644
--- a/stats/stats_log_api_gen/test_java/Android.bp
+++ b/stats/stats_log_api_gen/test_java/Android.bp
@@ -15,6 +15,7 @@
 //
 
 package {
+    default_team: "trendy_team_android_telemetry_infra",
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
diff --git a/stats/stats_log_api_gen/utils.cpp b/stats/stats_log_api_gen/utils.cpp
index ee8f73d..19a403a 100644
--- a/stats/stats_log_api_gen/utils.cpp
+++ b/stats/stats_log_api_gen/utils.cpp
@@ -16,16 +16,28 @@
 
 #include "utils.h"
 
+#include <stdio.h>
+
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "Collation.h"
+#include "frameworks/proto_logging/stats/atom_field_options.pb.h"
+
 namespace android {
 namespace stats_log_api_gen {
 
+using std::map;
+using std::string;
+using std::vector;
+
 /**
  * Inlining this method because "android-base/strings.h" is not available on
  * google3.
  */
 static vector<string> Split(const string& s, const string& delimiters) {
-    GOOGLE_CHECK_NE(delimiters.size(), 0U);
-
     vector<string> result;
 
     size_t base = 0;
@@ -91,8 +103,8 @@
     return *ANNOTATION_ID_CONSTANTS;
 }
 
-string get_java_build_version_code(int minApiLevel) {
-    switch (minApiLevel) {
+string get_java_build_version_code(int apiLevel) {
+    switch (apiLevel) {
         case API_Q:
             return "Build.VERSION_CODES.Q";
         case API_R:
@@ -252,7 +264,7 @@
 // Native
 // Writes namespaces for the cpp and header files
 void write_namespace(FILE* out, const string& cppNamespaces) {
-    vector<string> cppNamespaceVec = Split(cppNamespaces, ",");
+    const vector<string> cppNamespaceVec = Split(cppNamespaces, ",");
     for (const string& cppNamespace : cppNamespaceVec) {
         fprintf(out, "namespace %s {\n", cppNamespace.c_str());
     }
@@ -267,13 +279,13 @@
 }
 
 static void write_cpp_usage(FILE* out, const string& method_name, const string& atom_code_name,
-                            const shared_ptr<AtomDecl> atom, const AtomDecl& attributionDecl,
+                            const AtomDecl& atom, const AtomDecl& attributionDecl,
                             bool isVendorAtomLogging = false) {
     const char* delimiterStr = method_name.find('(') == string::npos ? "(" : " ";
     fprintf(out, "     * Usage: %s%s%s", method_name.c_str(), delimiterStr, atom_code_name.c_str());
 
-    for (vector<AtomField>::const_iterator field = atom->fields.begin();
-         field != atom->fields.end(); field++) {
+    for (vector<AtomField>::const_iterator field = atom.fields.begin(); field != atom.fields.end();
+         field++) {
         if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
             for (const auto& chainField : attributionDecl.fields) {
                 if (chainField.javaType == JAVA_TYPE_STRING) {
@@ -307,15 +319,15 @@
     // Print atom constants
     for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
          atomIt++) {
-        string constant = make_constant_name((*atomIt)->name);
+        const string constant = make_constant_name((*atomIt)->name);
         fprintf(out, "\n");
         fprintf(out, "    /**\n");
         fprintf(out, "     * %s %s\n", (*atomIt)->message.c_str(), (*atomIt)->name.c_str());
-        write_cpp_usage(out, methodName, constant, *atomIt, attributionDecl, isVendorAtomLogging);
+        write_cpp_usage(out, methodName, constant, **atomIt, attributionDecl, isVendorAtomLogging);
 
         auto non_chained_decl = atom_code_to_non_chained_decl_map.find((*atomIt)->code);
         if (non_chained_decl != atom_code_to_non_chained_decl_map.end()) {
-            write_cpp_usage(out, methodName + "_non_chained", constant, *non_chained_decl->second,
+            write_cpp_usage(out, methodName + "_non_chained", constant, **non_chained_decl->second,
                             attributionDecl, isVendorAtomLogging);
         }
         fprintf(out, "     */\n");
@@ -438,7 +450,7 @@
     // Print constants for the atom codes.
     for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
          atomIt++) {
-        string constant = make_constant_name((*atomIt)->name);
+        const string constant = make_constant_name((*atomIt)->name);
         fprintf(out, "\n");
         fprintf(out, "    /**\n");
         fprintf(out, "     * %s %s<br>\n", (*atomIt)->message.c_str(), (*atomIt)->name.c_str());
@@ -634,7 +646,7 @@
     return 0;
 }
 
-bool contains_restricted(const AtomDeclSet& atomDeclSet) {
+static bool contains_restricted(const AtomDeclSet& atomDeclSet) {
     for (const auto& decl : atomDeclSet) {
         if (decl->restricted) {
             return true;
@@ -643,22 +655,19 @@
     return false;
 }
 
-bool requires_api_needed(const AtomDeclSet& atomDeclSet) {
-    return contains_restricted(atomDeclSet);
-}
-
-int get_min_api_level(const AtomDeclSet& atomDeclSet) {
-    if (requires_api_needed(atomDeclSet)) {
-        if (contains_restricted(atomDeclSet)) {
-            return API_U;
-        }
+int get_requires_api_level(int minApiLevel, const AtomDeclSet* atomDeclSet) {
+    if (atomDeclSet != nullptr && contains_restricted(*atomDeclSet)) {
+        return API_U;
+    }
+    if (minApiLevel <= API_Q) {
+        return API_Q;  // for StatsLog.writeRaw()
     }
     return API_LEVEL_CURRENT;
 }
 
 AtomDeclSet get_annotations(int argIndex,
                             const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet) {
-    FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
+    const FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
             fieldNumberToAtomDeclSet.find(argIndex);
     if (fieldNumberToAtomDeclSet.end() == fieldNumberToAtomDeclSetIt) {
         return AtomDeclSet();
diff --git a/stats/stats_log_api_gen/utils.h b/stats/stats_log_api_gen/utils.h
index cefd7e6..3ac08c8 100644
--- a/stats/stats_log_api_gen/utils.h
+++ b/stats/stats_log_api_gen/utils.h
@@ -60,7 +60,7 @@
 
 const map<AnnotationId, AnnotationStruct>& get_annotation_id_constants(const string& prefix);
 
-string get_java_build_version_code(int minApiLevel);
+string get_java_build_version_code(int apiLevel);
 
 string get_restriction_category_str(int annotationValue);
 
@@ -124,11 +124,7 @@
     }
 };
 
-bool contains_restricted(const AtomDeclSet& atomDeclSet);
-
-bool requires_api_needed(const AtomDeclSet& atomDeclSet);
-
-int get_min_api_level(const AtomDeclSet& atomDeclSet);
+int get_requires_api_level(int minApiLevel, const AtomDeclSet* atomDeclSet);
 
 }  // namespace stats_log_api_gen
 }  // namespace android