/*
 * 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.os.statsd;

option optimize_for = CODE_SIZE;
option java_package = "com.android.os";
option java_outer_classname = "AtomsProto";

import "frameworks/proto_logging/stats/atom_field_options.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";
import "frameworks/proto_logging/stats/enums/app/settings_enums.proto";
import "frameworks/proto_logging/stats/enums/app/media_output_enum.proto";
import "frameworks/proto_logging/stats/enums/app/tvsettings_enums.proto";
import "frameworks/proto_logging/stats/enums/app/wearsettings_enums.proto";
import "frameworks/proto_logging/stats/enums/bluetooth/a2dp/enums.proto";
import "frameworks/proto_logging/stats/enums/bluetooth/enums.proto";
import "frameworks/proto_logging/stats/enums/bluetooth/hci/enums.proto";
import "frameworks/proto_logging/stats/enums/bluetooth/hfp/enums.proto";
import "frameworks/proto_logging/stats/enums/bluetooth/leaudio/enums.proto";
import "frameworks/proto_logging/stats/enums/bluetooth/smp/enums.proto";
import "frameworks/proto_logging/stats/enums/contexthub/enums.proto";
import "frameworks/proto_logging/stats/enums/debug/enums.proto";
import "frameworks/proto_logging/stats/enums/hardware/biometrics/enums.proto";
import "frameworks/proto_logging/stats/enums/hardware/sensor/assist/enums.proto";
import "frameworks/proto_logging/stats/enums/hotword/enums.proto";
import "frameworks/proto_logging/stats/enums/media/audio/enums.proto";
import "frameworks/proto_logging/stats/enums/media/enums.proto";
import "frameworks/proto_logging/stats/enums/nearby/enums.proto";
import "frameworks/proto_logging/stats/enums/net/enums.proto";
import "frameworks/proto_logging/stats/enums/neuralnetworks/enums.proto";
import "frameworks/proto_logging/stats/enums/os/enums.proto";
import "frameworks/proto_logging/stats/enums/server/connectivity/data_stall_event.proto";
import "frameworks/proto_logging/stats/enums/server/display/enums.proto";
import "frameworks/proto_logging/stats/enums/server/enums.proto";
import "frameworks/proto_logging/stats/enums/server/job/enums.proto";
import "frameworks/proto_logging/stats/enums/server/location/enums.proto";
import "frameworks/proto_logging/stats/enums/service/enums.proto";
import "frameworks/proto_logging/stats/enums/service/procstats_enum.proto";
import "frameworks/proto_logging/stats/enums/stats/connectivity/network_stack.proto";
import "frameworks/proto_logging/stats/enums/stats/connectivity/tethering.proto";
import "frameworks/proto_logging/stats/enums/stats/dnsresolver/dns_resolver.proto";
import "frameworks/proto_logging/stats/enums/stats/devicepolicy/device_policy.proto";
import "frameworks/proto_logging/stats/enums/stats/devicepolicy/device_policy_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/docsui/docsui_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/accessibility/accessibility_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/hdmi/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/intelligence/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/launcher/launcher.proto";
import "frameworks/proto_logging/stats/enums/stats/location/location_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/mediametrics/mediametrics.proto";
import "frameworks/proto_logging/stats/enums/stats/mediaprovider/mediaprovider_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/mobiledatadownload/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/privacysignals/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/safetycenter/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/storage/storage_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/style/style_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/sysui/notification_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/tls/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/tv/tif_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/wm/enums.proto";
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/uwb/enums.proto";
import "frameworks/proto_logging/stats/enums/view/enums.proto";
import "frameworks/proto_logging/stats/enums/wifi/enums.proto";
import "frameworks/proto_logging/stats/enums/stats/textclassifier/textclassifier_enums.proto";
import "frameworks/proto_logging/stats/enums/stats/otaupdate/updateengine_enums.proto";
import "frameworks/proto_logging/stats/message/mediametrics_message.proto";

/**
 * The primary atom class. This message defines all of the available
 * raw stats log events from the Android system, also known as "atoms."
 *
 * This field contains a single oneof with all of the available messages.
 * The stats-log-api-gen tool runs as part of the Android build and
 * generates the android.util.StatsLog class, which contains the constants
 * and methods that Android uses to log.
 *
 * This Atom class is not actually built into the Android system.
 * Instead, statsd on Android constructs these messages synthetically,
 * in the format defined here and in stats_log.proto.
 */
message Atom {
    // Pushed atoms start at 2.
    oneof pushed {
        // For StatsLog reasons, 1 is illegal and will not work. Must start at 2.
        BleScanStateChanged ble_scan_state_changed = 2
                [(module) = "bluetooth", (module) = "statsdtest"];
        ProcessStateChanged process_state_changed = 3 [(module) = "framework"];
        BleScanResultReceived ble_scan_result_received = 4 [(module) = "bluetooth"];
        SensorStateChanged sensor_state_changed =
                5 [(module) = "framework", (module) = "statsdtest"];
        GpsScanStateChanged gps_scan_state_changed = 6 [(module) = "framework"];
        SyncStateChanged sync_state_changed = 7 [(module) = "framework", (module) = "statsdtest"];
        ScheduledJobStateChanged scheduled_job_state_changed =
                8 [(module) = "framework", (module) = "statsdtest"];
        ScreenBrightnessChanged screen_brightness_changed =
                9 [(module) = "framework", (module) = "statsdtest"];
        WakelockStateChanged wakelock_state_changed =
                10 [(module) = "framework", (module) = "statsdtest"];
        LongPartialWakelockStateChanged long_partial_wakelock_state_changed =
                11 [(module) = "framework"];
        MobileRadioPowerStateChanged mobile_radio_power_state_changed =
                12 [(module) = "framework", (truncate_timestamp) = true];
        WifiRadioPowerStateChanged wifi_radio_power_state_changed = 13 [(module) = "framework"];
        ActivityManagerSleepStateChanged activity_manager_sleep_state_changed =
                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"];
        LauncherUIChanged launcher_event = 19 [(module) = "sysui"];
        BatterySaverModeStateChanged battery_saver_mode_state_changed =
                20 [(module) = "framework", (module) = "statsdtest"];
        DeviceIdleModeStateChanged device_idle_mode_state_changed = 21 [(module) = "framework"];
        DeviceIdlingModeStateChanged device_idling_mode_state_changed = 22 [(module) = "framework"];
        AudioStateChanged audio_state_changed =
                23 [(module) = "framework", (truncate_timestamp) = true];
        MediaCodecStateChanged media_codec_state_changed = 24 [(module) = "framework"];
        CameraStateChanged camera_state_changed = 25 [(module) = "framework"];
        FlashlightStateChanged flashlight_state_changed = 26 [(module) = "framework"];
        UidProcessStateChanged uid_process_state_changed =
                27 [(module) = "framework", (module) = "statsdtest"];
        ProcessLifeCycleStateChanged process_life_cycle_state_changed =
                28 [(module) = "framework", (module) = "statsdtest"];
        ScreenStateChanged screen_state_changed =
                29 [(module) = "framework", (module) = "statsdtest"];
        BatteryLevelChanged battery_level_changed =
                30 [(module) = "framework", (module) = "statsdtest"];
        ChargingStateChanged charging_state_changed = 31 [(module) = "framework"];
        PluggedStateChanged plugged_state_changed = 32
                [(module) = "framework", (module) = "statsdtest"];
        InteractiveStateChanged interactive_state_changed = 33 [(module) = "framework"];
        TouchEventReported touch_event_reported = 34;
        WakeupAlarmOccurred wakeup_alarm_occurred = 35 [(module) = "framework"];
        KernelWakeupReported kernel_wakeup_reported = 36 [(module) = "framework"];
        WifiLockStateChanged wifi_lock_state_changed = 37 [(module) = "wifi"];
        WifiSignalStrengthChanged wifi_signal_strength_changed = 38 [(module) = "wifi"];
        WifiScanStateChanged wifi_scan_state_changed = 39 [(module) = "wifi"];
        PhoneSignalStrengthChanged phone_signal_strength_changed =
                40 [(module) = "framework", (truncate_timestamp) = true];
        SettingChanged setting_changed = 41 [(module) = "framework"];
        ActivityForegroundStateChanged activity_foreground_state_changed =
                42 [(module) = "framework", (module) = "statsdtest"];
        IsolatedUidChanged isolated_uid_changed =
                43 [(module) = "framework", (module) = "statsd", (module) = "statsdtest"];
        PacketWakeupOccurred packet_wakeup_occurred = 44 [(module) = "framework"];
        WallClockTimeShifted wall_clock_time_shifted = 45 [(module) = "framework"];
        AnomalyDetected anomaly_detected = 46 [(module) = "statsd"];
        AppBreadcrumbReported app_breadcrumb_reported = 47 [(module) = "statsd"];
        AppStartOccurred app_start_occurred = 48 [(module) = "framework", (module) = "statsdtest"];
        AppStartCanceled app_start_canceled = 49 [(module) = "framework"];
        AppStartFullyDrawn app_start_fully_drawn = 50 [(module) = "framework"];
        LmkKillOccurred lmk_kill_occurred = 51 [(module) = "framework"];
        PictureInPictureStateChanged picture_in_picture_state_changed = 52 [(module) = "framework"];
        WifiMulticastLockStateChanged wifi_multicast_lock_state_changed = 53 [(module) = "wifi"];
        LmkStateChanged lmk_state_changed = 54 [(module) = "framework"];
        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 [(module) = "statsd", deprecated = true];
        OverlayStateChanged overlay_state_changed =
                59 [(module) = "framework", (module) = "statsdtest"];
        ForegroundServiceStateChanged foreground_service_state_changed
                = 60 [(module) = "framework"];
        CallStateChanged call_state_changed =
                61 [(module) = "telecom", (truncate_timestamp) = true];
        KeyguardStateChanged keyguard_state_changed = 62 [(module) = "sysui"];
        KeyguardBouncerStateChanged keyguard_bouncer_state_changed = 63 [(module) = "sysui"];
        KeyguardBouncerPasswordEntered keyguard_bouncer_password_entered = 64 [(module) = "sysui"];
        AppDied app_died = 65 [(module) = "framework"];
        ResourceConfigurationChanged resource_configuration_changed = 66 [(module) = "framework"];
        BluetoothEnabledStateChanged bluetooth_enabled_state_changed = 67 [(module) = "framework"];
        BluetoothConnectionStateChanged bluetooth_connection_state_changed =
                68 [(module) = "bluetooth"];
        GpsSignalQualityChanged gps_signal_quality_changed = 69 [(module) = "framework"];
        UsbConnectorStateChanged usb_connector_state_changed = 70 [(module) = "framework"];
        SpeakerImpedanceReported speaker_impedance_reported = 71;
        HardwareFailed hardware_failed = 72;
        PhysicalDropDetected physical_drop_detected = 73;
        ChargeCyclesReported charge_cycles_reported = 74;
        MobileConnectionStateChanged mobile_connection_state_changed = 75 [(module) = "telephony"];
        MobileRadioTechnologyChanged mobile_radio_technology_changed = 76 [(module) = "telephony"];
        UsbDeviceAttached usb_device_attached = 77 [(module) = "framework"];
        AppCrashOccurred app_crash_occurred = 78 [(module) = "framework", (module) = "statsdtest"];
        ANROccurred anr_occurred = 79 [(module) = "framework"];
        WTFOccurred wtf_occurred = 80 [(module) = "framework"];
        LowMemReported low_mem_reported = 81 [(module) = "framework"];
        GenericAtom generic_atom = 82;
        VibratorStateChanged vibrator_state_changed = 84 [(module) = "framework"];
        DeferredJobStatsReported deferred_job_stats_reported = 85 [(module) = "framework"];
        ThermalThrottlingStateChanged thermal_throttling = 86 [deprecated=true];
        BiometricAcquired biometric_acquired = 87 [(module) = "framework"];
        BiometricAuthenticated biometric_authenticated = 88 [(module) = "framework"];
        BiometricErrorOccurred biometric_error_occurred = 89 [(module) = "framework"];
        UiEventReported ui_event_reported = 90 [
            (module) = "framework",
            (module) = "sysui",
            (module) = "mediaprovider"
        ];
        BatteryHealthSnapshot battery_health_snapshot = 91;
        SlowIo slow_io = 92;
        BatteryCausedShutdown battery_caused_shutdown = 93;
        PhoneServiceStateChanged phone_service_state_changed = 94 [(module) = "framework"];
        PhoneStateChanged phone_state_changed = 95 [(module) = "framework"];
        UserRestrictionChanged user_restriction_changed = 96;
        SettingsUIChanged settings_ui_changed = 97 [(module) = "settings"];
        ConnectivityStateChanged connectivity_state_changed = 98 [(module) = "framework"];
        // TODO: service state change is very noisy shortly after boot, as well
        // as at other transitions - coming out of doze, device plugged in, etc.
        // Consider removing this if it becomes a problem
        ServiceStateChanged service_state_changed = 99 [(module) = "framework"];
        ServiceLaunchReported service_launch_reported = 100 [(module) = "framework"];
        FlagFlipUpdateOccurred flag_flip_update_occurred = 101 [(module) = "framework"];
        BinaryPushStateChanged binary_push_state_changed = 102 [(module) = "statsd"];
        DevicePolicyEvent device_policy_event = 103 [(module) = "framework"];
        DocsUIFileOperationCanceledReported docs_ui_file_op_canceled = 104 [(module) = "docsui"];
        DocsUIFileOperationCopyMoveModeReported docs_ui_file_op_copy_move_mode_reported =
            105 [(module) = "docsui"];
        DocsUIFileOperationFailureReported docs_ui_file_op_failure = 106 [(module) = "docsui"];
        DocsUIFileOperationReported docs_ui_provider_file_op = 107 [(module) = "docsui"];
        DocsUIInvalidScopedAccessRequestReported docs_ui_invalid_scoped_access_request =
            108 [(module) = "docsui"];
        DocsUILaunchReported docs_ui_launch_reported = 109 [(module) = "docsui"];
        DocsUIRootVisitedReported docs_ui_root_visited = 110 [(module) = "docsui"];
        DocsUIStartupMsReported docs_ui_startup_ms = 111 [(module) = "docsui"];
        DocsUIUserActionReported docs_ui_user_action_reported = 112 [(module) = "docsui"];
        WifiEnabledStateChanged wifi_enabled_state_changed = 113 [(module) = "framework"];
        WifiRunningStateChanged wifi_running_state_changed = 114
                [(module) = "framework", deprecated = true];
        AppCompacted app_compacted = 115 [(module) = "framework"];
        NetworkDnsEventReported network_dns_event_reported = 116 [(module) = "resolv"];
        DocsUIPickerLaunchedFromReported docs_ui_picker_launched_from_reported =
            117 [(module) = "docsui"];
        DocsUIPickResultReported docs_ui_pick_result_reported = 118 [(module) = "docsui"];
        DocsUISearchModeReported docs_ui_search_mode_reported = 119 [(module) = "docsui"];
        DocsUISearchTypeReported docs_ui_search_type_reported = 120 [(module) = "docsui"];
        DataStallEvent data_stall_event = 121 [(module) = "network_stack"];
        RescuePartyResetReported rescue_party_reset_reported = 122 [(module) = "framework"];
        SignedConfigReported signed_config_reported = 123 [(module) = "framework"];
        GnssNiEventReported gnss_ni_event_reported = 124 [(module) = "framework"];
        BluetoothLinkLayerConnectionEvent bluetooth_link_layer_connection_event =
                125 [(module) = "bluetooth"];
        BluetoothAclConnectionStateChanged bluetooth_acl_connection_state_changed =
                126 [(module) = "bluetooth"];
        BluetoothScoConnectionStateChanged bluetooth_sco_connection_state_changed =
                127 [(module) = "bluetooth"];
        AppDowngraded app_downgraded = 128 [(module) = "framework"];
        AppOptimizedAfterDowngraded app_optimized_after_downgraded = 129;
        LowStorageStateChanged low_storage_state_changed = 130 [(module) = "framework"];
        GnssNfwNotificationReported gnss_nfw_notification_reported = 131 [(module) = "framework"];
        GnssConfigurationReported gnss_configuration_reported = 132 [(module) = "framework"];
        UsbPortOverheatEvent usb_port_overheat_event_reported = 133;
        NfcErrorOccurred nfc_error_occurred = 134 [(module) = "nfc"];
        NfcStateChanged nfc_state_changed = 135 [(module) = "nfc"];
        NfcBeamOccurred nfc_beam_occurred = 136 [(module) = "nfc"];
        NfcCardemulationOccurred nfc_cardemulation_occurred = 137 [(module) = "nfc"];
        NfcTagOccurred nfc_tag_occurred = 138 [(module) = "nfc"];
        NfcHceTransactionOccurred nfc_hce_transaction_occurred = 139 [(module) = "nfc"];
        SeStateChanged se_state_changed = 140 [(module) = "secure_element"];
        SeOmapiReported se_omapi_reported = 141 [(module) = "secure_element"];
        BroadcastDispatchLatencyReported broadcast_dispatch_latency_reported =
                142 [(module) = "framework"];
        AttentionManagerServiceResultReported attention_manager_service_result_reported =
                143 [(module) = "framework"];
        AdbConnectionChanged adb_connection_changed = 144 [(module) = "framework"];
        SpeechDspStatReported speech_dsp_stat_reported = 145;
        UsbContaminantReported usb_contaminant_reported = 146 [(module) = "framework"];
        WatchdogRollbackOccurred watchdog_rollback_occurred =
                147 [(module) = "framework", (module) = "statsd"];
        BiometricSystemHealthIssueDetected biometric_system_health_issue_detected =
                148 [(module) = "framework"];
        BubbleUIChanged bubble_ui_changed = 149 [(module) = "framework"];
        ScheduledJobConstraintChanged scheduled_job_constraint_changed =
                150 [(module) = "framework"];
        BluetoothActiveDeviceChanged bluetooth_active_device_changed =
                151 [(module) = "bluetooth"];
        BluetoothA2dpPlaybackStateChanged bluetooth_a2dp_playback_state_changed =
                152 [(module) = "bluetooth"];
        BluetoothA2dpCodecConfigChanged bluetooth_a2dp_codec_config_changed =
                153 [(module) = "bluetooth"];
        BluetoothA2dpCodecCapabilityChanged bluetooth_a2dp_codec_capability_changed =
                154 [(module) = "bluetooth"];
        BluetoothA2dpAudioUnderrunReported bluetooth_a2dp_audio_underrun_reported =
                155 [(module) = "bluetooth"];
        BluetoothA2dpAudioOverrunReported bluetooth_a2dp_audio_overrun_reported =
                156 [(module) = "bluetooth"];
        BluetoothDeviceRssiReported bluetooth_device_rssi_reported =
                157 [(module) = "bluetooth"];
        BluetoothDeviceFailedContactCounterReported
                bluetooth_device_failed_contact_counter_reported = 158 [(module) = "bluetooth"];
        BluetoothDeviceTxPowerLevelReported bluetooth_device_tx_power_level_reported =
                159 [(module) = "bluetooth"];
        BluetoothHciTimeoutReported bluetooth_hci_timeout_reported =
                160 [(module) = "bluetooth"];
        BluetoothQualityReportReported bluetooth_quality_report_reported =
                161 [(module) = "bluetooth"];
        BluetoothDeviceInfoReported bluetooth_device_info_reported =
                162 [(module) = "bluetooth"];
        BluetoothRemoteVersionInfoReported bluetooth_remote_version_info_reported =
                163 [(module) = "bluetooth"];
        BluetoothSdpAttributeReported bluetooth_sdp_attribute_reported =
                164 [(module) = "bluetooth"];
        BluetoothBondStateChanged bluetooth_bond_state_changed =
                165 [(module) = "bluetooth"];
        BluetoothClassicPairingEventReported bluetooth_classic_pairing_event_reported =
                166 [(module) = "bluetooth"];
        BluetoothSmpPairingEventReported bluetooth_smp_pairing_event_reported =
                167 [(module) = "bluetooth"];
        ScreenTimeoutExtensionReported screen_timeout_extension_reported =
                168 [(module) = "framework"];
        ProcessStartTime process_start_time = 169 [(module) = "framework"];
        PermissionGrantRequestResultReported permission_grant_request_result_reported =
                170 [(module) = "permissioncontroller"];
        BluetoothSocketConnectionStateChanged bluetooth_socket_connection_state_changed =
                171 [(module) = "bluetooth"];
        DeviceIdentifierAccessDenied device_identifier_access_denied =
                172 [(module) = "telephony_common"];
        BubbleDeveloperErrorReported bubble_developer_error_reported = 173 [(module) = "framework"];
        AssistGestureStageReported assist_gesture_stage_reported = 174 [(module) = "sysui"];
        AssistGestureFeedbackReported assist_gesture_feedback_reported = 175 [(module) = "sysui"];
        AssistGestureProgressReported assist_gesture_progress_reported = 176 [(module) = "sysui"];
        TouchGestureClassified touch_gesture_classified = 177 [(module) = "framework"];
        HiddenApiUsed hidden_api_used = 178 [(module) = "framework"];
        StyleUIChanged style_ui_changed = 179 [(module) = "sysui"];
        PrivacyIndicatorsInteracted privacy_indicators_interacted =
                180 [(module) = "permissioncontroller"];
        AppInstallOnExternalStorageReported app_install_on_external_storage_reported =
                181 [(module) = "framework"];
        NetworkStackReported network_stack_reported = 182 [(module) = "network_stack"];
        AppMovedStorageReported app_moved_storage_reported = 183 [(module) = "framework"];
        BiometricEnrolled biometric_enrolled = 184 [(module) = "framework"];
        SystemServerWatchdogOccurred system_server_watchdog_occurred = 185 [(module) = "framework"];
        TombStoneOccurred tomb_stone_occurred = 186 [(module) = "framework"];
        BluetoothClassOfDeviceReported bluetooth_class_of_device_reported =
                187 [(module) = "bluetooth"];
        IntelligenceEventReported intelligence_event_reported =
                188 [(module) = "intelligence"];
        ThermalThrottlingSeverityStateChanged thermal_throttling_severity_state_changed =
                189 [(module) = "framework"];
        RoleRequestResultReported role_request_result_reported =
                190 [(module) = "permissioncontroller"];
        MediametricsAudiopolicyReported mediametrics_audiopolicy_reported = 191;
        MediametricsAudiorecordReported mediametrics_audiorecord_reported = 192;
        MediametricsAudiothreadReported mediametrics_audiothread_reported = 193;
        MediametricsAudiotrackReported mediametrics_audiotrack_reported = 194;
        MediametricsCodecReported mediametrics_codec_reported = 195;
        MediametricsDrmWidevineReported mediametrics_drm_widevine_reported = 196;
        MediametricsExtractorReported mediametrics_extractor_reported = 197;
        MediametricsMediadrmReported mediametrics_mediadrm_reported = 198;
        MediametricsNuPlayerReported mediametrics_nuplayer_reported = 199;
        MediametricsRecorderReported mediametrics_recorder_reported = 200;
        MediametricsDrmManagerReported mediametrics_drmmanager_reported = 201;
        CarPowerStateChanged car_power_state_changed = 203 [(module) = "car"];
        GarageModeInfo garage_mode_info = 204 [(module) = "car"];
        TestAtomReported test_atom_reported = 205
            [(module) = "cts", (module) = "statsdtest"];
        ContentCaptureCallerMismatchReported content_capture_caller_mismatch_reported =
                206 [(module) = "framework"];
        ContentCaptureServiceEvents content_capture_service_events = 207 [(module) = "framework"];
        ContentCaptureSessionEvents content_capture_session_events = 208 [(module) = "framework"];
        ContentCaptureFlushed content_capture_flushed = 209 [(module) = "framework"];
        LocationManagerApiUsageReported location_manager_api_usage_reported =
                210 [(module) = "framework"];
        ReviewPermissionsFragmentResultReported review_permissions_fragment_result_reported =
                211 [(module) = "permissioncontroller"];
        RuntimePermissionsUpgradeResult runtime_permissions_upgrade_result =
                212 [(module) = "permissioncontroller"];
        GrantPermissionsActivityButtonActions grant_permissions_activity_button_actions =
                213 [(module) = "permissioncontroller"];
        LocationAccessCheckNotificationAction location_access_check_notification_action =
                214 [(module) = "permissioncontroller"];
        AppPermissionFragmentActionReported app_permission_fragment_action_reported =
                215 [(module) = "permissioncontroller"];
        AppPermissionFragmentViewed app_permission_fragment_viewed =
                216 [(module) = "permissioncontroller"];
        AppPermissionsFragmentViewed app_permissions_fragment_viewed =
                217 [(module) = "permissioncontroller"];
        PermissionAppsFragmentViewed permission_apps_fragment_viewed =
                218  [(module) = "permissioncontroller"];
        TextSelectionEvent text_selection_event = 219  [(module) = "textclassifier"];
        TextLinkifyEvent text_linkify_event = 220  [(module) = "textclassifier"];
        ConversationActionsEvent conversation_actions_event = 221  [(module) = "textclassifier"];
        LanguageDetectionEvent language_detection_event = 222  [(module) = "textclassifier"];
        ExclusionRectStateChanged exclusion_rect_state_changed = 223 [(module) = "framework"];
        BackGesture back_gesture_reported_reported = 224 [(module) = "sysui"];
        UpdateEngineUpdateAttemptReported update_engine_update_attempt_reported = 225;
        UpdateEngineSuccessfulUpdateReported update_engine_successful_update_reported = 226;
        CameraActionEvent camera_action_event = 227 [(module) = "framework"];
        AppCompatibilityChangeReported app_compatibility_change_reported =
                228 [(module) = "framework"];
        PerfettoUploaded perfetto_uploaded = 229 [(module) = "perfetto"];
        VmsClientConnectionStateChanged vms_client_connection_state_changed =
                230 [(module) = "car"];
        MediaProviderScanOccurred media_provider_scan_occurred = 233 [(module) = "mediaprovider"];
        MediaContentDeleted media_content_deleted = 234 [(module) = "mediaprovider"];
        MediaProviderPermissionRequested media_provider_permission_requested =
            235 [(module) = "mediaprovider"];
        MediaProviderSchemaChanged media_provider_schema_changed = 236 [(module) = "mediaprovider"];
        MediaProviderIdleMaintenanceFinished media_provider_idle_maintenance_finished =
            237 [(module) = "mediaprovider"];
        RebootEscrowRecoveryReported reboot_escrow_recovery_reported = 238 [(module) = "framework"];
        BootTimeEventDuration boot_time_event_duration_reported = 239 [(module) = "framework"];
        BootTimeEventElapsedTime boot_time_event_elapsed_time_reported =
                240 [(module) = "framework"];
        BootTimeEventUtcTime boot_time_event_utc_time_reported = 241;
        BootTimeEventErrorCode boot_time_event_error_code_reported = 242 [(module) = "framework"];
        UserspaceRebootReported userspace_reboot_reported = 243 [(module) = "framework"];
        NotificationReported notification_reported = 244 [(module) = "framework"];
        NotificationPanelReported notification_panel_reported = 245 [(module) = "sysui"];
        NotificationChannelModified notification_channel_modified = 246 [(module) = "framework"];
        IntegrityCheckResultReported integrity_check_result_reported = 247 [(module) = "framework"];
        IntegrityRulesPushed integrity_rules_pushed = 248 [(module) = "framework"];
        CellBroadcastMessageReported cb_message_reported =
            249 [(module) = "cellbroadcast"];
        CellBroadcastMessageError cb_message_error =
            250 [(module) = "cellbroadcast"];
        WifiHealthStatReported wifi_health_stat_reported = 251 [(module) = "wifi"];
        WifiFailureStatReported wifi_failure_stat_reported = 252 [(module) = "wifi"];
        WifiConnectionResultReported wifi_connection_result_reported = 253 [(module) = "wifi"];
        AppFreezeChanged app_freeze_changed = 254 [(module) = "framework"];
        SnapshotMergeReported snapshot_merge_reported = 255;
        ForegroundServiceAppOpSessionEnded foreground_service_app_op_session_ended =
            256  [(module) = "framework"];
        // DisplayJankReported was deprecated in Android 12+
        DisplayJankReported display_jank_reported = 257 [deprecated = true];
        AppStandbyBucketChanged app_standby_bucket_changed = 258 [(module) = "framework"];
        SharesheetStarted sharesheet_started = 259 [(module) = "framework"];
        RankingSelected ranking_selected = 260 [
            (module) = "framework",
            (module) = "sysui",
            (module) = "mediaprovider"
        ];
        TvSettingsUIInteracted tvsettings_ui_interacted = 261 [(module) = "tv_settings"];
        LauncherStaticLayout launcher_snapshot = 262 [(module) = "sysui"];
        PackageInstallerV2Reported package_installer_v2_reported = 263 [(module) = "framework"];
        UserLifecycleJourneyReported user_lifecycle_journey_reported = 264 [(module) = "framework"];
        UserLifecycleEventOccurred user_lifecycle_event_occurred = 265 [(module) = "framework"];
        AccessibilityShortcutReported accessibility_shortcut_reported =
            266 [(module) = "framework"];
        AccessibilityServiceReported accessibility_service_reported = 267 [(module) = "settings"];
        DocsUIDragAndDropReported docs_ui_drag_and_drop_reported = 268 [(module) = "docsui"];
        AppUsageEventOccurred app_usage_event_occurred = 269 [(module) = "framework"];
        AutoRevokeNotificationClicked auto_revoke_notification_clicked =
            270 [(module) = "permissioncontroller"];
        AutoRevokeFragmentAppViewed auto_revoke_fragment_app_viewed =
            271 [(module) = "permissioncontroller"];
        AutoRevokedAppInteraction auto_revoked_app_interaction =
            272 [(module) = "permissioncontroller", (module) = "settings"];
        AppPermissionGroupsFragmentAutoRevokeAction
            app_permission_groups_fragment_auto_revoke_action =
            273 [(module) = "permissioncontroller"];
        EvsUsageStatsReported evs_usage_stats_reported = 274 [(module) = "evs"];
        AudioPowerUsageDataReported audio_power_usage_data_reported = 275;
        TvTunerStateChanged tv_tuner_state_changed = 276 [(module) = "framework"];
        MediaOutputOpSwitchReported mediaoutput_op_switch_reported =
            277 [(module) = "sysui"];
        CellBroadcastMessageFiltered cb_message_filtered =
            278 [(module) = "cellbroadcast"];
        TvTunerDvrStatus tv_tuner_dvr_status = 279 [(module) = "framework"];
        TvCasSessionOpenStatus tv_cas_session_open_status =
            280 [(module) = "framework"];
        AssistantInvocationReported assistant_invocation_reported = 281 [(module) = "framework"];
        DisplayWakeReported display_wake_reported = 282 [(module) = "framework"];
        CarUserHalModifyUserRequestReported car_user_hal_modify_user_request_reported =
            283 [(module) = "car"];
        CarUserHalModifyUserResponseReported car_user_hal_modify_user_response_reported =
            284 [(module) = "car"];
        CarUserHalPostSwitchResponseReported car_user_hal_post_switch_response_reported =
            285 [(module) = "car"];
        CarUserHalInitialUserInfoRequestReported car_user_hal_initial_user_info_request_reported =
            286 [(module) = "car"];
        CarUserHalInitialUserInfoResponseReported car_user_hal_initial_user_info_response_reported =
            287 [(module) = "car"];
        CarUserHalUserAssociationRequestReported car_user_hal_user_association_request_reported =
            288 [(module) = "car"];
        CarUserHalSetUserAssociationResponseReported car_user_hal_set_user_association_response_reported =
            289 [(module) = "car"];
        NetworkIpProvisioningReported network_ip_provisioning_reported =
            290 [(module) = "network_stack"];
        NetworkDhcpRenewReported network_dhcp_renew_reported = 291 [(module) = "network_stack"];
        NetworkValidationReported network_validation_reported = 292 [(module) = "network_stack"];
        NetworkStackQuirkReported network_stack_quirk_reported = 293 [(module) = "network_stack"];
        MediametricsAudioRecordDeviceUsageReported mediametrics_audiorecorddeviceusage_reported =
            294;
        MediametricsAudioThreadDeviceUsageReported mediametrics_audiothreaddeviceusage_reported =
            295;
        MediametricsAudioTrackDeviceUsageReported mediametrics_audiotrackdeviceusage_reported =
            296;
        MediametricsAudioDeviceConnectionReported mediametrics_audiodeviceconnection_reported =
            297;
        BlobCommitted blob_committed = 298 [(module) = "framework"];
        BlobLeased blob_leased = 299 [(module) = "framework"];
        BlobOpened blob_opened = 300 [(module) = "framework"];
        ContactsProviderStatusReported contacts_provider_status_reported = 301;
        KeystoreKeyEventReported keystore_key_event_reported = 302;
        NetworkTetheringReported  network_tethering_reported =
            303 [(module) = "network_tethering"];
        ImeTouchReported ime_touch_reported = 304 [(module) = "sysui"];
        UIInteractionFrameInfoReported ui_interaction_frame_info_reported =
            305 [(module) = "framework"];
        UIActionLatencyReported ui_action_latency_reported = 306 [(module) = "framework"];
        WifiDisconnectReported wifi_disconnect_reported = 307 [(module) = "wifi"];
        WifiConnectionStateChanged wifi_connection_state_changed = 308 [(module) = "wifi"];
        HdmiCecActiveSourceChanged hdmi_cec_active_source_changed = 309 [(module) = "framework"];
        HdmiCecMessageReported hdmi_cec_message_reported = 310 [(module) = "framework"];
        AirplaneMode airplane_mode = 311 [(module) = "telephony"];
        ModemRestart modem_restart = 312 [(module) = "telephony"];
        CarrierIdMismatchReported carrier_id_mismatch_reported = 313 [(module) = "telephony"];
        CarrierIdTableUpdated carrier_id_table_updated = 314 [(module) = "telephony"];
        DataStallRecoveryReported data_stall_recovery_reported = 315 [(module) = "telephony"];
        MediametricsMediaParserReported mediametrics_mediaparser_reported = 316;
        TlsHandshakeReported tls_handshake_reported = 317 [(module) = "conscrypt"];
        TextClassifierApiUsageReported text_classifier_api_usage_reported = 318  [(module) = "textclassifier"];
        CarWatchdogKillStatsReported car_watchdog_kill_stats_reported = 319 [(module) = "car"];
        MediametricsPlaybackReported mediametrics_playback_reported = 320 [(module) = "media_metrics"];
        MediaNetworkInfoChanged media_network_info_changed = 321 [(module) = "media_metrics"];
        MediaPlaybackStateChanged media_playback_state_changed = 322 [(module) = "media_metrics"];
        MediaPlaybackErrorReported media_playback_error_reported = 323 [(module) = "media_metrics"];
        MediaPlaybackTrackChanged media_playback_track_changed = 324 [(module) = "media_metrics"];
        WifiScanReported wifi_scan_reported = 325 [(module) = "wifi"];
        WifiPnoScanReported wifi_pno_scan_reported = 326  [(module) = "wifi"];
        TifTuneStateChanged tif_tune_changed = 327 [(module) = "framework"];
        AutoRotateReported auto_rotate_reported = 328 [(module) = "framework"];
        PerfettoTrigger perfetto_trigger = 329 [(module) = "perfetto"];
        TranscodingData transcoding_data = 330 [(module) = "mediaprovider"];
        ImsServiceEntitlementUpdated ims_service_entitlement_updated = 331 [(module) = "imsentitlement"];
        ArtDatumReported art_datum_reported = 332 [(module) = "art"];
        DeviceRotated device_rotated = 333 [(module) = "framework"];
        SimSpecificSettingsRestored sim_specific_settings_restored = 334
            [(module) = "telephony"];
        TextClassifierDownloadReported text_classifier_download_reported = 335 [(module) = "textclassifier"];
        PinStorageEvent pin_storage_event = 336 [(module) = "telephony"];
        FaceDownReported face_down_reported = 337 [(module) = "framework"];
        BluetoothHALCrashReasonReported bluetooth_hal_crash_reason_reported =
            338 [(module) = "bluetooth"];
        RebootEscrowPreparationReported reboot_escrow_preparation_reported =
            339 [(module) = "framework"];
        RebootEscrowLskfCaptureReported reboot_escrow_lskf_capture_reported =
            340 [(module) = "framework"];
        RebootEscrowRebootReported reboot_escrow_reboot_reported = 341 [(module) = "framework"];
        BinderLatencyReported binder_latency_reported = 342 [(module) = "framework"];
        MediametricsAAudioStreamReported mediametrics_aaudiostream_reported = 343;
        MediaTranscodingSessionEnded media_transcoding_session_ended = 344
            [(module) = "media"];
        MagnificationUsageReported magnification_usage_reported =
            345 [(module) = "framework"];
        MagnificationModeWithImeOnReported magnification_mode_with_ime_on_reported =
            346 [(module) = "framework"];
        AppSearchCallStatsReported app_search_call_stats_reported = 347 [(module) = "appsearch"];
        AppSearchPutDocumentStatsReported app_search_put_document_stats_reported = 348 [(module) = "appsearch"];
        DeviceControlChanged device_control_changed = 349 [(module) = "sysui"];
        DeviceStateChanged device_state_changed = 350 [(module) = "framework"];
        InputDeviceRegistered inputdevice_registered = 351 [(module) = "framework"];
        SmartSpaceCardReported smartspace_card_reported = 352 [(module) = "sysui"];
        AuthPromptAuthenticateInvoked auth_prompt_authenticate_invoked = 353 [(module) = "framework"];
        AuthManagerCanAuthenticateInvoked auth_manager_can_authenticate_invoked = 354 [(module) = "framework"];
        AuthEnrollActionInvoked auth_enroll_action_invoked = 355 [(module) = "framework"];
        AuthDeprecatedAPIUsed auth_deprecated_api_used = 356 [(module) = "framework"];
        UnattendedRebootOccurred unattended_reboot_occurred = 357 [(module) = "scheduling"];
        LongRebootBlockingReported long_reboot_blocking_reported = 358 [(module) = "scheduling"];
        LocationTimeZoneProviderStateChanged location_time_zone_provider_state_changed =
            359 [(module) = "framework"];
        // 360-363 are reserved.
        FdtrackEventOccurred fdtrack_event_occurred = 364 [(module) = "framework"];
        TimeoutAutoExtendedReported timeout_auto_extended_reported = 365
            [(module) = "framework"];
        OdrefreshReported odrefresh_reported = 366 [(module) = "art"];
        AlarmBatchDelivered alarm_batch_delivered = 367 [(module) = "framework"];
        AlarmScheduled alarm_scheduled = 368 [(module) = "framework"];
        CarWatchdogIoOveruseStatsReported car_watchdog_io_overuse_stats_reported = 369 [(module) = "car"];
        UserLevelHibernationStateChanged user_level_hibernation_state_changed = 370 [(module) = "framework"];
        AppSearchInitializeStatsReported app_search_initialize_stats_reported = 371 [(module) = "appsearch"];
        AppSearchQueryStatsReported app_search_query_stats_reported = 372 [(module) = "appsearch"];
        AppProcessDied app_process_died = 373 [(module) = "framework"];
        NetworkIpReachabilityMonitorReported network_ip_reachability_monitor_reported =
            374 [(module) = "network_stack"];
        SlowInputEventReported slow_input_event_reported = 375 [(module) = "input"];
        ANROccurredProcessingStarted anr_occurred_processing_started = 376 [(module) = "framework"];
        AppSearchRemoveStatsReported app_search_remove_stats_reported = 377 [(module) = "appsearch"];
        MediaCodecReported media_codec_reported = 378 [(module) = "framework"];
        PermissionUsageFragmentInteraction permission_usage_fragment_interaction = 379 [(module) = "permissioncontroller"];
        PermissionDetailsInteraction permission_details_interaction = 380 [(module) = "permissioncontroller"];
        PrivacySensorToggleInteraction privacy_sensor_toggle_interaction = 381 [(module) = "framework"];
        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"];
        NetworkDnsHandshakeReported network_dns_handshake_reported = 389 [(module) = "resolv"];
        BluetoothCodePathCounter bluetooth_code_path_counter =
            390 [(module) = "bluetooth"];
        BluetoothLeBatchScanReportDelay bluetooth_le_batch_scan_report_delay =
            392 [(module) = "bluetooth"];
        AccessibilityFloatingMenuUIChanged accessibility_floating_menu_ui_changed = 393 [(module) = "sysui"];
        NeuralNetworksCompilationCompleted neuralnetworks_compilation_completed = 394
            [(module) = "neuralnetworks"];
        NeuralNetworksExecutionCompleted neuralnetworks_execution_completed = 395
            [(module) = "neuralnetworks"];
        NeuralNetworksCompilationFailed neuralnetworks_compilation_failed = 396
            [(module) = "neuralnetworks"];
        NeuralNetworksExecutionFailed neuralnetworks_execution_failed = 397
            [(module) = "neuralnetworks"];
        ContextHubBooted context_hub_booted = 398 [(module) = "contexthub"];
        ContextHubRestarted context_hub_restarted = 399 [(module) = "contexthub"];
        ContextHubLoadedNanoappSnapshotReported context_hub_loaded_nanoapp_snapshot_reported = 400
            [(module) = "contexthub"];
        ChreCodeDownloadTransacted chre_code_download_transacted = 401 [(module) = "contexthub"];
        UwbSessionInitiated uwb_session_inited = 402 [(module) = "uwb"];
        UwbSessionClosed uwb_session_closed = 403 [(module) = "uwb"];
        UwbFirstRangingReceived uwb_first_ranging_received = 404 [(module) = "uwb"];
        UwbRangingMeasurementReceived uwb_ranging_measurement_received = 405 [(module) = "uwb"];
        TextClassifierDownloadWorkScheduled text_classifier_download_work_scheduled = 406 [(module) = "textclassifier"];
        TextClassifierDownloadWorkCompleted text_classifier_download_work_completed = 407 [(module) = "textclassifier"];
        ClipboardCleared clipboard_cleared = 408 [(module) = "framework"];
        VmCreationRequested vm_creation_requested = 409 [(module) = "virtualizationservice"];
        NearbyDeviceScanStateChanged nearby_device_scan_state_changed = 410 [(module) = "nearby"];
        CameraCompatControlEventReported camera_compat_control_event_reported = 411 [(module) = "framework"];
        ApplicationLocalesChanged application_locales_changed = 412 [(module) = "framework"];
        MediametricsAudioTrackStatusReported mediametrics_audiotrackstatus_reported = 413;
        FoldStateDurationReported fold_state_duration_reported = 414 [(module) = "framework"];
        LocationTimeZoneProviderControllerStateChanged location_time_zone_provider_controller_state_changed =
            415 [(module) = "framework"];
        DisplayHbmStateChanged display_hbm_state_changed = 416 [(module) = "framework"];
        DisplayHbmBrightnessChanged display_hbm_brightness_changed = 417 [(module) = "framework"];
        PersistentUriPermissionsFlushed persistent_uri_permissions_flushed =
            418 [(module) = "framework"];
        EarlyBootCompOsArtifactsCheckReported early_boot_comp_os_artifacts_check_reported = 419 [(module) = "art"];
        VBMetaDigestReported vbmeta_digest_reported = 420 [(module) = "framework"];
        ApexInfoGathered apex_info_gathered = 421 [(module) = "framework"];
        PvmInfoGathered pvm_info_gathered = 422 [(module) = "framework"];
        WearSettingsUIInteracted wear_settings_ui_interacted = 423 [(module) = "wear_settings"];
        TracingServiceReportEvent tracing_service_report_event = 424 [(module) = "framework"];
        MediametricsAudioRecordStatusReported mediametrics_audiorecordstatus_reported = 425;
        LauncherLatency launcher_latency = 426 [(module) = "sysui"];
        DropboxEntryDropped dropbox_entry_dropped = 427 [(module) = "framework"];
        WifiP2pConnectionReported wifi_p2p_connection_reported = 428 [(module) = "wifi"];
        GameStateChanged game_state_changed = 429 [(module) = "framework"];
        HotwordDetectorCreateRequested hotword_detector_create_requested = 430
            [(module) = "framework"];
        HotwordDetectionServiceInitResultReported hotword_detection_service_init_result_reported = 431
            [(module) = "framework"];
        HotwordDetectionServiceRestarted hotword_detection_service_restarted = 432
            [(module) = "framework"];
        HotwordDetectorKeyphraseTriggered hotword_detector_keyphrase_triggered = 433
            [(module) = "framework"];
        HotwordDetectorEvents hotword_detector_events = 434
            [(module) = "framework"];
        AdServicesApiCalled ad_services_api_called =
            435 [(module) = "adservices", (truncate_timestamp) = true];
        AdServicesMeasurementReportsUploaded ad_services_mesurement_reports_uploaded =
            436 [(module) = "adservices", (truncate_timestamp) = true];
        BootCompletedBroadcastCompletionLatencyReported boot_completed_broadcast_completion_latency_reported =
            437 [(module) = "framework"];
        ContactsIndexerUpdateStatsReported contacts_indexer_update_stats_reported = 440
            [(module) = "appsearch"];
        AppBackgroundRestrictionsInfo app_background_restrictions_info = 441
            [(module) = "framework"];
        PermissionReminderNotificationInteracted permission_reminder_notification_interacted =
            444 [(module) = "permissioncontroller"];
        RecentPermissionDecisionsInteracted recent_permission_decisions_interacted =
            445 [(module) = "permissioncontroller"];
        GnssPsdsDownloadReported gnss_psds_download_reported = 446 [(module) = "framework"];
        LeAudioConnectionSessionReported le_audio_connection_session_reported = 447 [(module) = "bluetooth"];
        LeAudioBroadcastSessionReported le_audio_broadcast_session_reported = 448 [(module) = "bluetooth"];
        DreamUiEventReported dream_ui_event_reported = 449 [(module) = "framework"];
        TaskManagerEventReported task_manager_event_reported = 450 [(module) = "sysui"];
        CdmAssociationAction cdm_association_action = 451 [(module) = "framework"];
        MagnificationTripleTapAndHoldActivatedSessionReported magnification_triple_tap_and_hold_activated_session_reported =
            452 [(module) = "framework"];
        MagnificationFollowTypingFocusActivatedSessionReported magnification_follow_typing_focus_activated_session_reported =
            453 [(module) = "framework"];
        AccessibilityTextReadingOptionsChanged accessibility_text_reading_options_changed = 454 [(module) = "settings"];
        WifiSetupFailureCrashReported wifi_setup_failure_crash_reported = 455 [(module) = "wifi"];
        UwbDeviceErrorReported uwb_device_error_reported = 456 [(module) = "uwb"];
        IsolatedCompilationScheduled isolated_compilation_scheduled = 457 [(module) = "art"];
        IsolatedCompilationEnded isolated_compilation_ended = 458 [(module) = "art"];
        OnsOpportunisticEsimProvisioningComplete ons_opportunistic_esim_provisioning_complete = 459 [(module) = "ons"];
        TelephonyAnomalyDetected telephony_anomaly_detected = 461 [(module) = "telephony"];
        RemoteKeyProvisioningAttempt remote_key_provisioning_attempt = 463 [(module) = "remoteprovisioner"];
        RemoteKeyProvisioningNetworkInfo remote_key_provisioning_network_info = 464 [(module) = "remoteprovisioner"];
        RemoteKeyProvisioningTiming remote_key_provisioning_timing = 465 [(module) = "remoteprovisioner"];
        MediaOutputOpInteractionReported mediaoutput_op_interaction_report = 466 [(module) = "sysui"];
        BackgroundDexoptJobEnded background_dexopt_job_ended = 467 [(module) = "art"];
        SyncExemptionOccurred sync_exemption_occurred = 468 [(module) = "framework"];
        AutofillPresentationEventReported autofill_presentation_event_reported = 469 [(module) = "framework"];
        SafetySourceStateCollected safety_source_state_collected = 471 [(module) = "permissioncontroller"];
        SafetyCenterSystemEventReported safety_center_system_event_reported = 472 [(module) = "permissioncontroller"];
        SafetyCenterInteractionReported safety_center_interaction_reported = 473 [(module) = "permissioncontroller"];
        BroadcastDeliveryEventReported broadcast_delivery_event_reported =
                475 [(module) = "framework"];
        ServiceRequestEventReported service_request_event_reported = 476 [(module) = "framework"];
        ProviderAcquisitionEventReported provider_acquisition_event_reported =
                477 [(module) = "framework"];
        BluetoothDeviceNameReported bluetooth_device_name_reported = 478 [(module) = "bluetooth"];
        CellBroadcastConfigUpdated cb_config_updated = 479 [(module) = "cellbroadcast"];
        CellBroadcastModuleError cb_module_error = 480 [(module) = "cellbroadcast"];
        CellBroadcastServiceFeature cb_service_feature= 481 [(module) = "cellbroadcast"];
        CellBroadcastReceiverFeature cb_receiver_feature= 482 [(module) = "cellbroadcast"];
        JSScriptEngineLatencyReported jsscriptengine_latency_reported = 483 [(module) = "adservices"];
        PrivacySignalNotificationInteraction privacy_signal_notification_interaction = 484 [(module) = "permissioncontroller"];
        PrivacySignalIssueCardInteraction privacy_signal_issue_card_interaction = 485 [(module) = "permissioncontroller"];
        PrivacySignalsJobFailure privacy_signals_job_failure = 486 [(module) = "permissioncontroller"];
        SandboxApiCalled sandbox_api_called = 488 [(module) = "sdksandbox"];
        MobileDataDownloadFileGroupDownloadStatusReported mobile_data_download_file_group_status_reported = 490 [(module) = "adservices"];
        // StatsdStats tracks platform atoms with ids upto 750.
        // Update StatsdStats::kMaxPushedAtomId when atom ids here approach that value.
    }

    // Pulled events will start at field 10000.
    // Next: 10160
    oneof pulled {
        WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"];
        WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"];
        MobileBytesTransfer mobile_bytes_transfer =
                10002 [(module) = "framework", (truncate_timestamp) = true];
        MobileBytesTransferByFgBg mobile_bytes_transfer_by_fg_bg =
                10003 [(module) = "framework", (truncate_timestamp) = true];
        BluetoothBytesTransfer bluetooth_bytes_transfer = 10006 [(module) = "framework"];
        KernelWakelock kernel_wakelock = 10004 [(module) = "framework"];
        SubsystemSleepState subsystem_sleep_state = 10005 [(module) = "framework", (module) = "statsdtest"];
        CpuTimePerUid cpu_time_per_uid = 10009 [(module) = "framework", (module) = "statsdtest"];
        CpuTimePerUidFreq cpu_time_per_uid_freq =
                10010 [(module) = "framework", (module) = "statsd"];
        WifiActivityInfo wifi_activity_info = 10011 [(module) = "framework"];
        ModemActivityInfo modem_activity_info = 10012 [(module) = "framework"];
        BluetoothActivityInfo bluetooth_activity_info = 10007 [(module) = "framework"];
        ProcessMemoryState process_memory_state = 10013 [(module) = "framework"];
        SystemElapsedRealtime system_elapsed_realtime = 10014 [(module) = "framework"];
        SystemUptime system_uptime = 10015 [(module) = "framework"];
        CpuActiveTime cpu_active_time = 10016 [(module) = "framework", (module) = "statsdtest"];
        CpuClusterTime cpu_cluster_time = 10017 [(module) = "framework"];
        DiskSpace disk_space = 10018 [deprecated=true, (module) = "statsdtest"];
        RemainingBatteryCapacity remaining_battery_capacity = 10019 [(module) = "framework"];
        FullBatteryCapacity full_battery_capacity = 10020 [(module) = "framework"];
        Temperature temperature = 10021 [(module) = "framework", (module) = "statsdtest"];
        BinderCalls binder_calls = 10022 [(module) = "framework", (module) = "statsd"];
        BinderCallsExceptions binder_calls_exceptions = 10023 [(module) = "framework"];
        LooperStats looper_stats = 10024 [(module) = "framework", (module) = "statsd"];
        DiskStats disk_stats = 10025 [(module) = "framework"];
        DirectoryUsage directory_usage = 10026 [(module) = "framework"];
        AppSize app_size = 10027 [(module) = "framework"];
        CategorySize category_size = 10028 [(module) = "framework"];
        ProcStats proc_stats = 10029 [(module) = "framework"];
        BatteryVoltage battery_voltage = 10030 [(module) = "framework"];
        NumFingerprintsEnrolled num_fingerprints_enrolled = 10031 [(module) = "framework"];
        DiskIo disk_io = 10032 [(module) = "framework"];
        PowerProfile power_profile = 10033 [(module) = "framework"];
        ProcStatsPkgProc proc_stats_pkg_proc = 10034 [(module) = "framework"];
        ProcessCpuTime process_cpu_time = 10035 [(module) = "framework"];
        CpuTimePerThreadFreq cpu_time_per_thread_freq = 10037 [(module) = "framework"];
        OnDevicePowerMeasurement on_device_power_measurement = 10038 [(module) = "framework"];
        DeviceCalculatedPowerUse device_calculated_power_use = 10039 [(module) = "framework"];
        ProcessMemoryHighWaterMark process_memory_high_water_mark = 10042 [(module) = "framework"];
        BatteryLevel battery_level = 10043 [(module) = "framework"];
        BuildInformation build_information = 10044 [(module) = "framework"];
        BatteryCycleCount battery_cycle_count = 10045 [(module) = "framework"];
        DebugElapsedClock debug_elapsed_clock = 10046 [(module) = "framework"];
        DebugFailingElapsedClock debug_failing_elapsed_clock = 10047 [(module) = "framework"];
        NumFacesEnrolled num_faces_enrolled = 10048 [(module) = "framework"];
        RoleHolder role_holder = 10049 [(module) = "framework"];
        DangerousPermissionState dangerous_permission_state = 10050 [(module) = "framework"];
        TrainInfo train_info = 10051 [(module) = "statsd"];
        TimeZoneDataInfo time_zone_data_info = 10052 [(module) = "framework"];
        ExternalStorageInfo external_storage_info = 10053 [(module) = "framework"];
        GpuStatsGlobalInfo gpu_stats_global_info = 10054;
        GpuStatsAppInfo gpu_stats_app_info = 10055;
        SystemIonHeapSize system_ion_heap_size = 10056 [deprecated = true, (module) = "framework"];
        AppsOnExternalStorageInfo apps_on_external_storage_info = 10057 [(module) = "framework"];
        FaceSettings face_settings = 10058 [(module) = "framework"];
        CoolingDevice cooling_device = 10059 [(module) = "framework"];
        AppOps app_ops = 10060 [(module) = "framework"];
        ProcessSystemIonHeapSize process_system_ion_heap_size = 10061 [(module) = "framework"];
        SurfaceflingerStatsGlobalInfo surfaceflinger_stats_global_info = 10062;
        SurfaceflingerStatsLayerInfo surfaceflinger_stats_layer_info = 10063;
        ProcessMemorySnapshot process_memory_snapshot = 10064 [(module) = "framework"];
        VmsClientStats vms_client_stats = 10065 [(module) = "car"];
        NotificationRemoteViews notification_remote_views = 10066 [(module) = "framework"];
        DangerousPermissionStateSampled dangerous_permission_state_sampled =
                10067 [(module) = "framework"];
        GraphicsStats graphics_stats = 10068 [(module) = "hwui"];
        RuntimeAppOpAccess runtime_app_op_access = 10069 [(module) = "framework"];
        IonHeapSize ion_heap_size = 10070 [(module) = "framework"];
        PackageNotificationPreferences package_notification_preferences =
                10071 [(module) = "framework"];
        PackageNotificationChannelPreferences package_notification_channel_preferences =
                10072 [(module) = "framework"];
        PackageNotificationChannelGroupPreferences package_notification_channel_group_preferences =
                10073 [(module) = "framework"];
        GnssStats gnss_stats = 10074 [(module) = "framework"];
        AttributedAppOps attributed_app_ops = 10075 [(module) = "framework"];
        VoiceCallSession voice_call_session = 10076 [(module) = "telephony"];
        VoiceCallRatUsage voice_call_rat_usage = 10077 [(module) = "telephony"];
        SimSlotState sim_slot_state = 10078 [(module) = "telephony"];
        SupportedRadioAccessFamily supported_radio_access_family = 10079 [(module) = "telephony"];
        SettingSnapshot setting_snapshot = 10080 [(module) = "framework"];
        BlobInfo blob_info = 10081 [(module) = "framework"];
        DataUsageBytesTransfer data_usage_bytes_transfer =
                10082 [(module) = "framework", (truncate_timestamp) = true];
        BytesTransferByTagAndMetered bytes_transfer_by_tag_and_metered =
                10083 [(module) = "framework", (truncate_timestamp) = true];
        DNDModeProto dnd_mode_rule = 10084 [(module) = "framework"];
        GeneralExternalStorageAccessStats general_external_storage_access_stats =
            10085 [(module) = "mediaprovider"];
        IncomingSms incoming_sms = 10086 [(module) = "telephony"];
        OutgoingSms outgoing_sms = 10087 [(module) = "telephony"];
        CarrierIdTableVersion carrier_id_table_version = 10088 [(module) = "telephony"];
        DataCallSession data_call_session = 10089 [(module) = "telephony"];
        CellularServiceState cellular_service_state = 10090 [(module) = "telephony"];
        CellularDataServiceSwitch cellular_data_service_switch = 10091 [(module) = "telephony"];
        SystemMemory system_memory = 10092 [(module) = "framework"];
        ImsRegistrationTermination ims_registration_termination = 10093 [(module) = "telephony"];
        ImsRegistrationStats ims_registration_stats = 10094 [(module) = "telephony"];
        CpuTimePerClusterFreq cpu_time_per_cluster_freq = 10095 [(module) = "framework"];
        CpuCyclesPerUidCluster cpu_cycles_per_uid_cluster = 10096 [(module) = "framework"];
        DeviceRotatedData device_rotated_data = 10097 [(module) = "framework"];
        CpuCyclesPerThreadGroupCluster cpu_cycles_per_thread_group_cluster = 10098 [(module) = "framework"];
        MediaDrmActivityInfo media_drm_activity_info = 10099;
        OemManagedBytesTransfer oem_managed_bytes_transfer = 10100 [(module) = "framework"];
        GnssPowerStats gnss_power_stats = 10101 [(module) = "framework"];
        TimeZoneDetectorState time_zone_detector_state = 10102 [(module) = "framework"];
        Keystore2StorageStats keystore2_storage_stats = 10103 [(module) = "framework"];
        RkpPoolStats rkp_pool_stats = 10104 [(module) = "framework"];
        ProcessDmabufMemory process_dmabuf_memory = 10105 [(module) = "framework"];
        PendingAlarmInfo pending_alarm_info = 10106 [(module) = "framework"];
        UserLevelHibernatedApps user_level_hibernated_apps = 10107 [(module) = "framework"];
        LauncherLayoutSnapshot launcher_layout_snapshot = 10108
            [(module) = "sysui"];
        GlobalHibernatedApps global_hibernated_apps = 10109 [(module) = "framework"];
        InputEventLatencySketch input_event_latency_sketch = 10110 [(module) = "input"];
        BatteryUsageStatsBeforeReset battery_usage_stats_before_reset =
            10111 [(module) = "framework"];
        BatteryUsageStatsSinceReset battery_usage_stats_since_reset =
            10112 [(module) = "framework"];
        BatteryUsageStatsSinceResetUsingPowerProfileModel
            battery_usage_stats_since_reset_using_power_profile_model =
            10113 [(module) = "framework"];
        InstalledIncrementalPackage installed_incremental_package = 10114 [(module) = "framework"];
        TelephonyNetworkRequests telephony_network_requests =
            10115 [(module) = "telephony", deprecated = true];
        AppSearchStorageInfo app_search_storage_info = 10116 [(module) = "appsearch"];
        VmStat vmstat = 10117 [(module) = "framework"];
        Keystore2KeyCreationWithGeneralInfo keystore2_key_creation_with_general_info =
                10118 [(module) = "framework"];
        Keystore2KeyCreationWithAuthInfo keystore2_key_creation_with_auth_info =
                10119 [(module) = "framework"];
        Keystore2KeyCreationWithPurposeAndModesInfo
                keystore2_key_creation_with_purpose_and_modes_info = 10120 [(module) = "framework"];
        Keystore2AtomWithOverflow keystore2_atom_with_overflow = 10121 [(module) = "framework"];
        Keystore2KeyOperationWithPurposeAndModesInfo
                keystore2_key_operation_with_purpose_and_modes_info =
                        10122 [(module) = "framework"];
        Keystore2KeyOperationWithGeneralInfo keystore2_key_operation_with_general_info =
                10123 [(module) = "framework"];
        RkpErrorStats rkp_error_stats = 10124 [(module) = "framework"];
        Keystore2CrashStats keystore2_crash_stats = 10125 [(module) = "framework"];
        VendorApexInfo vendor_apex_info = 10126 [(module) = "framework"];
        AccessibilityShortcutStats accessibility_shortcut_stats = 10127 [(module) = "framework"];
        AccessibilityFloatingMenuStats accessibility_floating_menu_stats =
            10128 [(module) = "framework"];
        DataUsageBytesTransferV2 data_usage_bytes_transfer_v2 = 10129 [(module) = "framework",
                (truncate_timestamp) = true];
        MediaCapabilities media_capabilities = 10130 [(module) = "framework"];
        CarWatchdogSystemIoUsageSummary car_watchdog_system_io_usage_summary =
            10131 [(module) = "car"];
        CarWatchdogUidIoUsageSummary car_watchdog_uid_io_usage_summary = 10132 [(module) = "car"];
        ImsRegistrationFeatureTagStats ims_registration_feature_tag_stats =
                10133 [(module) = "telephony"];
        RcsClientProvisioningStats rcs_client_provisioning_stats =
                10134 [(module) = "telephony"];
        RcsAcsProvisioningStats rcs_acs_provisioning_stats =
                10135 [(module) = "telephony"];
        SipDelegateStats sip_delegate_stats = 10136 [(module) = "telephony"];
        SipTransportFeatureTagStats sip_transport_feature_tag_stats =
                10137 [(module) = "telephony"];
        SipMessageResponse sip_message_response = 10138 [(module) = "telephony"];
        SipTransportSession sip_transport_session = 10139 [(module) = "telephony"];
        ImsDedicatedBearerListenerEvent ims_dedicated_bearer_listener_event =
                10140 [(module) = "telephony"];
        ImsDedicatedBearerEvent ims_dedicated_bearer_event = 10141 [(module) = "telephony"];
        ImsRegistrationServiceDescStats ims_registration_service_desc_stats =
                10142 [(module) = "telephony"];
        UceEventStats uce_event_stats = 10143 [(module) = "telephony"];
        PresenceNotifyEvent presence_notify_event = 10144 [(module) = "telephony"];
        GbaEvent gba_event = 10145 [(module) = "telephony"];
        PerSimStatus per_sim_status = 10146 [(module) = "telephony"];
        GpuWorkPerUid gpu_work_per_uid = 10147;
        PersistentUriPermissionsAmountPerPackage persistent_uri_permissions_amount_per_package =
            10148 [(module) = "framework"];
        SignedPartitionInfo signed_partition_info = 10149 [(module) = "framework"];
        PinnedFileSizesPerPackage pinned_file_sizes_per_package = 10150
            [(module) = "framework"];
        PendingIntentsPerPackage pending_intents_per_package = 10151
            [(module) = "framework"];
        UserInfo user_info = 10152 [(module) = "framework"];
        TelephonyNetworkRequestsV2 telephony_network_requests_v2 = 10153 [(module) = "telephony"];
        DeviceTelephonyProperties device_telephony_properties = 10154 [(module) = "telephony"];
        RemoteKeyProvisioningErrorCounts remote_key_provisioning_error_counts = 10155 [(module) = "remoteprovisioner"];
        SafetyState safety_state = 10156 [(module) = "permissioncontroller"];
        SandboxSdkStorage sandbox_sdk_storage = 10159 [(module) = "sdksandbox"];
    }

    // 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, 10008, 10036, 10040, 10041;
}

message JSScriptEngineLatencyReported {
    enum LatencyStat {
      UNKNOWN = 0;
      SANDBOX_INIT = 1;
      ISOLATE_CREATE = 2;
      JAVA_PROCESS_EXECUTION = 3;
      WEBVIEW_PROCESS_EXECUTION = 4;
    }

    optional LatencyStat stat = 1;
    optional int64 latency_millis = 2;
}

/**
 * This proto represents a node of an attribution chain.
 * Note: All attribution chains are represented as a repeated field of type
 * AttributionNode. It is understood that in such arrays, the order is that
 * of calls, that is [A, B, C] if A calls B that calls C.
 */
message AttributionNode {
    // The uid for a given element in the attribution chain.
    optional int32 uid = 1;

    // The (optional) string tag for an element in the attribution chain. If the
    // element has no tag, it is encoded as an empty string.
    optional string tag = 2;
}


/*
 * *****************************************************************************
 * Below are all of the individual atoms that are logged by Android via statsd.
 *
 * RULES:
 *   - The field ids for each atom must start at 1, and count upwards by 1.
 *     Skipping field ids is not allowed.
 *   - These form an API, so renaming, renumbering or removing fields is
 *     not allowed between android releases.  (This is not currently enforced,
 *     but there will be a tool to enforce this restriction).
 *   - The types must be built-in protocol buffer types, namely, no sub-messages
 *     are allowed (yet).  The bytes type is also not allowed.
 *   - The CamelCase name of the message type should match the
 *     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.
 *
 * CONVENTIONS:
 *   - Events are past tense. e.g. ScreenStateChanged, not ScreenStateChange.
 *   - If there is a UID, it goes first. Think in an object-oriented fashion.
 * *****************************************************************************
 */

/**
 * This atom is deprecated starting in Q. Please use ThermalThrottlingSeverityStateChanged.
 * Logs when the Thermal service HAL notifies the throttling start/stop events.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/stats/StatsCompanionService.java
 */
message ThermalThrottlingStateChanged {
    // The type of temperature being reported (CPU, GPU, SKIN, etc)
    optional android.os.TemperatureTypeEnum sensor_type = 1;

    // Throttling state, this field is DEPRECATED
    enum State {
        UNKNOWN = 0;
        START = 1; // START indicated that throttling was triggered.
        STOP = 2; // STOP indicates that throttling was cleared.
    }
    optional State state = 2;

    optional float temperature = 3;
}

/**
 * Track transcoding service usage
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/TranscodeHelper.java
 * Next Tag: 14
 */
message TranscodingData {
    // Reason that leads to the type of access.
    enum AccessReason {
        UNKNOWN = 0;
        SYSTEM_DEFAULT = 1; // Default option
        SYSTEM_CONFIG = 2;  // Server-side/on-device config
        APP_MANIFEST = 3;  // media_capabilites.xml
        APP_COMPAT = 4;   // App compat framework
        APP_EXTRA = 5;   // ApplicationMediaCapabilities API in open()
    }

    // Causes that leads to the failure of transcode.
    enum FailureCause {
        CAUSE_UNKNOWN = 0;
        TRANSCODING_SERVICE_ERROR = 1;     // Error from transcoding service.
        TRANSCODING_CLIENT_TIMEOUT = 2;    // Timeout from MediaProvider.
        TRANSCODING_SESSION_CANCELED = 3; // MediaProvider cancels the transcode.
    }

    enum AccessType {
        HEVC_WRITE = 1;
        READ_DIRECT = 2;
        READ_CACHE = 3;
        READ_TRANSCODE = 4;
        WRITE_CACHE = 5; // App trying to write to transcodeid avc file in cache, this is rare.
        AVC_WRITE = 6;
    }

    enum Result {
        SUCCESS = 0;
        FAIL = 1;
        UNDEFINED = 2;
    }

    optional string requestor_package = 1;
    optional AccessType access_type = 2;
    optional int64 file_size_bytes = 3;
    optional Result transcode_result = 4;
    optional int64 transcode_duration_millis = 5; // The duration of transcoding.
    optional int64 file_duration_millis = 6; // The duration of the video file.
    optional int64 file_framerate_fps = 7; // The framerate of the video file.
    optional AccessReason access_reason = 8;
    optional int64 width = 9;
    optional int64 height = 10;
    optional bool hit_anr = 11;
    optional FailureCause failure_cause = 12;   // This field is valid only when fails.
    optional int64 transcoding_service_error_code = 13; // Error code from transcoding service.
}

/**
 * Logs when the screen state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message ScreenStateChanged {
    // New screen state, from frameworks/proto_logging/stats/enums/view/enums.proto.
    optional android.view.DisplayStateEnum state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs that the process state of the uid, as determined by ActivityManager
 * (i.e. the highest process state of that uid's processes) has changed.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message UidProcessStateChanged {
    optional int32 uid = 1 [(state_field_option).primary_field = true, (is_uid) = true];

    // The state, from frameworks/proto_logging/stats/enums/app/enums.proto.
    optional android.app.ProcessStateEnum state = 2
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs process state change of a process, as per the activity manager.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java
 */
message ProcessStateChanged {
    optional int32 uid = 1;
    optional string process_name = 2;
    optional string package_name = 3;
    // TODO: remove this when validation is done
    optional int64 version = 5;
    // The state, from frameworks/proto_logging/stats/enums/app/enums.proto.
    optional android.app.ProcessStateEnum state = 4;
}

/**
 * Logs when ActivityManagerService sleep state is changed.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityTaskManagerService.java
 */
message ActivityManagerSleepStateChanged {
    // TODO: import frameworks proto
    enum State {
        UNKNOWN = 0;
        ASLEEP = 1;
        AWAKE = 2;
    }
    optional State state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs when system memory state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message MemoryFactorStateChanged {
    // TODO: import frameworks proto
    enum State {
        MEMORY_UNKNOWN = 0;
        NORMAL = 1;     // normal.
        MODERATE = 2;   // moderate memory pressure.
        LOW = 3;        // low memory.
        CRITICAL = 4;   // critical memory.

    }
    optional State factor = 1 [(state_field_option).exclusive_state = true];
}

/**
 * Logs when app is using too much cpu, according to ActivityManagerService.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message ExcessiveCpuUsageReported {
    optional int32 uid = 1;
    optional string process_name = 2;
    optional string package_name = 3;
    // package version. TODO: remove this when validation is done
    optional int64 version = 4;
}

/**
 * Logs when a cached process is killed, along with its pss.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message CachedKillReported {
    optional int32 uid = 1;
    optional string process_name = 2;
    optional string package_name = 3;
    // TODO: remove this when validation is done
    optional int64 version = 5;
    optional int64 pss = 4;
}

/**
 * Logs the change in wifi health.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiDataStall.java
 */
message WifiHealthStatReported {
    enum Band {
        UNKNOWN = 0;
        // All of 2.4GHz band
        BAND_2G = 1;
        // Frequencies in the range of [5150, 5250) GHz
        BAND_5G_LOW = 2;
        // Frequencies in the range of [5250, 5725) GHz
        BAND_5G_MIDDLE = 3;
        // Frequencies in the range of [5725, 5850) GHz
        BAND_5G_HIGH = 4;
        // Frequencies in the range of [5925, 6425) GHz
        BAND_6G_LOW = 5;
        // Frequencies in the range of [6425, 6875) GHz
        BAND_6G_MIDDLE = 6;
        // Frequencies in the range of [6875, 7125) GHz
        BAND_6G_HIGH = 7;
    }
    // duration this stat is obtained over in milliseconds
    optional int32 duration_millis = 1;
    // whether wifi is classified as sufficient for the user's data traffic, determined
    // by whether the calculated throughput exceeds the average demand within |duration_millis|
    optional bool is_sufficient = 2;
    // whether cellular data is available
    optional bool is_cell_data_available = 3;
    // the Band bucket the connected network is on
    optional Band band = 4;
}

/**
 * Logged when wifi detects a significant change in connection failure rate.
 *
 * Logged from: frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiHealthMonitor.java
 *
 */
message WifiFailureStatReported {
    enum AbnormalityType {
        UNKNOWN = 0;
        SIGNIFICANT_INCREASE = 1;
        SIGNIFICANT_DECREASE = 2;
        SIMPLY_HIGH = 3;
    }
    enum FailureType {
        FAILURE_UNKNOWN = 0;
        FAILURE_CONNECTION = 1;
        FAILURE_ASSOCIATION_REJECTION = 2;
        FAILURE_ASSOCIATION_TIMEOUT = 3;
        FAILURE_AUTHENTICATION = 4;
        FAILURE_NON_LOCAL_DISCONNECTION = 5;
        FAILURE_SHORT_CONNECTION_DUE_TO_NON_LOCAL_DISCONNECTION = 6;
    }
    // Reason for uploading this stat
    optional AbnormalityType abnormality_type = 1;
    // The particular type of failure
    optional FailureType failure_type = 2;
    // How many times we have encountered this combination of AbnormalityType and FailureType
    optional int32 failure_count = 3;
}

/**
 * Logs whether a Wifi connection attempt was successful and reasons for failure if it wasn't.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMetrics.java
 */
message WifiConnectionResultReported {
    enum FailureCode {
        FAILURE_UNKNOWN = 0;
        FAILURE_ASSOCIATION_TIMEOUT = 1;
        FAILURE_ASSOCIATION_REJECTION = 2;
        FAILURE_AUTHENTICATION_GENERAL = 3;
        FAILURE_AUTHENTICATION_EAP = 4;
        FAILURE_DHCP = 5;
        FAILURE_NETWORK_DISCONNECTION = 6;
        FAILURE_ROAM_TIMEOUT = 7;
        FAILURE_WRONG_PASSWORD = 8;
    }

    enum Trigger {
        UNKNOWN = 0;
        // Connection attempt was initiated manually.
        MANUAL = 1;
        // Automatic reconnection to the same network as connected previously.
        RECONNECT_SAME_NETWORK = 2;
        // Automatic reconnection to a saved network, but not the previous one.
        AUTOCONNECT_CONFIGURED_NETWORK = 3;
        // Automatic first connection attempt after device boot.
        AUTOCONNECT_BOOT = 4;
    }

    // True represents a successful connection.
    optional bool connection_result = 1;
    // Reason for the connection failure.
    optional FailureCode failure_code = 2;
    // Scan RSSI before the connection attempt.
    optional int32 rssi = 3;
    // Time taken by this connection attempt.
    optional int32 connection_attempt_duration_millis = 4;
    // Band bucket the connected network is on.
    optional android.net.wifi.WifiBandBucket band = 5;
    // Authentication type.
    optional android.net.wifi.WifiAuthType auth_type = 6;
    // What triggered this connection attempt.
    optional Trigger trigger = 7;
    // Whether this network was used (successfully connected to) previously.
    optional bool network_used = 8;
    // Time taken from the last successful connection (or device boot if that's the first one).
    optional int32 time_since_last_connection_seconds = 9;
}

/**
 * Logs when a Wifi connection drops.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMetrics.java
 */
message WifiDisconnectReported {
    enum FailureCode {
        UNKNOWN = 0;

        // Wifi supplicant failure reason codes (IEEE Std 802.11-2016, 9.4.1.7, Table 9-45).
        // See ISupplicantStaIfaceCallback.java:ReasonCode
        UNSPECIFIED = 1;
        PREV_AUTH_NOT_VALID = 2;
        DEAUTH_LEAVING = 3;
        DISASSOC_DUE_TO_INACTIVITY = 4;
        DISASSOC_AP_BUSY = 5;
        CLASS2_FRAME_FROM_NONAUTH_STA = 6;
        CLASS3_FRAME_FROM_NONASSOC_STA = 7;
        DISASSOC_STA_HAS_LEFT = 8;
        STA_REQ_ASSOC_WITHOUT_AUTH = 9;
        PWR_CAPABILITY_NOT_VALID = 10;
        SUPPORTED_CHANNEL_NOT_VALID = 11;
        BSS_TRANSITION_DISASSOC = 12;
        INVALID_IE = 13;
        MICHAEL_MIC_FAILURE = 14;
        FOURWAY_HANDSHAKE_TIMEOUT = 15;
        GROUP_KEY_UPDATE_TIMEOUT = 16;
        IE_IN_4WAY_DIFFERS = 17;
        GROUP_CIPHER_NOT_VALID = 18;
        PAIRWISE_CIPHER_NOT_VALID = 19;
        AKMP_NOT_VALID = 20;
        UNSUPPORTED_RSN_IE_VERSION = 21;
        INVALID_RSN_IE_CAPAB = 22;
        IEEE_802_1X_AUTH_FAILED = 23;
        CIPHER_SUITE_REJECTED = 24;
        TDLS_TEARDOWN_UNREACHABLE = 25;
        TDLS_TEARDOWN_UNSPECIFIED = 26;
        SSP_REQUESTED_DISASSOC = 27;
        NO_SSP_ROAMING_AGREEMENT = 28;
        BAD_CIPHER_OR_AKM = 29;
        NOT_AUTHORIZED_THIS_LOCATION = 30;
        SERVICE_CHANGE_PRECLUDES_TS = 31;
        UNSPECIFIED_QOS_REASON = 32;
        NOT_ENOUGH_BANDWIDTH = 33;
        DISASSOC_LOW_ACK = 34;
        EXCEEDED_TXOP = 35;
        STA_LEAVING = 36;
        END_TS_BA_DLS = 37;
        UNKNOWN_TS_BA = 38;
        TIMEOUT = 39;
        PEERKEY_MISMATCH = 45;
        AUTHORIZED_ACCESS_LIMIT_REACHED = 46;
        EXTERNAL_SERVICE_REQUIREMENTS = 47;
        INVALID_FT_ACTION_FRAME_COUNT = 48;
        INVALID_PMKID = 49;
        INVALID_MDE = 50;
        INVALID_FTE = 51;
        MESH_PEERING_CANCELLED = 52;
        MESH_MAX_PEERS = 53;
        MESH_CONFIG_POLICY_VIOLATION = 54;
        MESH_CLOSE_RCVD = 55;
        MESH_MAX_RETRIES = 56;
        MESH_CONFIRM_TIMEOUT = 57;
        MESH_INVALID_GTK = 58;
        MESH_INCONSISTENT_PARAMS = 59;
        MESH_INVALID_SECURITY_CAP = 60;
        MESH_PATH_ERROR_NO_PROXY_INFO = 61;
        MESH_PATH_ERROR_NO_FORWARDING_INFO = 62;
        MESH_PATH_ERROR_DEST_UNREACHABLE = 63;
        MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64;
        MESH_CHANNEL_SWITCH_REGULATORY_REQ = 65;
        MESH_CHANNEL_SWITCH_UNSPECIFIED = 66;

        // ClientModeImpl error codes
        // Defined in /frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMetrics.java
        IFACE_DESTROYED = 10000;
        WIFI_DISABLED = 10001;
        SUPPLICANT_DISCONNECTED = 10002;
        CONNECTING_WATCHDOG_TIMER = 10003;
        ROAM_WATCHDOG_TIMER = 10004;
    }

    // How long the session lasted from successful connection to disconnect.
    optional int32 connected_duration_seconds = 1;

    // Reason for the disconnect.
    optional FailureCode failure_code = 2;

    // Band bucket the connected network was on.
    optional android.net.wifi.WifiBandBucket band = 3;

    // Authentication type.
    optional android.net.wifi.WifiAuthType auth_type = 4;

    // Last seen RSSI before the disconnect.
    optional int32 last_rssi = 5;

    // Last seen link speed before the disconnect.
    optional int32 last_link_speed = 6;
}

/**
 * Logs when Wifi connection is established or dropped.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMetrics.java
 */
message WifiConnectionStateChanged {
    optional bool is_connected = 1;

    // Band bucket the connected network was on.
    // Filled for both connected and disconnected cases.
    optional android.net.wifi.WifiBandBucket band = 2;

    // Authentication type.
    // Filled for both connected and disconnected cases.
    optional android.net.wifi.WifiAuthType auth_type = 3;
}

/**
 * Logged when wifi peer to peer connection happens
 */
message WifiP2pConnectionReported {
    enum Type {
        UNSPECIFIED = 0;
        // fresh new connection.
        FRESH = 1;
        // reinvoke a group.
        REINVOKE = 2;
        // create a group with the current device as the group owner locally.
        LOCAL = 3;
        // create a group or join a group with config.
        FAST = 4;
    }
    enum FailureCode {
        // Failure is unknown.
        UNKNOWN = 0;
        // No failure.
        NONE = 1;
        // Timeout for current connecting request.
        TIMEOUT = 2;
        // The connecting request is canceled by the user.
        CANCEL = 3;
        // Provision discovery failure, e.g. no pin code, timeout, rejected by the peer.
        PROV_DISC_FAIL = 4;
        // Invitation failure, e.g. rejected by the peer.
        INVITATION_FAIL = 5;
        // Incoming request is rejected by the user.
        USER_REJECT = 6;
        // New connection request is issued before ending previous connecting request.
        NEW_CONNECTION_ATTEMPT = 7;
    }
    enum GroupRole {
        GROUP_UNKNOWN = 0;
        GROUP_OWNER = 1;
        GROUP_CLIENT = 2;
    }
    // Type of the connection.
    optional Type type = 1;
    // Duration to connect in millis.
    optional int32 latency_ms= 2;
    // Duration to connect in step size of 200 millis.
    optional int32 latency_200ms= 3;
    // Failure code
    optional FailureCode failure_code = 4;
    // Group role. This could be unknown with connect() call when the WifiConfig doesn't have the
    // credential.
    optional GroupRole group_role = 5;
}

/**
 * Logged when wifi setup failure or crash reported
 */
message WifiSetupFailureCrashReported {
    enum Type {
        UNKNOWN = 0;
        // Wifi HAL crash
        HAL_CRASH = 1;
        // Wificond crash
        WIFICOND_CRASH = 2;
        // Supplicant crash
        SUPPLICANT_CRASH = 3;
        // hostapd crash
        HOSTAPD_CRASH = 4;
        // HAL error on WifiNative.setupInterfaceForClientMode
        CLIENT_FAILURE_HAL = 5;
        // Wificond error on WifiNative.setupInterfaceForClientMode
        CLIENT_FAILURE_WIFICOND = 6;
        // Supplicant error on WifiNative.setupInterfaceForClientMode
        CLIENT_FAILURE_SUPPLICANT = 7;
        // HAL error on WifiNative.setupInterfaceForSoftApMode
        SOFT_AP_FAILURE_HAL = 8;
        // Wificond error on WifiNative.setupInterfaceForSoftApMode
        SOFT_AP_FAILURE_WIFICOND = 9;
        // Hostapd error on WifiNative.setupInterfaceForSoftApMode
        SOFT_AP_FAILURE_HOSTAPD = 10;
    }
    // Type of failure
    optional Type type= 1;
}

/**
 * Logs when memory stats of a process is reported.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java
 */
message ProcessMemoryStatReported {
    optional int32 uid = 1;
    optional string process_name = 2;
    optional string package_name = 3;
    //TODO: remove this when validation is done
    optional int64 version = 9;
    optional int64 pss = 4;
    optional int64 uss = 5;
    optional int64 rss = 6;
    enum Type {
        ADD_PSS_INTERNAL_SINGLE = 0;
        ADD_PSS_INTERNAL_ALL_MEM = 1;
        ADD_PSS_INTERNAL_ALL_POLL = 2;
        ADD_PSS_EXTERNAL = 3;
        ADD_PSS_EXTERNAL_SLOW = 4;
    }
    optional Type type = 7;
    optional int64 duration_millis = 8;

    // Keep in sync with
    // frameworks/base/services/core/java/com/android/server/am/ProcessProfileRecord.java
    enum HostingComponentType {
        HOSTING_COMPONENT_TYPE_EMPTY = 0x0;
        HOSTING_COMPONENT_TYPE_SYSTEM = 0x0001;
        HOSTING_COMPONENT_TYPE_PERSISTENT = 0x0002;
        HOSTING_COMPONENT_TYPE_BACKUP = 0x0004;
        HOSTING_COMPONENT_TYPE_INSTRUMENTATION = 0x0008;
        HOSTING_COMPONENT_TYPE_ACTIVITY = 0x0010;
        HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER = 0x0020;
        HOSTING_COMPONENT_TYPE_PROVIDER = 0x0040;
        HOSTING_COMPONENT_TYPE_STARTED_SERVICE = 0x0080;
        HOSTING_COMPONENT_TYPE_FOREGROUND_SERVICE = 0x0100;
        HOSTING_COMPONENT_TYPE_BOUND_SERVICE = 0x0200;
    }

    // The types of the components this process is hosting at the moment this
    // snapshot is taken.
    // See the available types in HostingComponentType above.
    optional int32 current_hosting_component_types = 10;

    // The historical types of the components this process is or was hosting
    // since it's born.
    // See the available types in HostingComponentType above.
    optional int32 historical_hosting_component_types = 11;
}

/**
 * Logs that a process started, finished, crashed, or ANRed.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message ProcessLifeCycleStateChanged {
    optional int32 uid = 1 [(is_uid) = true];

    // The process name (usually same as the app name).
    optional string process_name = 2;

    // What lifecycle state the process changed to.
    // This enum is specific to atoms.proto.
    enum State {
        FINISHED = 0;
        STARTED = 1;
        CRASHED = 2;
    }
    optional State state = 3;
}

/**
 * Logs when the ble scan state changes.
 *
 * Logged from:
 *   packages/apps/Bluetooth/src/com/android/bluetooth/gatt/AppScanStats.java
 */
message BleScanStateChanged {
    repeated AttributionNode attribution_node = 1
            [(state_field_option).primary_field_first_uid = true];

    enum State {
        OFF = 0;
        ON = 1;
        // RESET indicates all ble stopped. Used when it (re)starts (e.g. after it crashes).
        RESET = 2;
    }
    optional State state = 2 [
        (state_field_option).exclusive_state = true,
        (state_field_option).default_state_value = 0 /* State.OFF */,
        (state_field_option).trigger_state_reset_value = 2 /* State.RESET */,
        (state_field_option).nested = true
    ];

    // Does the scan have a filter.
    optional bool is_filtered = 3 [(state_field_option).primary_field = true];
    // Whether the scan is a CALLBACK_TYPE_FIRST_MATCH scan. Called 'background' scan internally.
    optional bool is_first_match = 4 [(state_field_option).primary_field = true];
    // Whether the scan set to piggy-back off the results of other scans (SCAN_MODE_OPPORTUNISTIC).
    optional bool is_opportunistic = 5 [(state_field_option).primary_field = true];
}

/**
 * Logs reporting of a ble scan finding results.
 *
 * Logged from:
 *   packages/apps/Bluetooth/src/com/android/bluetooth/gatt/AppScanStats.java
 */
// TODO: Consider also tracking per-scanner-id.
message BleScanResultReceived {
    repeated AttributionNode attribution_node = 1;

    // Number of ble scan results returned.
    optional int32 num_results = 2;
}

/**
 * Logs when a sensor state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message SensorStateChanged {
    repeated AttributionNode attribution_node = 1;

    // The id (int) of the sensor.
    optional int32 sensor_id = 2;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 3;
}

/**
 * Logs when GPS state changes.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message GpsScanStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 2;
}

/**
 * Logs when GPS signal quality.
 *
 * Logged from:
 *   /frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
 */
message GpsSignalQualityChanged {
    optional android.server.location.GpsSignalQualityEnum level = 1;
}


/**
 * Logs when a sync manager sync state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message SyncStateChanged {
    repeated AttributionNode attribution_node = 1;

    // Name of the sync (as named in the app). Can be chosen at run-time.
    optional string sync_name = 2;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 3;
}

/*
 * Deferred job stats.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java
*/
message DeferredJobStatsReported {
    repeated AttributionNode attribution_node = 1;

    // Number of jobs deferred.
    optional int32 num_jobs_deferred = 2;

    // Time since the last job runs.
    optional int64 time_since_last_job_millis = 3;
}

/**
 * Logs when a job scheduler job state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java
 *   frameworks/base/services/core/java/com/android/server/job/JobServiceContext.java
 *
 * Next tag: 22
 */
message ScheduledJobStateChanged {
    repeated AttributionNode attribution_node = 1;

    // Name of the job (as named in the app)
    optional string job_name = 2;

    enum State {
        FINISHED = 0;
        STARTED = 1;
        SCHEDULED = 2;
    }
    optional State state = 3;

    // The internal reason a job has stopped.
    // This is only applicable when the state is FINISHED.
    // The default value is INTERNAL_STOP_REASON_UNKNOWN.
    optional android.app.job.InternalStopReasonEnum internal_stop_reason = 4;

    // The publicly returned reason onStopJob() was called.
    // This is only applicable when the state is FINISHED, but may be undefined if
    // JobService.onStopJob() was never called for the job.
    // The default value is STOP_REASON_UNDEFINED.
    optional android.app.job.StopReasonEnum public_stop_reason = 17;

    // The standby bucket of the app that scheduled the job. These match the framework constants
    // defined in JobSchedulerService.java with the addition of UNKNOWN using -1, as ACTIVE is
    // already assigned 0.
    enum Bucket {
        UNKNOWN = -1;
        ACTIVE = 0;
        WORKING_SET = 1;
        FREQUENT = 2;
        RARE = 3;
        NEVER = 4;
        RESTRICTED = 5;
    }
    optional Bucket standby_bucket = 5 [default = UNKNOWN];

    // The job id (as assigned by the app).
    optional int32 job_id = 6;

    // One flag for each of the API constraints defined by JobScheduler. Does not include implicit
    // constraints as they are always assumed to be set.
    optional bool has_charging_constraint = 7;
    optional bool has_battery_not_low_constraint = 8;
    optional bool has_storage_not_low_constraint = 9;
    optional bool has_timing_delay_constraint = 10;
    optional bool has_deadline_constraint = 11;
    optional bool has_idle_constraint = 12;
    optional bool has_connectivity_constraint = 13;
    optional bool has_content_trigger_constraint = 14;
    optional bool is_prefetch = 18;

    // True if the app has requested this run as an expedited job.
    optional bool is_requested_expedited_job = 15;
    // True if the job is running as an expedited job. Only valid for STARTED and FINISHED states.
    optional bool is_running_as_expedited_job = 16;

    // The priority set by the app (via JobInfo.Builder.setPriority()).
    optional int32 requested_priority = 19;
    // The priority JobScheduler ran the job at. Only valid for STARTED and FINISHED states.
    optional int32 effective_priority = 20;

    // Number of times JobScheduler has tried to run this particular job. This value is incremented
    // when a job is stopped and rescheduled for various reasons (lost network, constraints no
    // longer satisfied, etc). For periodic jobs, this value is reset after a successful run.
    optional int32 num_previous_attempts = 21;
}

/**
 * Logs when the audio state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message AudioStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
        // RESET indicates all audio stopped. Used when it (re)starts (e.g. after it crashes).
        RESET = 2;
    }
    optional State state = 2;
}

/**
 * Logs when the video codec state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message MediaCodecStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
        // RESET indicates all mediaCodec stopped. Used when it (re)starts (e.g. after it crashes).
        RESET = 2;
    }
    optional State state = 2;
}

/**
 * Logs when the flashlight state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message FlashlightStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
        // RESET indicates all flashlight stopped. Used when it (re)starts (e.g. after it crashes).
        RESET = 2;
    }
    optional State state = 2;
}

/**
 * Logs when the camera state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message CameraStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
        // RESET indicates all camera stopped. Used when it (re)starts (e.g. after it crashes).
        RESET = 2;
    }
    optional State state = 2;
}

/**
 * Logs that the state of a wakelock (per app and per wakelock name) has changed.
 *
 * Logged from:
 *   TODO
 */
message WakelockStateChanged {
    repeated AttributionNode attribution_node = 1
            [(state_field_option).primary_field_first_uid = true];

    // The type (level) of the wakelock; e.g. a partial wakelock or a full wakelock.
    // From frameworks/proto_logging/stats/enums/os/enums.proto.
    optional android.os.WakeLockLevelEnum type = 2 [(state_field_option).primary_field = true];

    // The wakelock tag (Called tag in the Java API, sometimes name elsewhere).
    optional string tag = 3 [(state_field_option).primary_field = true];

    enum State {
        RELEASE = 0;
        ACQUIRE = 1;
        CHANGE_RELEASE = 2;
        CHANGE_ACQUIRE = 3;
    }
    optional State state = 4 [
        (state_field_option).exclusive_state = true,
        (state_field_option).default_state_value = 0,
        (state_field_option).nested = true
    ];
}

/**
 * Logs when a partial wakelock is considered 'long' (over 1 min).
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message LongPartialWakelockStateChanged {
    repeated AttributionNode attribution_node = 1;

    // The wakelock tag (Called tag in the Java API, sometimes name elsewhere).
    optional string tag = 2;

    // TODO: I have no idea what this is.
    optional string history_tag = 3;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 4;
}

/**
 * Logs when the device is interactive, according to the PowerManager Notifier.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/power/Notifier.java
 */
message InteractiveStateChanged {
    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 1;
}

/**
 * Logs Battery Saver state change.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message BatterySaverModeStateChanged {
    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs Doze mode state change.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message DeviceIdleModeStateChanged {
    optional android.server.DeviceIdleModeEnum state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}


/**
 * Logs state change of Doze mode including maintenance windows.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message DeviceIdlingModeStateChanged {
    optional android.server.DeviceIdleModeEnum state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs screen brightness level.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message ScreenBrightnessChanged {
    // Screen brightness level. Should be in [-1, 255] according to PowerManager.java.
    optional int32 level = 1;
}

/**
 * Logs battery level (percent full, from 0 to 100).
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message BatteryLevelChanged {
    // Battery level. Should be in [0, 100].
    optional int32 battery_level = 1;
}

/**
 * Logs change in charging status of the device.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message ChargingStateChanged {
    // State of the battery, from frameworks/proto_logging/stats/enums/os/enums.proto.
    optional android.os.BatteryStatusEnum state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs whether the device is plugged in, and what power source it is using.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message PluggedStateChanged {
    // Whether the device is plugged in, from frameworks/proto_logging/stats/enums/os/enums.proto.
    optional android.os.BatteryPluggedStateEnum state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs when an app's wakeup alarm fires.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message WakeupAlarmOccurred {
    repeated AttributionNode attribution_node = 1;

    // Name of the wakeup alarm.
    optional string tag = 2;

    // Name of source package (for historical reasons, since BatteryStats tracked it).
    optional string package_name = 3;

    // The App Standby bucket of the app that scheduled the alarm at the time the alarm fired.
    optional AppStandbyBucketChanged.Bucket app_standby_bucket = 4;
}

/**
 * Logs when an an app causes the mobile radio to change state.
 * Changing from LOW to MEDIUM or HIGH can be considered the app waking the mobile radio.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/NetworkManagementService.java
 */
message MobileRadioPowerStateChanged {
    repeated AttributionNode attribution_node = 1;

    // Power state, from frameworks/proto_logging/stats/enums/telephony/enums.proto.
    optional android.telephony.DataConnectionPowerStateEnum state = 2;
}

/**
 * Logs when an an app causes the wifi radio to change state.
 * Changing from LOW to MEDIUM or HIGH can be considered the app waking the wifi radio.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/NetworkManagementService.java
 */
message WifiRadioPowerStateChanged {
    repeated AttributionNode attribution_node = 1;

    // Power state, from frameworks/proto_logging/stats/enums/telephony/enums.proto.
    optional android.telephony.DataConnectionPowerStateEnum state = 2;
}

/**
 * Logs kernel wakeup reasons and aborts.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message KernelWakeupReported {
    // Name of the kernel wakeup reason (or abort).
    optional string wakeup_reason_name = 1;

    // Duration (in microseconds) for the wake-up interrupt to be serviced.
    optional int64 duration_micros = 2;
}

/**
 * Logs when Wifi is toggled on/off.
 * Note that Wifi may still perform certain functions (e.g. location scanning) even when disabled.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message WifiEnabledStateChanged {
    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 1;
}

/**
 * This atom is deprecated starting in R.
 *
 * Logs when an app causes Wifi to run. In this context, 'to run' means to use Wifi Client Mode.
 * TODO: Include support for Hotspot, perhaps by using an extra field to denote 'mode'.
 * Note that Wifi Scanning is monitored separately in WifiScanStateChanged.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
 */
message WifiRunningStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 2;
}

/**
 * Logs wifi locks held by an app.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message WifiLockStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 2;

    // WifiLock type, from frameworks/proto_logging/stats/enums/wifi/enums.proto.
    optional android.net.wifi.WifiModeEnum mode = 3;
}

/**
 * Logs wifi signal strength changes.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
 */
message WifiSignalStrengthChanged {
    // Signal strength, from frameworks/proto_logging/stats/enums/telephony/enums.proto.
    optional android.telephony.SignalStrengthEnum signal_strength = 1;
}

/**
 * Logs wifi scans performed by an app.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
 */
message WifiScanStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 2;
}

/**
 * Logs wifi multicast locks held by an app
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMulticastLockManager.java
 */
message WifiMulticastLockStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 2;

    optional string tag = 3;
}

/**
 * Logs shutdown reason and duration on next boot.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/server/BootReceiver.java
 */
message ShutdownSequenceReported {
    // True if shutdown is for a reboot. Default: false if we do not know.
    optional bool reboot = 1;

    // Reason for shutdown. Eg: userrequested. Default: "<EMPTY>".
    optional string reason = 2;

    // Beginning of shutdown time in ms using wall clock time since unix epoch.
    // Default: 0 if no start time received.
    optional int64 start_time_millis = 3;

    // Duration of shutdown in ms. Default: 0 if no duration received.
    optional int64 duration_millis = 4;
}


/**
 * Logs boot reason and duration.
 *
 * Logged from:
 *   system/core/bootstat/bootstat.cpp
 */
message BootSequenceReported {
    // Reason for bootloader boot. Eg. reboot. See bootstat.cpp for larger list
    // Default: "<EMPTY>" if not available.
    optional string bootloader_reason = 1;

    // Reason for system boot. Eg. bootloader, reboot,userrequested
    // Default: "<EMPTY>" if not available.
    optional string system_reason = 2;

    // End of boot time in ms from unix epoch using system wall clock.
    optional int64 end_time_millis = 3;

    // Total boot duration in ms.
    optional int64 total_duration_millis = 4;

    // Bootloader duration in ms.
    optional int64 bootloader_duration_millis = 5;

    // Time since last boot in ms. Default: 0 if not available.
    optional int64 time_since_last_boot = 6;
}


/**
 * Logs call state and disconnect cause (if applicable).
 *
 * Logged from:
 *   packages/services/Telecomm/src/com/android/server/telecom/Call.java
 */
message CallStateChanged {
    // The state of the call. Eg. DIALING, ACTIVE, ON_HOLD, DISCONNECTED.
    // From frameworks/proto_logging/stats/enums/telecomm/enums.proto.
    optional android.telecom.CallStateEnum call_state = 1;

    // The reason the call disconnected. Eg. ERROR, MISSED, REJECTED, BUSY.
    // This value is only applicable when the call_state is DISCONNECTED, and
    // should always be UNKNOWN if the call_state is not DISCONNECTED.
    // From frameworks/proto_logging/stats/enums/telecomm/enums.proto.
    optional android.telecom.DisconnectCauseEnum disconnect_cause = 2;

    // True if the call is self-managed, which are apps that use the
    // telecom infrastructure to make their own calls.
    optional bool self_managed = 3;

    // True if call is external. External calls are calls on connected Wear
    // devices but show up in Telecom so the user can pull them onto the device.
    optional bool external_call = 4;
}

/**
 * Logs keyguard state. The keyguard is the lock screen.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
 */
message KeyguardStateChanged {
    enum State {
        UNKNOWN = 0;
        // The keyguard is hidden when the phone is unlocked.
        HIDDEN = 1;
        // The keyguard is shown when the phone is locked (screen turns off).
        SHOWN= 2;
        // The keyguard is occluded when something is overlaying the keyguard.
        // Eg. Opening the camera while on the lock screen.
        OCCLUDED = 3;
    }
    optional State state = 1;
}

/**
 * Logs keyguard bouncer state. The bouncer is a part of the keyguard, and
 * prompts the user to enter a password (pattern, pin, etc).
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
 */

message KeyguardBouncerStateChanged {
    enum State {
        UNKNOWN = 0;
        // Bouncer is hidden, either as a result of successfully entering the
        // password, screen timing out, or user going back to lock screen.
        HIDDEN = 1;
        // The user is being prompted to enter the password and the keyguard is NOT in one
        // handed mode.
        SHOWN = 2;
        // The user is being prompted to enter the password and the keyguard shows in one
        // handed mode and left aligned.
        SHOWN_LEFT = 3;
        // The user is being prompted to enter the password and the keyguard shows in one
        // handed mode and right aligned.
        SHOWN_RIGHT = 4;
        // The keyguard switches to the left side while it is in one handed mode.
        SWITCH_LEFT = 5;
        // The keyguard switches to the right side while it is in one handed mode.
        SWITCH_RIGHT = 6;
    }
    optional State state = 1;
}

/**
 * Logs the result of entering a password into the keyguard bouncer.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
 */
message KeyguardBouncerPasswordEntered {
    enum BouncerResult {
        UNKNOWN = 0;
        // The password entered was incorrect.
        FAILURE = 1;
        // The password entered was correct.
        SUCCESS = 2;
    }
    optional BouncerResult result = 1;

    enum BouncerSide {
        DEFAULT = 0;
        LEFT = 1;
        RIGHT = 2;
    }
    optional BouncerSide side = 2;
}

/*
 * Logs changes to the configuration of the device. The configuration is defined
 * in frameworks/base/core/java/android/content/res/Configuration.java
 * More documentation is at https://d.android.com/reference/android/content/res/Configuration.html
 * Please go there to interpret the possible values each field can be.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message ResourceConfigurationChanged {
    // Bit mask of color capabilities of the screen.
    // Contains information about the color gamut and hdr mode of the screen.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#colorMode
    optional int32 color_mode = 1;

    // The target screen density being rendered to.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#densityDpi
    optional int32 density_dpi = 2;

    // Current user preference for the scaling factor for fonts,
    // relative to the base density scaling.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#fontScale
    optional float font_scale = 3;

    // Flag indicating whether the hard keyboard is hidden.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#hardKeyboardHidden
    optional int32 hard_keyboard_hidden = 4;

    // The type of keyboard attached to the device.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#keyboard
    optional int32 keyboard = 5;

    // Flag indicating whether any keyboard is available. Takes soft keyboards into account.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#keyboardHidden
    optional int32 keyboard_hidden = 6;

    // IMSI MCC (Mobile Country Code), corresponding to mcc resource qualifier.
    // 0 if undefined.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#mcc
    optional int32 mcc = 7;

    // IMSI MNC (Mobile Network Code), corresponding to mnc resource qualifier.
    // 0 if undefined. Note: the actual MNC may be 0, to check for this use the
    // MNC_ZERO symbol defined in Configuration.java.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#mnc
    optional int32 mnc = 8;

    // The kind of navigation available on the device.
    // See: https://developer.android.com/reference/android/content/res/Configuration.html#navigation
    optional int32 navigation = 9;

    // Flag indicating whether the navigation is available.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#navigationHidden
    optional int32 navigation_hidden = 10;

    // Overall orientation of the screen.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#orientation
    optional int32 orientation = 11;

    // The current height of the available screen space, in dp units.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#screenHeightDp
    optional int32 screen_height_dp = 12;

    // Bit mask of overall layout of the screen.
    // Contains information about screen size, whether the screen is wider/taller
    // than normal, whether the screen layout is right-tl-left or left-to-right,
    // and whether the screen has a rounded shape.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#screenLayout
    optional int32 screen_layout = 13;

    // Current width of the available screen space, in dp units.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#screenWidthDp
    optional int32 screen_width_dp = 14;

    // The smallest screen size an application will see in normal operation.
    // This is the smallest value of both screenWidthDp and screenHeightDp
    // in portrait and landscape.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#smallestScreenWidthDp
    optional int32 smallest_screen_width_dp = 15;

    // The type of touch screen attached to the device.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#touchscreen
    optional int32 touchscreen = 16;

    // Bit mask of the ui mode.
    // Contains information about the overall ui mode of the device.
    // Eg: NORMAL, DESK, CAR, TELEVISION, WATCH, VR_HEADSET
    // Also contains information about whether the device is in night mode.
    // See: https://d.android.com/reference/android/content/res/Configuration.html#uiMode
    optional int32 ui_mode = 17;
}


/**
 * Logs changes in the connection state of the mobile radio.
 *
 * Logged from:
 *    frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
 */
message MobileConnectionStateChanged {
    // States are from the state machine DataConnection.java.
    enum State {
        UNKNOWN = 0;
        // The connection is inactive, or disconnected.
        INACTIVE = 1;
        // The connection is being activated, or connecting.
        ACTIVATING = 2;
        // The connection is active, or connected.
        ACTIVE = 3;
        // The connection is disconnecting.
        DISCONNECTING = 4;
        // The connection is disconnecting after creating a connection.
        DISCONNECTION_ERROR_CREATING_CONNECTION = 5;
    }
    optional State state  = 1;
    // For multi-sim phones, this distinguishes between the sim cards.
    optional int32 sim_slot_index = 2;
    // Used to identify the connection. Starts at 0 and increments by 1 for
    // every new network created. Resets whenever the device reboots.
    optional int32 data_connection_id = 3;
    // A bitmask for the capabilities of this connection.
    // Eg. DEFAULT (internet), MMS, SUPL, DUN, IMS.
    // Default value (if we have no information): 0
    optional int64 capabilities = 4;
    // If this connection has internet.
    // This just checks if the DEFAULT bit of capabilities is set.
    optional bool has_internet = 5;
}

/**
 * Logs changes in mobile radio technology. eg: LTE, EDGE, CDMA.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java
 */
message MobileRadioTechnologyChanged {
    optional android.telephony.NetworkTypeEnum state = 1;
    // For multi-sim phones, this distinguishes between the sim cards.
    optional int32 sim_slot_index = 2;
}

/**
 * Logs the VID and PID of any connected USB devices.
 *
 * Notes if any Audio, HID (input buttons/mouse/keyboard), or Storage interfaces are present.
 *
 * Logged by Vendor.
 */
message UsbDeviceAttached {
    optional int32 vid = 1;
    optional int32 pid = 2;
    optional bool has_audio = 3;
    optional bool has_hid = 4;
    optional bool has_storage = 5;
    enum State {
        STATE_DISCONNECTED = 0;
        STATE_CONNECTED = 1;
    }
    optional State state = 6;
    optional int64 last_connect_duration_millis = 7;
}


/**
 * Logs when Bluetooth is enabled and disabled.
 *
 * Logged from:
 *   services/core/java/com/android/server/BluetoothManagerService.java
 */
message BluetoothEnabledStateChanged {
    repeated AttributionNode attribution_node = 1;
    // Whether or not bluetooth is enabled on the device.
    enum State {
        UNKNOWN = 0;
        ENABLED = 1;
        DISABLED = 2;
    }
    optional State state = 2;
    // The reason for being enabled/disabled.
    // Eg. Airplane mode, crash, application request.
    optional android.bluetooth.EnableDisableReasonEnum reason = 3;
    // If the reason is an application request, this will be the package name.
    optional string pkg_name = 4;
}

/**
 * Logs when profiles on a Bluetooth device connects and disconnects.
 *
 * Logged from:
 *    packages/apps/Bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java
 *
 * Next Tag: 6
 */
message BluetoothConnectionStateChanged {
    // The state of the connection.
    // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED.
    optional android.bluetooth.ConnectionStateEnum state = 1;
    // An identifier that can be used to match connect and disconnect events.
    // Currently is last two bytes of a hash of a device level ID and
    // the mac address of the bluetooth device that is connected.
    // Deprecated: use obfuscated_id instead, this one is always 0 for Q+
    optional int32 obfuscated_id = 2 [deprecated = true];
    // The profile that is connected. Eg. GATT, A2DP, HEADSET.
    // From android.bluetooth.BluetoothAdapter.java
    // Default: 0 when not used
    optional int32 bt_profile = 3;
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes new_obfuscated_id = 4 [(android.os.statsd.log_mode) = MODE_BYTES];
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 5;
    // An index to group connection events by session. It's a counter generated by
    // each profile. e.g. Gatt server generate such id to identify Gatt apps
    optional int32 session_index = 6;
}

/**
 * Logs when a Bluetooth device connects and disconnects over ACL
 *
 * Logged from:
 *    packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java
 *
 * Next Tag: 4
 */
message BluetoothAclConnectionStateChanged {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // The state of the connection.
    // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED.
    optional android.bluetooth.ConnectionStateEnum state = 2;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 3;
    // Used transport of this event.
    optional android.bluetooth.TransportTypeEnum transport = 4;
}

/**
 * Logs when a Bluetooth device connects and disconnects over SCO
 *
 * Logged from:
 *    packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
 *    packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetClientStateMachine.java
 *
 * Next Tag: 5
 */
message BluetoothScoConnectionStateChanged {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // The state of the connection.
    // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED.
    optional android.bluetooth.ConnectionStateEnum state = 2;
    // Codec used for this SCO connection
    // Default: UNKNOWN
    optional android.bluetooth.hfp.ScoCodec codec = 3;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 4;
}

/**
 * Logged when active device of a profile changes
 *
 * Logged from:
 *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
 *     packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetService.java
 *     packages/apps/Bluetooth/src/com/android/bluetooth/hearingaid/HearingAidService.java
 */
message BluetoothActiveDeviceChanged {
    // The profile whose active device has changed. Eg. A2DP, HEADSET, HEARING_AID
    // From android.bluetooth.BluetoothProfile
    optional int32 bt_profile = 1;
    // An identifier that can be used to match events for this new active device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if there is no active device for this profile
    optional bytes obfuscated_id = 2 [(android.os.statsd.log_mode) = MODE_BYTES];
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 3;
}

// Logs when there is an event affecting Bluetooth device's link layer connection.
// - This event is triggered when there is a related HCI command or event
// - Users of this metrics can deduce Bluetooth device's connection state from these events
// - HCI commands are logged before the command is sent, after receiving command status, and after
//   receiving command complete
// - HCI events are logged when they arrive
//
// Low level log from system/bt
//
// Bluetooth classic commands:
// - CMD_CREATE_CONNECTION
// - CMD_DISCONNECT
// - CMD_CREATE_CONNECTION_CANCEL
// - CMD_ACCEPT_CONNECTION_REQUEST
// - CMD_REJECT_CONNECTION_REQUEST
// - CMD_SETUP_ESCO_CONNECTION
// - CMD_ACCEPT_ESCO_CONNECTION
// - CMD_REJECT_ESCO_CONNECTION
// - CMD_ENH_SETUP_ESCO_CONNECTION
// - CMD_ENH_ACCEPT_ESCO_CONNECTION
//
// Bluetooth low energy commands:
// - CMD_BLE_CREATE_LL_CONN [Only logged on error or when initiator filter policy is 0x00]
// - CMD_BLE_CREATE_CONN_CANCEL [Only logged when there is an error]
// - CMD_BLE_EXTENDED_CREATE_CONNECTION [Only logged on error or when initiator filter policy is 0x00]
// - CMD_BLE_CLEAR_WHITE_LIST
// - CMD_BLE_ADD_WHITE_LIST
// - CMD_BLE_REMOVE_WHITE_LIST
//
// Bluetooth classic events:
// - EVT_CONNECTION_COMP
// - EVT_CONNECTION_REQUEST
// - EVT_DISCONNECTION_COMP
// - EVT_ESCO_CONNECTION_COMP
// - EVT_ESCO_CONNECTION_CHANGED
//
// Bluetooth low energy meta events:
// - BLE_EVT_CONN_COMPLETE_EVT
// - BLE_EVT_ENHANCED_CONN_COMPLETE_EVT
//
// Next tag: 10
message BluetoothLinkLayerConnectionEvent {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Connection handle of this connection if available
    // Range: 0x0000 - 0x0EFF (12 bits)
    // Default: 0xFFFF if the handle is unknown
    optional int32 connection_handle = 2;
    // Direction of the link
    // Default: DIRECTION_UNKNOWN
    optional android.bluetooth.DirectionEnum direction = 3;
    // Type of this link
    // Default: LINK_TYPE_UNKNOWN
    optional android.bluetooth.LinkTypeEnum type = 4;

    // Reason metadata for this link layer connection event, rules for interpretation:
    // 1. If hci_cmd is set and valid, hci_event can be either EVT_COMMAND_STATUS or
    //    EVT_COMMAND_COMPLETE, ignore hci_ble_event in this case
    // 2. If hci_event is set to EVT_BLE_META, look at hci_ble_event; otherwise, if hci_event is
    //    set and valid, ignore hci_ble_event

    // HCI command associated with this event
    // Default: CMD_UNKNOWN
    optional android.bluetooth.hci.CommandEnum hci_cmd = 5;
    // HCI event associated with this event
    // Default: EVT_UNKNOWN
    optional android.bluetooth.hci.EventEnum hci_event = 6;
    // HCI BLE meta event associated with this event
    // Default: BLE_EVT_UNKNOWN
    optional android.bluetooth.hci.BleMetaEventEnum hci_ble_event = 7;
    // HCI command status code if this is triggerred by hci_cmd
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum cmd_status = 8;
    // HCI reason code associated with this event
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum reason_code = 9;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 10;
}

/**
 * Logs when a module is rolled back by Watchdog.
 *
 * Logged from: Rollback Manager
 */
message WatchdogRollbackOccurred {
    enum RollbackType {
        UNKNOWN = 0;
        ROLLBACK_INITIATE = 1;
        ROLLBACK_SUCCESS = 2;
        ROLLBACK_FAILURE = 3;
        ROLLBACK_BOOT_TRIGGERED = 4;
    }
    optional RollbackType rollback_type = 1;

    optional string package_name = 2;

    optional int32 package_version_code = 3;

    enum RollbackReasonType {
        REASON_UNKNOWN = 0;
        REASON_NATIVE_CRASH = 1;
        REASON_EXPLICIT_HEALTH_CHECK = 2;
        REASON_APP_CRASH = 3;
        REASON_APP_NOT_RESPONDING = 4;
        REASON_NATIVE_CRASH_DURING_BOOT = 5;
    }
    optional RollbackReasonType rollback_reason = 4;

    // Set by RollbackPackageHealthObserver to be the package that is failing when a rollback
    // is initiated. Empty if the package is unknown.
    optional string failing_package_name = 5;

    optional TrainExperimentIds experiment_ids = 6 [(log_mode) = MODE_BYTES];
}

/**
 * Logs when there is a change in Bluetooth A2DP playback state
 *
 * Logged from:
 *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
 */
message BluetoothA2dpPlaybackStateChanged {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Current playback state
    // Default: PLAYBACK_STATE_UNKNOWN
    optional android.bluetooth.a2dp.PlaybackStateEnum playback_state = 2;
    // Current audio coding mode
    // Default: AUDIO_CODING_MODE_UNKNOWN
    optional android.bluetooth.a2dp.AudioCodingModeEnum audio_coding_mode = 3;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 4;
}

/**
 * Logs when there is a change in A2DP codec config for a particular remote device
 *
 * Logged from:
 *     frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java
 *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
 */
message BluetoothA2dpCodecConfigChanged {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig
    // Default SOURCE_CODEC_TYPE_INVALID
    optional int32 codec_type = 2;
    // Codec priroity, the higher the more preferred, -1 for disabled
    // Default: CODEC_PRIORITY_DEFAULT
    optional int32 codec_priority = 3;
    // Sample rate in Hz as defined by various SAMPLE_RATE_* constants in BluetoothCodecConfig
    // Default: SAMPLE_RATE_NONE
    optional int32 sample_rate = 4;
    // Bits per sample as defined by various BITS_PER_SAMPLE_* constants in BluetoothCodecConfig
    // Default: BITS_PER_SAMPLE_NONE
    optional int32 bits_per_sample = 5;
    // Channel mode as defined by various CHANNEL_MODE_* constants in BluetoothCodecConfig
    // Default: CHANNEL_MODE_NONE
    optional int32 channel_mode = 6;
    // Codec specific values
    // Default 0
    optional int64 codec_specific_1 = 7;
    optional int64 codec_specific_2 = 8;
    optional int64 codec_specific_3 = 9;
    optional int64 codec_specific_4 = 10;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 11;
}

/**
 * Logs when there is a change in selectable A2DP codec capability for a paricular remote device
 * Each codec's capability is logged separately due to statsd restriction
 *
 * Logged from:
 *     frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java
 *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
 */
message BluetoothA2dpCodecCapabilityChanged {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig
    // Default SOURCE_CODEC_TYPE_INVALID
    optional int32 codec_type = 2;
    // Codec priroity, the higher the more preferred, -1 for disabled
    // Default: CODEC_PRIORITY_DEFAULT
    optional int32 codec_priority = 3;
    // A bit field of supported sample rates as defined by various SAMPLE_RATE_* constants
    // in BluetoothCodecConfig
    // Default: empty and SAMPLE_RATE_NONE for individual item
    optional int32 sample_rate = 4;
    // A bit field of supported bits per sample as defined by various BITS_PER_SAMPLE_* constants
    // in BluetoothCodecConfig
    // Default: empty and BITS_PER_SAMPLE_NONE for individual item
    optional int32 bits_per_sample = 5;
    // A bit field of supported channel mode as defined by various CHANNEL_MODE_* constants in
    // BluetoothCodecConfig
    // Default: empty and CHANNEL_MODE_NONE for individual item
    optional int32 channel_mode = 6;
    // Codec specific values
    // Default 0
    optional int64 codec_specific_1 = 7;
    optional int64 codec_specific_2 = 8;
    optional int64 codec_specific_3 = 9;
    optional int64 codec_specific_4 = 10;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 11;
}

/**
 * Logs when A2DP failed to read from PCM source.
 * This typically happens when audio HAL cannot supply A2DP with data fast enough for encoding.
 *
 * Logged from:
 *     system/bt
 */
message BluetoothA2dpAudioUnderrunReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Encoding interval in nanoseconds
    // Default: 0
    optional int64 encoding_interval_nanos = 2;
    // Number of bytes of PCM data that could not be read from the source
    // Default: 0
    optional int32 num_missing_pcm_bytes = 3;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 4;
}

/**
 * Logs when A2DP failed send encoded data to the remote device fast enough such that the transmit
 * buffer queue is full and we have to drop data
 *
 * Logged from:
 *     system/bt
 */
message BluetoothA2dpAudioOverrunReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Encoding interval in nanoseconds
    // Default: 0
    optional int64 encoding_interval_nanos = 2;
    // Number of buffers dropped in this event
    // Each buffer is encoded in one encoding interval and consists of multiple encoded frames
    // Default: 0
    optional int32 num_dropped_buffers = 3;
    // Number of encoded buffers dropped in this event
    // Default 0
    optional int32 num_dropped_encoded_frames = 4;
    // Number of encoded bytes dropped in this event
    // Default: 0
    optional int32 num_dropped_encoded_bytes = 5;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 6;
}

/**
 * Logs when we receive reports regarding a device's RSSI value
 *
 * Logged from:
 *     system/bt
 */
message BluetoothDeviceRssiReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Connection handle of this connection if available
    // Range: 0x0000 - 0x0EFF (12 bits)
    // Default: 0xFFFF if the handle is unknown
    optional int32 connection_handle = 2;
    // HCI command status code if this is triggerred by hci_cmd
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum hci_status = 3;
    // BR/EDR
    //   Range: -128 ≤ N ≤ 127 (signed integer)
    //   Units: dB
    // LE:
    //   Range: -127 to 20, 127 (signed integer)
    //   Units: dBm
    // Invalid when an out of range value is reported
    optional int32 rssi = 4;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 5;
}

/**
 * Logs when we receive reports regarding how many consecutive failed contacts for a connection
 *
 * Logged from:
 *     system/bt
 */
message BluetoothDeviceFailedContactCounterReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Connection handle of this connection if available
    // Range: 0x0000 - 0x0EFF (12 bits)
    // Default: 0xFFFF if the handle is unknown
    optional int32 connection_handle = 2;
    // HCI command status code if this is triggerred by hci_cmd
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum cmd_status = 3;
    // Number of consecutive failed contacts for a connection corresponding to the Handle
    // Range: uint16_t, 0-0xFFFF
    // Default: 0xFFFFF
    optional int32 failed_contact_counter = 4;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 5;
}

/**
 * Logs when we receive reports regarding the tranmit power level used for a specific connection
 *
 * Logged from:
 *     system/bt
 */
message BluetoothDeviceTxPowerLevelReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Connection handle of this connection if available
    // Range: 0x0000 - 0x0EFF (12 bits)
    // Default: 0xFFFF if the handle is unknown
    optional int32 connection_handle = 2;
    // HCI command status code if this is triggered by hci_cmd
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum hci_status = 3;
    // Range: -30 ≤ N ≤ 20
    // Units: dBm
    // Invalid when an out of range value is reported
    optional int32 transmit_power_level = 4;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 5;
}

/**
 * Logs when Bluetooth controller failed to reply with command status within a timeout period after
 * receiving an HCI command from the host
 *
 * Logged from: system/bt
 */
message BluetoothHciTimeoutReported {
    // HCI command associated with this event
    // Default: CMD_UNKNOWN
    optional android.bluetooth.hci.CommandEnum hci_command = 1;
}

/**
 * Logs when we receive Bluetooth Link Quality Report event from the controller
 * See Android Bluetooth HCI specification for more details
 *
 * Note: all count and bytes field are counted since last event
 *
 * Logged from: system/bt
 */
message BluetoothQualityReportReported {
    // Quality report ID
    // Original type: uint8_t
    // Default: BQR_ID_UNKNOWN
    optional android.bluetooth.hci.BqrIdEnum quality_report_id = 1;
    // Packet type of the connection
    // Original type: uint8_t
    // Default: BQR_PACKET_TYPE_UNKNOWN
    optional android.bluetooth.hci.BqrPacketTypeEnum packet_types = 2;
    // Connection handle of the connection
    // Original type: uint16_t
    optional int32 connection_handle = 3;
    // Performing Role for the connection
    // Original type: uint8_t
    optional int32 connection_role = 4;
    // Current Transmit Power Level for the connection. This value is the same as the controller's
    // response to the HCI_Read_Transmit_Power_Level HCI command
    // Original type: uint8_t
    optional int32 tx_power_level = 5;
    // Received Signal Strength Indication (RSSI) value for the connection. This value is an
    // absolute receiver signal strength value
    // Original type: int8_t
    optional int32 rssi = 6;
    // Signal-to-Noise Ratio (SNR) value for the connection. It is the average SNR of all the
    // channels used by the link currently
    // Original type: uint8_t
    optional int32 snr = 7;
    // Indicates the number of unused channels in AFH_channel_map
    // Original type: uint8_t
    optional int32 unused_afh_channel_count = 8;
    // Indicates the number of the channels which are interfered and quality is bad but are still
    // selected for AFH
    // Original type: uint8_t
    optional int32 afh_select_unideal_channel_count = 9;
    // Current Link Supervision Timeout Setting
    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
    // Original type: uint16_t
    optional int32 lsto = 10;
    // Piconet Clock for the specified Connection_Handle. This value is the same as the controller's
    // response to HCI_Read_Clock HCI command with the parameter "Which_Clock" of
    // 0x01 (Piconet Clock)
    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
    // Original type: uint32_t
    optional int64 connection_piconet_clock = 11;
    // The count of retransmission
    // Original type: uint32_t
    optional int64 retransmission_count = 12;
    // The count of no RX
    // Original type: uint32_t
    optional int64 no_rx_count = 13;
    // The count of NAK (Negative Acknowledge)
    // Original type: uint32_t
    optional int64 nak_count = 14;
    // Controller timestamp of last TX ACK
    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
    // Original type: uint32_t
    optional int64 last_tx_ack_timestamp = 15;
    // The count of Flow-off (STOP)
    // Original type: uint32_t
    optional int64 flow_off_count = 16;
    // Controller timestamp of last Flow-on (GO)
    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
    // Original type: uint32_t
    optional int64 last_flow_on_timestamp = 17;
    // Buffer overflow count (how many bytes of TX data are dropped) since the last event
    // Original type: uint32_t
    optional int64 buffer_overflow_bytes = 18;
    // Buffer underflow count (in byte) since last event
    // Original type: uint32_t
    optional int64 buffer_underflow_bytes = 19;
}

/**
 * Logs when a Bluetooth device's manufacturer information is learnt by the Bluetooth stack
 *
 * Notes:
 * - Each event can be partially filled as we might learn different pieces of device
 *   information at different time
 * - Multiple device info events can be combined to give more complete picture
 * - When multiple device info events tries to describe the same information, the
 *   later one wins
 *
 * Logged from:
 *     packages/apps/Bluetooth
 */
message BluetoothDeviceInfoReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Where is this device info obtained from
    optional android.bluetooth.DeviceInfoSrcEnum source_type = 2;
    // Name of the data source
    // For EXTERNAL: package name of the data source
    // For INTERNAL: null for general case, component name otherwise
    optional string source_name = 3;
    // Name of the manufacturer of this device
    optional string manufacturer = 4;
    // Model of this device
    optional string model = 5;
    // Hardware version of this device
    optional string hardware_version = 6;
    // Software version of this device
    optional string software_version = 7;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 8;
    // A flag indicating if the MAC address of the remote device is public or
    // random.
    optional android.bluetooth.AddressTypeEnum address_type = 9;
    // The first byte of MAC address
    optional int32 byte1 = 10;
    // The second byte of MAC address
    optional int32 byte2 = 11;
    // The third byte of MAC address
    optional int32 byte3 = 12;

}

/**
 * Logs when we receive Bluetooth Read Remote Version Information Complete Event from the remote
 * device, as documented by the Bluetooth Core HCI specification
 * Reference: https://www.bluetooth.com/specifications/bluetooth-core-specification
 * Vol 2, Part E, Page 1118
 *
 * Logged from:
 *     system/bt
 */
message BluetoothRemoteVersionInfoReported {
    // Connection handle of the connection
    // Original type: uint16_t
    optional int32 connection_handle = 1;
    // HCI command status code
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum hci_status = 2;
    // 1 byte Version of current LMP in the remote controller
    optional int32 lmp_version = 3;
    // 2 bytes LMP manufacturer code of the remote controller
    // https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers
    optional int32 lmp_manufacturer_code = 4;
    // 4 bytes subversion of the LMP in the remote controller
    optional int32 lmp_subversion = 5;
}

/**
 * Logs when certain Bluetooth SDP attributes are discovered
 * Constant definitions are from:
 *     https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
 *
 * Current logged attributes:
 * - BluetoothProfileDescriptorList
 * - Supported Features Bitmask
 *
 * Logged from:
 *     system/bt
 */
message BluetoothSdpAttributeReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Short form UUIDs used to identify Bluetooth protocols, profiles, and service classes
    // Original type: uint16_t
    optional int32 protocol_uuid = 2;
    // Short form UUIDs used to identify Bluetooth SDP attribute types
    // Original type: uint16_t
    optional int32 attribute_id = 3;
    // Attribute value for the particular attribute
    optional bytes attribute_value = 4 [(android.os.statsd.log_mode) = MODE_BYTES];
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 5;
}

/**
* Logs the user created Bluetooth device's name.
* It is pushed at Bluetooth pairing and connection.
* The metric will only be collected from dogfooders.
*
* Logged from:
*     packages/modules/Bluetooth
*/
message BluetoothDeviceNameReported {
   // An identifier that can be used to match events for this device.
   // The incremental identifier is locally generated and guaranteed not derived
   // from any globally unique hardware id.
   // For paired devices, it stays consistent between Bluetooth toggling for the
   // same remote device.
   // For unpaired devices, it stays consistent within the same Bluetooth adapter
   // session for the same remote device.
   // Default: 0 if the device's metric id is unknown.
   optional int32 metric_id = 1;

   // Name of the Bluetooth device. It is created by the user.
   optional string device_name = 2;
}

/**
 * Logs when bond state of a Bluetooth device changes
 *
 * Logged from:
 *     frameworks/base/core/java/android/bluetooth/BluetoothDevice.java
 *     packages/apps/Bluetooth/src/com/android/bluetooth/btservice/BondStateMachine.java
 */
message BluetoothBondStateChanged {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Preferred transport type to remote dual mode device
    // Default: TRANSPORT_AUTO means no preference
    optional android.bluetooth.TransportTypeEnum transport = 2;
    // The type of this Bluetooth device (Classic, LE, or Dual mode)
    // Default: UNKNOWN
    optional android.bluetooth.DeviceTypeEnum type = 3;
    // Current bond state (NONE, BONDING, BONDED)
    // Default: BOND_STATE_UNKNOWN
    optional android.bluetooth.BondStateEnum bond_state = 4;
    // Bonding sub state
    // Default: BOND_SUB_STATE_UNKNOWN
    optional android.bluetooth.BondSubStateEnum bonding_sub_state = 5;
    // Unbond Reason
    // Default: UNBOND_REASON_UNKNOWN
    optional android.bluetooth.UnbondReasonEnum unbond_reason = 6;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 7;
}

/**
 * Logs there is an event related Bluetooth classic pairing
 *
 * Logged from:
 *     system/bt
 */
message BluetoothClassicPairingEventReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Connection handle of this connection if available
    // Range: 0x0000 - 0x0EFF (12 bits)
    // Default: 0xFFFF if the handle is unknown
    optional int32 connection_handle = 2;
    // HCI command associated with this event
    // Default: CMD_UNKNOWN
    optional android.bluetooth.hci.CommandEnum hci_cmd = 3;
    // HCI event associated with this event
    // Default: EVT_UNKNOWN
    optional android.bluetooth.hci.EventEnum hci_event = 4;
    // HCI command status code if this is triggerred by hci_cmd
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum cmd_status = 5;
    // HCI reason code associated with this event
    // Default: STATUS_UNKNOWN
    optional android.bluetooth.hci.StatusEnum reason_code = 6;
    // A status value related to this specific event
    // Default: 0
    optional int64 event_value = 7;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 8;
}

/**
 * Logs when there is an event related to Bluetooth Security Manager Protocol (SMP)
 *
 * Logged from:
 *     system/bt
 */
message BluetoothSmpPairingEventReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // SMP command sent or received over L2CAP
    // Default: CMD_UNKNOWN
    optional android.bluetooth.smp.CommandEnum smp_command = 2;
    // Whether this command is sent or received
    // Default: DIRECTION_UNKNOWN
    optional android.bluetooth.DirectionEnum direction = 3;
    // SMP failure reason code
    // Default: PAIRING_FAIL_REASON_DEFAULT
    optional android.bluetooth.smp.PairingFailReasonEnum smp_fail_reason = 4;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 5;
}

/**
 * Logs when a Bluetooth socket’s connection state changed
 *
 * Logged from:
 *   system/bt
 */
message BluetoothSocketConnectionStateChanged {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if this is a server listener socket
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Temporary port of this socket for the current connection or session only
    // Default 0 when unknown or don't care
    optional int32 port = 2;
    // Socket type as mentioned in
    // frameworks/base/core/java/android/bluetooth/BluetoothSocket.java
    // Default: SOCKET_TYPE_UNKNOWN
    optional android.bluetooth.SocketTypeEnum type = 3;
    // Socket connection state
    // Default: SOCKET_CONNECTION_STATE_UNKNOWN
    optional android.bluetooth.SocketConnectionstateEnum state = 4;
    // Number of bytes sent to remote device during this connection
    optional int64 tx_bytes = 5;
    // Number of bytes received from remote device during this connection
    optional int64 rx_bytes = 6;
    // Socket owner's UID
    optional int32 uid = 7 [(is_uid) = true];
    // Server port of this socket, if any. When both |server_port| and |port| fields are populated,
    // |port| must be spawned by |server_port|
    // Default 0 when unknown or don't care
    optional int32 server_port = 8;
    // Whether this is a server listener socket
    optional android.bluetooth.SocketRoleEnum is_server = 9;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 10;
}

/**
 * Logs when Class of Device (CoD) value is learnt for a device during pairing or connection
 *
 * Logged from:
 *   packages/apps/Bluetooth/src/com/android/bluetooth/btservice/BondStateMachine.java
 *   packages/apps/Bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java
 *
 */
message BluetoothClassOfDeviceReported {
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if this is a server listener socket
    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Class of Device (CoD) value including both Major, Minor device class and service class
    // Defined in: https://www.bluetooth.com/specifications/assigned-numbers/baseband
    // Also defined in: https://developer.android.com/reference/android/bluetooth/BluetoothClass
    // Default: 0
    optional int32 class_of_device = 2;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 3;
}

/**
 * Logs when there is a crash in hardware abstraction layer (HAL)
 *
 * Logged from:
 *   system/bt
 *
 */
message BluetoothHALCrashReasonReported {
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    optional int32 metric_id = 1;
    // An identifier that can be used to match events for this device.
    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
    // Salt: Randomly generated 256 bit value
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    // Default: null or empty if the device identifier is not known
    optional bytes obfuscated_id = 2 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Bluetooth HAL crash reason error code.
    // Original type: uint8_t
    // Default: 0x00 (DEFAULT)
    optional int32 error_code = 3;
    // Bluetooth HAL crash reason vendor error code.
    // Original type: uint8_t
    // Default: 0x00 (DEFAULT)
    optional int32 vendor_error_code = 4;
}

/**
 * Logs when an LE Audio connection session ended
 *
 * Logged from:
 *   packages/modules/Bluetooth
 *
 */
message LeAudioConnectionSessionReported {
    // Size of this CSIS group
    optional int32 group_size = 1;
    // An identifier that can be used to match events for this CSIS group.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired groups, it stays consistent between Bluetooth toggling for the
    // same remote group.
    // For unpaired groups, it stays consistent within the same Bluetooth adapter
    // session for the same remote group.
    // Default: 0 if the group's metric id is unknown.
    optional int32 group_metric_id = 2;
    // Total duration of this LeAudioConnectionSession
    optional int64 duration_nanos = 3;

    // Connecting timestamp offset to the beginning of this session of each device session
    repeated int64 device_connecting_offset_nanos = 4;
    // Connected timestamp offset to the beginning of this session of each device session
    repeated int64 device_connected_offset_nanos = 5;
    // Duration of each device session
    repeated int64 device_connection_duration_nanos = 6;
    // Connection status of each device session
    repeated android.bluetooth.leaudio.ConnectionStatus device_connection_status = 7;
    // Disconnection status of each device session
    repeated android.bluetooth.leaudio.ConnectionStatus device_disconnection_status = 8;
    // An identifier that can be used to match events for this device.
    // The incremental identifier is locally generated and guaranteed not derived
    // from any globally unique hardware id.
    // For paired devices, it stays consistent between Bluetooth toggling for the
    // same remote device.
    // For unpaired devices, it stays consistent within the same Bluetooth adapter
    // session for the same remote device.
    // Default: 0 if the device's metric id is unknown.
    repeated int32 device_metric_id = 9;

    // Streaming beginning timestamp offset to the beginning of this session
    repeated int64 streaming_session_offset_nanos = 10;
    // Streaming ending timestamp offset to the beginning of this session
    repeated int64 streaming_session_duration_nanos = 11;
    // Streaming context type of each steaming session
    repeated android.bluetooth.leaudio.ContextType streaming_context_type = 12;
}

/**
 * Logs when an LE Audio broadcast session ended
 *
 * Logged from:
 *   packages/modules/Bluetooth
 *
 */
message LeAudioBroadcastSessionReported {
    // Broadcast duration
    optional int64 duration_nanos = 1;
}

/* Logs input device information when input device is registered with Android device.
 * Reported at when a new input device is found by EventHub.
 *
 * Logged from:
 *   frameworks/native/services/inputflinger
 */
message InputDeviceRegistered {
    // The Input Device Name
    optional string name = 1;
    // The Input Device Vendor ID
    optional int32 vendor_id = 2;
    // The Input Device Product ID
    optional int32 product_id = 3;
    // The Input Device Version ID
    optional int32 version_id = 4;
    // The Input Device Bus ID
    optional int32 bus_id = 5;
    // The Input Device identifier generated from kernel device.
    // Hash algorithm: HMAC-SHA256
    optional string obfuscated_id = 6;
    // The Input Device Classes
    optional int32 device_classes = 7;
}

/**
 * Logs when the counter is incremented
 *
 * Logged from:
 *   system/bt
 *   packages/apps/Bluetooth
 *
 */
message BluetoothCodePathCounter {
    // Keys of events with enum ranges to be defined
    optional android.bluetooth.CodePathCounterKeyEnum key = 1;
    // Number of frequency of events
    optional int64 number = 2;
}

/**
 * Logs when an application attempts to start a Bluetooth Low Energy scan.
 * It only happens when the scan is initiated and does not repeatedly call
 * while the scan is running.
 *
 * Logged from:
 *   packages/apps/Bluetooth/src/com/android/bluetooth/gatt/GattService.java
 *
 */
message BluetoothLeBatchScanReportDelay {
    optional int32 application_uid = 1;
    optional int64 application_report_delay_millis = 2;
}

/**
 * Logs when something is plugged into or removed from the USB-C connector.
 *
 * Logged from:
 *  UsbService
 */
message UsbConnectorStateChanged {
    enum State {
        STATE_DISCONNECTED = 0;
        STATE_CONNECTED = 1;
    }
    optional State state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
    optional string id = 2 [(state_field_option).primary_field = true];
    // Last active session in ms.
    // 0 when the port is in connected state.
    optional int64 last_connect_duration_millis = 3;
}

/**
 * Logs the reported speaker impedance.
 *
 * Logged from:
 *  Vendor audio implementation.
 */
message SpeakerImpedanceReported {
    optional int32 speaker_location = 1;
    optional int32 impedance = 2;
}

/**
 * Logs the report of a failed hardware.
 *
 * Logged from:
 *  Vendor HALs.
 *
 */
message HardwareFailed {
    enum HardwareType {
        HARDWARE_FAILED_UNKNOWN = 0;
        HARDWARE_FAILED_MICROPHONE = 1;
        HARDWARE_FAILED_CODEC = 2;
        HARDWARE_FAILED_SPEAKER = 3;
        HARDWARE_FAILED_FINGERPRINT = 4;
    }
    optional HardwareType hardware_type = 1;

   /**
    * hardware_location allows vendors to differentiate between multiple instances of
    * the same hardware_type.  The specific locations are vendor defined integers,
    * referring to board-specific numbering schemes.
    */
    optional int32 hardware_location = 2;

    /**
     * failure_code is specific to the HardwareType of the failed hardware.
     * It should use one of the enum values defined below.
     */
    enum HardwareErrorCode {
        UNKNOWN = 0;
        COMPLETE = 1;
        SPEAKER_HIGH_Z = 2;
        SPEAKER_SHORT = 3;
        FINGERPRINT_SENSOR_BROKEN = 4;
        FINGERPRINT_TOO_MANY_DEAD_PIXELS = 5;
        DEGRADE = 6;
    }
    optional int32 failure_code = 3;
}

/**
 * Log an event when the device has been physically dropped.
 * Reported from the /vendor partition.
 */
message PhysicalDropDetected {
    // Confidence that the event was actually a drop, 0 -> 100
    optional int32 confidence_pctg = 1;
    // Peak acceleration of the drop, in 1/1000s of a g.
    optional int32 accel_peak_thousandths_g = 2;
    // Duration of freefall in ms
    optional int32 freefall_time_millis = 3;
}

/**
 * Log bucketed battery charge cycles.
 *
 * Each bucket represents cycles of the battery past
 * a given charge point.  For example, if 10 cycle buckets are
 * initialized, bucket 1 is the lowest 1/10th of the battery,
 * and bucket 10 is 100%.
 *
 * Logged from:
 * /sys/class/power_supply/bms/cycle_count, via Vendor.
 */
message ChargeCyclesReported {
    optional int32 cycle_bucket_1 = 1;
    optional int32 cycle_bucket_2 = 2;
    optional int32 cycle_bucket_3 = 3;
    optional int32 cycle_bucket_4 = 4;
    optional int32 cycle_bucket_5 = 5;
    optional int32 cycle_bucket_6 = 6;
    optional int32 cycle_bucket_7 = 7;
    optional int32 cycle_bucket_8 = 8;
    optional int32 cycle_bucket_9 = 9;
    optional int32 cycle_bucket_10 = 10;
}

/**
 * Log battery health snapshot.
 *
 * Resistance, Voltage, Open Circuit Voltage, Temperature, and Charge Level
 * are snapshotted periodically over 24hrs.
 */
message BatteryHealthSnapshot {
    enum BatterySnapshotType {
        UNKNOWN = 0;
        MIN_TEMP = 1;         // Snapshot at min batt temp over 24hrs.
        MAX_TEMP = 2;         // Snapshot at max batt temp over 24hrs.
        MIN_RESISTANCE = 3;   // Snapshot at min batt resistance over 24hrs.
        MAX_RESISTANCE = 4;   // Snapshot at max batt resistance over 24hrs.
        MIN_VOLTAGE = 5;      // Snapshot at min batt voltage over 24hrs.
        MAX_VOLTAGE = 6;      // Snapshot at max batt voltage over 24hrs.
        MIN_CURRENT = 7;      // Snapshot at min batt current over 24hrs.
        MAX_CURRENT = 8;      // Snapshot at max batt current over 24hrs.
        MIN_BATT_LEVEL = 9;   // Snapshot at min battery level (SoC) over 24hrs.
        MAX_BATT_LEVEL = 10;  // Snapshot at max battery level (SoC) over 24hrs.
        AVG_RESISTANCE = 11;  // Snapshot at average battery resistance over 24hrs.
    }
    optional BatterySnapshotType type = 1;
    // Temperature, in 1/10ths of degree C.
    optional int32 temperature_deci_celsius = 2;
    // Voltage Battery Voltage, in microVolts.
    optional int32 voltage_micro_volt = 3;
    // Current Battery current, in microAmps.
    optional int32 current_micro_amps = 4;
    // OpenCircuitVoltage Battery Open Circuit Voltage, in microVolts.
    optional int32 open_circuit_micro_volt = 5;
    // Resistance Battery Resistance, in microOhms.
    optional int32 resistance_micro_ohm = 6;
    // Level Battery Level, as % of full.
    optional int32 level_percent = 7;
}

/**
 * Log slow I/O operations on the primary storage.
 */
message SlowIo {
    // Classifications of IO Operations.
    enum IoOperation {
        UNKNOWN = 0;
        READ = 1;
        WRITE = 2;
        UNMAP = 3;
        SYNC = 4;
    }
    optional IoOperation operation = 1;

    // The number of slow IO operations of this type over 24 hours.
    optional int32 count = 2;
}

/**
 * Log battery caused shutdown with the last recorded voltage.
 */
message BatteryCausedShutdown {
    // The last recorded battery voltage prior to shutdown.
    optional int32 last_recorded_micro_volt = 1;
}

/**
 * Logs when ThermalService receives throttling events.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/stats/StatsCompanionService.java
 */
message ThermalThrottlingSeverityStateChanged {
    // The type of temperature being reported (CPU, GPU, SKIN, etc)
    optional android.os.TemperatureTypeEnum sensor_type = 1;

    // The name of the temperature source. Eg. CPU0
    optional string sensor_name = 2;

    // Temperature in tenths of a degree C.
    // For BCL, it is decimillivolt, decimilliamps, and percentage * 10.
    optional int32 temperature_deci_celsius = 3;

    // Relative severity of the throttling, see enum definition.
    optional android.os.ThrottlingSeverityEnum severity = 4;
}

/**
 * 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:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message PhoneSignalStrengthChanged {
    // Signal strength, from frameworks/proto_logging/stats/enums/telephony/enums.proto.
    optional android.telephony.SignalStrengthEnum signal_strength = 1;
}


/**
 * Logs when the phone state, sim state or signal strength changes
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message PhoneServiceStateChanged {
    optional android.telephony.ServiceStateEnum state = 1;
    optional android.telephony.SimStateEnum sim_state = 2;
    optional android.telephony.SignalStrengthEnum signal_strength = 3;
}

/**
 * Logs when the phone becomes on or off.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/TelephonyRegistry.java
 */
message PhoneStateChanged {
    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 1;
}

message BackGesture {
    enum BackType {
        DEFAULT_BACK_TYPE = 0;
        COMPLETED = 1;
        COMPLETED_REJECTED = 2; // successful because coming from rejected area
        INCOMPLETE_EXCLUDED = 3; // would have been successful but in the exclusion area
        INCOMPLETE = 4;  // Unsuccessful, for reasons other than below.
        INCOMPLETE_FAR_FROM_EDGE = 5;  // Unsuccessful, far from the edge.
        INCOMPLETE_MULTI_TOUCH = 6;  // Unsuccessful, multi touch.
        INCOMPLETE_LONG_PRESS = 7;  // Unsuccessful, long press.
        INCOMPLETE_VERTICAL_MOVE = 8;  // Unsuccessful, move vertically.
    }
    optional BackType type = 1;

    optional int32 y_coordinate = 2 [deprecated = true]; // y coordinate for ACTION_DOWN event
    optional int32 start_x = 4;  // X coordinate for ACTION_DOWN event.
    optional int32 start_y = 5;  // Y coordinate for ACTION_DOWN event.
    optional int32 end_x = 6;   // X coordinate for ACTION_MOVE event.
    optional int32 end_y = 7;  // Y coordinate for ACTION_MOVE event.
    optional int32 left_boundary = 8;  // left edge width + left inset
    optional int32 right_boundary = 9;  // screen width - (right edge width + right inset)
    // The score between 0 and 1 which is the prediction output for the Back Gesture model.
    optional float ml_model_score = 10;
    optional string package_name = 11;  // The name of the top 100 most used package by all users.

    enum WindowHorizontalLocation {
        DEFAULT_LOCATION = 0;
        LEFT = 1;
        RIGHT = 2;
    }
    optional WindowHorizontalLocation x_location = 3 [deprecated = true];
}

message ExclusionRectStateChanged {
    optional string component_name = 1;    // if not available, simply packageName
    optional int32 requested_height = 2;   // px
    optional int32 rejected_height = 3;    // px

    enum WindowHorizontalLocation {
        DEFAULT_LOCATION = 0;
        LEFT = 1;
        RIGHT = 2;
    }
    optional WindowHorizontalLocation x_location = 4;
    optional bool landscape = 5;
    optional bool splitscreen = 6 [deprecated = true];
    optional int32 duration_millis = 7;
}

/**
 * Logs when IME is on.
 *
 * Logged from: /packages/SystemUI/src/com/android/systemui/
                statusbar/phone/NavigationBarView.java
 *
 */
message ImeTouchReported {
    optional int32 x_coordinate = 1;  // X coordinate for ACTION_DOWN event.
    optional int32 y_coordinate = 2;  // Y coordinate for ACTION_DOWN event.
}

/**
 * Logs when Launcher (HomeScreen) UI has changed or was interacted.
 *
 * Logged from:
 *   packages/apps/Launcher3
 */
message LauncherUIChanged {
    optional android.stats.launcher.LauncherAction action = 1 [deprecated = true];
    optional android.stats.launcher.LauncherState src_state = 2;
    optional android.stats.launcher.LauncherState dst_state = 3;
    optional android.stats.launcher.LauncherExtension extension = 4 [(log_mode) = MODE_BYTES, deprecated = true];
    optional bool is_swipe_up_enabled = 5 [deprecated = true];

    // The event id (e.g., app launch, drag and drop, long press)
    optional int32 event_id = 6;
    // The event's source or target id (e.g., icon, task, button)
    optional int32 target_id = 7;
    // If the target needs to be tracked, use this id field
    optional int32 instance_id = 8;
    optional int32 uid = 9 [(is_uid) = true];
    optional string package_name = 10;
    optional string component_name = 11;

    // (x, y) coordinate and the index information of the target on the container
    optional int32 grid_x = 12 [default = -1];
    optional int32 grid_y = 13 [default = -1];
    optional int32 page_id = 14 [default = -2];

    // e.g., folder icon's (x, y) location and index information on the workspace
    optional int32 grid_x_parent = 15 [default = -1];
    optional int32 grid_y_parent = 16 [default = -1];
    optional int32 page_id_parent = 17 [default = -2];

    // e.g., SEARCHBOX_ALLAPPS, FOLDER_WORKSPACE
    optional int32 hierarchy = 18;

    optional bool is_work_profile = 19;

    // Used to store the predicted rank of the target
    optional int32 rank = 20 [default = -1];

    // e.g., folderLabelState can be captured in the following two fields
    optional int32 from_state = 21;
    optional int32 to_state = 22;

    // e.g., autofilled or suggested texts that are not user entered
    optional string edittext = 23;

    // e.g., number of contents inside a container (e.g., icons inside a folder)
    optional int32 cardinality = 24;

    // Used to store features of the target (e.g. widget is reconfigurable, etc)
    optional int32 features = 25;

    // Used to store on-device search related features of the target
    // (e.g. spell-corrected query etc)
    optional int32 search_attributes = 26;

    // List of attributes attached to the event.
    optional LauncherAttributes attributes = 27 [(log_mode) = MODE_BYTES];
}

message LauncherAttributes{

  // Integer value of item attribute enum
  // (e.g. SUGGESTED_LABEL, ALL_APPS_SEARCH_RESULT_SETTING etc)
  repeated int32 item_attributes = 1;
}

message SmartSpaceCardReported {
    // Different SmartSpace cards.
    // DEPRECATED CardType enum. Use SmartspaceTarget.mFeatureType, which matches the list from:
    // google3/java/com/google/android/apps/miphone/aiai/echo/smartspace/Constants.kt
    enum CardType {
        option deprecated = true;
        UNKNOWN_CARD = 0;
        COMMUTE = 1;
        CALENDAR = 2;
        FLIGHT = 3;
        WEATHER = 4;
        WEATHER_ALERT = 5;
        AT_A_STORE_SHOPPING_LIST = 6;
        AT_A_STORE_LOYALTY_CARD = 7;
        HEADPHONE_RESUME_MEDIA = 8;
        HEADPHONE_MEDIA_RECOMMENDATIONS = 9;
        TIMER = 10;
        STOPWATCH = 11;
        FITNESS_ACTIVITY = 12;
        UPCOMING_REMINDER = 13;
        UPCOMING_BEDTIME = 14;
        TIME_TO_LEAVE = 15;
        PACKAGE_DELIVERED = 16;
        TIPS = 17;
        DOORBELL = 18;
        CROSS_DEVICE_TIMER = 19;
    }

    // The surface that SmartSpace card is shown.
    enum DisplaySurface {
        DEFAULT_SURFACE = 0;
        HOMESCREEN = 1;
        LOCKSCREEN = 2;
        AOD = 3;
        SHADE = 4;
        DREAM_OVERLAY = 5;
    }

    // The event id (e.g., impression, click, longpress, dismiss)
    optional int32 event_id = 1;
    // Uniquely identifies a card. Should persist through updates.
    optional int32 instance_id = 2;
    // Uniquely identifies one of the possible types of the SmartSpace cards.
    // Deprecated. Please read card_type_id instead.
    optional CardType card_type = 3 [deprecated = true];
    // Location of the card when the event occurred.
    optional DisplaySurface display_surface = 4;
    // The position of the card in the carousel when the event occurred.
    optional int32 rank = 5;
    // The number of cards shown to the user.
    optional int32 cardinality = 6;
    // Uniquely identifies one of the possible types of the SmartSpace cards.
    // To replace card_type. See go/smartspace-aster-metrics#card-type-id.
    optional int32 card_type_id = 7;
    // The app that the Smartspace card is tied to.
    optional int32 uid = 8 [(is_uid) = true];
    // This represents the interacted subaction for the given card.
    optional int32 interacted_subcard_rank = 9;
    // This represents the number of displayed subactions on the given card when a subaction click
    // occurred.
    optional int32 interacted_subcard_cardinality = 10;
    // The time it takes in ms from smartspace target is created to sysui receives
    // the target.
    optional int32 received_latency_millis = 11;
    // The sub cards.
    optional SmartSpaceSubcards subcards_info = 12 [(log_mode) = MODE_BYTES];
}

/**
 * This message represents information about any SmartSpace subcards.
 * Logged from
 *   vendor/unbundled_google/packages/SystemUIGoogle/bcsmartspace/src/com/google/android/systemui/smartspace/BcSmartspaceLogger.java
 *   vendor/unbundled_google/packages/NexusLauncher/src/com/google/android/apps/nexuslauncher/qsb/SmartspaceViewContainer.java
 * Next Tag: 3
 */
message SmartSpaceSubcards {
    // List of subcards.
    repeated SmartSpaceCardMetadata subcards = 1;
    // The index of the clicked subcard, if applicable.
    // This index is 1 indexed as opposed to 0 indexed due to sint32 encoding
    // limitation when using -1 as a default.
    // Default will be 0 to denote that no subcard was clicked.
    // Please note this has no information about whether the primary card was
    // clicked or not. Basically if this has the value 0, just ignore this field.
    optional int32 clicked_subcard_index = 2;
}

/**
 * This message represents metadata for a SmartSpace card.
 * Logged from
 *   vendor/unbundled_google/packages/SystemUIGoogle/bcsmartspace/src/com/google/android/systemui/smartspace/BcSmartspaceLogger.java
 *   vendor/unbundled_google/packages/NexusLauncher/src/com/google/android/apps/nexuslauncher/qsb/SmartspaceViewContainer.java
 * Next Tag: 3
 */
message SmartSpaceCardMetadata {
    // Uniquely identifies a card. Should persist through updates.
    optional int32 instance_id = 1;
    // The type of the card.
    optional int32 card_type_id = 2;
}

/**
 * Used for snapshot of the HomeScreen UI elements
 *
 * Logged from:
 *   packages/apps/Launcher3
 */
message LauncherStaticLayout {
    // The event id (e.g., snapshot, drag and drop)
    optional int32 event_id = 1;
    // The event's source or target id (e.g., icon, shortcut, widget)
    optional int32 target_id = 2;
    // If the target needs to be tracked, use this id field
    optional int32 instance_id = 3;
    optional int32 uid = 4 [(is_uid) = true];
    optional string package_name = 5;
    optional string component_name = 6;

    // (x, y) coordinate and the index information of the target on the container
    optional int32 grid_x = 7 [default = -1];
    optional int32 grid_y = 8 [default = -1];
    optional int32 page_id = 9 [default = -2];

    // e.g., folder icon's (x, y) location and index information on the workspace
    // e.g., when used with widgets target, use these values for (span_x, span_y)
    optional int32 grid_x_parent = 10 [default = -1];
    optional int32 grid_y_parent = 11 [default = -1];
    optional int32 page_id_parent = 12 [default = -2];

    // UNKNOWN = 0
    // HOTSEAT = 1
    // WORKSPACE = 2
    // FOLDER_HOTSEAT = 3
    // FOLDER_WORKSPACE = 4
    optional int32 hierarchy = 13;

    optional bool is_work_profile = 14;

    // e.g., PIN, WIDGET TRAY, APPS TRAY, PREDICTION
    optional int32 origin = 15;

    // e.g., number of icons inside a folder
    optional int32 cardinality = 16;

    // e.g., (x, y) span of the widget inside homescreen grid system
    optional int32 span_x = 17 [default = 1];
    optional int32 span_y = 18 [default = 1];

    // Used to store features of the target (e.g. widget is reconfigurable, etc)
    optional int32 features = 19;

    // List of attributes attached to the event.
    optional LauncherAttributes attributes = 20 [(log_mode) = MODE_BYTES];
}

/**
 * Used for logging launcher static elements using pulled atom.
 *
 * Logged from:
 *   packages/apps/Launcher3
 */
message LauncherLayoutSnapshot {
  // The event id (e.g., snapshot, drag and drop)
  optional int32 event_id = 1;
  // The event's source or target id (e.g., icon, shortcut, widget)
  optional int32 item_id = 2;
  // If the target needs to be tracked, use this id field
  optional int32 instance_id = 3;
  optional int32 uid = 4 [(is_uid) = true];
  optional string package_name = 5;
  optional string component_name = 6;

  // (x, y) coordinate and the index information of the target on the container
  optional int32 grid_x = 7 [default = -1];
  optional int32 grid_y = 8 [default = -1];
  optional int32 page_id = 9 [default = -2];

  // e.g., folder icon's (x, y) location and index information on the workspace
  // e.g., when used with widgets target, use these values for (span_x, span_y)
  optional int32 grid_x_parent = 10 [default = -1];
  optional int32 grid_y_parent = 11 [default = -1];
  optional int32 page_id_parent = 12 [default = -2];

  // UNKNOWN = 0
  // HOTSEAT = 1
  // WORKSPACE = 2
  // FOLDER_HOTSEAT = 3
  // FOLDER_WORKSPACE = 4
  optional int32 container_id = 13;

  optional bool is_work_profile = 14;

  // e.g., PIN, WIDGET TRAY, APPS TRAY, PREDICTION
  optional int32 attribute_id = 15;

  // e.g., number of icons inside a folder
  optional int32 cardinality = 16;

  // e.g., (x, y) span of the widget inside homescreen grid system
  optional int32 span_x = 17 [default = 1];
  optional int32 span_y = 18 [default = 1];

  // List of attributes attached to the event.
  optional LauncherAttributes attributes = 19 [(log_mode) = MODE_BYTES];
}

/**
 * Logs when Wallpaper or ThemePicker UI has changed.
 *
 * Logged from:
 *   packages/apps/ThemePicker
 *   packages/apps/WallpaperPicker2
 */
message StyleUIChanged {
    optional android.stats.style.Action action = 1;
    optional int32 color_package_hash = 2;
    optional int32 font_package_hash  = 3;
    optional int32 shape_package_hash = 4;
    optional int32 clock_package_hash = 5;
    optional int32 launcher_grid = 6;
    optional int32 wallpaper_category_hash = 7;
    optional int32 wallpaper_id_hash = 8;
    optional int32 color_preference = 9;
    optional android.stats.style.LocationPreference location_preference = 10;
    optional android.stats.style.DatePreference date_preference = 11;
    optional android.stats.style.LaunchedPreference launched_preference = 12;
    optional android.stats.style.EffectPreference effect_preference = 13;
    optional int32 effect_id_hash = 14;
    optional int32 lock_wallpaper_category_hash = 15;
    optional int32 lock_wallpaper_id_hash = 16;
    optional int32 first_launch_date_since_setup = 17;
    optional int32 first_wallpaper_apply_date_since_setup = 18;
    optional int32 app_launch_count = 19;
    optional int32 color_variant = 20;
}

/**
 * Logs when Settings UI has changed.
 *
 * Logged from:
 *   packages/apps/Settings
 */
message SettingsUIChanged {
    /**
     * Where this SettingsUIChange event comes from. For example, if
     * it's a PAGE_VISIBLE event, where the page is opened from.
     */
    optional android.app.settings.PageId attribution = 1;

    /**
     * What the UI action is.
     */
    optional android.app.settings.Action action = 2;

    /**
     * Where the action is happening
     */
    optional android.app.settings.PageId page_id = 3;

    /**
     * What preference changed in this event.
     */
    optional string changed_preference_key = 4;

    /**
     * The new value of the changed preference.
     */
    optional int64 changed_preference_int_value = 5;
}

/**
 * Logs basic timing information about touch events.
 * Reported at most every 5 minutes while device is being interacted with.
 *
 * Logged from:
 *   frameworks/native/services/inputflinger
 */
message TouchEventReported {
    /**
     * The fields latency_{min|max|mean|stdev} represent minimum, maximum, mean,
     * and the standard deviation of the time spent processing touchscreen events
     * in the kernel and inputflinger. The units are microseconds.
     *
     * On supported devices, the starting point is taken during the hard interrupt inside the
     * kernel touch driver. On all other devices, the starting point is taken inside
     * the kernel's input event subsystem upon receipt of the input event.
     * The ending point is taken inside InputDispatcher, just after the input event
     * is sent to the app.
     */
    // Minimum value
    optional float latency_min_micros = 1;
    // Maximum value
    optional float latency_max_micros = 2;
    // Average value
    optional float latency_mean_micros = 3;
    // Standard deviation
    optional float latency_stdev_micros = 4;
    // Number of touch events (input_event) in this report
    optional int32 count = 5;
}

/**
 * Logs slow input events.
 * The reports are rate-limited via a configurable server flag.
 *
 * Logged from:
 *   frameworks/native/services/inputflinger
 */
message SlowInputEventReported {
    /**
     * This is logged when a slow input event occurs. The threshold for what is considered a slow
     * event is applied to the 'end_to_end' latency number, and is configurable via a server flag.
     *
     * The goal of this data is to identify the bottlenecks in processing of input events.
     * All of the *_micros fields below are durations. The start and end points for each value
     * are described in the comments.
     */
    // Whether or not this is a DOWN event. If false, this is a MOVE event
    optional bool is_down = 1;
    // Start: the input event was created (touch events: the touch interrupt received in the driver)
    // End: the event was read in userspace (in EventHub)
    optional int32 event_to_read_micros = 2;
    // Start: the event was read in EventHub
    // End: the event was send to the app via the InputChannel (written to the socket)
    optional int32 read_to_deliver_micros = 3;
    // Start: the input event was sent to the app
    // End: the app consumed the input event
    optional int32 deliver_to_consume_micros = 4;
    // Start: the app consumed the event
    // End: the app's 'finishInputEvent' call was received in inputflinger
    // The end point can also be called "the app finished processing input event"
    optional int32 consume_to_finish_micros = 5;
    // Start: the app consumed the input event
    // End: the app produced a buffer
    optional int32 consume_to_gpu_complete_micros = 6;
    // Start: the app produced a buffer
    // End: the frame was shown on the display
    optional int32 gpu_complete_to_present_micros = 7;
    // The end-to-end touch latency
    // Start: the input event was created (touch events: the touch interrupt received in the driver)
    // End: the frame was presented on the display
    optional int32 end_to_end_micros = 8;
    // Since the last time this atom was reported, how many total events occurred?
    optional int32 num_events_since_last_report = 9;
    // Since the last time this atom was reported, how many slow events did not get reported
    // due to rate limiting?
    optional int32 num_skipped_slow_events_since_last_report = 10;
}

/**
 * Logs gesture classification and timing information for touch events.
 *
 * Logged from:
 *   frameworks/base/core/java/android/view/GestureDetector.java
 *   frameworks/base/core/java/android/view/View.java
 */
message TouchGestureClassified {
    // The source of the classification (e.g. Java class name).
    optional string source = 1;

    enum Classification {
        UNKNOWN_CLASSIFICATION = 0;
        SINGLE_TAP = 1;
        DOUBLE_TAP = 2;
        LONG_PRESS = 3;
        DEEP_PRESS = 4;
        SCROLL = 5;
    }
    // The classification of the gesture.
    optional Classification classification = 2;

    // The interval from the start of a touch event stream until the
    // classification was made.
    optional int32 latency_millis = 3;

    // The distance from the location of the first touch event to the
    // location of the touch event when the classification was made.
    optional float displacement_px = 4;
}

/**
 * Logs that a setting was updated.
 * Logged from:
 *   frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
 * The tag and is_default allow resetting of settings to default values based on the specified
 * tag. See Settings#putString(ContentResolver, String, String, String, boolean) for more details.
 */
message SettingChanged {
    // The name of the setting.
    optional string setting = 1;

    // The change being imposed on this setting. May represent a number, eg "3".
    optional string value = 2;

    // The new value of this setting. For most settings, this is same as value. For some settings,
    // value is +X or -X where X represents an element in a set. For example, if the previous value
    // is A,B,C and value is -B, then new_value is A,C and prev_value is A,B,C.
    // The +/- feature is currently only used for location_providers_allowed.
    optional string new_value = 3;

    // The previous value of this setting.
    optional string prev_value = 4;

    // The tag used with the is_default for resetting sets of settings. This is generally null.
    optional string tag = 5;

    // True if this setting with tag should be resettable.
    optional bool is_default = 6;

    // The associated user (for multi-user feature). Defined in android/os/UserHandle.java
    optional int32 user = 7;

    enum ChangeReason {
        UPDATED = 1; // Updated can be an insertion or an update.
        DELETED = 2;
    }
    optional ChangeReason reason = 8;
}

/**
 * Logs activity going to foreground or background
 *
 * Logged from:
  *   frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java
 */
message ActivityForegroundStateChanged {
    optional int32 uid = 1 [(is_uid) = true];
    optional string pkg_name = 2;
    optional string class_name = 3;

    enum State {
        BACKGROUND = 0;
        FOREGROUND = 1;
    }
    optional State state = 4;
}

/**
 * Logs when a volume entered low Storage state.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
 */
message LowStorageStateChanged {
    // Volume that ran out of storage.
    optional string volume_description = 1;

    enum State {
        UNKNOWN = 0;
        OFF = 1;
        ON = 2;
    }
    optional State state = 2;
}

/**
 * Logs when an app is downgraded.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java
 */
message AppDowngraded {
    optional string package_name = 1;
    // Size of the package (all data) before being downgraded.
    optional int64 size_in_bytes_before = 2;
    // Size of the package (all data) after being downgraded.
    optional int64 size_in_bytes_after = 3;

    optional bool aggressive = 4;
}

/**
 * Logs when an app is optimized after being downgraded.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java
 */
message AppOptimizedAfterDowngraded {
    optional string package_name = 1;
}

/**
 * Logs whenever an app is installed on external storage.
 * Logged from:
        frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
 */
message AppInstallOnExternalStorageReported {
    // The type of external storage.
    optional android.stats.storage.ExternalStorageType storage_type = 1;
    // The name of the package that is installed on the sd card.
    optional string package_name = 2;
}

/**
 * Logs when an app crashes.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message AppCrashOccurred {
    optional int32 uid = 1 [(is_uid) = true];

    optional string event_type = 2;

    // The name of the process.
    // system_server if it is not by an app
    optional string process_name = 3;

    // The pid if available. -1 means not available.
    optional int32 pid = 4;

    optional string package_name = 5;

    enum InstantApp {
        UNAVAILABLE = 0;
        FALSE = 1;
        TRUE = 2;
    }
    optional InstantApp is_instant_app = 6;

    enum ForegroundState {
        UNKNOWN = 0;
        BACKGROUND = 1;
        FOREGROUND = 2;
    }
    optional ForegroundState foreground_state = 7;

    optional android.server.ErrorSource error_source = 8;

    optional bool is_incremental = 9;

    optional float loading_progress = 10;

    optional int64 millis_since_oldest_pending_read = 11;

    // Status code to represent the health of the file system backing storage, as defined in
    // frameworks/base/core/java/android/os/incremental/IStorageHealthListener.aidl.
    // Value -1 if the app is not installed on Incremental
    optional int32 storage_health_code = 12;

    // Status code to represent the status of data loader, as defined in
    // frameworks/base/core/java/android/content/pm/IDataLoaderStatusListener.aidl.
    // Value -1 if the app is not installed on Incremental
    optional int32 data_loader_status_code = 13;

    // Whether read logs collection is enabled
    optional bool read_logs_enabled = 14;

    // Duration since last attempt to bind data loader. 0 means did not attempt to bind.
    // -1 means the app is not installed on Incremental.
    optional int64 millis_since_last_data_loader_bind = 15;

    // Delay for retrying to bind data loader. If not bound, it shows how soon it will be bound.
    optional int64 data_loader_bind_delay_millis = 16;

    // Total count of delayed reads, as reported by Incremental File System.
    optional int32 total_delayed_reads = 17;

    // Total count of failed reads (timeout or hash errors) as reported by Incremental File System.
    optional int32 total_failed_reads = 18;

    // UID of the process that tried to read a page from the app but failed.
    // This shows whether the read was initiated by the system, the app itself, or some other apps.
    // -1 means there was no read error or the app is not installed on Incremental.
    optional int32 last_read_error_uid = 19;

    // Duration since that last read failure.
    // -1 means there was no read error or the app is not installed on Incremental.
    optional int64 last_read_error_millis_since = 20;

    // Error code of last read failure. ETIME (value=62) for timeout, EBADMSG (value=74) for hash
    // and other positive values for other errors. -1 means app is not installed on Incremental.
    optional int32 last_read_error_code = 21;

    // Total duration of delayed reads in milliseconds
    optional int64 total_delayed_reads_duration_millis = 22;
}

/**
 * Logs when a WTF (What a Terrible Failure) happened.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message WTFOccurred {
    optional int32 uid = 1 [(is_uid) = true];

    optional string tag = 2;

    // The name of the process.
    // system_server if it is not by an app
    optional string process_name = 3;

    // The pid if available. -1 means not available.
    optional int32 pid = 4;

    optional android.server.ErrorSource error_source = 5;
}

/**
 * Logs when system server reports low memory.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message LowMemReported {
}

/**
 * Logs when an app ANR (App Not Responding) occurs.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/AppErrors.java
 */
message ANROccurred {
    optional int32 uid = 1 [(is_uid) = true];

    optional string process_name = 2;

    optional string short_component_name = 3;

    optional string reason = 4;

    enum InstantApp {
        UNAVAILABLE = 0;
        FALSE = 1;
        TRUE = 2;
    }
    optional InstantApp is_instant_app = 5;

    enum ForegroundState {
        UNKNOWN = 0;
        BACKGROUND = 1;
        FOREGROUND = 2;
    }
    optional ForegroundState foreground_state = 6;

    optional android.server.ErrorSource error_source = 7;

    optional string package_name = 8;

    optional bool is_incremental = 9;

    optional float loading_progress = 10;

    optional int64 millis_since_oldest_pending_read = 11;

    // Status code to represent the health of the file system backing storage, as defined in
    // frameworks/base/core/java/android/os/incremental/IStorageHealthListener.aidl.
    // Value -1 if the app is not installed on Incremental
    optional int32 storage_health_code = 12;

    // Status code to represent the status of data loader, as defined in
    // frameworks/base/core/java/android/content/pm/IDataLoaderStatusListener.aidl.
    // Value -1 if the app is not installed on Incremental
    optional int32 data_loader_status_code = 13;

    // Whether read logs collection is enabled
    optional bool read_logs_enabled = 14;

    // Duration since last attempt to bind data loader. 0 means did not attempt to bind.
    // -1 means the app is not installed on Incremental.
    optional int64 millis_since_last_data_loader_bind = 15;

    // Delay for retrying to bind data loader. If not bound, it shows how soon it will be bound.
    optional int64 data_loader_bind_delay_millis = 16;

    // Total count of delayed reads, as reported by Incremental File System.
    optional int32 total_delayed_reads = 17;

    // Total count of failed reads (timeout or hash errors) as reported by Incremental File System.
    optional int32 total_failed_reads = 18;

    // UID of the process that tried to read a page from the app but failed.
    // This shows whether the read was initiated by the system, the app itself, or some other apps.
    // -1 means there was no read error or the app is not installed on Incremental.
    optional int32 last_read_error_uid = 19;

    // Duration since that last read failure.
    // -1 means there was no read error or the app is not installed on Incremental.
    optional int64 last_read_error_millis_since = 20;

    // Error code of last read failure. ETIME (value=62) for timeout, EBADMSG (value=74) for hash
    // and other positive values for other errors. -1 means app is not installed on Incremental.
    optional int32 last_read_error_code = 21;

    // Total duration of delayed reads in milliseconds
    optional int64 total_delayed_reads_duration_millis = 22;
}

/**
 * Logs immediately after an app ANR (App Not Responding) occurs. In contrast, ANROccurred (the
 * atom above) logs some time (not necessarily immediately) after the ANR is detected.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/AppErrors.java
 */
message ANROccurredProcessingStarted {
  optional string process_name = 1;
}

/**
 * Logs when the vibrator state changes.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/VibratorService.java
 */
message VibratorStateChanged {
    repeated AttributionNode attribution_node = 1;

    enum State {
        OFF = 0;
        ON = 1;
    }
    optional State state = 2;

    // Duration (in milliseconds) requested to keep the vibrator on.
    // Only applicable for State == ON.
    optional int64 duration_millis = 3;
}

/*
 * Allows other apps to push events into statsd.
 * Logged from:
 *      frameworks/base/core/java/android/util/StatsLog.java
 */
message AppBreadcrumbReported {
    // The uid of the application that sent this custom atom.
    optional int32 uid = 1 [(is_uid) = true];

    // An arbitrary label chosen by the developer. For Android P, the label should be in [0, 16).
    optional int32 label = 2;

    // Allows applications to easily use a custom event as start/stop boundaries (ie, define custom
    // predicates for the metrics).
    enum State {
        UNKNOWN = 0;
        UNSPECIFIED = 1;  // For events that are known to not represent START/STOP.
        STOP = 2;
        START = 3;
    }
    optional State state = 3;
}

/**
 * Logs the wall-clock time when a significant wall-clock time shift occurs.
 * For example, this could be due to the user manually changing the time.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/AlarmManagerService.java
 */
message WallClockTimeShifted {
    // New wall-clock time in milliseconds, according to System.currentTimeMillis().
    optional int64 wall_clock_timestamp_millis = 1;
}

/**
 * Logs when statsd detects an anomaly.
 *
 * Logged from:
 *   frameworks/base/cmds/statsd/src/anomaly/AnomalyTracker.cpp
 */
message AnomalyDetected {
    // Uid that owns the config whose anomaly detection alert fired.
    optional int32 config_uid = 1 [(is_uid) = true];

    // Id of the config whose anomaly detection alert fired.
    optional int64 config_id = 2;

    // Id of the alert (i.e. name of the anomaly that was detected).
    optional int64 alert_id = 3;
}

message AppStartOccurred {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The app package name.
    optional string pkg_name = 2;

    enum TransitionType {
        UNKNOWN = 0;
        WARM = 1;
        HOT = 2;
        COLD = 3;
        RELAUNCH = 4;
    }
    // The transition type.
    optional TransitionType type = 3;

    // The activity name.
    optional string activity_name = 4;

    // The name of the calling app. Empty if not set.
    optional string calling_pkg_name = 5;

    // Whether the app is an instant app.
    optional bool is_instant_app = 6;

    // Device uptime when activity started. Deprecated: use activity_start_timestamp_millis instead.
    optional int64 activity_start_millis = 7 [deprecated = true];

    optional android.app.AppTransitionReasonEnum reason = 8;

    optional int32 transition_delay_millis = 9;
    // -1 if not set.
    optional int32 starting_window_delay_millis = 10;
    // -1 if not set.
    optional int32 bind_application_delay_millis = 11;
    optional int32 windows_drawn_delay_millis = 12;

    // Empty if not set.
    optional string launch_token = 13;

    // The reason why the package was optimized.
    optional int32 package_optimization_compilation_reason = 14;

    // The compiler filter used when when the package was optimized.
    optional int32 package_optimization_compilation_filter = 15;

    enum SourceType {
        UNAVAILABLE = 0;
        LAUNCHER = 1;
        NOTIFICATION = 2;
        LOCKSCREEN = 3;
        RECENTS_ANIMATION = 4;
    }
    // The type of the startup source.
    optional SourceType source_type = 16;

    // The time from the startup source to the beginning of handling the startup event.
    // -1 means not available.
    optional int32 source_event_delay_millis = 17;

    // Whether the app is hibernating when it started
    optional bool is_hibernating = 18;

    // Whether the app is installed on Incremental File System.
    optional bool is_incremental = 19;

    // Whether the app is still being streamed.
    optional bool is_loading = 20;

    // The hash value of the activity name.
    optional int32 activity_name_hash = 21;

    // The timestamp(SystemClock#elapsedRealtime()) when starting activity.
    optional int64 activity_start_timestamp_millis = 22;
}

message AppStartCanceled {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The app package name.
    optional string pkg_name = 2;

    enum TransitionType {
        UNKNOWN = 0;
        WARM = 1;
        HOT = 2;
        COLD = 3;
        RELAUNCH = 4;
    }
    // The transition type.
    optional TransitionType type = 3;

    // The activity name.
    optional string activity_name = 4;
}

message AppStartFullyDrawn {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The app package name.
    optional string pkg_name = 2;

    enum TransitionType {
        UNKNOWN = 0;
        WITH_BUNDLE = 1;
        WITHOUT_BUNDLE = 2;
    }
    // The transition type.
    optional TransitionType type = 3;

    // The activity name.
    optional string activity_name = 4;

    optional bool transition_process_running = 5;

    // App startup time (until call to Activity#reportFullyDrawn()).
    optional int64 app_startup_time_millis = 6;

    // The reason why the package was optimized.
    optional int32 package_optimization_compilation_reason = 7;

    // The compiler filter used when when the package was optimized.
    optional int32 package_optimization_compilation_filter = 8;

    enum SourceType {
        UNAVAILABLE = 0;
        LAUNCHER = 1;
        NOTIFICATION = 2;
        LOCKSCREEN = 3;
    }
    // The type of the startup source.
    optional SourceType source_type = 9;

    // The time from the startup source to the beginning of handling the startup event.
    // -1 means not available.
    optional int32 source_event_delay_millis = 10;

    // Whether the app is installed on Incremental File System.
    optional bool is_incremental = 11;

    // Whether the app is still being streamed.
    optional bool is_loading = 12;

    // The hash value of the activity name.
    optional int32 activity_name_hash = 13;
}

/**
 * Logs when an app enters a different App Compat state.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
 */
message AppCompatStateChanged {
    // UID of the package whose state changed.
    optional int32 uid = 1 [(state_field_option).primary_field = true, (is_uid) = true];

    enum State {
        UNKNOWN = 0;
        // The app is not visible or has been closed.
        NOT_VISIBLE = 1;
        // The app’s bounds aren’t letterboxed.
        NOT_LETTERBOXED = 2;
        // The app’s bounds are letterboxed because of size-compat-mode.
        LETTERBOXED_FOR_SIZE_COMPAT_MODE = 3;
        // The app’s bounds are letterboxed because of fixed orientation.
        LETTERBOXED_FOR_FIXED_ORIENTATION = 4;
        // The app’s bounds are letterboxed because of aspect ratio restrictions.
        LETTERBOXED_FOR_ASPECT_RATIO = 5;
    }

    // The state that was entered.
    optional State state = 2 [
      (state_field_option).exclusive_state = true,
      (state_field_option).nested = false];
}

/**
 * Logs events reported for the Size Compat restart button of an app.
 *
 * Logged from:
 *   frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
 */
message SizeCompatRestartButtonEventReported {
    // UID of the package that has the button.
    optional int32 uid = 1 [(is_uid) = true];

    enum Event {
        UNKNOWN = 0;
        APPEARED = 1;
        CLICKED = 2;
    }

    // The event that was reported.
    optional Event event = 2;
}

/**
 * Logs events reported for the Camera App Compat control, which is used to
 * correct stretched viewfinder in apps that don't handle all possible
 * configurations, and changes between them, correctly.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
 */
message CameraCompatControlEventReported {
  // UID of the package that has the control.
  optional int32 uid = 1 [(is_uid) = true];

  enum Event {
    UNKNOWN = 0;
    // Button to apply the treatment appeared.
    APPEARED_APPLY_TREATMENT = 1;
    // Button to revert the treatment appeared.
    APPEARED_REVERT_TREATMENT = 2;
    // Users clicked on the button to apply the treatment.
    CLICKED_APPLY_TREATMENT = 3;
    // Users clicked on the button to revert the treatment.
    CLICKED_REVERT_TREATMENT = 4;
    // Users clicked on the button to dismiss the control.
    CLICKED_DISMISS = 5;
  }

  // The event that was reported.
  optional Event event = 2;
}

/**
 * Logs a picture-in-picture action
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 *      frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
 *      frameworks/base/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
 */
message PictureInPictureStateChanged {
    // -1 if it is not available
    optional int32 uid = 1 [(is_uid) = true];

    optional string short_name = 2;

    enum State {
        ENTERED = 1;
        EXPANDED_TO_FULL_SCREEN = 2;
        MINIMIZED = 3;
        DISMISSED = 4;
    }
    optional State state = 3;
}

/**
 * Logs overlay action
 * Logged from:
 *     services/core/java/com/android/server/wm/Session.java
 */
message OverlayStateChanged {
    optional int32 uid = 1 [(state_field_option).primary_field = true, (is_uid) = true];

    optional string package_name = 2 [(state_field_option).primary_field = true];

    optional bool using_alert_window = 3;

    enum State {
        ENTERED = 1;
        EXITED = 2;
    }
    optional State state = 4
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
}

/**
 * Logs foreground service starts and stops.
 * Note that this is not when a service starts or stops, but when it is
 * considered foreground.
 * Logged from
 *     frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
 */
message ForegroundServiceStateChanged {
    optional int32 uid = 1 [(is_uid) = true];
    // package_name + "/" + class_name
    optional string short_name = 2;

    enum State {
        ENTER = 1;
        EXIT = 2;
        DENIED = 3;
    }
    optional State state = 3;

    // Whether the fgs is allowed while-in-use permissions, i.e. is considered 'in-use' to the user.
    // (If the fgs was started while the app wasn't TOP it usually will be denied these permissions)
    optional bool allow_while_in_use_permission = 4;
    // the reason why FGS is allowed or denied to start. The reason code is defined as
    // PowerExemptionManager#ReasonCode.
    optional int32 fgs_start_reason_code = 5;
    // FGS service's targetSdkVersion.
    optional int32 target_sdk_version = 6;
    // uid of the app that start/bind this service.
    optional int32 calling_uid = 7;
    // targetSdkVersion of the app that start/bind this service.
    optional int32 caller_target_sdk_version = 8;
    // uid of the app that set the temp-allowlist, INVALID_UID (-1) if not in any
    // temp-allowlist.
    optional int32 temp_allow_list_calling_uid = 9;
    // FGS notification was deferred.
    optional bool fgs_notification_deferred = 10;
    // FGS notification was shown before the FGS finishes, or it wasn't deferred in the first place.
    optional bool fgs_notification_shown = 11;
    // The duration from state ENTER to state EXIT. Only meaningful when the state is EXIT.
    optional int32 fgs_duration_ms = 12;
    // Number of times startForeground() is called on this service.
    optional int32 fgs_start_count = 13;
    // SHA-1 hashed short_name combined with ANDROID_ID.
    optional int32 short_name_hash = 14;
    // Whether this FGS package had permission to notify the user.
    optional bool fgs_has_notification_permission = 15;

    // Keep in sync with frameworks/base/core/java/android/content/pm/ServiceInfo.java
    enum ForegroundServiceType {
        FOREGROUND_SERVICE_TYPE_NONE = 0;
        FOREGROUND_SERVICE_TYPE_DATA_SYNC = 0x0001; // 1 << 0
        FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK = 0x0002; // 1 << 1
        FOREGROUND_SERVICE_TYPE_PHONE_CALL = 0x0004; //1 << 2
        FOREGROUND_SERVICE_TYPE_LOCATION = 0x0008; // 1 << 3
        FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE = 0x0010; // 1 << 4
        FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION = 0x0020; // 1 << 5
        FOREGROUND_SERVICE_TYPE_CAMERA = 0x0040; // 1 << 6
        FOREGROUND_SERVICE_TYPE_MICROPHONE = 0x0080; // 1 << 7
    }

    // The foreground service types, must be one or a combination of the types
    // in the ForegroundServiceType above.
    optional int32 fgs_types = 16;
}

/**
 * Logs the number of times a uid accesses a sensitive AppOp during a foreground service session.
 * A foreground service session is any continuous period during which the uid holds at least one
 * foreground service; the atom will be pushed when the uid no longer holds any foreground services.
 * Accesses initiated while the uid is in the TOP state are ignored.
 * Sessions with no attempted accesses are not logged.
 * Logged from
 *     frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
 */
message ForegroundServiceAppOpSessionEnded {
    optional int32 uid = 1 [(is_uid) = true];

    // The operation's name.
    // Only following four ops are logged
    // COARSE_LOCATION = 0
    // FINE_LOCATION = 1
    // CAMERA = 26
    // RECORD_AUDIO = 27
    optional android.app.AppOpEnum app_op_name = 2 [default = APP_OP_NONE];

    // The uid's permission mode for accessing the AppOp during this fgs session.
    enum Mode {
        MODE_UNKNOWN = 0;
        MODE_ALLOWED = 1; // Always allowed
        MODE_IGNORED = 2; // Denied
        MODE_FOREGROUND = 3; // Allow-while-in-use (or allowed-one-time)
    }
    optional Mode app_op_mode = 3;

    // Number of times this AppOp was requested and allowed.
    optional int32 count_ops_accepted = 4;
    // Number of times this AppOp was requested but denied.
    optional int32 count_ops_rejected = 5;
}

/**
 * Logs creation or removal of an isolated uid. Isolated uid's are temporary uid's to sandbox risky
 * behavior in its own uid. However, the metrics of these isolated uid's almost always should be
 * attributed back to the parent (host) uid. One example is Chrome.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
 */
message IsolatedUidChanged {
    // The host UID. Generally, we should attribute metrics from the isolated uid to the host uid.
    // NOTE: DO NOT annotate uid field in this atom. This atom is specially handled in statsd.
    // This field is ignored when event == REMOVED.
    optional int32 parent_uid = 1;

    optional int32 isolated_uid = 2;

    // We expect an isolated uid to be removed before if it's used for another parent uid.
    enum Event {
        REMOVED = 0;
        CREATED = 1;
    }
    optional Event event = 3;
}

/*
 * Logs the reception of an incoming network packet causing the main system to wake up for
 * processing that packet. These events are notified by the kernel via Netlink NFLOG to Netd
 * and processed by WakeupController.cpp.
 */
message PacketWakeupOccurred {
    // The uid owning the socket into which the packet was delivered, or -1 if the packet was
    // delivered nowhere.
    optional int32 uid = 1 [(is_uid) = true];
    // The interface name on which the packet was received.
    optional string iface = 2;
    // The ethertype value of the packet.
    optional int32 ethertype = 3;
    // String representation of the destination MAC address of the packet.
    optional string destination_hardware_address = 4;
    // String representation of the source address of the packet if this was an IP packet.
    optional string source_ip = 5;
    // String representation of the destination address of the packet if this was an IP packet.
    optional string destination_ip = 6;
    // The value of the protocol field if this was an IPv4 packet or the value of the Next Header
    // field if this was an IPv6 packet. The range of possible values is the same for both IP
    // families.
    optional int32 ip_next_header = 7;
    // The source port if this was a TCP or UDP packet.
    optional int32 source_port = 8;
    // The destination port if this was a TCP or UDP packet.
    optional int32 destination_port = 9;
}

/*
 * Logs the memory stats for an app on startup.
 * Logged from:
 *     frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message AppStartMemoryStateCaptured {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The process name.
    optional string process_name = 2;

    // The activity name.
    optional string activity_name = 3;

    // # of page-faults
    optional int64 page_fault = 4;

    // # of major page-faults
    optional int64 page_major_fault = 5;

    // RSS
    optional int64 rss_in_bytes = 6;

    // CACHE
    optional int64 cache_in_bytes = 7;

    // SWAP
    optional int64 swap_in_bytes = 8;
}

/*
 * Logs the change in Low Memory Killer Daemon (LMKD) state which is used as start/stop boundaries
 * for LMK event.
 * Logged from:
 *      system/core/lmkd/lmkd.c
 */
message LmkStateChanged {
    enum State {
        UNKNOWN = 0;
        START = 1;
        STOP = 2;
    }
    optional State state = 1;
}

/*
 * Logs the event when Low Memory Killer Daemon (LMKD) kills a process to reduce memory pressure.
 * Logged from:
 *      system/core/lmkd/lmkd.c
 */
message LmkKillOccurred {
    enum Reason {
        UNKNOWN = 0;
        PRESSURE_AFTER_KILL = 1;
        NOT_RESPONDING = 2;
        LOW_SWAP_AND_THRASHING = 3;
        LOW_MEM_AND_SWAP = 4;
        LOW_MEM_AND_THRASHING = 5;
        DIRECT_RECL_AND_THRASHING = 6;
        LOW_MEM_AND_SWAP_UTIL = 7;
        LOW_FILECACHE_AFTER_THRASHING = 8;
    }

    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The process name.
    optional string process_name = 2;

    // oom adj score.
    optional int32 oom_adj_score = 3;

    // # of page-faults
    optional int64 page_fault = 4;

    // # of major page-faults
    optional int64 page_major_fault = 5;

    // RSS
    optional int64 rss_in_bytes = 6;

    // CACHE
    optional int64 cache_in_bytes = 7;

    // SWAP
    optional int64 swap_in_bytes = 8;

    // The elapsed real time of start of the process.
    optional int64 process_start_time_nanos = 9;

    // Min oom adj score considered by lmkd.
    optional int32 min_oom_score = 10;

    // Free physical memory on device at LMK time.
    optional int32 free_mem_kb = 11;

    // Free swap on device at LMK time.
    optional int32 free_swap_kb = 12;

    // What triggered the LMK event.
    optional Reason reason = 13;

    // Current thrashing levels (workingset_refaults/filecache in %).
    optional int32 thrashing = 14;

    // Max thrashing levels (workingset_refaults/filecache in %).
    optional int32 max_thrashing = 15;
}

/*
 * Logs when the ActivityManagerService detects that an app died.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message AppDied {
    // timestamp(elapsedRealtime) of record creation
    optional uint64 timestamp_millis = 1 [(state_field_option).exclusive_state = true];
}

/**
 * An atom for generic metrics logging. Available from Android Q.
 */
message GenericAtom {
    // The uid of the application that sent this custom atom.
    optional int32 uid = 1 [(is_uid) = true];

    // An event_id indicates the type of event.
    optional android.stats.EventType event_id = 2;
}

/**
 * Atom for simple logging of user interaction and impression events, such as "the user touched
 * this button" or "this dialog was displayed".
 * Keep the UI event stream clean: don't use for system or background events.
 * Log using the UiEventLogger wrapper - don't write with the StatsLog API directly.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/
 *   frameworks/base/packages/SystemUI/src/com/android/systemui/
 */
message UiEventReported {
    // The event_id.
    optional int32 event_id = 1;
    // The event's source or target uid and package, if applicable.
    // For example, the package posting a notification, or the destination package of a share.
    optional int32 uid = 2 [(is_uid) = true];
    optional string package_name = 3;
    // An identifier used to disambiguate which logs refer to a particular instance of some
    // UI element. Useful when there might be multiple instances simultaneously active.
    optional int32 instance_id = 4;
}

/**
 * Atom for logging Dream user interaction and impression events.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/
 */
message DreamUiEventReported {
    // The event's source or target uid, if applicable.
    optional int32 uid = 1 [(is_uid) = true];
    // The event_id (as for UiEventReported).
    optional int32 event_id = 2;
    // An identifier used to disambiguate which logs refer to a particular instance of some
    // UI element. Useful when there might be multiple instances simultaneously active.
    optional int32 instance_id = 3;

    // The name of the dream component, which identifies the type of the dream.
    optional string dream_component_name = 4;
}

/**
 * Reports a notification was created or updated.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/notification/
 */
message NotificationReported {
    // The event_id (as for UiEventReported).
    optional int32 event_id = 1;
    // The notifying app's uid and package.
    optional int32 uid = 2 [(is_uid) = true];
    optional string package_name = 3;
    // A small system-assigned identifier for the notification.
    // Locally probably-unique, but expect collisions across users and/or days.
    optional int32 instance_id = 4;
    optional int32 notification_id_hash = 5;  // Small hash of the app-assigned notif ID + tag
    optional int32 channel_id_hash = 6;  // Small hash of app-assigned channel ID

    // Grouping information
    optional int32 group_id_hash = 7;  // Small hash of the group ID of the notification
    optional int32 group_instance_id = 8;  // Instance_id of the group-summary notification
    optional bool is_group_summary = 9;  // Tags the group-summary notification

    // Attributes
    optional string category = 10;   // App-assigned notification category (API-defined strings)
    optional int32 style = 11;       // App-assigned notification style
    optional int32 num_people = 12;  // Number of Person records attached to the notification

    // Ordering, importance and interruptiveness

    optional int32 position = 13;    // Position in NotificationManager's list

    optional android.stats.sysui.NotificationImportance importance = 14;
    optional int32 alerting = 15;    // Bitfield, 1=buzz 2=beep 4=blink

    enum NotificationImportanceExplanation {
        IMPORTANCE_EXPLANATION_UNKNOWN = 0;
        IMPORTANCE_EXPLANATION_APP = 1;     // App-specified channel importance.
        IMPORTANCE_EXPLANATION_USER = 2;    // User-specified channel importance.
        IMPORTANCE_EXPLANATION_ASST = 3;    // Notification Assistant override.
        IMPORTANCE_EXPLANATION_SYSTEM = 4;  // System override.
        // Like _APP, but based on pre-channels priority signal.
        IMPORTANCE_EXPLANATION_APP_PRE_CHANNELS = 5;
    }

    optional NotificationImportanceExplanation importance_source = 16;
    optional android.stats.sysui.NotificationImportance importance_initial = 17;
    optional NotificationImportanceExplanation importance_initial_source = 18;
    optional android.stats.sysui.NotificationImportance importance_asst = 19;
    optional int32 assistant_hash = 20;
    optional float assistant_ranking_score = 21;

    // Fields for tracking ongoing and foreground service notifications
    optional bool is_ongoing = 22;
    optional bool is_foreground_service = 23;
    // Fields to know about the timeout for notifications.
    optional int64 timeout_millis = 24;
}

message Notification {
    // The notifying app's uid and package.
    optional int32 uid = 1 [(is_uid) = true];
    optional string package_name = 2;
    // A small system-assigned identifier for the notification.
    optional int32 instance_id = 3;

    // Grouping information.
    optional int32 group_instance_id = 4;
    optional bool is_group_summary = 5;

    // The section of the shade that the notification is in.
    // See SystemUI Notifications.proto.
    enum NotificationSection {
        SECTION_UNKNOWN = 0;
        SECTION_HEADS_UP = 1;
        SECTION_MEDIA_CONTROLS = 2;
        SECTION_PEOPLE = 3;
        SECTION_ALERTING = 4;
        SECTION_SILENT = 5;
        SECTION_FOREGROUND_SERVICE = 6;
    }
    optional NotificationSection section = 6;
}

message NotificationList {
    repeated Notification notifications = 1;  // An ordered sequence of notifications.
}

/**
 * Reports a notification panel was displayed, e.g. from the lockscreen or status bar.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/
 */
message NotificationPanelReported {
    // The event_id (as for UiEventReported).
    optional int32 event_id = 1;
    optional int32 num_notifications = 2;
    // The notifications in the panel, in the order that they appear there.
    optional NotificationList notifications = 3 [(log_mode) = MODE_BYTES];
}

/**
 * Reports a notification channel, or channel group, was created, updated, or deleted.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/notification/
 */
message NotificationChannelModified {
    // The event_id (as for UiEventReported).
    optional int32 event_id = 1;
    // The notifying app's uid and package.
    optional int32 uid = 2 [(is_uid) = true];
    optional string package_name = 3;
    // Hash of app-assigned notification channel ID or channel-group ID
    optional int32 channel_id_hash = 4;
    // Previous importance setting, if applicable
    optional android.stats.sysui.NotificationImportance old_importance = 5;
    // New importance setting
    optional android.stats.sysui.NotificationImportance importance = 6;
    // whether or not this channel represents a conversation
    optional bool is_conversation = 7;
    // Hash of app-assigned notification conversation id
    optional int32 conversation_id_hash = 8;
    // whether or not the user demoted this channel out of the conversation space
    optional bool is_conversation_demoted = 9;
    // whether this conversation is marked as being a priority
    optional bool is_conversation_priority = 10;
}

/**
 * Logs when a biometric acquire event occurs.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 */
message BiometricAcquired {
    // Biometric modality that was acquired.
    optional android.hardware.biometrics.ModalityEnum modality = 1;
    // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java.
    optional int32 user = 2;
    // If this acquire is for a crypto operation. e.g. Secure purchases, unlock password storage.
    optional bool is_crypto = 3;
    // Action that the device is performing. Acquired messages are only expected for enroll and
    // authenticate. Other actions may indicate an error.
    optional android.hardware.biometrics.ActionEnum action = 4;
    // The client that this acquisition was received for.
    optional android.hardware.biometrics.ClientEnum client = 5;
    // Acquired constants, e.g. ACQUIRED_GOOD. See constants defined by <Biometric>Manager.
    optional int32 acquire_info = 6;
    // Vendor-specific acquire info. Valid only if acquire_info == ACQUIRED_VENDOR.
    optional int32 acquire_info_vendor = 7;
    // Dictates if this message should trigger additional debugging.
    optional bool debug = 8;
    // The ID of the biometric sensor associated with this action.
    optional int32 sensor_id = 9;
    // The ID of the session this event occurred in (if any)
    optional int32 session_id = 10;
    // The type of session (i.e. CUJ)
    optional android.hardware.biometrics.SessionTypeEnum session_type = 11;
    // If the AoD was on when this event occurred.
    optional bool is_aod = 12;
}

/**
 * Logs when a biometric authentication event occurs.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 */
message BiometricAuthenticated {
    // Biometric modality that was used.
    optional android.hardware.biometrics.ModalityEnum modality = 1;
    // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java
    optional int32 user = 2;
    // If this authentication is for a crypto operation. e.g. Secure purchases, unlock password
    // storage.
    optional bool is_crypto = 3;
    // The client that this acquisition was received for.
    optional android.hardware.biometrics.ClientEnum client = 4;
    // If authentication requires user confirmation. See BiometricPrompt's
    // setRequireConfirmation(bool) method.
    optional bool require_confirmation = 5;

    enum State {
        UNKNOWN = 0;
        REJECTED = 1;
        PENDING_CONFIRMATION = 2;
        CONFIRMED = 3;
    }

    // State of the current auth attempt.
    optional State state = 6;
    // Time it took to authenticate. For BiometricPrompt where setRequireConfirmation(false) is
    // specified and supported by the biometric modality, this is from the first ACQUIRED_GOOD to
    // AUTHENTICATED. for setRequireConfirmation(true), this is from PENDING_CONFIRMATION to
    // CONFIRMED.
    optional int64 latency_millis = 7;
    // Dictates if this message should trigger additional debugging.
    optional bool debug = 8;
    // The ID of the biometric sensor associated with this action.
    optional int32 sensor_id = 9;
    // The ambient light lux when authenticated.
    optional float ambient_light_lux = 10;
    // The ID of the session this event occurred in (if any)
    optional int32 session_id = 11;
    // The type of session (i.e. CUJ)
    optional android.hardware.biometrics.SessionTypeEnum session_type = 12;
    // If the AoD was on when this event occurred.
    optional bool is_aod = 13;
}

/**
 * Logs when a biometric error occurs.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 */
message BiometricErrorOccurred {
    // Biometric modality that was used.
    optional android.hardware.biometrics.ModalityEnum modality = 1;
    // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java
    optional int32 user = 2;
    // If this error is for a crypto operation. e.g. Secure purchases, unlock password storage.
    optional bool is_crypto = 3;
    // Action that the device is performing.
    optional android.hardware.biometrics.ActionEnum action = 4;
    // The client that this acquisition was received for.
    optional android.hardware.biometrics.ClientEnum client = 5;
    // Error constants. See constants defined by <Biometric>Manager. Enums won't work since errors
    // are unique to modality.
    optional int32 error_info = 6;
    // Vendor-specific error info. Valid only if acquire_info == ACQUIRED_VENDOR. These are defined
    // by the vendor and not specified by the HIDL interface.
    optional int32 error_info_vendor = 7;
    // Dictates if this message should trigger additional debugging.
    optional bool debug = 8;
    // Time spent during the authentication attempt.
    optional int64 latency_millis = 9;
    // The ID of the biometric sensor associated with this action.
    optional int32 sensor_id = 10;
    // The ID of the session this event occurred in (if any)
    optional int32 session_id = 11;
    // The type of session (i.e. CUJ)
    optional android.hardware.biometrics.SessionTypeEnum session_type = 12;
    // If the AoD was on when this event occurred.
    optional bool is_aod = 13;
}

/**
 * Logs when a system health issue is detected.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 */
message BiometricSystemHealthIssueDetected {
    // Biometric modality.
    optional android.hardware.biometrics.ModalityEnum modality = 1;
    // Type of issue detected.
    optional android.hardware.biometrics.IssueEnum issue = 2;
    // Dictates if this message should trigger additional debugging.
    optional bool debug = 3;
    // The ID of the biometric sensor associated with this action.
    optional int32 sensor_id = 4;
}

/**
 * Logs when a biometric enrollment occurs.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 */
message BiometricEnrolled {
    // Biometric modality that was used.
    optional android.hardware.biometrics.ModalityEnum modality = 1;
    // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java
    optional int32 user = 2;
    // The amount of time the enrollment took in milliseconds.
    optional int64 latency_millis = 3;
    // Whether or not the enrollment was successful.
    optional bool success = 4;
    // The ID of the biometric sensor associated with this action.
    optional int32 sensor_id = 5;
    // The ambient light lux when the user enrolled.
    optional float ambient_light_lux = 6;
}

/*
 * Logs when one of the BiometricPrompt#authenticate() method variants is called.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 *
 */
 message AuthPromptAuthenticateInvoked {
    // Whether an explicit CryptoObject was passed to the biometric prompt.
    optional bool is_crypto = 1;
    // The value passed to setConfirmationRequired(boolean), or true if not set.
    optional bool is_confirmation_required = 2;
    // The value passed to setDeviceCredentialAllowed(boolean), or false if not set.
    optional bool is_credential_allowed = 3;
    // Whether a value was passed to setAllowedAuthenticators(int).
    optional bool is_allowed_authenticators_set = 4;
    // The value passed to setAllowedAuthenticators(int), if any.
    optional int32 allowed_authenticators = 5;
}

/*
 * Logs when one of the BiometricPrompt#canAuthenticate() method variants is called.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 *
 */
message AuthManagerCanAuthenticateInvoked {
    // Whether a bit field of allowed authenticator types was provided as an argument.
    optional bool is_allowed_authenticators_set = 1;
    // The bit field of allowed authenticator types provided, if any.
    optional int32 allowed_authenticators = 2;
    // The authentication status code that was returned.
    optional int32 result_code = 3;
}

/*
 * Logs when Biometric enrollment is requested via the ACTION_BIOMETRIC_ENROLL intent action.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 *
 */
message AuthEnrollActionInvoked {
    // Whether a Class 3 (strong) biometric was previously enrolled on this device.
    optional bool is_strong_biometric_enrolled = 1;
    // Whether a Class 2 (weak) biometric was previously enrolled on this device.
    optional bool is_weak_biometric_enrolled = 2;
    // Whether a PIN/pattern/password was previously enrolled on this device.
    optional bool is_device_credential_enrolled = 3;
    // Whether a bit field of allowed authenticator types was provided as an extra.
    optional bool is_allowed_authenticators_set = 4;
    // The bit field of allowed authenticator types provided, if any.
    optional int32 allowed_authenticators = 5;
}

/*
 * Logs when an application uses a deprecated biometric or authentication API feature.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/biometrics
 */
 message AuthDeprecatedAPIUsed {
    enum APIEnum {
        API_UNKNOWN = 0;
        // android.hardware.fingerprint.FingerprintManager#authenticate(CryptoObject,
        // CancellationSignal, int, AuthenticationCallback, Handler)
        API_FINGERPRINT_MANAGER_AUTHENTICATE = 1;
        // android.hardware.fingerprint.FingerprintManager#hasEnrolledFingerprints()
        API_FINGERPRINT_MANAGER_HAS_ENROLLED_FINGERPRINTS = 2;
        // android.hardware.fingerprint.FingerprintManager#isHardwareDetected()
        API_FINGERPRINT_MANAGER_IS_HARDWARE_DETECTED = 3;
        // android.hardware.biometrics.BiometricManager#canAuthenticate()
        API_BIOMETRIC_MANAGER_CAN_AUTHENTICATE = 4;
    }

     // The deprecated API feature that was used.
     optional APIEnum deprecated_api = 1;
     // The UID of the application that used the deprecated API.
     optional int32 app_uid = 2;
     // The target SDK version (API level) of the application that used the deprecated API.
     optional int32 target_sdk = 3;
 }

/*
 * Logs when a flag flip update occurrs. Used for mainline modules that update via flag flips.
 */
message FlagFlipUpdateOccurred {
    // If the event is from a flag config package, specify the package name.
    optional string flag_flip_package_name = 1;

    // The order id of the package
    optional int64 order_id = 2;
}

/**
 * Potential experiment ids that goes with a train install.
 * Should be kept in sync with experiment_ids.proto.
 */
message TrainExperimentIds {
    repeated int64 experiment_id = 1;
}

/*
 * Logs when a binary push state changes.
 * Logged by the installer via public api.
 */
message BinaryPushStateChanged {
    // Name of the train.
    optional string train_name = 1;
    // Version code for a "train" of packages that need to be installed atomically
    optional int64 train_version_code = 2;
    // After installation of this package, device requires a restart.
    optional bool requires_staging = 3;
    // Rollback should be enabled for this install.
    optional bool rollback_enabled = 4;
    // Requires low latency monitoring if possible.
    optional bool requires_low_latency_monitor = 5;

    enum State {
        UNKNOWN = 0;
        INSTALL_REQUESTED = 1;
        INSTALL_STARTED = 2;
        INSTALL_STAGED_NOT_READY = 3;
        INSTALL_STAGED_READY = 4;
        INSTALL_SUCCESS = 5;
        // Replaced by INSTALL_FAILURE_DOWNLOAD, INSTALL_FAILURE_STATE_MISMATCH,
        // and INSTALL_FAILURE_COMMIT.
        INSTALL_FAILURE = 6  [deprecated = true];
        // This enum is for installs that are manually cancelled via the Manual Update UI.
        INSTALL_CANCELLED = 7;
        INSTALLER_ROLLBACK_REQUESTED = 8;
        INSTALLER_ROLLBACK_INITIATED = 9;
        INSTALLER_ROLLBACK_INITIATED_FAILURE = 10;
        INSTALLER_ROLLBACK_STAGED = 11;
        INSTALLER_ROLLBACK_STAGED_FAILURE = 12;
        INSTALLER_ROLLBACK_BOOT_TRIGGERED = 13;
        INSTALLER_ROLLBACK_BOOT_TRIGGERED_FAILURE = 14;
        INSTALLER_ROLLBACK_SUCCESS = 15;
        INSTALLER_ROLLBACK_FAILURE = 16;
        INSTALLER_ROLLBACK_STAGED_CANCEL_REQUESTED = 17;
        INSTALLER_ROLLBACK_STAGED_CANCEL_SUCCESS = 18;
        INSTALLER_ROLLBACK_STAGED_CANCEL_FAILURE = 19;
        INSTALL_STAGED_CANCEL_REQUESTED = 20;
        INSTALL_STAGED_CANCEL_SUCCESS = 21;
        INSTALL_STAGED_CANCEL_FAILURE = 22;
        INSTALL_FAILURE_DOWNLOAD = 23;
        INSTALL_FAILURE_STATE_MISMATCH = 24;
        INSTALL_FAILURE_COMMIT = 25;
        REBOOT_TRIGGERED = 26;
        // Logged after INSTALL_REQUESTED for devices installing a train that
        // contains no module requiring reboot.
        REBOOT_NOT_REQUIRED = 27;
        // Logged after INSTALL_REQUESTED for devices that are installing a train
        // which requires reboot and eligible for soft restart.
        SOFT_RESTART_ELIGIBLE = 28;
        // Logged after INSTALL_REQUESTED for devices that are installing a train
        // which requires reboot and eligible for notification restart.
        NOTIFICATION_RESTART_ELIGIBLE = 29;
        // Logged after INSTALL_REQUESTED for devices that are installing a train
        // which requires reboot and not eligible for any reboot promotion strategy
        // (e.g. soft restart, notification restart).
        NO_REBOOT_PROMOTION_STRATEGY_ELIGIBLE = 30;
        REBOOT_TRIGGER_FAILURE = 31;
        // Logged after INSTALL_REQUESTED for devices installing a train which
        // requires reboot and eligible for unattended reboot.
        UNATTENDED_REBOOT_ELIGIBLE = 32;
        // Logged when Phonesky trys to prepare LSKF.
        LSKF_PREPARATION_INITITATED = 33;
        // Logged when LSKF preparation succeeded.
        LSKF_PREPARATION_SUCCESS = 34;
        // Logged when LSKF preparation failed.
        LSKF_PREPARATION_FAILURE = 35;
        // Logged when Phonesky cannot schedule reboot job on a unattended reboot
        // eligible device.
        UNATTENDED_REBOOT_NOT_TRIGGERED = 36;
        // Logged when SIM PIN recovery preparation succeeded.
        SIM_PIN_PREPARATION_SUCCESS = 37;
        // Logged when SIM PIN recovery preparation failed.
        SIM_PIN_PREPARATION_FAILURE = 38 [deprecated = true];
        // Logged when unattended reboot is aborted and falls back to organic
        // reboot.
        UNATTENDED_REBOOT_ABORT = 39;
        // Logged when Phonesky re-prepares LSKF.
        LSKF_PREPARATION_RETRY = 40;
        // Logged when the device doesn’t support checkpoint and cannot stage
        // multiple sessions.
        CHECKPOINT_NOT_SUPPORTED = 41;
        // Logged when Phonesky instructs Android platform to monitor reboot
        // readiness signal.
        PENDING_REBOOT_MARKED = 42;
        // Logged when Phonesky instructs Android platform to stop monitoring reboot
        // readiness signal.
        PENDING_REBOOT_CANCELLED = 43 [deprecated = true];
        // Logged when Phonesky receives reboot readiness broadcast and the device
        // is ready to reboot.
        SIGNAL_READY_TO_REBOOT_RECEIVED = 44;
        // Logged when Phonesky receives reboot readiness broadcast and the device
        // is not ready to reboot.
        SIGNAL_NOT_READY_TO_REBOOT_RECEIVED = 45;
        // Logged when Phonesky cancels an untracked train.
        UNTRACKED_TRAIN_CANCELLED = 46;
    }
    optional State state = 6;
    // Possible experiment ids for monitoring this push.
    optional TrainExperimentIds experiment_ids = 7 [(log_mode) = MODE_BYTES];
    // Index of the Android User. E.g. 0 for primary profile, 10, 11, 12
    // for guest and secondary profiles. Not PII.
    optional int32 user_id = 8;
    // Log additional info for a state when needed.
    // When state = REBOOT_TRIGGERED, this field logs the reboot type:
    //  USERSPACE_REBOOT = 1.
    //  FORCED_REBOOT = 2.
    //  NOTIFICATION_RESTART_REBOOT = 3.
    //  UNATTENDED_REBOOT_SECURED_AND_SIM_PIN = 4.
    //  UNATTENDED_REBOOT_SECURED_NO_SIM_PIN = 5.
    //  UNATTENDED_REBOOT_UNSECURED_AND_SIM_PIN = 6.
    //  UNATTENDED_REBOOT_UNSECURED_NO_SIM_PIN = 7.
    // When state = INSTALL_FAILURE, this field logs the Install errors related
    // statusCode
    // When state = UNATTENDED_REBOOT_ABORT, this field logs the cancellation
    // reason:
    //  LSKF_RETRY_EXCEED_MAXIMUM = 1.
    //  SIM_PIN_NOT_PREPARED = 2.
    // When state = UNATTENDED_REBOOT_ELIGIBLE, this field logs the cancellation
    // reason:
    //  UNATTENDED_REBOOT_SECURED_AND_SIM_PIN = 1.
    //  UNATTENDED_REBOOT_SECURED_NO_SIM_PIN = 2.
    //  UNATTENDED_REBOOT_UNSECURED_AND_SIM_PIN = 3.
    //  UNATTENDED_REBOOT_UNSECURED_NO_SIM_PIN = 4.
    // When state = UNATTENDED_REBOOT_NOT_TRIGGERED, this field logs the
    // cancellation reason:
    //  LSKF_NOT_PREPARED = 1.
    //  REBOOT_NOT_READY = 2.
    // When state = PENDING_REBOOT_CANCELLED, this field logs the cancellation
    // reason:
    //  LSKF_NOT_PREPARED = 1.
    //  NO_STAGED_TRAIN = 2.
    //  HAS_SIM_PIN_AND_SIM_PIN_STORAGE_DISABLED = 3.
    optional int32 reason = 9;
    // Whether or not this is a rollback event.
    optional bool is_rollback = 10;
}

/* Test atom, is not logged anywhere */
message TestAtomReported {
    repeated AttributionNode attribution_node = 1;
    optional int32 int_field = 2;
    optional int64 long_field = 3;
    optional float float_field = 4;
    optional string string_field = 5;
    optional bool boolean_field = 6;
    enum State {
        UNKNOWN = 0;
        OFF = 1;
        ON = 2;
    }
    optional State state = 7;
    optional TrainExperimentIds bytes_field = 8 [(android.os.statsd.log_mode) = MODE_BYTES];
    repeated int32 repeated_int_field = 9;
    repeated int64 repeated_long_field = 10;
    repeated float repeated_float_field = 11;
    repeated string repeated_string_field = 12;
    repeated bool repeated_boolean_field = 13;
    repeated State repeated_enum_field = 14;
}

/** Represents USB port overheat event. */
message UsbPortOverheatEvent {
    /* Temperature of USB port at USB plug event, in 1/10ths of degree C. */
    optional int32 plug_temperature_deci_c = 1;

    /* Maximum temperature of USB port during overheat event, in 1/10ths of degree C. */
    optional int32 max_temperature_deci_c = 2;

    /* Time between USB plug event and overheat threshold trip, in seconds. */
    optional int32 time_to_overheat_secs = 3;

    /* Time between overheat threshold trip and hysteresis, in seconds. */
    optional int32 time_to_hysteresis_secs = 4;

    /* Time between hysteresis and active mitigation ending, in seconds. */
    optional int32 time_to_inactive_secs = 5;
};

/**
 * Logs total effective full charge and discharge cycles on a battery.
 * Here are some examples of one effective cycle:
 *   1) the battery charges from 0% to 100% and drains back to 0%,
 *   2) charging from 50% to 100% and draining back to 50% twice.
 * Pulled from:
 *   frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
 */
message BatteryCycleCount {
    /* Number of total charge and discharge cycles on the system battery. */
    optional int32 cycle_count = 1;
}

/**
 * Logs that external storage is mounted and information about it, the storage type (sd card/usb/
 * others), its type (public or private) and the size in bytes.
 * Pulled from:
 *   StatsCompanionService
 */

message ExternalStorageInfo {

    enum VolumeType {
        UNKNOWN = 0;
        PUBLIC = 1;
        PRIVATE = 2;
        OTHER = 3;
    }

    // The type of external storage.
    optional android.stats.storage.ExternalStorageType storage_type = 1;
    // Type of the volume: TYPE_PUBLIC if portable and TYPE_PRIVATE if internal.
    optional VolumeType volume_type = 2;
    // Total size of the sd card in bytes.
    optional int64 size_bytes = 3;
}

/*
 * Logs when a connection becomes available and lost.
 * Logged in StatsCompanionService.java
 */
message ConnectivityStateChanged {
  // Id of the network.
  optional int32 net_id = 1;

  enum State {
    UNKNOWN = 0;
    CONNECTED = 1;
    DISCONNECTED = 2;
  }
  // Connected state of a network.
  optional State state = 2;
}

/**
 * Logs when a service starts and stops.
 * Logged from:
 *   services/core/java/com/android/server/am/ActiveServices.java
 */
message ServiceStateChanged {

    optional int32 uid = 1 [(is_uid) = true];

    optional string package_name = 2;

    optional string service_name = 3;

    enum State {
        START = 1;
        STOP = 2;
    }

    optional State state = 4;
}

/**
 * Logs when a service is launched.
 * Logged from:
 *   services/core/java/com/android/server/am/ActiveServices.java
 */
message ServiceLaunchReported {

    optional int32 uid = 1 [(is_uid) = true];

    optional string package_name = 2;

    optional string service_name = 3;
}

/**
 * The type of process start. It's the same as ProcessStartTime.StartType but we
 * can't re-type that for background compatibility.
 */
enum ProcessStartType {
    PROCESS_START_TYPE_UNKNOWN = 0;
    PROCESS_START_TYPE_WARM = 1;
    PROCESS_START_TYPE_HOT = 2;
    PROCESS_START_TYPE_COLD = 3;
}

/**
 * Logs when a service request is made.
 * Logged from:
 *   services/core/java/com/android/server/am/ActiveServices.java
 */
message ServiceRequestEventReported {
    /** The package uid of the service host. */
    optional int32 uid = 1 [(is_uid) = true];

    /** The package uid of the service launch request. */
    optional int32 requester_uid = 2 [(is_uid) = true];

    /** The action name of the service request. */
    optional string action_name = 3;

    /**
     * The types of the requests to the service.
     */
    enum RequestType {
        UNKNOWN = 0;
        START = 1;
        BIND = 2;
    }

    /** The type of the current request to the service.*/
    optional RequestType request_type = 4;

    /** Whether or not it's requested to start as a foreground service. */
    optional bool fg_required = 5;

    /** The start type of the host process. */
    optional ProcessStartType proc_start_type = 6;
}

/**
 * Logs indicating a broadcast is being delivered to a receiver.
 *
 * Logged from:
 *     frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
 */
message BroadcastDeliveryEventReported {
    /** The package uid of the broadcast receiver. */
    optional int32 uid = 1 [(is_uid) = true];

    /** The package uid of the broadcast sender. */
    optional int32 sender_uid = 2 [(is_uid) = true];

    /** The action name of the broadcast. */
    optional string action_name = 3;

    /**
     * The types of the broadcast receivers.
     */
    enum ReceiverType {
        UNKNOWN = 0;
        RUNTIME = 1;
        MANIFEST = 2;
    }

    /** The type of the current broadcast receiver. */
    optional ReceiverType receiver_type = 4;

    /** The start type of the host process. */
    optional ProcessStartType proc_start_type = 5;
}

/**
 * Logs indicating a client is requesting to acquire a provider,
 * this doesn't include the case where the provider has been installed in the
 * client's process space and it's just increasing a ref count.
 *
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/ContentProviderHelper.java
 */
message ProviderAcquisitionEventReported {
    /** The package uid of the content provider host. */
    optional int32 uid = 1 [(is_uid) = true];

    /** The package uid of the content provider client who makes the request. */
    optional int32 client_uid = 2 [(is_uid) = true];

    /** The start type of the host process. */
    optional ProcessStartType proc_start_type = 3;
}

/**
 * Logs when a hidden API is used.
 *
 * Logged from:
 *     libcore/libart/src/main/java/dalvik/system/VMRuntime.java
 */
message HiddenApiUsed {
    // The uid of the app making the hidden access.
    optional int32 uid = 1 [(is_uid) = true];

    // Signature of the method or field accessed.
    optional string signature = 2;

    enum AccessMethod {
        NONE = 0;
        REFLECTION = 1;
        JNI = 2;
        LINKING = 3;
    }

    // Type of access.
    optional AccessMethod access_method = 3;

    // Whether the access was prevented or not.
    optional bool access_denied = 4;
}

/**
 * Logs user interaction with the Privacy Indicators added in Q. In particular:
 * - When user sees privacy chip
 * - When user clicks privacy chip
 * - How does the user exit the Privacy Dialog
 * Logged from:
 *   packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
 */
message PrivacyIndicatorsInteracted {

    enum Type {
        UNKNOWN = 0;
        CHIP_VIEWED = 1;
        CHIP_CLICKED = 2;
        reserved 3; // Used only in beta builds, never shipped
        DIALOG_DISMISS = 4;
        DIALOG_LINE_ITEM = 5;
    }

    optional Type type = 1 [(state_field_option).exclusive_state = true];
}

/**
 * Logs information about a package that is moved from the internal to external storage and vice
 * versa.
 * It logs the package name, the type of the external storage where the package is installed
 * (if moved to external storage, or UNKNOWN if moved to internal storage),
 * and the move type: if it's from internal to external or the other way around.
 *
 * Logged from:
        frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
 */
message AppMovedStorageReported {
    enum MoveType {
        UNKNOWN = 0;
        TO_EXTERNAL = 1;
        TO_INTERNAL = 2;
    }
    // The type of the external storage.
    optional android.stats.storage.ExternalStorageType external_storage_type = 1;
    // The type of move.
    optional MoveType move_type = 2;
    // The name of the package that was moved.
    optional string package_name = 3;
}

/**
 * Logs when system server watchdog occurs.
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/Watchdog.java
 */
message SystemServerWatchdogOccurred {
    optional string subject = 1;
}

/**
 * Logs when new file added to tombstones.
 * Logged from:
 *      frameworks/base/core/java/com/android/server/BootReceiver.java
 */
message TombStoneOccurred {
}

/*
 * Information about a role request
 *
 * Logged from:
 *   packages/apps/PermissionController/src/com/android/packageinstaller/role/ui/RequestRoleFragment.java
 */
message RoleRequestResultReported {
    // UID of application requesting the role
    optional int32 requesting_uid = 1;

    // Package name of application requesting the role
    optional string requesting_package_name = 2;

    // The role to be granted
    optional string role_name = 3;

    // The count of applications qualifying for the role
    optional int32 qualifying_count = 4;

    // UID of application current granted the role
    optional int32 current_uid = 5;

    // Package name of application current granted the role
    optional string current_package_name = 6;

    // UID of another application that user chose to grant the role to, instead of the requesting
    // application
    optional int32 granted_another_uid = 7;

    // Package name of another application that user chose to grant the role to, instead of the
    // requesting application
    optional string granted_another_package_name = 8;

    enum Result {
        UNDEFINED = 0;
        // role request was ignored
        IGNORED = 1;
        // role request was ignored because it's already granted
        IGNORED_ALREADY_GRANTED = 2;
        // role request was ignored because the application isn't qualified
        IGNORED_NOT_QUALIFIED = 3;
        // role request was ignored because user said it should be always denied
        IGNORED_USER_ALWAYS_DENIED = 4;
        // role was granted by user action
        USER_GRANTED = 5;
        // role was denied by user action
        USER_DENIED = 6;
        // role was denied by user granting another application the role
        USER_DENIED_GRANTED_ANOTHER = 7;
        // role was denied and set to be always denied by the user
        USER_DENIED_WITH_ALWAYS = 8;
    }
    // The result of the role request
    optional Result result = 9;
}

/**
 * Logs when a Vehicle Maps Service client's connection state has changed
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/stats/VmsClientLog.java
 */
message VmsClientConnectionStateChanged {
    // The UID of the VMS client app
    optional int32 uid = 1 [(is_uid) = true];

    enum State {
        UNKNOWN = 0;
        // Attempting to connect to the client
        CONNECTING = 1;
        // Client connection established
        CONNECTED = 2;
        // Client connection closed unexpectedly
        DISCONNECTED = 3;
        // Client connection closed by VMS
        TERMINATED = 4;
        // Error establishing the client connection
        CONNECTION_ERROR = 5;
    }

    optional State state  = 2;
}

message MimeTypes {
    repeated string mime_types = 1;
}

/**
 * Logs statistics regarding accesses to external storage.
 * All stats are normalized for one day period.
 *
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 */
message GeneralExternalStorageAccessStats {
    optional int32 uid = 1 [(is_uid) = true];
    // Total number of accesses like creation, open, delete and rename/update.
    // Includes file path and ContentResolver accesses
    optional uint32 total_accesses = 2;
    // Number of file path accesses, as opposed to file path and ContentResolver.
    optional uint32 file_path_accesses = 3;
    // Number of accesses on secondary volumes like SD cards.
    // Includes file path and ContentResolver accesses
    optional uint32 secondary_storage_accesses = 4;
    // Comma-separated list of mime types that were accessed.
    optional MimeTypes mime_types_accessed = 5 [(log_mode) = MODE_BYTES];
}

/**
 * Logs when MediaProvider has successfully finished scanning a storage volume.
 *
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/scan/ModernMediaScanner.java
 */
message MediaProviderScanOccurred {
    enum Reason {
        // Scan triggered due to unknown reason
        UNKNOWN = 0;
        // Scan triggered due to storage volume being mounted
        MOUNTED = 1;
        // Scan triggered due to explicit user action or app request
        DEMAND = 2;
        // Scan triggered due to idle maintenance
        IDLE = 3;
    }

    // Volume type that this event pertains to
    optional android.stats.mediaprovider.VolumeType volume_type = 1;
    // Reason why this scan was triggered
    optional Reason reason = 2;
    // Total number of files scanned
    optional int64 item_count = 3;
    // Duration of scan, normalized per file
    optional float normalized_duration_millis = 4;
    // Number of database inserts, normalized per file
    optional float normalized_insert_count = 5;
    // Number of database updates, normalized per file
    optional float normalized_update_count = 6;
    // Number of database deletes, normalized per file
    optional float normalized_delete_count = 7;
}

/**
 * Logs when an app has asked MediaProvider to delete media belonging to the user.
 *
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 */
message MediaContentDeleted {
    // Volume type that this event pertains to
    optional android.stats.mediaprovider.VolumeType volume_type = 1;
    // UID of app that requested deletion
    optional int32 uid = 2 [(is_uid) = true];
    // Number of items that were deleted
    optional int32 item_count = 3;
}

/**
 * Logs when an app has asked MediaProvider to grant them access to media belonging to the user.
 *
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/PermissionActivity.java
 */
message MediaProviderPermissionRequested {
    enum Result {
        UNKNOWN = 0;
        USER_GRANTED = 1;
        AUTO_GRANTED = 2;
        USER_DENIED = 3;
        USER_DENIED_WITH_PREJUDICE = 4;
        AUTO_DENIED = 5;
    }

    // Volume type that this event pertains to
    optional android.stats.mediaprovider.VolumeType volume_type = 1;
    // UID of app that requested permission
    optional int32 uid = 2 [(is_uid) = true];
    // Number of items that were requested
    optional int32 item_count = 3;
    // Result of this request
    optional Result result = 4;
}

/**
 * Logs when MediaProvider has finished upgrading or downgrading its database schema.
 *
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/DatabaseHelper.java
 */
message MediaProviderSchemaChanged {
    // Volume type that this event pertains to
    optional android.stats.mediaprovider.VolumeType volume_type = 1;
    // Old database version code
    optional int32 version_from = 2;
    // New database version code
    optional int32 version_to = 3;
    // Total number of files in database
    optional int64 item_count = 4;
    // Duration of schema change, normalized per file
    optional float normalized_duration_millis = 5;
}

/**
 * Logs when MediaProvider has finished an idle maintenance job.
 *
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 */
message MediaProviderIdleMaintenanceFinished {
    // Volume type that this event pertains to
    optional android.stats.mediaprovider.VolumeType volume_type = 1;

    // Total number of files in database
    optional int64 item_count = 2;
    // Duration of idle maintenance, normalized per file
    optional float normalized_duration_millis = 3;
    // Number of thumbnails found to be stale, normalized per file
    optional float normalized_stale_thumbnails = 4;
    // Number of items found to be expired, normalized per file
    optional float normalized_expired_media = 5;
}

/**
 * Represents boot time event with duration in ms.
 *
 * Logged from: bootstat and various system server components. Check each enums for details.
 */
message BootTimeEventDuration {
    enum DurationEvent {
        UNKNOWN = 0;
        // Bootloader time excluding BOOTLOADER_UI_WAIT + boot complete time. Logged from bootstat.
        ABSOLUTE_BOOT_TIME = 1;
        // Bootloader's 1st stage execution time.
        // Logged from bootstat.
        BOOTLOADER_FIRST_STAGE_EXEC = 2;
        // Bootloader's 1st stage loading time.
        // Logged from bootstat.
        BOOTLOADER_FIRST_STAGE_LOAD = 3;
        // Bootloader's kernel loading time.
        // Logged from bootstat.
        BOOTLOADER_KERNEL_LOAD = 4;
        // Bootloader's 2nd stage execution time.
        // Logged from bootstat.
        BOOTLOADER_SECOND_STAGE_EXEC = 5;
        // Bootloader's 2nd stage loading time.
        // Logged from bootstat.
        BOOTLOADER_SECOND_STAGE_LOAD = 6;
        // Duration for Bootloader to show unlocked device's warning UI. This should not happen
        // for locked device.
        // Logged from bootstat.
        BOOTLOADER_UI_WAIT = 7;
        // Total time spend in bootloader. This is the sum of all BOOTLOADER_* listed above.
        // Logged from bootstat.
        BOOTLOADER_TOTAL = 8;
        // Shutdown duration inside init for the reboot before the current boot up.
        // Logged from f/b/services/.../BootReceiver.java.
        SHUTDOWN_DURATION = 9;
        // Total time for mounting of disk devices during bootup.
        // Logged from f/b/services/.../BootReceiver.java.
        MOUNT_DEFAULT_DURATION = 10;
        // Total time for early stage mounting of disk devices during bootup.
        // Logged from f/b/services/.../BootReceiver.java.
        MOUNT_EARLY_DURATION = 11;
        // Total time for late stage mounting of disk devices during bootup.
        // Logged from f/b/services/.../BootReceiver.java.
        MOUNT_LATE_DURATION = 12;
        // Average time to scan non-system app after OTA
        // Logged from f/b/services/.../PackageManagerService.java
        OTA_PACKAGE_MANAGER_INIT_TIME = 13;
        // Time to initialize Package manager after OTA
        // Logged from f/b/services/.../PackageManagerService.java
        OTA_PACKAGE_MANAGER_DATA_APP_AVG_SCAN_TIME = 14;
        // Time to scan all system app from Package manager after OTA
        // Logged from f/b/services/.../PackageManagerService.java
        OTA_PACKAGE_MANAGER_SYSTEM_APP_AVG_SCAN_TIME = 15;
        // Init's total time for cold boot stage.
        // Logged from bootstat.
        COLDBOOT_WAIT = 16;
        // Init's total time for initializing selinux.
        // Logged from bootstat.
        SELINUX_INIT = 17;
        // Time since last factory reset.
        // Logged from bootstat.
        FACTORY_RESET_TIME_SINCE_RESET = 18;
        // Init's total time spent for completing the 1st stage.
        // Logged from bootstat.
        ANDROID_INIT_STAGE_1 = 19;
    }

    // Type of the event.
    optional DurationEvent event = 1;
    // Duration of the event in ms.
    optional int64 duration_millis = 2;
}

/**
 * Represents the start of specific boot time event during bootup in ms. This is usually a time
 * since boot-up.
 *
 * Logged from: bootstat and various system server components. Check each enums for details.
 */
message BootTimeEventElapsedTime {
    enum ElapsedTimeEvent {
        UNKNOWN = 0;
        // Time when init starts 1st stage. Logged from bootstat.
        ANDROID_INIT_STAGE_1 = 1;
        // Time when sys.boot_completed prop is set.
        // Logged from bootstat.
        BOOT_COMPLETE = 2;
        // BOOT_COMPLETE for encrypted device.
        BOOT_COMPLETE_ENCRYPTION = 3;
        // BOOT_COMPLETE for device with no encryption.
        BOOT_COMPLETE_NO_ENCRYPTION = 4;
        // Adjusted BOOT_COMPLETE for encrypted device extracting decryption time.
        BOOT_COMPLETE_POST_DECRYPT = 5;
        // BOOT_COMPLETE after factory reset.
        FACTORY_RESET_BOOT_COMPLETE = 6;
        // BOOT_COMPLETE_NO_ENCRYPTION after factory reset.
        FACTORY_RESET_BOOT_COMPLETE_NO_ENCRYPTION = 7;
        // BOOT_COMPLETE_POST_DECRYPT after factory reset.
        FACTORY_RESET_BOOT_COMPLETE_POST_DECRYPT = 8;
        // BOOT_COMPLETE after OTA.
        OTA_BOOT_COMPLETE = 9;
        // BOOT_COMPLETE_NO_ENCRYPTION after OTA.
        OTA_BOOT_COMPLETE_NO_ENCRYPTION = 10;
        // BOOT_COMPLETE_POST_DECRYPT after OTA.
        OTA_BOOT_COMPLETE_POST_DECRYPT = 11;
        // Time when the system starts sending LOCKED_BOOT_COMPLETED broadcast.
        // Logged from  f/b/services/.../UserController.java
        FRAMEWORK_LOCKED_BOOT_COMPLETED = 12;
        // Time when the system starts sending BOOT_COMPLETED broadcast.
        // Logged from  f/b/services/.../UserController.java
        FRAMEWORK_BOOT_COMPLETED = 13;
        // Time when the package manager starts init.
        // Logged from f/b/services/.../SystemServer.java
        PACKAGE_MANAGER_INIT_START = 14;
        // Time when package manager is ready
        // Logged from f/b/services/.../SystemServer.java
        PACKAGE_MANAGER_INIT_READY = 15;
        // Represents the time when user has entered unlock credential for system with user pin.
        // Logged from bootstat.
        POST_DECRYPT = 16;
        // Represents the start of zygote's init.
        // Logged from zygote itself.
        ZYGOTE_INIT_START = 17;
        // Represents the start of secondary zygote's init.
        // TODO: add logging to zygote
        SECONDARY_ZYGOTE_INIT_START = 18;
        // Represents the start of system server's init.
        // Logged from f/b/services/.../SystemServer.java
        SYSTEM_SERVER_INIT_START = 19;
        // Represents the completion of system server's init.
        // Logged from f/b/services/.../SystemServer.java
        SYSTEM_SERVER_READY = 20;
        // Represents the start of launcher during boot-up.
        // TODO: add logging
        LAUNCHER_START = 21;
        // Represents the completion of launcher's initial rendering. User can use other apps from
        // launcher from this point.
        // TODO: add logging
        LAUNCHER_SHOWN = 22;
    }

    // Type of the event.
    optional ElapsedTimeEvent event = 1;
    // Time since bootup for the event.
    // It should be acquired from SystemClock elapsedRealtime() call or equivalent.
    optional int64 time_millis = 2;
}

/**
 * Boot time events with UTC time.
 *
 * Logged from: bootstat and various system server components. Check each enums for details.
 */
message BootTimeEventUtcTime {
    enum UtcTimeEvent {
        UNKNOWN = 0;
        // Time of the bootstat's marking of 1st boot after the last factory reset.
        // Logged from bootstat.
        FACTORY_RESET_RESET_TIME = 1;
        // The time when bootstat records FACTORY_RESET_* events. This is close to
        // BOOT_COMPLETE time for the current bootup.
        // Logged from bootstat.
        FACTORY_RESET_CURRENT_TIME = 2;
        // DUplicate of FACTORY_RESET_RESET_TIME added for debugging purpose.
        // Logged from bootstat.
        FACTORY_RESET_RECORD_VALUE = 3;
    }

    // Type of the event.
    optional UtcTimeEvent event = 1;
    // UTC time for the event.
    optional int64 utc_time_secs = 2;
}

/**
 * Boot time events representing specific error code during bootup.
 * Meaning of error code can be different per each event type.
 *
 * Logged from: bootstat and various system server components. Check each enums for details.
 */
message BootTimeEventErrorCode {
    enum ErrorCodeEvent {
        UNKNOWN = 0;
        // Linux error code for time() call to get the current UTC time.
        // Logged from bootstat.
        FACTORY_RESET_CURRENT_TIME_FAILURE = 1;
        // Represents UmountStat before the reboot for the current boot up. Error codes defined
        // as UMOUNT_STAT_* from init/reboot.cpp.
        // Logged from f/b/services/.../BootReceiver.java.
        SHUTDOWN_UMOUNT_STAT = 2;
        // Reprepsents fie system mounting error code of /data partition for the current boot.
        // Error codes defined as combination of FsStatFlags from system/core/fs_mgr/fs_mgr.cpp.
        // Logged from f/b/services/.../BootReceiver.java.
        FS_MGR_FS_STAT_DATA_PARTITION = 3;
    }

    // Type of the event.
    optional ErrorCodeEvent event = 1;
    // error code defined per each event type.
    // For example, this can have a value of FsStatFlags.FS_STAT_FULL_MOUNT_FAILED for the event of
    // FS_MGR_FS_STAT.
    optional int32 error_code = 2;
}

/**
 * Collects Virtual A/B statistics related to the use of dm-snapshot performed
 * after an OTA.
 *
 * Logged from:
 *  - system/update_engine/cleanup_previous_update_action.cc
 */
message SnapshotMergeReported {
    // Keep in sync with
    // system/core/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
    enum UpdateState {
        // No update or merge is in progress.
        NONE = 0;
        // An update is applying; snapshots may already exist.
        INITIATED = 1;
        // An update is pending, but has not been successfully booted yet.
        UNVERIFIED = 2;
        // The kernel is merging in the background.
        MERGING = 3;
        // Post-merge cleanup steps could not be completed due to a transient
        // error, but the next reboot will finish any pending operations.
        MERGE_NEEDS_REBOOT = 4;
        // Merging is complete, and needs to be acknowledged.
        MERGE_COMPLETED = 5;
        // Merging failed due to an unrecoverable error.
        MERGE_FAILED = 6;
        // The update was implicitly cancelled, either by a rollback or a flash
        // operation via fastboot. This state can only be returned by WaitForMerge.
        CANCELLED = 7;
    };

    // Status codes correspond to specific failure conditions in
    // system/core/fs_mgr/libsnapshot/android/snapshot/snapshot.cpp
    //
    // Keep in sync with
    // system/core/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
    enum MergeFailureCode {
        OK = 0;
        READ_STATUS = 1;
        GET_TABLE_INFO = 2;
        UNKNOWN_TABLE = 3;
        GET_TABLE_PARAMS = 4;
        ACTIVATE_NEW_TABLE = 5;
        ACQUIRE_LOCK = 6;
        LIST_SNAPSHOTS = 7;
        WRITE_STATUS = 8;
        UNKNOWN_TARGET_TYPE = 9;
        QUERY_SNAPSHOT_STATUS = 10;
        EXPECTED_MERGE_TARGET = 11;
        UNMERGED_SECTORS_AFTER_COMPLETION = 12;
        UNEXPECTED_MERGE_STATE = 13;
        GET_COW_PATH_CONSISTENCY_CHECK = 14;
        OPEN_COW_CONSISTENCY_CHECK = 15;
        PARSE_COW_CONSISTENCY_CHECK = 16;
        OPEN_COW_DIRECT_CONSISTENCY_CHECK = 17;
        MEM_ALIGN_CONSISTENCY_CHECK = 18;
        DIRECT_READ_CONSISTENCY_CHECK = 19;
        WRONG_MERGE_COUNT_CONSISTENCY_CHECK = 20;
    };

    // Status of the update after the merge attempts.
    optional UpdateState final_state = 1;

    // Time to complete a merge operation in milliseconds.
    // A negative value corresponds to the case in which the merge operation
    // was interrupted and resumed (e.g. in case of a system reboot during the
    // merge).
    optional int64 duration_millis = 2;

    // Number of reboots that occurred after issuing and before completing the
    // merge of all the snapshot devices.
    optional int32 intermediate_reboots = 3;

    // The device has been upgraded to Virtual A/B.
    optional bool is_vab_retrofit = 4;

    // Space that has been temporarily allocated in the /data partition
    // containing the dm-snapshot's copy-on-write data generated during a
    // Virtual A/B update.
    optional int64 cow_file_size_bytes = 5;

    // Whether the device enables Virtual A/B compression.
    optional bool vab_compression_enabled = 6;

    // Whether this update attempt uses Virtual A/B compression.
    optional bool vab_compression_used = 7;

    // Total size used by COWs, including /data and the super partition.
    optional int64 total_cow_size_bytes = 8;

    // Sum of the estimated COW fields in the OTA manifest.
    optional int64 estimated_cow_size_bytes = 9;

    // Time from boot to sys.boot_completed, in milliseconds.
    optional int32 boot_complete_time_millis = 10;

    // Time from sys.boot_completed to merge start, in milliseconds.
    optional int32 boot_complete_to_merge_start_time_millis = 11;

    optional MergeFailureCode merge_failure_code = 12;

    // Build fingerprint at the time the OTA was downloaded.
    optional string source_build_fingerprint = 13;

    // Build fingerprint at the time the merge was initiated.
    optional string target_build_fingerprint = 14;
}

/**
 * Event representing when BlobStoreManager.Session#commit() is called
 *
 * Logged from:
 *  frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
 */
message BlobCommitted {
    // Uid of the Blob committer
    optional int32 uid = 1 [(is_uid) = true];

    // Id of the Blob committed
    optional int64 blob_id = 2;

    // Size of the Blob
    optional int64 size = 3;

    enum Result {
        UNKNOWN = 0;
        // Commit Succeeded
        SUCCESS = 1;
        // Commit Failed: Error occurred during commit
        ERROR_DURING_COMMIT = 2;
        // Commit Failed: Digest of the data did not match Blob digest
        DIGEST_MISMATCH = 3;
        // Commit Failed: Allowed count limit exceeded
        COUNT_LIMIT_EXCEEDED = 4;
    }
    optional Result result = 4;
}

/**
 * Event representing when BlobStoreManager#acquireLease() is called
 *
 * Logged from:
 *  frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
 */
message BlobLeased{
    // Uid of the Blob leasee
    optional int32 uid = 1 [(is_uid) = true];

    // Id of the Blob leased or 0 if the Blob does not exist
    optional int64 blob_id = 2;

    // Size of the Blob or 0 if the Blob does not exist
    optional int64 size = 3;

    enum Result {
        UNKNOWN = 0;
        // Lease Succeeded
        SUCCESS = 1;
        // Lease Failed: Blob does not exist
        BLOB_DNE = 2;
        // Lease Failed: Leasee does not have access to the Blob
        ACCESS_NOT_ALLOWED = 3;
        // Lease Failed: Leasee requested an invalid expiry duration
        LEASE_EXPIRY_INVALID = 4;
        // Lease Failed: Leasee has exceeded the total data lease limit
        DATA_SIZE_LIMIT_EXCEEDED = 5;
        // Leasee Failed: Allowed count limit exceeded
        COUNT_LIMIT_EXCEEDED = 6;
    }
    optional Result result = 4;
}

/**
 * Event representing when BlobStoreManager#openBlob() is called
 *
 * Logged from:
 *  frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
 */
message BlobOpened{
    // Uid of the Blob opener
    optional int32 uid = 1 [(is_uid) = true];

    // Id of the Blob opened or 0 if the Blob does not exist
    optional int64 blob_id = 2;

    // Size of the Blob or 0 if the Blob does not exist
    optional int64 size = 3;

    enum Result {
        UNKNOWN = 0;
        // Open Succeeded
        SUCCESS = 1;
        // Open Failed: Blob does not exist
        BLOB_DNE = 2;
        // Open Failed: Opener does not have access to the Blob
        ACCESS_NOT_ALLOWED = 3;
    }
    optional Result result = 4;
}

/**
 * Event to track Jank for various system interactions.
 *
 * Logged from:
 *  frameworks/base/core/java/com/android/internal/jank/FrameTracker.java
 *
 * Next Tag: 59
 */
message UIInteractionFrameInfoReported {
    enum InteractionType {
        UNKNOWN = 0;
        NOTIFICATION_SHADE_SWIPE = 1;
        SHADE_EXPAND_COLLAPSE_LOCK = 2;
        SHADE_SCROLL_FLING = 3;
        SHADE_ROW_EXPAND = 4;
        SHADE_ROW_SWIPE = 5;
        SHADE_QS_EXPAND_COLLAPSE = 6;
        SHADE_QS_SCROLL_SWIPE = 7;
        LAUNCHER_APP_LAUNCH_FROM_RECENTS = 8;
        LAUNCHER_APP_LAUNCH_FROM_ICON = 9;
        LAUNCHER_APP_CLOSE_TO_HOME = 10;
        LAUNCHER_APP_CLOSE_TO_PIP = 11;
        LAUNCHER_QUICK_SWITCH = 12;
        SHADE_HEADS_UP_APPEAR = 13;
        SHADE_HEADS_UP_DISAPPEAR = 14;
        SHADE_NOTIFICATION_ADD = 15;
        SHADE_NOTIFICATION_REMOVE = 16;
        SHADE_APP_LAUNCH = 17;
        LOCKSCREEN_PASSWORD_APPEAR = 18;
        LOCKSCREEN_PATTERN_APPEAR = 19;
        LOCKSCREEN_PIN_APPEAR = 20;
        LOCKSCREEN_PASSWORD_DISAPPEAR = 21;
        LOCKSCREEN_PATTERN_DISAPPEAR = 22;
        LOCKSCREEN_PIN_DISAPPEAR = 23;
        LOCKSCREEN_TRANSITION_FROM_AOD = 24;
        LOCKSCREEN_TRANSITION_TO_AOD = 25;
        LAUNCHER_OPEN_ALL_APPS = 26;
        LAUNCHER_ALL_APPS_SCROLL = 27;
        LAUNCHER_APP_LAUNCH_FROM_WIDGET = 28;
        SETTINGS_PAGE_SCROLL = 29;
        LOCKSCREEN_UNLOCK_ANIMATION = 30;
        SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON = 31;
        SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER = 32;
        SHADE_APP_LAUNCH_FROM_QS_TILE = 33;
        SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON = 34;
        STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP = 35;
        PIP_TRANSITION = 36;
        WALLPAPER_TRANSITION = 37;
        USER_SWITCH = 38;
        SPLASHSCREEN_AVD = 39;
        SPLASHSCREEN_EXIT_ANIM = 40;
        SCREEN_OFF = 41;
        SCREEN_OFF_SHOW_AOD = 42;
        ONE_HANDED_ENTER_TRANSITION = 43;
        ONE_HANDED_EXIT_TRANSITION = 44;
        UNFOLD_ANIM = 45;
        SUW_LOADING_TO_SHOW_INFO_WITH_ACTIONS = 46;
        SUW_SHOW_FUNCTION_SCREEN_WITH_ACTIONS = 47;
        SUW_LOADING_TO_NEXT_FLOW = 48;
        SUW_LOADING_SCREEN_FOR_STATUS = 49;
        SPLIT_SCREEN_ENTER = 50;
        SPLIT_SCREEN_EXIT = 51;
        LOCKSCREEN_LAUNCH_CAMERA = 52;
        SPLIT_SCREEN_RESIZE = 53;
        SETTINGS_SLIDER = 54;
        TAKE_SCREENSHOT = 55;
        VOLUME_CONTROL = 56;
        BIOMETRIC_PROMPT_TRANSITION = 57;
        SETTINGS_TOGGLE = 58;
    }

    optional InteractionType interaction_type = 1;

    // Number of frames rendered during the interaction.
    optional int64 total_frames = 2;

    // Number of frames that were skipped in rendering during the interaction.
    optional int64 missed_frames = 3;

    // Number of frames that were missed in Surface Flinger during the interaction.
    optional int64 sf_missed_frames = 5;

    // Number of frames that were missed in the app during the interaction.
    optional int64 app_missed_frames = 6;

    // Maximum time it took to render a single frame during the interaction.
    optional int64 max_frame_time_nanos = 4;

    // Maximum number of successive frames missed.
    optional int64 max_successive_missed_frames = 7;
}

/**
 * Event to track various latencies in SystemUI.
 *
 * Logged from:
 *  frameworks/base/core/java/com/android/internal/util/LatencyTracker.java
 */
message UIActionLatencyReported {
    enum ActionType {
        UNKNOWN = 0;
        ACTION_EXPAND_PANEL = 1;
        ACTION_TOGGLE_RECENTS = 2;
        ACTION_FINGERPRINT_WAKE_AND_UNLOCK = 3;
        ACTION_CHECK_CREDENTIAL = 4;
        ACTION_CHECK_CREDENTIAL_UNLOCKED = 5;
        ACTION_TURN_ON_SCREEN = 6;
        ACTION_ROTATE_SCREEN = 7;
        ACTION_FACE_WAKE_AND_UNLOCK = 8;
        ACTION_START_RECENTS_ANIMATION = 9;
        ACTION_ROTATE_SCREEN_CAMERA_CHECK = 10;
        ACTION_ROTATE_SCREEN_SENSOR = 11;
        ACTION_LOCKSCREEN_UNLOCK = 12;
        ACTION_USER_SWITCH = 13;
        ACTION_SWITCH_DISPLAY_UNFOLD = 14;
        ACTION_UDFPS_ILLUMINATE = 15;
        ACTION_SHOW_BACK_ARROW = 16;
        ACTION_LOAD_SHARE_SHEET = 17;
    }

    optional ActionType action = 1;

    optional int64 latency_millis = 2;
}

//////////////////////////////////////////////////////////////////////
// Pulled atoms below this line //
//////////////////////////////////////////////////////////////////////

/**
 * Pulls bytes transferred via wifi (Sum of foreground and background usage).
 *
 * Pulled from:
 *   StatsCompanionService (using BatteryStats to get which interfaces are wifi)
 */
message WifiBytesTransfer {
    optional int32 uid = 1 [(is_uid) = true];

    optional int64 rx_bytes = 2;

    optional int64 rx_packets = 3;

    optional int64 tx_bytes = 4;

    optional int64 tx_packets = 5;
}

/**
 * Pulls bytes transferred via wifi (separated by foreground and background usage).
 *
 * Pulled from:
 *   StatsCompanionService (using BatteryStats to get which interfaces are wifi)
 */
message WifiBytesTransferByFgBg {
    optional int32 uid = 1 [(is_uid) = true];

    // 1 denotes foreground and 0 denotes background. This is called Set in NetworkStats.
    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;
}

/**
 * Pulls bytes transferred via mobile networks (Sum of foreground and background usage).
 *
 * Pulled from:
 *   StatsCompanionService (using BatteryStats to get which interfaces are mobile data)
 */
message MobileBytesTransfer {
    optional int32 uid = 1 [(is_uid) = true];

    optional int64 rx_bytes = 2;

    optional int64 rx_packets = 3;

    optional int64 tx_bytes = 4;

    optional int64 tx_packets = 5;
}

/**
 * Pulls bytes transferred via mobile networks (separated by foreground and background usage).
 *
 * Pulled from:
 *   StatsCompanionService (using BatteryStats to get which interfaces are mobile data)
 */
message MobileBytesTransferByFgBg {
    optional int32 uid = 1 [(is_uid) = true];

    // 1 denotes foreground and 0 denotes background. This is called Set in
    // NetworkStats.
    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;
}

/**
 * Used for pull network statistics via mobile|wifi networks, and sliced by interesting dimensions.
 * Note that the data is expected to be sliced into more dimensions in future. In other words,
 * the caller must not assume any row of data is one full report when filtering with a set of
 * matching conditions, because future data may represent with multiple rows what is currently
 * represented by one.
 * To avoid being broken by future slicing, callers must take care to aggregate rows even if they
 * query all the existing columns.
 *
 * Pulled from:
 *   StatsPullAtomService (using NetworkStatsService to get NetworkStats)
 */
message DataUsageBytesTransfer {
    // State of this record. Should be NetworkStats#SET_DEFAULT or NetworkStats#SET_FOREGROUND to
    // indicate the foreground state, or NetworkStats#SET_ALL to indicate the record is for all
    // states combined, not including debug states. See NetworkStats#SET_*.
    optional int32 state = 1;

    optional int64 rx_bytes = 2;

    optional int64 rx_packets = 3;

    optional int64 tx_bytes = 4;

    optional int64 tx_packets = 5;

    // Radio Access Technology (RAT) type of this record, should be one of
    // TelephonyManager#NETWORK_TYPE_* constants, or NetworkTemplate#NETWORK_TYPE_ALL to indicate
    // the record is for all rat types combined.
    optional int32 rat_type = 6;

    // Mcc/Mnc read from sim if the record is for a specific subscription, null indicates the
    // record is combined across subscriptions.
    optional string sim_mcc = 7;
    optional string sim_mnc = 8;

    // Allows mobile virtual network operators (MVNOs) to be identified with individual IDs.
    // See TelephonyManager#getSimCarrierId.
    optional int32 carrier_id = 9;

    // Enumeration of opportunistic states with an additional ALL state indicates the record is
    // combined regardless of the boolean value in its field.
    enum DataSubscriptionState {
        UNKNOWN = 0; // For server side backward compatibility.
        ALL = 1;
        OPPORTUNISTIC = 2;
        NOT_OPPORTUNISTIC = 3;
    }
    // Mark whether the subscription is an opportunistic data subscription, and ALL indicates the
    // record is combined across opportunistic data subscriptions.
    // See {@link SubscriptionManager#setOpportunistic}.
    optional DataSubscriptionState opportunistic_data_sub = 10;

    // Indicate whether NR is connected, server side could use this with RAT type to determine if
    // the record is for 5G NSA (Non Stand Alone) mode, where the primary cell is still LTE and
    // network allocates a secondary 5G cell so telephony reports RAT = LTE along with NR state as
    // connected.
    optional bool is_nr_connected = 11;
}

/**
 * Note: This is a copy from DataUsageBytesTransfer and add a metered field.
 * TODO: DataUsageBytesTransfer should be eventually replaced with DataUsageBytesTransferV2.
 *
 * Used for pull network statistics via mobile|wifi networks, and sliced by interesting dimensions.
 * Note that the data is expected to be sliced into more dimensions in future. In other words,
 * the caller must not assume any row of data is one full report when filtering with a set of
 * matching conditions, because future data may represent with multiple rows what is currently
 * represented by one.
 * To avoid being broken by future slicing, callers must take care to aggregate rows even if they
 * query all the existing columns.
 *
 * Pulled from:
 *   StatsPullAtomService (using NetworkStatsService to get NetworkStats)
 */
message DataUsageBytesTransferV2 {
    // State of this record. Should be NetworkStats#SET_DEFAULT or NetworkStats#SET_FOREGROUND to
    // indicate the foreground state, or NetworkStats#SET_ALL to indicate the record is for all
    // states combined, not including debug states. See NetworkStats#SET_*.
    optional int32 state = 1;

    optional int64 rx_bytes = 2;

    optional int64 rx_packets = 3;

    optional int64 tx_bytes = 4;

    optional int64 tx_packets = 5;

    // Radio Access Technology (RAT) type of this record, should be one of
    // TelephonyManager#NETWORK_TYPE_* constants, or NetworkTemplate#NETWORK_TYPE_ALL to indicate
    // the record is for all rat types combined.
    optional int32 rat_type = 6;

    // Mcc/Mnc read from sim if the record is for a specific subscription, null indicates the
    // record is combined across subscriptions.
    optional string sim_mcc = 7;
    optional string sim_mnc = 8;

    // Allows mobile virtual network operators (MVNOs) to be identified with individual IDs.
    // See TelephonyManager#getSimCarrierId.
    optional int32 carrier_id = 9;

    // Enumeration of opportunistic states with an additional DSS_ALL state indicates the record is
    // combined regardless of the boolean value in its field.
    enum DataSubscriptionState {
        DSS_UNKNOWN = 0; // For server side backward compatibility.
        DSS_ALL = 1;
        DSS_OPPORTUNISTIC = 2;
        DSS_NOT_OPPORTUNISTIC = 3;
    }
    // Mark whether the subscription is an opportunistic data subscription, and ALL indicates the
    // record is combined across opportunistic data subscriptions.
    // See {@link SubscriptionManager#setOpportunistic}.
    optional DataSubscriptionState opportunistic_data_sub = 10;

    // Indicate whether NR is connected, server side could use this with RAT type to determine if
    // the record is for 5G NSA (Non Stand Alone) mode, where the primary cell is still LTE and
    // network allocates a secondary 5G cell so telephony reports RAT = LTE along with NR state as
    // connected.
    optional bool is_nr_connected = 11;

    // Enumeration of metered states.
    enum MeteredState {
        METERED_UNKNOWN = 0;
        METERED_ALL = 1;
        METERED_NO = 2;
        METERED_YES = 3;
    }
    // Mark the reported data is metered or non-metered, and METERED_ALL indicates the record is
    // combined across metered data.
    optional MeteredState metered = 12;
}

/**
 * Pulls bytes transferred via OEM managed networks. Data is split up by which
 * type of OEM managed network it is, what transport it went over, and if it was
 * in the foreground or background.
 *
 * Pulled from:
 *   StatsPullAtomService
 */
 message OemManagedBytesTransfer {
    optional int32 uid = 1 [(is_uid) = true];

    // 1 denotes foreground and 0 denotes background. This is called Set in
    // NetworkStats.
    optional bool is_foreground = 2;

    // Corresponds to the type of OEM managed network, see
    // {@link NetworkTemplate#OEM_MANAGED_ANY} and {@code NetworkIdentity#OEM_*}.
    optional int32 oem_managed_type = 3;

    // Corresponds to the type of transport the bytes were transferred over, see
    // {@link NetworkTemplate#transportToMatchRule} and
    // {@code NetworkCapabilities#TRANSPORT_*}
    optional int32 transport_type = 4;

    optional int64 rx_bytes = 5;

    optional int64 rx_packets = 6;

    optional int64 tx_bytes = 7;

    optional int64 tx_packets = 8;
  }

/**
 * Pulls bytes transferred via bluetooth. It is pulled from Bluetooth controller.
 *
 * Pulled from:
 *   StatsCompanionService
 */
message BluetoothBytesTransfer {
    optional int32 uid = 1 [(is_uid) = true];

    optional int64 rx_bytes = 2;

    optional int64 tx_bytes = 3;
}

/**
 * Pulls the kernel wakelock durations. This atom is adapted from
 * android/internal/os/KernelWakelockStats.java
 *
 * Pulled from:
 *   StatsCompanionService using KernelWakelockReader.
 */
message KernelWakelock {
    optional string name = 1;

    optional int32 count = 2;

    optional int32 version = 3;

    optional int64 time_micros = 4;
}

/**
 * Pulls power state information.
 * Pulled from:
 *   frameworks/base/services/core/java/com/android/server/powerstats/StatsPullAtomCallbackImpl.java
 */
message SubsystemSleepState {
    // Subsystem name
    optional string subsystem_name = 1;
    // For PlatformLowPowerStats (hal 1.0), this is the voter name, which could be empty.
    // For SubsystemLowPowerStats (hal 1.1), this is the sleep state name.
    // For PowerEntityStateResidencyResult (hal power/stats/1.0) this is the
    //    powerEntityStateName from the corresponding PowerEntityStateInfo.
    optional string subname = 2;
    // The number of times it entered, or voted for entering the sleep state
    optional uint64 count = 3;
    // The length of time spent in, or spent voting for, the sleep state
    optional uint64 time_millis = 4;
}

/**
 * Pulls on-device power measurement information.
 * Pulled from:
 *   frameworks/base/services/core/java/com/android/server/powerstats/StatsPullAtomCallbackImpl.java
 */
message OnDevicePowerMeasurement {
    // Name of the subsystem (to which the rail belongs).
    optional string subsystem_name = 1;

    // Rail name. The rail lies within the subsystem.
    optional string rail_name = 2;

    // Time (in ms since boot) at which the rail energy value was measured.
    // This may differ slightly from the time that statsd logs this information.
    optional uint64 measurement_timestamp_millis = 3;

    // Accumulated energy used via the rail since device boot in uWs.
    optional uint64 energy_microwatt_secs = 4;
}

/**
 * Pulls Cpu time per cluster per frequency.
 * This is tracked by the time_in_state eBPF program.
 */
message CpuTimePerClusterFreq {
    optional uint32 cluster = 1;
    optional uint32 freq_khz = 2;
    // Time spent at this frequency excluding sleep since tracking started.
    optional uint64 time_millis = 3;
}

/**
 * Pulls Cpu Time Per Uid.
 * Note that isolated process uid time should be attributed to host uids.
 */
message CpuTimePerUid {
    optional int32 uid = 1 [(is_uid) = true];
    optional uint64 user_time_micros = 2;
    optional uint64 sys_time_micros = 3;
}

/**
 * Pulls Cpu Cycles Per Uid Per Cluster.
 * Note that uids are transformed to reduce the number of uploaded entries. Shared GIDs are
 * combined under single uid LAST_SHARED_APPLICATION_GID. Individual isolated uids are excluded
 * because they are recycled and removed from the underlying data source. All uids are normalized
 * to their base uids.
 */
message CpuCyclesPerUidCluster {
    optional int32 uid = 1 [(is_uid) = true];
    optional int32 cluster = 2;
    // Megacycles, i.e. millions of cycles.
    optional int64 mcycles = 3;
    // Time excluding sleep since tracking started.
    optional int64 time_millis = 4;
    // Power estimate: time * average power for frequency / 1000.
    optional int64 power_profile_estimate = 5;
}

/**
 * Pulls Cpu Time Per Uid per frequency.
 * Note that uids are transformed to reduce the number of uploaded entries. Shared GIDs are
 * combined under single uid LAST_SHARED_APPLICATION_GID. Individual isolated uids are excluded
 * because they are recycled and removed from the underlying data source. All uids are normalized
 * to their base uids.
 */
message CpuTimePerUidFreq {
    optional int32 uid = 1 [(is_uid) = true];
    optional uint32 freq_index = 2;
    optional uint64 time_millis = 3;
}

/**
  * Pulls Cpu Cycles Per ThreadGroup Per Cluster.
  * This is tracked by the time_in_state eBPF program.
  */
message CpuCyclesPerThreadGroupCluster {
    enum ThreadGroup {
        UNKNOWN_THREAD_GROUP = 0;

        // System server threads serving Binder calls.
        SYSTEM_SERVER_BINDER = 1;

        // All system server threads.
        SYSTEM_SERVER = 2;

        // All surface flinger threads.
        SURFACE_FLINGER = 3;
    }
    optional ThreadGroup thread_group = 1;

    optional int32 cluster = 2;

    // Megacycles, i.e. millions of cycles.
    optional int64 mcycles = 3;
    // Time excluding sleep since tracking started.
    optional int64 time_millis = 4;
}

/**
 * Pulls Wifi Controller Activity Energy Info
 */
message WifiActivityInfo {
    // timestamp(wall clock) of record creation
    optional uint64 timestamp_millis = 1;
    // stack reported state
    // TODO: replace this with proto enum
    optional int32 stack_state = 2;
    // tx time in millis
    optional uint64 controller_tx_time_millis = 3;
    // rx time in millis
    optional uint64 controller_rx_time_millis = 4;
    // idle time in millis
    optional uint64 controller_idle_time_millis = 5;
    // product of current(mA), voltage(V) and time(ms)
    optional uint64 controller_energy_used = 6;
}

/**
 * Pulls Modem Activity Energy Info
 */
message ModemActivityInfo {
    // timestamp(wall clock) of record creation
    optional uint64 timestamp_millis = 1;
    // sleep time in millis.
    optional uint64 sleep_time_millis = 2;
    // idle time in millis
    optional uint64 controller_idle_time_millis = 3;
    /**
     * Tx power index
     * index 0 = tx_power < 0dBm
     * index 1 = 0dBm < tx_power < 5dBm
     * index 2 = 5dBm < tx_power < 15dBm
     * index 3 = 15dBm < tx_power < 20dBm
     * index 4 = tx_power > 20dBm
     */
    // tx time in ms at power level 0
    optional uint64 controller_tx_time_pl0_millis = 4;
    // tx time in ms at power level 1
    optional uint64 controller_tx_time_pl1_millis = 5;
    // tx time in ms at power level 2
    optional uint64 controller_tx_time_pl2_millis = 6;
    // tx time in ms at power level 3
    optional uint64 controller_tx_time_pl3_millis = 7;
    // tx time in ms at power level 4
    optional uint64 controller_tx_time_pl4_millis = 8;
    // rx time in ms at power level 5
    optional uint64 controller_rx_time_millis = 9;
    // product of current(mA), voltage(V) and time(ms)
    optional uint64 energy_used = 10 [deprecated=true];
}

/**
 * Pulls Bluetooth Activity Energy Info
 * Note: BluetoothBytesTransfer is pulled at the same time from the controller.
 */
message BluetoothActivityInfo {
    // timestamp(wall clock) of record creation
    optional uint64 timestamp_millis = 1;
    // bluetooth stack state
    optional int32 bluetooth_stack_state = 2;
    // tx time in millis
    optional uint64 controller_tx_time_millis = 3;
    // rx time in millis
    optional uint64 controller_rx_time_millis = 4;
    // idle time in millis
    optional uint64 controller_idle_time_millis = 5;
    // product of current(mA), voltage(V) and time(ms)
    optional uint64 energy_used = 6;
}

/*
 * Logs the memory stats for a process.
 *
 * Pulled from StatsCompanionService for all managed processes (from ActivityManagerService).
 */
message ProcessMemoryState {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The process name.
    // Usually package name, "system" for system server.
    // Provided by ActivityManagerService.
    optional string process_name = 2;

    // Current OOM score adjustment. Value read from ProcessRecord.
    optional int32 oom_adj_score = 3;

    // # of page-faults
    optional int64 page_fault = 4;

    // # of major page-faults
    optional int64 page_major_fault = 5;

    // RSS
    // Value is read from memory.stat, field total_rss if per-app memory
    // cgroups are enabled. Otherwise, value from /proc/pid/stat.
    optional int64 rss_in_bytes = 6;

    // CACHE
    // Value is read from memory.stat, field total_cache if per-app memory
    // cgroups are enabled. Otherwise, 0.
    optional int64 cache_in_bytes = 7;

    // SWAP
    // Value is read from memory.stat, field total_swap if per-app memory
    // cgroups are enabled. Otherwise, 0.
    optional int64 swap_in_bytes = 8;

    // Deprecated: use ProcessMemoryHighWaterMark atom instead. Always -1.
    optional int64 rss_high_watermark_in_bytes = 9 [deprecated = true];

    // Deprecated: use ProcessMemorySnapshot atom instead. Always -1.
    optional int64 start_time_nanos = 10 [deprecated = true];

    // Deprecated: use ProcessMemorySnapshot atom instead. Always -1.
    optional int32 anon_rss_and_swap_in_kilobytes = 11 [deprecated = true];
}

/*
 * Logs the memory high-water mark for a process.
 *
 * Pulled from StatsCompanionService for all managed processes (from ActivityManagerServie)
 * and for selected native processes.
 *
 * Pulling this atom resets high-water mark counters for all processes.
 */
message ProcessMemoryHighWaterMark {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The process name.
    // Usually package name or process cmdline.
    // Provided by ActivityManagerService or read from /proc/PID/cmdline.
    optional string process_name = 2;

    // Deprecated: use rss_high_water_mark_in_kilobytes instead. This field is
    // computed by converting kilobytes to bytes.
    optional int64 rss_high_water_mark_in_bytes = 3 [deprecated = true];

    // RSS high-water mark. Peak RSS usage of the process. Read from the VmHWM field in
    // /proc/PID/status.
    optional int32 rss_high_water_mark_in_kilobytes = 4;
}

/*
 * Logs the memory stats for a process.
 *
 * Pulled from StatsCompanionService for all managed processes (from ActivityManagerService)
 * and for selected native processes.
 */
message ProcessMemorySnapshot {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The process name.
    // Usually package name or process cmdline.
    // Provided by ActivityManagerService or read from /proc/PID/cmdline.
    optional string process_name = 2;

    // The pid of the process.
    // Allows to disambiguate instances of the process.
    optional int32 pid = 3;

    // The current OOM score adjustment value.
    // Read from ProcessRecord for managed processes.
    // Placeholder -1001 (OOM_SCORE_ADJ_MIN - 1, outside of allowed range) for native ones.
    optional int32 oom_score_adj = 4;

    // The current RSS of the process.
    // VmRSS from /proc/pid/status.
    optional int32 rss_in_kilobytes = 5;

    // The current anon RSS of the process.
    // RssAnon from /proc/pid/status.
    optional int32 anon_rss_in_kilobytes = 6;

    // The current swap size of the process.
    // VmSwap from /proc/pid/status.
    optional int32 swap_in_kilobytes = 7;

    // The sum of rss_in_kilobytes and swap_in_kilobytes.
    optional int32 anon_rss_and_swap_in_kilobytes = 8;

    // GPU memory usage as measured by the kernel tracepoints
    // Equivalent to dumpsys gpu --gpumem
    optional int32 gpu_memory_kb = 9;

    // Whether or not this process is hosting one or more foregound services.
    optional bool has_foreground_services = 10;
}

/*
 * Elapsed real time from SystemClock.
 */
message SystemElapsedRealtime {
    optional uint64 time_millis = 1;
}

/*
 * Up time from SystemClock.
 */
message SystemUptime {
    // Milliseconds since the system was booted.
    // This clock stops when the system enters deep sleep (CPU off, display dark, device waiting
    // for external input).
    // It is not affected by clock scaling, idle, or other power saving mechanisms.
    optional uint64 uptime_millis = 1;
}

/*
 * Reads from /proc/uid_concurrent_active_time which has the format:
 * active: X (X is # cores)
 * [uid0]: [time-0] [time-1] [time-2] ... (# entries = # cores)
 * [uid1]: [time-0] [time-1] [time-2] ... ...
 * ...
 * Time-N means the CPU time a UID spent running concurrently with N other processes.
 * The file contains a monotonically increasing count of time for a single boot.
 */
message CpuActiveTime {
    optional int32 uid = 1 [(is_uid) = true];
    optional uint64 time_millis = 2;
}

/**
 * Reads from /proc/uid_concurrent_policy_time which has the format:
 * policy0: X policy4: Y (there are X cores on policy0, Y cores on policy4)
 * [uid0]: [time-0-0] [time-0-1] ... [time-1-0] [time-1-1] ...
 * [uid1]: [time-0-0] [time-0-1] ... [time-1-0] [time-1-1] ...
 * ...
 * Time-X-Y means the time a UID spent on clusterX running concurrently with Y other processes.
 * The file contains a monotonically increasing count of time for a single boot.
 */
message CpuClusterTime {
    optional int32 uid = 1 [(is_uid) = true];
    optional int32 cluster_index = 2;
    optional uint64 time_millis = 3;
}

/*
 * Pulls free disk space, for data, system partition and temporary directory.
 */
message DiskSpace {
    // available bytes in data partition
    optional uint64 data_available_bytes = 1;
    // available bytes in system partition
    optional uint64 system_available_bytes = 2;
    // available bytes in download cache or temp directories
    optional uint64 temp_available_bytes = 3;
}

/**
 * Pulls battery coulomb counter, which is the remaining battery charge in uAh.
 *
 * Pulled from StatsCompanionService.java
 */
message RemainingBatteryCapacity {
    optional int32 charge_micro_ampere_hour = 1;
}

/**
 * Pulls battery capacity, which is the battery capacity when full in uAh.
 * Pulled from:
 *   frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
 */
message FullBatteryCapacity {
    optional int32 capacity_micro_ampere_hour = 1;
}

/**
 * Pulls battery voltage.
 * Pulled from:
 *   frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
 */
message BatteryVoltage {
    // The voltage of the battery, in millivolts.
    optional int32 voltage_millivolt = 1;
}

/**
 * Pulls battery level (percent full, from 0 to 100).
 *
 * Pulled from:
 *   frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
 */
message BatteryLevel {
    // Battery level. Should be in [0, 100].
    optional int32 battery_level = 1;
}

/**
 * Pulls the temperature of various parts of the device.
 * The units are tenths of a degree Celsius. Eg: 30.3C is reported as 303.
 *
 * Pulled from StatsCompanionService.java
 */
message Temperature {
    // The type of temperature being reported. Eg. CPU, GPU, SKIN, BATTERY, BCL_.
    optional android.os.TemperatureTypeEnum sensor_location = 1;

    // The name of the temperature source. Eg. CPU0
    optional string sensor_name = 2;

    // Temperature in tenths of a degree C.
    // For BCL, it is decimillivolt, decimilliamps, and percentage * 10.
    optional int32 temperature_deci_celsius = 3;

    // Relative severity of the throttling, see enum definition.
    optional android.os.ThrottlingSeverityEnum severity = 4;
}

/**
 * Pulls the statistics of calls to Binder.
 *
 * Binder stats will be reset every time the data is pulled. It means it can only be pulled by one
 * config on the device.
 *
 * Next tag: 15
 */
message BinderCalls {
    // UID of the process responsible for the binder transaction. It will be set if the process
    // executing the binder transaction attribute the transaction to another uid using
    // Binder.setThreadWorkSource().
    //
    // If not set, the value will be -1.
    optional int32 uid = 1 [(is_uid) = true];
    // UID of the process executing the binder transaction.
    optional int32 direct_caller_uid = 14;
    // Fully qualified class name of the API call.
    //
    // This is a system server class name.
    //
    // TODO(gaillard): figure out if binder call stats includes data from isolated uids, if a uid
    // gets recycled and we have isolated uids, we might attribute the data incorrectly.
    // TODO(gaillard): there is a high dimensions cardinality, figure out if we should drop the less
    // commonly used APIs.
    optional string service_class_name = 2;
    // Method name of the API call. It can also be a transaction code if we cannot
    // resolve it to a name. See Binder#getTransactionName.
    //
    // This is a system server method name.
    optional string service_method_name = 3;
    // Total number of API calls.
    optional int64 call_count = 4;
    // True if the screen was interactive PowerManager#isInteractive at the end of the call.
    optional bool screen_interactive = 13;
    // Total number of API calls we have data recorded for. If we collected data for all the calls,
    // call_count will be equal to recorded_call_count.
    //
    // If recorded_call_count is different than call_count, it means data collection has been
    // sampled. All the fields below will be sampled in this case.
    optional int64 recorded_call_count = 12;
    // Number of exceptions thrown by the API.
    optional int64 recorded_exception_count = 5;
    // Total latency of all API calls.
    // Average can be computed using total_latency_micros / recorded_call_count.
    optional int64 recorded_total_latency_micros = 6;
    // Maximum latency of one API call.
    optional int64 recorded_max_latency_micros = 7;
    // Total CPU usage of all API calls.
    // Average can be computed using total_cpu_micros / recorded_call_count.
    // Total can be computed using total_cpu_micros / recorded_call_count * call_count.
    optional int64 recorded_total_cpu_micros = 8;
    // Maximum CPU usage of one API call.
    optional int64 recorded_max_cpu_micros = 9;
    // Maximum parcel reply size of one API call.
    optional int64 recorded_max_reply_size_bytes = 10;
    // Maximum parcel request size of one API call.
    optional int64 recorded_max_request_size_bytes = 11;
}

/**
 * Pulls the statistics of exceptions during calls to Binder.
 *
 * Binder stats are cumulative from boot unless somebody reset the data using
 * > adb shell dumpsys binder_calls_stats --reset
 */
message BinderCallsExceptions {
    // Exception class name, e.g. java.lang.IllegalArgumentException.
    //
    // This is an exception class name thrown by the system server.
    optional string exception_class_name = 1;
    // Total number of exceptions.
    optional int64 exception_count = 2;
}

/**
 * Pulls the statistics of message dispatching on HandlerThreads.
 *
 * Looper stats will be reset every time the data is pulled. It means it can only be pulled by one
 * config on the device.
 *
 * Next tag: 11
 */
message LooperStats {
    // The uid that made a call to the System Server and caused the message to be enqueued.
    optional int32 uid = 1 [(is_uid) = true];

    // Fully qualified class name of the handler target class.
    //
    // This field does not contain PII. This is a system server class name.
    optional string handler_class_name = 2;

    // The name of the thread that runs the Looper.
    //
    // This field does not contain PII. This is a system server thread name.
    optional string looper_thread_name = 3;

    // The name of the dispatched message.
    //
    // This field does not contain PII. This is a system server constant or class
    // name.
    optional string message_name = 4;

    // Total number of successfully dispatched messages.
    optional int64 message_count = 5;

    // Total number of messages that failed dispatching.
    optional int64 exception_count = 6;

    // Total number of processed messages we have data recorded for. If we
    // collected data for all the messages, message_count will be equal to
    // recorded_message_count.
    //
    // If recorded_message_count is different than message_count, it means data
    // collection has been sampled. The fields below will be sampled in this case.
    optional int64 recorded_message_count = 7;

    // Total latency of all processed messages.
    // Average can be computed using recorded_total_latency_micros /
    // recorded_message_count.
    optional int64 recorded_total_latency_micros = 8;

    // Total CPU usage of all processed message.
    // Average can be computed using recorded_total_cpu_micros /
    // recorded_message_count. Total can be computed using
    // recorded_total_cpu_micros / recorded_message_count * message_count.
    optional int64 recorded_total_cpu_micros = 9;

    // True if the screen was interactive PowerManager#isInteractive at the end of the call.
    optional bool screen_interactive = 10;

    // Max recorded CPU usage of all processed messages.
    optional int64 recorded_max_cpu_micros = 11;

    // Max recorded latency of all processed messages.
    optional int64 recorded_max_latency_micros = 12;

    // Total number of messages we tracked the dispatching delay for. If we
    // collected data for all the messages, message_count will be equal to
    // recorded_delay_message_count.
    //
    // If recorded_delay_message_count is different than message_count, it means data
    // collection has been sampled or/and not all messages specified the target dispatch time.
    // The fields below will be sampled in this case.
    optional int64 recorded_delay_message_count = 13;

    // Total dispatching delay of all processed messages.
    // Calculated as a difference between the target dispatching time (Message.when)
    // and the actual dispatching time.
    // Average can be computed using recorded_total_delay_millis / recorded_delay_message_count.
    optional int64 recorded_total_delay_millis = 14;

    // Max dispatching delay of all processed messages.
    // Calculated as a difference between the target dispatching time (Message.when)
    // and the actual dispatching time.
    optional int64 recorded_max_delay_millis = 15;
}

/**
 * Pulls disk information, such as write speed and latency.
 */
message DiskStats {
    // Time taken to open, write 512B to, and close a file.
    // -1 if error performing the check.
    optional int64 data_write_latency_millis = 1;

    optional bool file_based_encryption = 2;

    // Recent disk write speed in kB/s.
    // -1 if error querying storageed.
    // 0 if data is unavailable.
    optional int32 recent_disk_write_speed = 3;
}


/**
 * Free and total bytes of the Data, Cache, System, and Metadata partitions.
 */
message DirectoryUsage {
    enum Directory {
        UNKNOWN = 0;
        DATA = 1;
        CACHE = 2;
        SYSTEM = 3;
        METADATA = 4;
    }
    optional Directory directory = 1;
    optional int64 free_bytes = 2;
    optional int64 total_bytes = 3;
}


/**
 * Size of an application: apk size, data size, and cache size.
 * Reads from a cached file produced daily by DiskStatsLoggingService.java.
 * Information is only reported for apps with the primary user (user 0).
 * Sizes are aggregated by package name.
 */
message AppSize {
    // Including uids will involve modifying diskstats logic.
    optional string package_name = 1;
    // App size in bytes. -1 if unavailable.
    optional int64 app_size_bytes = 2;
    // App data size in bytes. -1 if unavailable.
    optional int64 app_data_size_bytes = 3;
    // App cache size in bytes. -1 if unavailable.
    optional int64 app_cache_size_bytes = 4;
    // Time that the cache file was produced.
    // Uses System.currentTimeMillis(), which is wall clock time.
    optional int64 cache_time_millis = 5;
}


/**
 * Size of a particular category. Eg: photos, videos.
 * Reads from a cached file produced daily by DiskStatsLoggingService.java.
 */
message CategorySize {
    enum Category {
        UNKNOWN = 0;
        APP_SIZE = 1;
        APP_DATA_SIZE = 2;
        APP_CACHE_SIZE = 3;
        PHOTOS = 4;
        VIDEOS = 5;
        AUDIO = 6;
        DOWNLOADS = 7;
        SYSTEM = 8;
        OTHER = 9;
    }
    optional Category category = 1;
    // Category size in bytes.
    optional int64 size_bytes = 2;
    // Time that the cache file was produced.
    // Uses System.currentTimeMillis(), which is wall clock time.
    optional int64 cache_time_millis = 3;
}

/**
 * Pulls per uid I/O stats. The stats are cumulative since boot.
 *
 * Read/write bytes are I/O events from a storage device
 * Read/write chars are data requested by read/write syscalls, and can be
 *   satisfied by caching.
 *
 * Pulled from StatsCompanionService, which reads proc/uid_io/stats.
 */
message DiskIo {
    optional int32 uid = 1 [(is_uid) = true];
    optional int64 fg_chars_read = 2;
    optional int64 fg_chars_write = 3;
    optional int64 fg_bytes_read = 4;
    optional int64 fg_bytes_write = 5;
    optional int64 bg_chars_read = 6;
    optional int64 bg_chars_write = 7;
    optional int64 bg_bytes_read = 8;
    optional int64 bg_bytes_write = 9;
    optional int64 fg_fsync = 10;
    optional int64 bg_fsync= 11;
}


/**
 * Pulls the number of fingerprints for each user.
 *
 * Pulled from StatsCompanionService, which queries <Biometric>Manager.
 */
message NumFingerprintsEnrolled {
    // The associated user. Eg: 0 for owners, 10+ for others.
    // Defined in android/os/UserHandle.java
    optional int32 user = 1;
    // Number of fingerprints registered to that user.
    optional int32 num_fingerprints_enrolled = 2;
}

/**
 * Pulls the number of faces for each user.
 *
 * Pulled from StatsCompanionService, which queries <Biometric>Manager.
 */
message NumFacesEnrolled {
    // The associated user. Eg: 0 for owners, 10+ for others.
    // Defined in android/os/UserHandle.java
    optional int32 user = 1;
    // Number of faces registered to that user.
    optional int32 num_faces_enrolled = 2;
}
/**
 * A mapping of role holder -> role
 */
message RoleHolder {
    // uid of the role holder
    optional int32 uid = 1 [(is_uid) = true];

    // package name of the role holder
    optional string package_name = 2;

    // the role held
    optional string role = 3;
}

message AggStats {
    // These are all in byte resolution.
    optional int64 min = 1 [deprecated = true];
    optional int64 average = 2 [deprecated = true];
    optional int64 max = 3 [deprecated = true];

    // These are all in kilobyte resolution. Can fit in int32, so smaller on the wire than the above
    // int64 fields.
    optional int32 mean_kb = 4;
    optional int32 max_kb = 5;
}

// A reduced subset of process states; reducing the number of possible states allows more
// aggressive device-side aggregation of statistics and hence reduces metric upload size.
enum ProcessStateAggregated {
    PROCESS_STATE_UNKNOWN = 0;
    // Persistent system process.
    PROCESS_STATE_PERSISTENT = 1;
    // Top activity; actually any visible activity.
    PROCESS_STATE_TOP = 2;
    // Process binding to top or a foreground service.
    PROCESS_STATE_BOUND_TOP_OR_FGS = 3;
    // Processing running a foreground service.
    PROCESS_STATE_FGS = 4;
    // Important foreground process (ime, wallpaper, etc).
    PROCESS_STATE_IMPORTANT_FOREGROUND = 5;
    // Important background process.
    PROCESS_STATE_BACKGROUND = 6;
    // Process running a receiver.
    PROCESS_STATE_RECEIVER = 7;
    // All kinds of cached processes.
    PROCESS_STATE_CACHED = 8;
}

// Next tag: 13
message ProcessStatsStateProto {
    optional android.service.procstats.ScreenState screen_state = 1;

    optional android.service.procstats.MemoryState memory_state = 2 [deprecated = true];

    // this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
    // and not frameworks/base/core/java/android/app/ActivityManager.java
    optional android.service.procstats.ProcessState process_state = 3 [deprecated = true];

    optional ProcessStateAggregated process_state_aggregated = 10;

    // Millisecond uptime duration spent in this state
    optional int64 duration_millis = 4 [deprecated = true];
    // Same as above, but with minute resolution so it fits into an int32.
    optional int32 duration_minutes = 11;

    // Millisecond elapsed realtime duration spent in this state
    optional int64 realtime_duration_millis = 9 [deprecated = true];
    // Same as above, but with minute resolution so it fits into an int32.
    optional int32 realtime_duration_minutes = 12;

    // # of samples taken
    optional int32 sample_size = 5;

    // PSS is memory reserved for this process
    optional AggStats pss = 6 [deprecated = true];

    // USS is memory shared between processes, divided evenly for accounting
    optional AggStats uss = 7 [deprecated = true];

    // RSS is memory resident for this process
    optional AggStats rss = 8;
}

// Next Tag: 8
message ProcessStatsProto {
    // Name of process.
    optional string process = 1;

    // Uid of the process.
    optional int32 uid = 2 [(is_uid) = true];

    // Information about how often kills occurred
    message Kill {
        // Count of excessive CPU kills
        optional int32 cpu = 1;

        // Count of kills when cached
        optional int32 cached = 2;

        // PSS stats during cached kill
        optional AggStats cached_pss = 3;
    }
    optional Kill kill = 3 [deprecated = true];

    // Time and memory spent in various states.
    repeated ProcessStatsStateProto states = 5;

    // Total time process has been running...  screen_state, memory_state, and process_state
    // will not be set.
    optional ProcessStatsStateProto total_running_state = 6;

    // Association data for this process in this state;
    // each entry here is one association.
    repeated ProcessStatsAssociationProto assocs = 7;
}

// Next Tag: 6
message ProcessStatsAssociationProto {
    // Procss Name of the associated process (client process of service binding)
    optional string assoc_process_name = 1;

    // Package Name of the associated package (client package of service binding)
    optional string assoc_package_name = 2 [deprecated = true];

    // UID of the associated process/package (client package of service binding)
    optional int32 assoc_uid = 5 [(is_uid) = true];

    // Total count of the times this association (service binding) appeared.
    optional int32 total_count = 3;

    // Uptime total duration in seconds this association (service binding) was around.
    optional int32 total_duration_secs = 4;
}

message PackageServiceOperationStatsProto {
    // Operate enum: Started, Foreground, Bound, Executing
    optional android.service.procstats.ServiceOperationState operation = 1;

    // Number of times the service was in this operation.
    optional int32 count = 2;

    // Information about a state the service can be in.
    message StateStats {
        // Screen state enum.
        optional android.service.procstats.ScreenState screen_state = 1;
        // Memory state enum.
        optional android.service.procstats.MemoryState memory_state = 2;

        // duration in milliseconds.
        optional int64 duration_millis = 3;
        // Millisecond elapsed realtime duration spent in this state
        optional int64 realtime_duration_millis = 4;
    }
    repeated StateStats state_stats = 3;
}

message PackageServiceStatsProto {
    // Name of service component.
    optional string service_name = 1;

    // The operation stats.
    // The package_name, package_uid, package_version, service_name will not be set to save space.
    repeated PackageServiceOperationStatsProto operation_stats = 2;
}

message PackageAssociationSourceProcessStatsProto {
    // Uid of the process.
    optional int32 process_uid = 1;
    // Process name.
    optional string process_name = 2;
    // Package name.
    optional string package_name = 7;
    // Total count of the times this association appeared.
    optional int32 total_count = 3;

    // Millisecond uptime total duration this association was around.
    optional int64 total_duration_millis = 4;

    // Total count of the times this association became actively impacting its target process.
    optional int32 active_count = 5;

    // Information on one source in this association.
    message StateStats {
        // Process state enum.
        optional android.service.procstats.ProcessState process_state = 1;
        // Millisecond uptime duration spent in this state
        optional int64 duration_millis = 2;
        // Millisecond elapsed realtime duration spent in this state
        optional int64 realtime_duration_mmillis = 3;
    }
    repeated StateStats active_state_stats = 6;
}

message PackageAssociationProcessStatsProto {
    // Name of the target component.
    optional string component_name = 1;
    // Information on one source in this association.
    repeated PackageAssociationSourceProcessStatsProto sources = 2;
}


message ProcessStatsPackageProto {
    // Name of package.
    optional string package = 1;

    // Uid of the package.
    optional int32 uid = 2;

    // Version of the package.
    optional int64 version = 3;

    // Stats for each process running with the package loaded in to it.
    repeated ProcessStatsProto process_stats = 4;

    // Stats for each of the package's services.
    repeated PackageServiceStatsProto service_stats = 5;

    // Stats for each association with the package.
    repeated PackageAssociationProcessStatsProto association_stats = 6;
}

message ProcessStatsSectionProto {
    // Elapsed realtime at start of report.
    optional int64 start_realtime_millis = 1;

    // Elapsed realtime at end of report.
    optional int64 end_realtime_millis = 2;

    // CPU uptime at start of report.
    optional int64 start_uptime_millis = 3;

    // CPU uptime at end of report.
    optional int64 end_uptime_millis = 4;

    // System runtime library. e.g. "libdvm.so", "libart.so".
    optional string runtime = 5;

    // whether kernel reports swapped pss.
    optional bool has_swapped_pss = 6;

    // Data completeness. e.g. "complete", "partial", shutdown", or "sysprops".
    enum Status {
        STATUS_UNKNOWN = 0;
        STATUS_COMPLETE = 1;
        STATUS_PARTIAL = 2;
        STATUS_SHUTDOWN = 3;
        STATUS_SYSPROPS = 4;
    }
    repeated Status status = 7;

    // Number of pages available of various types and sizes, representation fragmentation.
    repeated ProcessStatsAvailablePagesProto available_pages = 10;

    // Stats for each process.
    repeated ProcessStatsProto process_stats = 8;

    // Stats for each package.
    repeated ProcessStatsPackageProto package_stats = 9;
}

message ProcessStatsAvailablePagesProto {
    // Node these pages are in (as per /proc/pagetypeinfo)
    optional int32 node = 1;

    // Zone these pages are in (as per /proc/pagetypeinfo)
    optional string zone = 2;

    // Label for the type of these pages (as per /proc/pagetypeinfo)
    optional string label = 3;

    // Distribution of number of pages available by order size.  First entry in array is
    // order 0, second is order 1, etc.  Each order increase is a doubling of page size.
    repeated int32 pages_per_order = 4;
}

/**
 * Pulled from ProcessStatsService.java
 */
message ProcStats {
    optional ProcessStatsSectionProto proc_stats_section = 1 [(log_mode) = MODE_BYTES];
    // Data pulled from device into this is sometimes sharded across multiple atoms to work around
    // a size limit. When this happens, this shard ID will contain an increasing 1-indexed integer
    // with the number of this shard.
    optional int32 shard_id = 2;
}

/**
 * Pulled from ProcessStatsService.java
 */
message ProcStatsPkgProc {
    optional ProcessStatsSectionProto proc_stats_section = 1 [(log_mode) = MODE_BYTES];
}

// Next Tag: 2
message PackageRemoteViewInfoProto {
    optional string package_name = 1;
    // add per-package additional info here (like channels)
}

// Next Tag: 2
message NotificationRemoteViewsProto {
    repeated PackageRemoteViewInfoProto package_remote_view_info = 1;
}

/**
 * Pulled from NotificationManagerService.java
 */
message NotificationRemoteViews {
    optional NotificationRemoteViewsProto notification_remote_views = 1 [(log_mode) = MODE_BYTES];
}

/**
 * Atom that contains a list of a package's preferences, pulled from NotificationManagerService.java
 */
message PackageNotificationPreferences {
    // Uid under which the package is installed.
    optional int32 uid = 1 [(is_uid) = true];
    // Notification importance, which specifies when and how a notification is displayed.
    // Specified under core/java/android/app/NotificationManager.java.
    optional int32 importance = 2;
    // Lockscreen visibility as set by the user.
    optional int32 visibility = 3;
    // Bitfield mask indicating what fields were locked by the user (see LockableAppfields in
    // PreferencesHelper.java)
    optional int32 user_locked_fields = 4;
    // Indicates if the package importance was set by the user (rather than system default).
    optional bool user_set_importance = 5;
}

/**
 * Atom that contains a list of a package's channel preferences, pulled from
 * NotificationManagerService.java.
 */
message PackageNotificationChannelPreferences {
    // Uid under which the package is installed.
    optional int32 uid = 1 [(is_uid) = true];
    // Channel's ID. Should always be available.
    optional string channel_id = 2;
    // Channel's name. Should always be available.
    optional string channel_name = 3;
    // Channel's description. Optionally set by the channel creator.
    optional string description = 4;
    // Notification importance, which specifies when and how a notification is displayed. Specified
    // under core/java/android/app/NotificationManager.java.
    optional int32 importance = 5;
    // Bitmask representing which fields have been set by the user. See field bitmask descriptions
    // at core/java/android/app/NotificationChannel.java
    optional int32 user_locked_fields = 6;
    // Indicates if the channel was deleted by the app.
    optional bool is_deleted = 7;
    // Indicates if the channel was marked as a conversation by the app.
    optional bool is_conversation = 8;
    // Indicates if the channel is a conversation that was demoted by the user.
    optional bool is_demoted_conversation = 9;
    // Indicates if the channel is a conversation that was marked as important by the user.
    optional bool is_important_conversation = 10;
}

/**
 * Atom that represents an item in the list of Do Not Disturb rules, pulled from
 * NotificationManagerService.java.
 */
message DNDModeProto {
    enum Mode {
        ROOT_CONFIG = -1;  // Used to distinguish the config (one per user) from the rules.
        ZEN_MODE_OFF = 0;
        ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
        ZEN_MODE_NO_INTERRUPTIONS = 2;
        ZEN_MODE_ALARMS = 3;
    }
    optional int32 user = 1;  // Android user ID (0, 1, 10, ...)
    optional bool enabled = 2;  // true for ROOT_CONFIG if a manualRule is enabled
    optional bool channels_bypassing = 3; // only valid for ROOT_CONFIG
    optional Mode zen_mode = 4;
    // id is one of the system default rule IDs, or empty
    // May also be "MANUAL_RULE" to indicate app-activation of the manual rule.
    optional string id = 5;
    optional int32 uid = 6 [(is_uid) = true]; // currently only SYSTEM_UID or 0 for other
    optional DNDPolicyProto policy = 7 [(log_mode) = MODE_BYTES];
}

/**
 * Atom that represents a Do Not Disturb policy, an optional detail proto for DNDModeProto.
 */
message DNDPolicyProto {
    enum State {
        STATE_UNSET = 0;
        STATE_ALLOW = 1;
        STATE_DISALLOW = 2;
    }
    optional State calls = 1;
    optional State repeat_callers = 2;
    optional State messages = 3;
    optional State conversations = 4;
    optional State reminders = 5;
    optional State events = 6;
    optional State alarms = 7;
    optional State media = 8;
    optional State system = 9;
    optional State fullscreen = 10;
    optional State lights = 11;
    optional State peek = 12;
    optional State status_bar = 13;
    optional State badge = 14;
    optional State ambient = 15;
    optional State notification_list = 16;

    enum PeopleType {
        PEOPLE_UNSET = 0;
        PEOPLE_ANYONE = 1;
        PEOPLE_CONTACTS = 2;
        PEOPLE_STARRED = 3;
        PEOPLE_NONE = 4;
    }

    optional PeopleType allow_calls_from = 17;
    optional PeopleType allow_messages_from = 18;

    enum ConversationType {
        CONV_UNSET = 0;
        CONV_ANYONE = 1;
        CONV_IMPORTANT = 2;
        CONV_NONE = 3;
    }

    optional ConversationType allow_conversations_from = 19;
}

/**
 * Atom that contains a list of a package's channel group preferences, pulled from
 * NotificationManagerService.java.
 */
message PackageNotificationChannelGroupPreferences {
    // Uid under which the package is installed.
    optional int32 uid = 1 [(is_uid) = true];
    // Channel Group's ID. Should always be available.
    optional string group_id = 2;
    // Channel Group's name. Should always be available.
    optional string group_name = 3;
    // Channel Group's description. Optionally set by group creator.
    optional string description = 4;
    // Indicates if notifications from this channel group are blocked.
    optional bool is_blocked = 5;
    // Bitmask representing which fields have been set by the user. See field bitmask descriptions
    // at core/java/android/app/NotificationChannelGroup.java
    optional int32 user_locked_fields = 6;
}

message PowerProfileProto {
    optional double cpu_suspend = 1;

    optional double cpu_idle = 2;

    optional double cpu_active = 3;

    message CpuCluster {
        optional int32 id = 1;
        optional double cluster_power = 2;
        optional int32 cores = 3;
        repeated int64 speed = 4;
        repeated double core_power = 5;
    }

    repeated CpuCluster cpu_cluster = 40;

    optional double wifi_scan = 4;

    optional double wifi_on = 5;

    optional double wifi_active = 6;

    optional double wifi_controller_idle = 7;

    optional double wifi_controller_rx = 8;

    optional double wifi_controller_tx = 9;

    repeated double wifi_controller_tx_levels = 10;

    optional double wifi_controller_operating_voltage = 11;

    optional double bluetooth_controller_idle = 12;

    optional double bluetooth_controller_rx = 13;

    optional double bluetooth_controller_tx = 14;

    optional double bluetooth_controller_operating_voltage = 15;

    optional double modem_controller_sleep = 16;

    optional double modem_controller_idle = 17;

    optional double modem_controller_rx = 18;

    repeated double modem_controller_tx = 19;

    optional double modem_controller_operating_voltage = 20;

    optional double gps_on = 21;

    repeated double gps_signal_quality_based = 22;

    optional double gps_operating_voltage = 23;

    optional double bluetooth_on = 24;

    optional double bluetooth_active = 25;

    optional double bluetooth_at_cmd = 26;

    optional double ambient_display = 27;

    optional double screen_on = 28;

    optional double radio_on = 29;

    optional double radio_scanning = 30;

    optional double radio_active = 31;

    optional double screen_full = 32;

    optional double audio = 33;

    optional double video = 34;

    optional double flashlight = 35;

    optional double memory = 36;

    optional double camera = 37;

    optional double wifi_batched_scan = 38;

    optional double battery_capacity = 39;
}

/**
 * power_profile.xml and other constants for power model calculations.
 * Pulled from PowerProfile.java
 */
message PowerProfile {
    optional PowerProfileProto power_profile = 1 [(log_mode) = MODE_BYTES];
}

/**
 * Logs when a user restriction was added or removed.
 *
 * Logged from:
 *   frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
 */
message UserRestrictionChanged {
    // The raw string of the user restriction as defined in UserManager.
    // Allowed values are defined in UserRestrictionsUtils#USER_RESTRICTIONS.
    optional string restriction = 1;
    // Whether the restriction is enabled or disabled.
    optional bool enabled = 2;
}

/**
 * Pulls process user time and system time. Puller takes a snapshot of all pids
 * in the system and returns cpu stats for those that are working at the time.
 * Dead pids will be dropped. Kernel processes are excluded.
 * Min cool-down is 5 sec.
 */
message ProcessCpuTime {
    optional int32 uid = 1 [(is_uid) = true];

    optional string process_name = 2;
    // Process cpu time in user space, cumulative from boot/process start
    optional int64 user_time_millis = 3;
    // Process cpu time in system space, cumulative from boot/process start
    optional int64 system_time_millis = 4;
}

/**
 * Pulls the CPU usage for each thread.
 *
 * Read from /proc/$PID/task/$TID/time_in_state files.
 *
 * TODO(mishaw): This is an experimental atom. Issues with big/little CPU frequencies, and
 * time_in_state files not being present on some phones, have not been addressed. These should be
 * considered before a public release.
 */
message CpuTimePerThreadFreq {
    // UID that owns the process.
    optional int32 uid = 1 [(is_uid) = true];
    // ID of the process.
    optional int32 process_id = 2;
    // ID of the thread.
    optional int32 thread_id = 3;
    // Name of the process taken from `/proc/$PID/cmdline`.
    optional string process_name = 4;
    // Name of the thread taken from `/proc/$PID/task/$TID/comm`
    optional string thread_name = 5;

    // Report eight different frequencies, and how much time is spent in each frequency. Frequencies
    // are given in KHz, and time is given in milliseconds since the thread started. All eight
    // frequencies are given here as the alternative is sending eight separate atoms. This method
    // significantly reduces the amount of data created
    optional int32 frequency1_khz = 6;
    optional int32 time1_millis = 7;
    optional int32 frequency2_khz = 8;
    optional int32 time2_millis = 9;
    optional int32 frequency3_khz = 10;
    optional int32 time3_millis = 11;
    optional int32 frequency4_khz = 12;
    optional int32 time4_millis = 13;
    optional int32 frequency5_khz = 14;
    optional int32 time5_millis = 15;
    optional int32 frequency6_khz = 16;
    optional int32 time6_millis = 17;
    optional int32 frequency7_khz = 18;
    optional int32 time7_millis = 19;
    optional int32 frequency8_khz = 20;
    optional int32 time8_millis = 21;
}

/**
 * Pulls information about the device's build.
 */
message BuildInformation {
    // Build.FINGERPRINT. A string that uniquely identifies this build. Do not parse.
    // E.g. may be composed of the brand, product, device, release, id, incremental, type, and tags.
    optional string fingerprint = 1;

    // Build.BRAND. The consumer-visible brand with which the product/hardware will be associated.
    optional string brand = 2;

    // Build.PRODUCT. The name of the overall product.
    optional string product = 3;

    // Build.DEVICE. The name of the industrial design.
    optional string device = 4;

    // Build.VERSION.RELEASE. The user-visible version string.  E.g., "1.0" or "3.4b5" or "bananas".
    optional string version_release = 5;

    // Build.ID. E.g. a label like "M4-rc20".
    optional string id = 6;

    // Build.VERSION.INCREMENTAL. The internal value used by the underlying source control to
    // represent this build.
    optional string version_incremental = 7;

    // Build.TYPE. The type of build, like "user" or "eng".
    optional string type = 8;

    // Build.TAGS. Comma-separated tags describing the build, like "unsigned,debug".
    optional string tags = 9;
}

/**
 * Logs information about mismatched caller for content capture.
 *
 * Logged from:
 *   frameworks/base/core/java/android/service/contentcapture/ContentCaptureService.java
 */
message ContentCaptureCallerMismatchReported {
    optional string intended_package = 1;
    optional string calling_package = 2;
}

/**
 * Logs information about content capture service events.
 *
 * Logged from:
 *   frameworks/base/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureMetricsLogger.java
 */
message ContentCaptureServiceEvents {
    // The type of event.
    enum Event {
        UNKNOWN = 0;
        ON_CONNECTED = 1;
        ON_DISCONNECTED = 2;
        SET_WHITELIST = 3;
        SET_DISABLED = 4;
        ON_USER_DATA_REMOVED = 5;
        ON_DATA_SHARE_REQUEST = 6;
        ACCEPT_DATA_SHARE_REQUEST = 7;
        REJECT_DATA_SHARE_REQUEST = 8;
        DATA_SHARE_WRITE_FINISHED = 9;
        DATA_SHARE_ERROR_IOEXCEPTION = 10;
        DATA_SHARE_ERROR_EMPTY_DATA = 11;
        DATA_SHARE_ERROR_CLIENT_PIPE_FAIL = 12;
        DATA_SHARE_ERROR_SERVICE_PIPE_FAIL = 13;
        DATA_SHARE_ERROR_CONCURRENT_REQUEST = 14;
        DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED = 15;
        ON_REMOTE_SERVICE_DIED = 16;
    }
    optional Event event = 1;
    // component/package of content capture service.
    optional string service_info = 2;
    // component/package of target.
    // it's a concatenated list of component/package for SET_WHITELIST event
    // separated by " ".
    // Deprecated: should not log app package
    optional string target_info = 3 [deprecated = true];
    // The number of packages in the allow list
    optional int32 set_allowlist_package_count = 4;
    // The number of activities in the allow list
    optional int32 set_allowlist_activity_count = 5;
}

/**
 * Logs information about content capture session events.
 *
 * Logged from:
 *   frameworks/base/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureMetricsLogger.java
 */
message ContentCaptureSessionEvents {
    // The type of event.
    enum Event {
        UNKNOWN = 0;
        ON_SESSION_STARTED = 1;
        ON_SESSION_FINISHED = 2;
        SESSION_NOT_CREATED = 3;
    }
    optional int32 session_id = 1;
    optional Event event = 2;
    // (n/a on session finished)
    optional int32 state_flags = 3;
    // component/package of content capture service.
    optional string service_info = 4;
    // component/package of app.
    // (n/a on session finished)
    // Deprecated: should not log app package
    optional string app_info = 5 [deprecated = true];
    optional bool is_child_session = 6;
}

/**
 * Logs information about session being flushed.
 *
 * Logged from:
 *   frameworks/base/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureMetricsLogger.java
 */
message ContentCaptureFlushed {
    optional int32 session_id = 1;
    // component/package of content capture service.
    optional string service_info = 2;
    // component/package of app.
    // Deprecated: should not log app package
    optional string app_info = 3 [deprecated = true];
    // session start/finish events
    optional int32 child_session_started = 4;
    optional int32 child_session_finished = 5;
    // count of view events.
    optional int32 view_appeared_count = 6;
    optional int32 view_disappeared_count = 7;
    optional int32 view_text_changed_count = 8;

    // Flush stats.
    optional int32 max_events = 9;
    optional int32 idle_flush_freq = 10;
    optional int32 text_flush_freq = 11;
    optional int32 flush_reason = 12;
}

/**
 * Pulls on-device BatteryStats power use calculations for the overall device.
 */
message DeviceCalculatedPowerUse {
    // Power used by the device in nAs (i.e. nanocoulombs (nC)), as computed by BatteryStats, since
    // BatteryStats last reset (i.e. roughly since device was last significantly charged).
    // Currently, this is from BatteryStatsHelper.getComputedPower() (not getTotalPower()).
    optional int64 computed_power_nano_amp_secs = 1;
}

// Keep in sync with frameworks/base/core/proto/android/os/batteryusagestats.proto
/**
 * Represents a device's BatteryUsageStats, with power usage information about the device
 * and each app.
 */
message BatteryUsageStatsAtomsProto {

    // The session start timestamp in UTC milliseconds since January 1, 1970, per Date#getTime().
    // All data is no older than this time.
    optional int64 session_start_millis = 1;

    // The session end timestamp in UTC milliseconds since January 1, 1970, per Date#getTime().
    // All data is no more recent than this time.
    optional int64 session_end_millis = 2;

    // Length that the reported data covered. This usually will be equal to the entire session,
    // session_end_millis - session_start_millis, but may not be if some data during this time frame
    // is missing.
    optional int64 session_duration_millis = 3;

    // Represents usage of a consumer, storing all of its power component usage.
    message BatteryConsumerData {
        // Total power consumed by this BatteryConsumer (including all of its PowerComponents).
        // May not equal the sum of the PowerComponentUsage due to under- or over-estimations.
        // Multiply by 1/36 to obtain mAh.
        optional int64 total_consumed_power_deci_coulombs = 1;

        // Represents power and time usage of a particular power component.
        message PowerComponentUsage {
            // Holds android.os.PowerComponentEnum, or custom component value between 1000 and 9999.
            // Evidently, if one attempts to write an int to an enum field that is out of range, it
            // is treated as 0, so we must make this an int32.
            optional int32 component = 1;

            // Power consumed by this component. Multiply by 1/36 to obtain mAh.
            optional int64 power_deci_coulombs = 2;

            optional int64 duration_millis = 3;
        }
        repeated PowerComponentUsage power_components = 2;

        // Represents a slice of power attribution, e.g. "cpu while in the background"
        // or "wifi when running a background service".  Queries that care about
        // PowerComponentUsage slices need to be aware of all supported dimensions.
        // There are no roll-ups included in the slices - it is up to the clients
        // of this data to aggregate values as needed.
        message PowerComponentUsageSlice {
            optional PowerComponentUsage power_component = 1;

            enum ProcessState {
                UNSPECIFIED = 0;
                FOREGROUND = 1;
                BACKGROUND = 2;
                FOREGROUND_SERVICE = 3;
            }

            optional ProcessState process_state = 2;
        }

        repeated PowerComponentUsageSlice slices = 3;
    }

    // Total power usage for the device during this session.
    optional BatteryConsumerData device_battery_consumer = 4;

    // Power usage by a uid during this session.
    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;
    }
    repeated UidBatteryConsumer uid_battery_consumers = 5;

    // Sum of all discharge percentage point drops during the reported session.
    optional int32 session_discharge_percentage = 6;

    // Total amount of time battery was discharging during the reported session
    optional int64 discharge_duration_millis = 7;
}

/**
 * Pulls on-device BatteryStats on-battery power use calculations, in the form of BatteryUsageStats,
 * using the best data available.
 *
 * Includes the data since the last time statsd pulled this atom (i.e. since the
 * last-BatteryStats-reset-prior-to-last-statsd-pull) until the most recent BatteryStats reset.
 *
 * Does NOT include data after the most recent reset (use BatteryUsageStatsSinceReset too for that).
 *
 * Pulled from BatteryManager.getBatteryUsageStats().
 */
message BatteryUsageStatsBeforeReset {
    optional BatteryUsageStatsAtomsProto battery_usage_stats = 1 [(log_mode) = MODE_BYTES];
}

/**
 * Pulls on-device BatteryStats on-battery power use calculations, in the form of BatteryUsageStats,
 * using the best data available.
 *
 * Includes all data since the most recent BatteryStats reset event, but none prior to it.
 *
 * Pulled from BatteryManager.getBatteryUsageStats().
 */
message BatteryUsageStatsSinceReset {
    optional BatteryUsageStatsAtomsProto battery_usage_stats = 1 [(log_mode) = MODE_BYTES];
}

/**
 * Pulls on-device BatteryStats on-battery power use calculations, in the form of BatteryUsageStats,
 * using only PowerProfile Model data (even if better data is available).
 *
 * Includes all data since the most recent BatteryStats reset event, but none prior to it.
 *
 * @see android.os.BatteryUsageStatsQuery#FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL
 * Pulled from BatteryManager.getBatteryUsageStats().
 */
message BatteryUsageStatsSinceResetUsingPowerProfileModel {
    optional BatteryUsageStatsAtomsProto battery_usage_stats = 1 [(log_mode) = MODE_BYTES];
}

/**
 * Logs device policy features.
 *
 * Logged from:
 *   frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
 *   packages/apps/ManagedProvisioning/src/com/android/managedprovisioning/
 */
message DevicePolicyEvent {
    // The event id - unique for each event.
    optional android.stats.devicepolicy.EventId event_id = 1;
    // The admin package name.
    optional string admin_package_name = 2;
    // A generic integer parameter.
    optional int32 integer_value = 3;
    // A generic boolean parameter.
    optional bool boolean_value = 4;
    // A parameter specifying a time period in milliseconds.
    optional uint64 time_period_millis = 5;
    // A parameter specifying a list of package names, bundle extras or string parameters.
    optional android.stats.devicepolicy.StringList string_list_value = 6 [(log_mode) = MODE_BYTES];
}

/**
 * Logs when DocumentsUI is started, and how. Call this when DocumentsUI first starts up.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUILaunchReported {
    optional android.stats.docsui.LaunchAction launch_action = 1;
    optional bool has_initial_uri = 2;
    optional android.stats.docsui.MimeType mime_type = 3;
    optional android.stats.docsui.Root initial_root = 4;
}

/**
 * Logs root/app visited event in file managers/picker. Call this when the user
 * taps on root/app in hamburger menu.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIRootVisitedReported {
    optional android.stats.docsui.ContextScope scope = 1;
    optional android.stats.docsui.Root root = 2;
}

/**
 * Logs file operation stats. Call this when a file operation has completed.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIFileOperationReported {
    optional android.stats.docsui.Provider provider = 1;
    optional android.stats.docsui.FileOperation file_op = 2;
}

/**
 * Logs file operation stats. Call this when a copy/move operation has completed with a specific
 * mode.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIFileOperationCopyMoveModeReported {
    optional android.stats.docsui.FileOperation file_op = 1;
    optional android.stats.docsui.CopyMoveOpMode mode = 2;
}


/**
 * Logs file sub operation stats. Call this when a file operation has failed.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIFileOperationFailureReported {
    optional android.stats.docsui.Authority authority = 1;
    optional android.stats.docsui.SubFileOperation sub_op = 2;
}

/**
* Logs the cancellation of a file operation. Call this when a job is canceled
*
* Logged from:
*     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
*/
message DocsUIFileOperationCanceledReported {
    optional android.stats.docsui.FileOperation file_op = 1;
}

/**
 * Logs startup time in milliseconds.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIStartupMsReported {
    optional int32 startup_millis = 1;
}

/**
 * Logs the action that was started by user.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIUserActionReported {
    optional android.stats.docsui.UserAction action = 1;
}

/**
 * Logs the invalid type when invalid scoped access is requested.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/ScopedAccessMetrics.java
 */
message DocsUIInvalidScopedAccessRequestReported {
    optional android.stats.docsui.InvalidScopedAccess type = 1;
}

/**
 * Logs the package name that launches docsui picker mode.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIPickerLaunchedFromReported {
    optional string package_name = 1;
}

/**
 * Logs the search type.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUISearchTypeReported {
    optional android.stats.docsui.SearchType search_type = 1;
}

/**
 * Logs the search mode.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUISearchModeReported {
    optional android.stats.docsui.SearchMode search_mode = 1;
}

/**
 * Logs the pick result information.
 *
 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIPickResultReported {
    optional int32 total_action_count = 1;
    optional int64 duration_millis = 2;
    optional int32 file_count= 3;
    optional bool is_searching = 4;
    optional android.stats.docsui.Root picked_from = 5;
    optional android.stats.docsui.MimeType mime_type = 6;
    optional int32 repeatedly_pick_times = 7;
}

/** Logs the drag and drop of files.

 * Logged from:
 *     package/app/DocumentsUI/src/com/android/documentsui/Metrics.java
 */
message DocsUIDragAndDropReported {
    optional bool drag_initiated_from_docsui = 1;
}

/**
 * Logs when an app's memory is compacted.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
 */
message AppCompacted {
  // The pid of the process being compacted.
  optional int32 pid = 1;

  // The name of the process being compacted.
  optional string process_name = 2;

  // The type of compaction.
  enum Action {
    UNKNOWN = 0;
    SOME = 1;
    FULL = 2;
    PERSISTENT = 3;
    BFGS = 4;
  }
  optional Action action = 3;

  // Total RSS in kilobytes consumed by the process prior to compaction.
  optional int64 before_rss_total_kilobytes = 4;

  // File RSS in kilobytes consumed by the process prior to compaction.
  optional int64 before_rss_file_kilobytes = 5;

  // Anonymous RSS in kilobytes consumed by the process prior to compaction.
  optional int64 before_rss_anon_kilobytes = 6;

  // Swap in kilobytes consumed by the process prior to compaction.
  optional int64 before_swap_kilobytes = 7;

  // Total RSS in kilobytes consumed by the process after compaction.
  optional int64 after_rss_total_kilobytes = 8;

  // File RSS in kilobytes consumed by the process after compaction.
  optional int64 after_rss_file_kilobytes = 9;

  // Anonymous RSS in kilobytes consumed by the process after compaction.
  optional int64 after_rss_anon_kilobytes = 10;

  // Swap in kilobytes consumed by the process after compaction.
  optional int64 after_swap_kilobytes = 11;

  // The time taken to perform compaction in milliseconds.
  optional int64 time_to_compact_millis = 12;

  // The last compaction action performed for this app.
  optional Action last_action = 13;

  // The last time that compaction was attempted on this process in milliseconds
  // since boot, not including sleep (see SystemClock.uptimeMillis()).
  optional int64 last_compact_timestamp_ms_since_boot = 14;

  // The "setAdj" (i.e. previous) oom_score_adj at the time of compaction.
  optional int32 oom_score_adj = 15;

  // The process state at the time of compaction.
  optional android.app.ProcessStateEnum process_state = 16 [default = PROCESS_STATE_UNKNOWN];

  // Free ZRAM in kilobytes before compaction.
  optional int64 before_zram_free_kilobytes = 17;

  // Free ZRAM in kilobytes after compaction.
  optional int64 after_zram_free_kilobytes = 18;
}

/**
 * Logs when a Tethering event occurs.
 *
 */
message NetworkTetheringReported {
  // tethering error code
  optional android.stats.connectivity.ErrorCode error_code = 1;

  // tethering downstream type
  optional android.stats.connectivity.DownstreamType downstream_type = 2;

  // transport type of upstream network
  optional android.stats.connectivity.UpstreamType upstream_type = 3;

  // The user type of Tethering
  optional android.stats.connectivity.UserType user_type= 4;
}

/**
 * Logs a DNS lookup operation initiated by the system resolver on behalf of an application
 * invoking native APIs such as getaddrinfo() or Java APIs such as Network#getAllByName().
 *
 * The NetworkDnsEventReported message represents the entire lookup operation, which may
 * result one or more queries to the recursive DNS resolvers. Those are individually logged
 * in DnsQueryEvents to enable computing error rates and network latency and timeouts
 * broken up by query type, transport, network interface, etc.
 */
message NetworkDnsEventReported {
    optional android.stats.dnsresolver.EventType event_type = 1;

    optional android.stats.dnsresolver.ReturnCode return_code = 2;

    // The latency in microseconds of the entire DNS lookup operation.
    optional int32 latency_micros = 3;

    // Only valid for event_type = EVENT_GETADDRINFO.
    optional int32 hints_ai_flags = 4;

    // Flags passed to android_res_nsend() defined in multinetwork.h
    // Only valid for event_type = EVENT_RESNSEND.
    optional int32 res_nsend_flags = 5;

    optional android.stats.dnsresolver.NetworkType network_type = 6;

    // The DNS over TLS mode on a specific netId.
    optional android.stats.dnsresolver.PrivateDnsModes private_dns_modes = 7;

    // Additional pass-through fields opaque to statsd.
    // The DNS resolver Mainline module can add new fields here without requiring an OS update.
    optional android.stats.dnsresolver.DnsQueryEvents dns_query_events = 8 [(log_mode) = MODE_BYTES];

    // The sample rate of DNS stats (to statsd) is 1/sampling_rate_denom.
    optional int32 sampling_rate_denom = 9;
}

/**
 * The NetworkDnsHandshakeReported message describes a DoT or DoH handshake operation along with
 * its result, cause, network latency, TLS version, etc.
 *
 */
message NetworkDnsHandshakeReported {
  optional android.stats.dnsresolver.Protocol protocol = 1;

  optional android.stats.dnsresolver.HandshakeResult result = 2;

  optional android.stats.dnsresolver.HandshakeCause cause = 3;

  optional android.stats.dnsresolver.NetworkType network_type = 4;

  optional android.stats.dnsresolver.PrivateDnsModes private_dns_mode = 5;

  // The latency in microseconds of the entire handshake operation.
  optional int32 latency_micros = 6;

  // Sent packets in bytes.
  optional int32 bytes_sent = 7;

  // Received packets in bytes.
  optional int32 bytes_received = 8;

  // Number of round-trips.
  optional int32 round_trips = 9;

  // True if TLS session cache hit.
  optional bool tls_session_cache_hit = 10;

  // 2 = TLS 1.2, 3 = TLS 1.3
  optional int32 tls_version = 11;

  // True if the handshake requires verifying the private DNS provider hostname.
  optional bool hostname_verification = 12;

  // Only present when protocol = PROTO_DOH.
  optional int32 quic_version = 13;

  optional int32 server_index = 14;

  // The sampling-rate of this event is 1/sampling_rate_denom.
  optional int32 sampling_rate_denom = 15;
}

/**
 * logs the CapportApiData info
 * Logged from:
 * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
 */
message CapportApiData {
    // The TTL of the network connection provided by captive portal
    optional int32 remaining_ttl_secs = 1;

    // The limit traffic data of the network connection provided by captive portal
    optional int32 remaining_bytes = 2;

    // Is portal url option included in the DHCP packet (Yes, No)
    optional bool has_portal_url = 3;

    // Is venue info (e.g. store info, maps, flight status) included (Yes, No)
    optional bool has_venue_info = 4;
}

/**
 * logs a network Probe Event
 * Logged from:
 * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
 */
message ProbeEvent {
    // The probe type (http or https, or captive portal API...)
    optional android.stats.connectivity.ProbeType probe_type = 1;

    // The latency in microseconds of the probe event
    optional int32 latency_micros = 2;

    // The result of the probe event
    optional android.stats.connectivity.ProbeResult probe_result = 3;

    // The CaptivePortal API info
    optional CapportApiData capport_api_data = 4;
}

/**
 * log each ProbeEvent in ProbeEvents
 * Logged from:
 * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
 */
message ProbeEvents {
    // Record probe event during the validation
    repeated ProbeEvent probe_event = 1;
}

/**
 * The DHCP (Dynamic Host Configuration Protocol) session info
 * Logged from:
 * packages/modules/NetworkStack/src/android/net/dhcp/DhcpClient.java
 */
message DhcpSession {
    // The DHCP Feature(s) enabled in this session
    repeated android.stats.connectivity.DhcpFeature used_features = 1;

    // The discover packet (re)transmit count
    optional int32 discover_count = 2;

    // The request packet (re)transmit count
    optional int32 request_count = 3;

    // The IPv4 address conflict count
    // (only be meaningful when duplicate address detection is enabled)
    optional int32 conflict_count = 4;

    // The DHCP packet parsing error code in this session
    // (defined in android.net.metrics.DhcpErrorEvent)
    repeated android.stats.connectivity.DhcpErrorCode error_code = 5;

    // The result of DHCP hostname transliteration
    optional android.stats.connectivity.HostnameTransResult ht_result = 6;
}

/**
 * Logs Network IP provisioning event
 * Logged from:
 * packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkIpProvisioningMetrics.java
 */
message NetworkIpProvisioningReported {
    // Transport type (WIFI, CELLULAR, BLUETOOTH, ..)
    optional android.stats.connectivity.TransportType transport_type = 1;

    // The latency in microseconds of IP Provisioning over IPV4
    optional int32 ipv4_latency_micros = 2;

    // The latency in microseconds of IP Provisioning over IPV6
    optional int32 ipv6_latency_micros = 3;

    // The time duration between provisioning start and end (success or failure)
    optional int64 provisioning_duration_micros = 4;

    // The specific disconnect reason for this IP provisioning
    optional android.stats.connectivity.DisconnectCode disconnect_code = 5;

    // Log DHCP session info (Only valid for IPv4)
    optional DhcpSession dhcp_session = 6 [(log_mode) = MODE_BYTES];

    // The random number between 0 ~ 999 for sampling
    optional int32 random_number = 7;
}

/**
 * Logs Network DHCP Renew event
 * Logged from:
 * packages/modules/NetworkStack/src/android/net/dhcp/DhcpClient.java
 */
message NetworkDhcpRenewReported {
    // Transport type (WIFI, CELLULAR, BLUETOOTH, ..)
    optional android.stats.connectivity.TransportType transport_type = 1;

    // The request packet (re)transmit count
    optional int32 request_count = 2;

    // The latency in microseconds of DHCP Renew
    optional int32 latency_micros = 3;

    // The DHCP error code is defined in android.net.metrics.DhcpErrorEvent
    optional android.stats.connectivity.DhcpErrorCode error_code = 4;

    // The result of DHCP renew
    optional android.stats.connectivity.DhcpRenewResult renew_result = 5;

    // The random number between 0 ~ 999 for sampling
    optional int32 random_number = 6;
}

/**
 * Logs Network Validation event
 * Logged from:
 * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
 */
message NetworkValidationReported {
    // Transport type (WIFI, CELLULAR, BLUETOOTH, ..)
    optional android.stats.connectivity.TransportType transport_type = 1;

    // Record each probe event
    optional ProbeEvents probe_events = 2 [(log_mode) = MODE_BYTES];

    // The result of the network validation
    optional android.stats.connectivity.ValidationResult validation_result = 3;

    // The latency in microseconds of network validation
    optional int32 latency_micros = 4;

    // The validation index (the first validation attempt or second, third...)
    optional int32 validation_index = 5;

    // The random number between 0 ~ 999 for sampling
    optional int32 random_number = 6;
}

/**
 * Logs NetworkStack Quirk event
 * Logged from:
 * packages/modules/NetworkStack/src/com/android/networkstack/
 */
message NetworkStackQuirkReported {
    // Transport type (WIFI, CELLULAR, BLUETOOTH, ..)
    optional android.stats.connectivity.TransportType transport_type = 1;

    // Record each Quirk event
    optional android.stats.connectivity.NetworkQuirkEvent event = 2;
}

/**
 * Logs Neighbor Unreachability Detection event
 * Logged from:
 * packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkIpReachabilityMonitorMetrics.java
 */
message NetworkIpReachabilityMonitorReported {
    // Neighbor Unreachability Detection event.
    optional android.stats.connectivity.NudEventType event_type = 1;

    // NUD probe based on IPv4 ARP or IPv6 ND packet.
    optional android.stats.connectivity.IpType ip_type = 2;

    // NUD neighbor type, default gateway, DNS server or both.
    optional android.stats.connectivity.NudNeighborType neighbor_type = 3;
}

/**
 * Logs when a data stall event occurs.
 *
 * Log from:
 *     packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
 */
message DataStallEvent {
    // Data stall evaluation type.
    // See packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
    // Refer to the definition of DATA_STALL_EVALUATION_TYPE_*.
    optional int32 evaluation_type = 1;
    // See definition in data_stall_event.proto.
    optional com.android.server.connectivity.ProbeResult validation_result = 2;
    // See definition in data_stall_event.proto.
    optional android.net.Transport network_type = 3;
    // See definition in data_stall_event.proto.
    optional com.android.server.connectivity.WifiData wifi_info = 4 [(log_mode) = MODE_BYTES];
    // See definition in data_stall_event.proto.
    optional com.android.server.connectivity.CellularData cell_info = 5 [(log_mode) = MODE_BYTES];
    // See definition in data_stall_event.proto.
    optional com.android.server.connectivity.DnsEvent dns_event = 6 [(log_mode) = MODE_BYTES];
    // The tcp packets fail rate from the latest tcp polling.
    optional int32 tcp_fail_rate = 7;
    // Number of packets sent since the last received packet.
    optional int32 tcp_sent_since_last_recv = 8;
}

/*
 * Logs when RescueParty resets some set of experiment flags.
 *
 * Logged from:
 *     frameworks/base/services/core/java/com/android/server/RescueParty.java
 */
message RescuePartyResetReported {
    // The rescue level of this reset. A value of 0 indicates missing or unknown level information.
    optional int32 rescue_level = 1;
}

/**
 * Logs when signed config is received from an APK, and if that config was applied successfully.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/signedconfig/SignedConfigService.java
 */
message SignedConfigReported {
    enum Type {
        UNKNOWN_TYPE = 0;
        GLOBAL_SETTINGS = 1;
    }
    optional Type type = 1;

    // The final status of the signed config received.
    enum Status {
        UNKNOWN_STATUS = 0;
        APPLIED = 1;
        BASE64_FAILURE_CONFIG = 2;
        BASE64_FAILURE_SIGNATURE = 3;
        SECURITY_EXCEPTION = 4;
        INVALID_CONFIG = 5;
        OLD_CONFIG = 6;
        SIGNATURE_CHECK_FAILED = 7;
        NOT_APPLICABLE = 8;
        SIGNATURE_CHECK_FAILED_PROD_KEY_ABSENT = 9;
    }
    optional Status status = 2;

    // The version of the signed config processed.
    optional int32 version = 3;

    // The package name that the config was extracted from.
    optional string from_package = 4;

    enum Key {
        NO_KEY = 0;
        DEBUG = 1;
        PRODUCTION = 2;
    }
    // Which key was used to verify the config.
    optional Key verified_with = 5;
}

/*
 * Logs GNSS Network-Initiated (NI) location events.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java
 */
message GnssNiEventReported {
    // The type of GnssNiEvent.
    enum EventType {
        UNKNOWN = 0;
        NI_REQUEST = 1;
        NI_RESPONSE = 2;
    }
    optional EventType event_type = 1;

    // An ID generated by HAL to associate NI notifications and UI responses.
    optional int32 notification_id = 2;

    // A type which distinguishes different categories of NI request, such as VOICE, UMTS_SUPL etc.
    optional android.server.location.GnssNiType ni_type = 3;

    // NI requires notification.
    optional bool need_notify = 4;

    // NI requires verification.
    optional bool need_verify = 5;

    // NI requires privacy override, no notification/minimal trace.
    optional bool privacy_override = 6;

    // Timeout period to wait for user response. Set to 0 for no timeout limit. Specified in
    // seconds.
    optional int32 timeout = 7;

    // Default response when timeout.
    optional android.server.location.GnssUserResponseType default_response = 8;

    // String representing the requester of the network inititated location request.
    optional string requestor_id = 9;

    // Notification message text string representing the service(for eg. SUPL-service) who sent the
    // network initiated location request.
    optional string text = 10;

    // requestorId decoding scheme.
    optional android.server.location.GnssNiEncodingType requestor_id_encoding = 11;

    // Notification message text decoding scheme.
    optional android.server.location.GnssNiEncodingType text_encoding = 12;

    // True if SUPL ES is enabled.
    optional bool is_supl_es_enabled = 13;

    // True if GNSS location is enabled.
    optional bool is_location_enabled = 14;

    // GNSS NI responses which define the response in NI structures.
    optional android.server.location.GnssUserResponseType user_response = 15;
}

/**
 * Logs GNSS non-framework (NFW) location notification.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java
 */
message GnssNfwNotificationReported {
    // Package name of the Android proxy application representing the non-framework entity that
    // requested location. Set to empty string if unknown.
    optional string proxy_app_package_name = 1;

    // Protocol stack that initiated the non-framework location request.
    optional android.server.location.NfwProtocolStack protocol_stack = 2;

    // Name of the protocol stack if protocol_stack field is set to OTHER_PROTOCOL_STACK. Otherwise,
    // set to empty string. This field is opaque to the framework and used for logging purposes.
    optional string other_protocol_stack_name = 3;

    // Source initiating/receiving the location information.
    optional android.server.location.NfwRequestor requestor = 4;

    // Identity of the endpoint receiving the location information. For example, carrier name, OEM
    // name, SUPL SLP/E-SLP FQDN, chipset vendor name, etc. This field is opaque to the framework
    // and used for logging purposes.
    optional string requestor_id = 5;

    // Indicates whether location information was provided for this request.
    optional android.server.location.NfwResponseType response_type = 6;

    // True if the device is in user initiated emergency session.
    optional bool in_emergency_mode = 7;

    // True if cached location is provided.
    optional bool is_cached_location = 8;

    // True if proxy app permission mismatch between framework and GNSS HAL.
    optional bool is_permission_mismatched = 9;
}

/**
 * Logs GNSS configuration as defined in IGnssConfiguration.hal.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/location/GnssConfiguration.java
 */
message GnssConfigurationReported {
    // SUPL host name.
    optional string supl_host = 1;

    // SUPL port number.
    optional int32 supl_port = 2;

    // C2K host name.
    optional string c2k_host = 3;

    // C2K port number.
    optional int32 c2k_port = 4;

    // The SUPL version requested by Carrier.
    optional int32 supl_ver = 5;

    // The SUPL mode.
    optional android.server.location.SuplMode supl_mode = 6;

    // True if NI emergency SUPL restrictions is enabled.
    optional bool supl_es = 7;

    // LTE Positioning Profile settings
    optional android.server.location.LppProfile lpp_profile = 8;

    // Positioning protocol on A-Glonass system.
    optional android.server.location.GlonassPosProtocol a_glonass_pos_protocol_select = 9;

    // True if emergency PDN is used. Otherwise, regular PDN is used.
    optional bool use_emergency_pdn_for_emergency_supl= 10;

    // Configurations of how GPS functionalities should be locked when user turns off GPS On setting.
    optional android.server.location.GpsLock gps_lock = 11;

    // Number of seconds to extend the emergency session duration post emergency call.
    optional int32 es_extension_sec = 12;

    // The full list of package names of proxy Android applications representing the non-framework
    // location access entities (on/off the device) for which the framework user has granted
    // non-framework location access permission. The package names are concatenated in one string
    // with spaces as separators.
    optional string enabled_proxy_app_package_name_list = 13;
}

/**
 * Logs GNSS PSDS downloads as defined in IGnssPsds.aidl.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/location/gnss/GnssPsdsDownloader.java
 */
message GnssPsdsDownloadReported {
    // PSDS type as defined in PsdsType.aidl
    optional int32 psds_type = 1;
}

/**
 * Logs when a NFC device's error occurred.
 * Logged from:
 *     system/nfc/src/nfc/nfc/nfc_ncif.cc
 *     packages/apps/Nfc/src/com/android/nfc/cardemulation/AidRoutingManager.java
 */
message NfcErrorOccurred {
    enum Type {
        UNKNOWN = 0;
        CMD_TIMEOUT = 1;
        ERROR_NOTIFICATION = 2;
        AID_OVERFLOW = 3;
    }
    optional Type type = 1;
    // If it's nci cmd timeout, log the timeout command.
    optional uint32 nci_cmd = 2;

    optional uint32 error_ntf_status_code = 3;
}

/**
 * Logs when a NFC device's state changed event
 * Logged from:
 *     packages/apps/Nfc/src/com/android/nfc/NfcService.java
 */
message NfcStateChanged {
    enum State {
        UNKNOWN = 0;
        OFF = 1;
        ON = 2;
        ON_LOCKED = 3; // Secure Nfc enabled.
        CRASH_RESTART = 4; // NfcService watchdog timeout restart.
    }
    optional State state = 1;
}

/**
 * Logs when a NFC Beam Transaction occurred.
 * Logged from:
 *     packages/apps/Nfc/src/com/android/nfc/P2pLinkManager.java
 */
message NfcBeamOccurred {
    enum Operation {
        UNKNOWN = 0;
        SEND = 1;
        RECEIVE = 2;
    }
    optional Operation operation = 1;
}

/**
 * Logs when a NFC Card Emulation Transaction occurred.
 * Logged from:
 *     packages/apps/Nfc/src/com/android/nfc/cardemulation/HostEmulationManager.java
 *     packages/apps/Nfc/src/com/android/nfc/cardemulation/HostNfcFEmulationManager.java
 */
message NfcCardemulationOccurred {
    enum Category {
        UNKNOWN = 0;
        HCE_PAYMENT = 1;
        HCE_OTHER = 2;
        OFFHOST = 3;
    }
    // Transaction belongs to HCE payment or HCE other category, or offhost.
    optional Category category = 1;
    // SeName from transaction: SIMx, eSEx, HCE, HCEF.
    optional string se_name = 2;
}

/**
 * Logs when a NFC Tag event occurred.
 * Logged from:
 *     packages/apps/Nfc/src/com/android/nfc/NfcDispatcher.java
 */
message NfcTagOccurred {
    enum Type {
        UNKNOWN = 0;
        URL = 1;
        BT_PAIRING = 2;
        PROVISION = 3;
        WIFI_CONNECT = 4;
        APP_LAUNCH = 5;
        OTHERS = 6;
    }
    optional Type type = 1;
}

/**
 * Logs when Hce transaction triggered
 * Logged from:
 *     system/nfc/src/nfc/nfc/nfc_ncif.cc
 */
message NfcHceTransactionOccurred {
    // The latency period(in microseconds) it took for the first HCE data
    // exchange.
    optional uint32 latency_micros = 1;
}

/**
 * Logs when SecureElement state event changed
 * Logged from:
 *     packages/apps/SecureElement/src/com/android/se/Terminal.java
 */
message SeStateChanged {
    enum State {
        UNKNOWN = 0;
        INITIALIZED = 1;
        DISCONNECTED = 2;
        CONNECTED = 3;
        HALCRASH = 4;
    }
    optional State state = 1;

    optional string state_change_reason = 2;
    // SIMx or eSEx.
    optional string terminal = 3;
}

/**
 * Information about a permission grant request
 */
message PermissionGrantRequestResultReported {
    // unique value identifying an API call. A API call might result in multiple of these atoms
    optional int64 request_id = 1;

    // UID of package requesting the permission grant
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package requesting the permission grant
    optional string package_name = 3;

    // The permission to be granted
    optional string permission_name = 4;

    // If the permission was explicitly requested via the API or added by the system
    optional bool is_implicit = 5;

    enum Result {
        UNDEFINED = 0;
        // permission request was ignored
        IGNORED = 1;
        // permission request was ignored because it was user fixed
        IGNORED_USER_FIXED = 2;
        // permission request was ignored because it was policy fixed
        IGNORED_POLICY_FIXED = 3;
        // permission was granted by user action
        USER_GRANTED = 4;
        // permission was automatically granted
        AUTO_GRANTED = 5;
        // permission was denied by user action
        USER_DENIED = 6;
        // permission was denied with prejudice by the user
        USER_DENIED_WITH_PREJUDICE = 7;
        // permission was automatically denied
        AUTO_DENIED = 8;
        // permission request was ignored because permission is restricted
        IGNORED_RESTRICTED_PERMISSION = 9;
        // one time permission was granted by user action
        USER_GRANTED_ONE_TIME = 10;
        // user ignored request by leaving the request screen without choosing any option
        USER_IGNORED = 11;
        // user granted the permission after being linked to settings
        USER_GRANTED_IN_SETTINGS = 12;
        // user denied the permission after being linked to settings
        USER_DENIED_IN_SETTINGS = 13;
        // user denied the permission with prejudice after being linked to settings
        USER_DENIED_WITH_PREJUDICE_IN_SETTINGS = 14;
        // permission was automatically revoked after one-time permission expired
        AUTO_ONE_TIME_PERMISSION_REVOKED = 15;
        // permission was automatically revoked for unused app
        AUTO_UNUSED_APP_PERMISSION_REVOKED = 16;
    }
    // The result of the permission grant
    optional Result result = 6;
}

/**
 * Logs when Omapi API used
 * Logged from:
 *     packages/apps/SecureElement/src/com/android/se/Terminal.java
 */
message SeOmapiReported {
    enum Operation {
        UNKNOWN = 0;
        OPEN_CHANNEL = 1;
    }
    optional Operation operation = 1;
    // SIMx or eSEx.
    optional string terminal = 2;

    optional string package_name = 3;
}

/**
  * Logs the dispatch latency of a broadcast during processing of BOOT_COMPLETED.
  * The dispatch latency is the dispatchClockTime - enqueueClockTime.
  * Logged from:
  *   frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
  */
message BroadcastDispatchLatencyReported {
    optional int64 dispatch_latency_millis = 1;
}

/**
   * Logs AttentionManagerService attention check result.
   *
   * Logged from:
   *   frameworks/base/services/core/java/com/android/server/attention/AttentionManagerService.java
   */
message AttentionManagerServiceResultReported {
    // See core/java/android/service/attention/AttentionService.java
    enum AttentionCheckResult {
        UNKNOWN = 20;
        ATTENTION_SUCCESS_ABSENT = 0;
        ATTENTION_SUCCESS_PRESENT = 1;
        ATTENTION_FAILURE_UNKNOWN = 2;
        ATTENTION_FAILURE_CANCELLED = 3;
        ATTENTION_FAILURE_PREEMPTED = 4;
        ATTENTION_FAILURE_TIMED_OUT = 5;
        ATTENTION_FAILURE_CAMERA_PERMISSION_ABSENT = 6;
    }
    optional AttentionCheckResult attention_check_result = 1 [default = UNKNOWN];
}

/**
 * Logs when an adb connection changes state.
 *
 * Logged from:
 *     frameworks/base/services/core/java/com/android/server/adb/AdbDebuggingManager.java
 */
message AdbConnectionChanged {
    // The last time this system connected via adb, or 0 if the 'always allow' option was not
    // previously selected for this system.
    optional int64 last_connection_time_millis = 1;

    // The time in ms within which a subsequent connection from an 'always allow' system is allowed
    // to reconnect via adb without user interaction.
    optional int64 auth_window_millis = 2;

    // The state of the adb connection from frameworks/proto_logging/stats/enums/debug/enums.proto.
    optional android.debug.AdbConnectionStateEnum state = 3;

    // True if the 'always allow' option was selected for this system.
    optional bool always_allow = 4;
}

/*
 * Logs the reported speech DSP status.
 *
 * Logged from:
 *  Vendor audio implementation.
 */
message SpeechDspStatReported {
    // The total Speech DSP uptime in milliseconds.
    optional int32 total_uptime_millis = 1;
    // The total Speech DSP downtime in milliseconds.
    optional int32 total_downtime_millis = 2;
    optional int32 total_crash_count = 3;
    optional int32 total_recover_count = 4;
}

/**
 * Logs USB connector contaminant status.
 *
 * Logged from: USB Service.
 */
message UsbContaminantReported {
    optional string id = 1;
    optional android.service.ContaminantPresenceStatus status = 2;
}

/**
 * This atom is for debugging purpose.
 */
message DebugElapsedClock {
    // Monotically increasing value for each pull.
    optional int64 pull_count = 1;
    // Time from System.elapsedRealtime.
    optional int64 elapsed_clock_millis = 2;
    // Time from System.elapsedRealtime.
    optional int64 same_elapsed_clock_millis = 3;
    // Diff between current elapsed time and elapsed time from previous pull.
    optional int64 elapsed_clock_diff_millis = 4;

    enum Type {
      TYPE_UNKNOWN = 0;
      ALWAYS_PRESENT = 1;
      PRESENT_ON_ODD_PULLS = 2;
    }
    // Type of behavior for the pulled data.
    optional Type type = 5;
}

/**
 * This atom is for debugging purpose.
 */
message DebugFailingElapsedClock {
    // Monotically increasing value for each pull.
    optional int64 pull_count = 1;
    // Time from System.elapsedRealtime.
    optional int64 elapsed_clock_millis = 2;
    // Time from System.elapsedRealtime.
    optional int64 same_elapsed_clock_millis = 3;
    // Diff between current elapsed time and elapsed time from previous pull.
    optional int64 elapsed_clock_diff_millis = 4;
}

/** Logs System UI bubbles event changed.
 *
 * Logged from:
 *     frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen
 */
message SplitscreenUIChanged {
    // User interactions with splitscreen
    enum Action {
        UNKNOWN_ACTION = 0;
        ENTER = 1;
        EXIT = 2;
        APP_CHANGE = 3;
        RESIZE = 4;
        SWAP = 5;
    }

    // The physical side on the device of the split
    enum Position {
        UNKNOWN_POSITION = 0;
        LEFT = 1;
        RIGHT = 2;
        TOP = 3;
        BOTTOM = 4;
    }

    // The reason for entering splitscreen
    enum EnterReason {
        UNKNOWN_ENTER = 0;
        OVERVIEW = 1;
        DRAG_LEFT = 2;
        DRAG_TOP = 3;
        DRAG_RIGHT = 4;
        DRAG_BOTTOM = 5;
    }

    // The reason for exiting splitscreen
    enum ExitReason {
        UNKNOWN_EXIT = 0;
        DRAG_DIVIDER = 1;
        RETURN_HOME = 2;
        SCREEN_LOCKED = 3;
        SCREEN_LOCKED_SHOW_ON_TOP = 4;
        DEVICE_FOLDED = 5;
        ROOT_TASK_VANISHED = 6;
        APP_FINISHED = 7;
        APP_DOES_NOT_SUPPORT_MULTIWINDOW = 8;
    }

    // The event action
    optional Action action = 1;
    // What triggered splitscreen (if the action is ENTER)
    optional EnterReason enter_reason = 2;
    // What triggered leaving splitscreen (if the action is EXIT)
    optional ExitReason exit_reason = 3;
    // The ratio of split between the main/side stages
    optional float split_ratio = 4;
    // Data about the main stage in split
    optional Position main_stage_position = 5;
    optional int32 main_stage_uid = 6 [(is_uid) = true];
    // Data about the side stage in split
    optional Position side_stage_position = 7;
    optional int32 side_stage_uid = 8 [(is_uid) = true];
    // The drag session id (if the enter_trigger was DRAG)
    optional int32 drag_instance_id = 9;
    // An identifier used to identify a splitscreen session
    optional int32 instance_id = 10;
}

/** Logs System UI bubbles event changed.
 *
 * Logged from:
 *     frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles
 */
message BubbleUIChanged {

    // The app package that is posting the bubble.
    optional string package_name = 1;

    // The notification channel that is posting the bubble.
    optional string notification_channel = 2;

    // The notification id associated with the posted bubble.
    optional int32 notification_id = 3;

    // The position of the bubble within the bubble stack.
    optional int32 position = 4;

    // The total number of bubbles within the bubble stack.
    optional int32 total_number = 5;

    // User interactions with the bubble.
    enum Action {
        UNKNOWN = 0;
        POSTED = 1;
        UPDATED = 2;
        EXPANDED = 3;
        COLLAPSED = 4;
        DISMISSED = 5;
        STACK_DISMISSED = 6;
        STACK_MOVED = 7;
        HEADER_GO_TO_APP = 8;
        HEADER_GO_TO_SETTINGS = 9;
        PERMISSION_OPT_IN = 10;
        PERMISSION_OPT_OUT = 11;
        PERMISSION_DIALOG_SHOWN = 12;
        SWIPE_LEFT = 13;
        SWIPE_RIGHT = 14;
        STACK_EXPANDED = 15;
        FLYOUT = 16;
    }
    optional Action action = 6;

    // Normalized screen position of the bubble stack. The range is between 0 and 1.
    optional float normalized_x_position = 7;
    optional float normalized_y_position = 8;

    // Whether the bubble is unread. If it is unread, a dot is shown in the bubble stack icon.
    optional bool is_unread = 9;

    // Whether the bubble is an on-going one.
    optional bool is_ongoing = 10;

    // Whether the bubble is produced by an app running in foreground.
    // This is deprecated and the value should be ignored.
    optional bool is_foreground = 11 [deprecated = true];
}

/**
  * Logs System UI bubbles developer errors.
  *
  * Logged from:
  *   frameworks/base/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
  */
message BubbleDeveloperErrorReported {

    // The app package that is posting the bubble.
    optional string package_name = 1;

    // Bubble developer error type enums.
    enum Error {
        UNKNOWN = 0;
        ACTIVITY_INFO_MISSING = 1;
        ACTIVITY_INFO_NOT_RESIZABLE = 2;
        DOCUMENT_LAUNCH_NOT_ALWAYS = 3;
    }
    optional Error error = 2 [default = UNKNOWN];
}

/**
 * Logs that a constraint for a scheduled job has changed.
 *
 * Logged from:
 *     frameworks/base/services/core/java/com/android/server/job/controllers/JobStatus.java
 */
message ScheduledJobConstraintChanged {
    repeated AttributionNode attribution_node = 1;

    // Name of the job.
    optional string job_name = 2;

    optional com.android.server.job.ConstraintEnum constraint = 3;

    enum State {
        UNKNOWN = 0;
        UNSATISFIED = 1;
        SATISFIED = 2;
    }
    optional State state = 4;
}

/**
 * Logs PowerManagerService screen timeout resets (extensions) that happen when an attention check
 * returns true.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
 */
message ScreenTimeoutExtensionReported {
    // Describes how many times in a row did the power manager reset the screen off timeout.
    optional uint32 consecutive_timeout_extended_count = 1;
}

/*
* Logs number of milliseconds it takes to start a process.
* The definition of app process start time is from the app launch time to
* the time that Zygote finished forking the app process and loaded the
* application package's java classes.

* This metric is different from AppStartOccurred which is for foreground
* activity only.

* ProcessStartTime can report all processes (both foreground and background)
* start time.
*
* Logged from:
*   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
*/
message ProcessStartTime {
    // The uid of the ProcessRecord.
    optional int32 uid = 1 [(is_uid) = true];

    // The process pid.
    optional int32 pid = 2;

    // The process name.
    // Usually package name, "system" for system server.
    // Provided by ActivityManagerService.
    // Do not fetch this field from device to save storage space, use uid field induced
    // package name as process name.
    optional string process_name = 3;

    enum StartType {
        UNKNOWN = 0;
        WARM = 1;
        HOT = 2;
        COLD = 3;
    }

    // The start type.
    optional StartType type = 4;

    // The elapsed realtime at the start of the process.
    optional int64 process_start_time_millis = 5;

    // Number of milliseconds it takes to reach bind application.
    optional int32 bind_application_delay_millis = 6;

    // Number of milliseconds it takes to finish start of the process.
    optional int32 process_start_delay_millis = 7;

    // hostingType field in ProcessRecord, the component type such as "activity",
    // "service", "content provider", "broadcast" or other strings.
    // deprecatd by enum type field hosting_type_id to reduce storage space usage by
    // string type.
    // Do not fetch this field from device to save storage space.
    optional string hosting_type = 8 [deprecated = true];

    // hostingNameStr field in ProcessRecord. The component class name that runs
    // in this process.
    // Do not fetch this field from device to save storage space.
    optional string hosting_name = 9;

    // Broadcast action name.
    optional string broadcast_action_name = 10;

    enum HostingTypeId {
        HOSTING_TYPE_UNKNOWN = 0;
        HOSTING_TYPE_ACTIVITY = 1;
        HOSTING_TYPE_ADDED_APPLICATION = 2;
        HOSTING_TYPE_BACKUP = 3;
        HOSTING_TYPE_BROADCAST = 4;
        HOSTING_TYPE_CONTENT_PROVIDER = 5;
        HOSTING_TYPE_LINK_FAIL = 6;
        HOSTING_TYPE_ON_HOLD = 7;
        HOSTING_TYPE_NEXT_ACTIVITY = 8;
        HOSTING_TYPE_NEXT_TOP_ACTIVITY = 9;
        HOSTING_TYPE_RESTART = 10;
        HOSTING_TYPE_SERVICE = 11;
        HOSTING_TYPE_SYSTEM = 12;
        HOSTING_TYPE_TOP_ACTIVITY = 13;
        HOSTING_TYPE_EMPTY = 14;
    }

    optional HostingTypeId hosting_type_id = 11;
}

/**
 * Track Media Codec usage (nested proto version)
 *   This atom is being deprecated in favor of MediaCodecReported which has a
 *   flattened CodecData to enable field filtering. The data is identical
 *   except MediaCodecReported also has the playback_duration field.
 * Logged from:
 *   frameworks/av/media/libstagefright/MediaCodec.cpp
 *   frameworks/av/services/mediaanalytics/statsd_codec.cpp
 */
message MediametricsCodecReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.CodecData codec_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track Media Codec usage
 *   This atom is the new version of MediametricsCodecReported and has a
 *   flattened CodecData to enable field filtering. The data is identical
 *   except for the addition of the playback_duration field.
 * Logged from:
 *   frameworks/av/media/libstagefright/MediaCodec.cpp
 *   frameworks/av/services/mediaanalytics/statsd_codec.cpp
 */
message MediaCodecReported {
    optional int64 timestamp_nanos = 1;
    // The inclusion of package name in a metric should be carefully analyzed to
    // determine if it is absolutely necessary for system health. It is strongly
    // discouraged to collect the package name along with other metrics (e.g.
    // playback duration).
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;
    // The name of the codec.
    // eg. `OMX.google.aac.decoder`
    optional string codec = 5;
    // The mime type. e.g. "audio/vorbis"
    optional string mime = 6;
    // The codec mode. i.e. video or audio.
    optional string mode = 7;
    // 1 if this is an encoder, 0 if this is a decoder.
    optional int32 encoder = 8;
    // 0, 1
    optional int32 secure = 9;
    // The video width in pixels.
    optional int32 width = 10;
    // The video height in pixels.
    optional int32 height = 11;
    // The rotation of the video in degrees
    // 0, 90, 180, 270
    optional int32 rotation = 12;
    // 1 if the codec uses crypto/drm, 0 otherwise.
    optional int32 crypto = 13;
    // The codec profile. The values are dependent on the codec type.
    // 0..n
    optional int32 profile = 14;
    // The coding level. The values are dependent on the codec type.
    // 0..n
    optional int32 level = 15;
    // The maximum allowed width during a particular codec session.
    // 0..n
    optional int32 max_width = 16;
    // The maximum allowed height during a particular codec session.
    // 0..n
    optional int32 max_height = 17;
    // Indicating which error condition caused the codec to reset to an
    // uninitialized state.
    optional int32 error_code = 18;
    // The error state.
    // The emitted values are descriptive:  UNINITIALIZED, INITIALIZING,
    // INITIALIZED, CONFIGURING, CONFIGURED, STARTING, STARTED, FLUSHING, FLUSHED,
    // STOPPING, and RELEASING.
    // In the event of an internal codec error setting the state outside of these
    // values, the invalid value will be encoded as a string (e.g., “17”).
    optional string error_state = 19;
    // The max latency in us.
    // The latency is from the time when the MediaCodec sends the ‘raw’ frame to
    // the media codec service to when the decoded frame arrives back in
    // MediaCodec’s possession.
    optional int64 latency_max = 20;
    // The min latency in us.
    optional int64 latency_min = 21;
    // The average latency in us.
    optional int64 latency_avg = 22;
    // The number of buffers included in the avg/min/max calculation above.
    optional int64 latency_count = 23;
    // The number of packets received back from the code where a latency could not
    // be determined, and therefore they aren't included in the avg/min/max
    // calculations above.
    optional int64 latency_unknown = 24;
    // Error returned by queueInputBuffer.
    optional int32 queue_input_buffer_error = 25;
    // Error returned by queueSecureInputBuffer.
    optional int32 queue_secure_input_buffer_error = 26;
    // These modes are primarily for videos.
    // CQ = constant quality
    // CBR = constant bit rate
    // VBR = variable bitrate
    optional string bitrate_mode = 27;
    optional int32 bitrate = 28;
    // 0..n
    optional int64 lifetime_millis = 29;
    optional int64 playback_duration_seconds = 30;
    optional string log_session_id = 31;
    optional int32 channel_count = 32;
    optional int32 sample_rate = 33;
    optional int64 video_encode_bytes = 34;
    optional int64 video_encode_frames = 35;
    optional int64 video_input_bytes = 36;
    optional int64 video_input_frames = 37;
    optional int64 video_encode_duration_us = 38;
    optional int32 color_format = 39;
    optional float frame_rate = 40;
    optional float capture_rate = 41;
    optional float operating_rate = 42;
    optional int32 priority = 43;
    optional int32 video_qp_i_min = 44;
    optional int32 video_qp_i_max = 45;
    optional int32 video_qp_p_min = 46;
    optional int32 video_qp_p_max = 47;
    optional int32 video_qp_b_min = 48;
    optional int32 video_qp_b_max = 49;
    optional int32 original_bitrate = 50;
    optional int32 shaping_enhanced = 51;
    optional int32 original_video_qp_i_min = 52;
    optional int32 original_video_qp_i_max = 53;
    optional int32 original_video_qp_p_min = 54;
    optional int32 original_video_qp_p_max = 55;
    optional int32 original_video_qp_b_min = 56;
    optional int32 original_video_qp_b_max = 57;
    optional int32 config_color_standard = 58;
    optional int32 config_color_range = 59;
    optional int32 config_color_transfer = 60;
    optional int32 parsed_color_standard = 61;
    optional int32 parsed_color_range = 62;
    optional int32 parsed_color_transfer = 63;
    optional int32 hdr_static_info = 64;
    optional int32 hdr_10_plus_info = 65;
    optional int32 hdr_format = 66;
    // !!! WARNING
    // Keep synchronized with MediametricsCodecReported.CodecData in
    // mediametrics_message.proto.
    // Also keep AStatsEvent serialization synchronized in statsd_codec.cpp
    // !!! WARNING
}

/**
 * Track Media Extractor (pulling video/audio streams out of containers) usage
 * Logged from:
 *   frameworks/av/media/libstagefright/RemoteMediaExtractor.cpp
 *   frameworks/av/services/mediaanalytics/statsd_extractor.cpp
 */
message MediametricsExtractorReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.ExtractorData extractor_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track MediaParser (parsing video/audio streams from containers) usage
 * Logged from:
 *
 *   frameworks/av/services/mediametrics/statsd_mediaparser.cpp
 *   frameworks/base/apex/media/framework/jni/android_media_MediaParserJNI.cpp
 */
message MediametricsMediaParserReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;

    // MediaParser specific data.
    /**
     * The name of the parser selected for parsing the media, or an empty string
     * if no parser was selected.
     */
    optional string parser_name = 4;
    /**
     * Whether the parser was created by name. 1 represents true, and 0
     * represents false.
     */
    optional int32 created_by_name = 5;
    /**
     * The parser names in the sniffing pool separated by "|".
     */
    optional string parser_pool = 6;
    /**
     * The fully qualified name of the last encountered exception, or an empty
     * string if no exception was encountered.
     */
    optional string last_exception = 7;
    /**
     * The size of the parsed media in bytes, or -1 if unknown. Note this value
     * contains intentional random error to prevent media content
     * identification.
     */
    optional int64 resource_byte_count = 8;
    /**
     * The duration of the media in milliseconds, or -1 if unknown. Note this
     * value contains intentional random error to prevent media content
     * identification.
     */
    optional int64 duration_millis = 9;
    /**
     * The MIME types of the tracks separated by "|".
     */
    optional string track_mime_types = 10;
    /**
     * The tracks' RFC 6381 codec strings separated by "|".
     */
    optional string track_codecs = 11;
    /**
     * Concatenation of the parameters altered by the client, separated by "|".
     */
    optional string altered_parameters = 12;
    /**
     * The video width in pixels, or -1 if unknown or not applicable.
     */
    optional int32 video_width = 13;
    /**
     * The video height in pixels, or -1 if unknown or not applicable.
     */
    optional int32 video_height = 14;
    /**
     * Session id for correlating playback metrics.
     */
    optional string log_session_id = 15;
}

/**
 * Track how we arbitrate between microphone/input requests.
 * Logged from
 *   frameworks/av/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
 *   frameworks/av/services/mediaanalytics/statsd_audiopolicy.cpp
 */
message MediametricsAudiopolicyReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.AudioPolicyData audiopolicy_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track how we arbitrate between microphone requests.
 * Logged from
 *   frameworks/av/media/libaudioclient/AudioRecord.cpp
 *   frameworks/av/services/mediaanalytics/statsd_audiorecord.cpp
 */
message MediametricsAudiorecordReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.AudioRecordData audiorecord_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];

    // Android S
    // Metric log session id, a Base64Url encoded string of a randomly generated 128-bit integer.
    // An empty string means no session id is set.
    optional string log_session_id = 6;
}

/**
 * Track how we arbitrate between microphone/input requests.
 * Logged from
 *   frameworks/av/media/libnblog/ReportPerformance.cpp
 *   frameworks/av/services/mediaanalytics/statsd_audiothread.cpp
 */
message MediametricsAudiothreadReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.AudioThreadData audiothread_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track how we arbitrate between microphone/input requests.
 * Logged from
 *   frameworks/av/media/libaudioclient/AudioTrack.cpp
 *   frameworks/av/services/mediaanalytics/statsd_audiotrack.cpp
 */
message MediametricsAudiotrackReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.AudioTrackData audiotrack_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];

    // Android S
    // Metric log session id, a Base64Url encoded string of a randomly generated 128-bit integer.
    // An empty string means no session id is set.
    optional string log_session_id = 6;
}

/**
 * Track information about DRM framework performance
 * Logged from
 *   frameworks/av/drm/libmediadrm/DrmHal.cpp
 *   frameworks/av/services/mediaanalytics/statsd_drm.cpp
 */
message MediametricsMediadrmReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    // vendor+description tell about which DRM plugin is in use on this device
    optional string vendor = 5;
    optional string description = 6;
    // from frameworks/av/drm/libmediadrm/protos/metrics.proto
    optional bytes framework_stats = 7 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track information about the widevine DRM plugin performance
 * Logged from
 *   vendor/widevine/libwvdrmengine/cdm/metrics
 *   frameworks/av/services/mediaanalytics/statsd_drm.cpp
 *
 * TODO b/182382094 -remove after migrated mediadrm metrics
 * reporting to statsd.
 */
message MediametricsDrmWidevineReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional bytes vendor_specific_stats = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track information about recordings (e.g. camcorder)
 * Logged from
 *   frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
 *   frameworks/av/services/mediaanalytics/statsd_recorder.cpp
 */
message MediametricsRecorderReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.RecorderData recorder_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track Media Player usage
 * Logged from:
 *   frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
 *   frameworks/av/services/mediaanalytics/statsd_nuplayer.cpp
 */
message MediametricsNuPlayerReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    optional android.stats.mediametrics_message.NuPlayerData nuplayer_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/**
 * Track Legacy DRM usage
 * Logged from
 *   frameworks/av/drm/drmserver/DrmManager.cpp
 */
message MediametricsDrmManagerReported {
    optional int64 timestamp_nanos = 1;
    optional string package_name = 2;
    optional int64 package_version_code = 3;
    optional int64 media_apex_version = 4;

    enum Method {
        METHOD_NOT_FOUND       = -1;
        GET_CONSTRAINTS        =  0;
        GET_METADATA           =  1;
        CAN_HANDLE             =  2;
        PROCESS_DRM_INFO       =  3;
        ACQUIRE_DRM_INFO       =  4;
        SAVE_RIGHTS            =  5;
        GET_ORIGINAL_MIME_TYPE =  6;
        GET_DRM_OBJECT_TYPE    =  7;
        CHECK_RIGHTS_STATUS    =  8;
        REMOVE_RIGHTS          =  9;
        REMOVE_ALL_RIGHTS      = 10;
        OPEN_CONVERT_SESSION   = 11;
        OPEN_DECRYPT_SESSION   = 12;
    }

    // plugin_id+description inform which Legacy DRM plugins are still in use on device
    optional string plugin_id = 5;
    optional string description = 6;
    optional Method method = 7;
    optional string mime_types = 8;

    optional int64 get_constraints_count =  9;
    optional int64 get_metadata_count = 10;
    optional int64 can_handle_count = 11;
    optional int64 process_drm_info_count = 12;
    optional int64 acquire_drm_info_count = 13;
    optional int64 save_rights_count = 14;
    optional int64 get_original_mime_type_count = 15;
    optional int64 get_drm_object_type_count = 16;
    optional int64 check_rights_status_count = 17;
    optional int64 remove_rights_count = 18;
    optional int64 remove_all_rights_count = 19;
    optional int64 open_convert_session_count = 20;
    optional int64 open_decrypt_session_count = 21;
}

/**
 * State of a all permission requested by a all package
 * Pulled from: StatsCompanionService
*/
message DangerousPermissionState {
    // Name of the permission
    optional string permission_name = 1;

    // Uid of the package
    optional int32 uid = 2 [(is_uid) = true];

    // Package requesting the permission
    optional string package_name = 3;

    // If the permission is granted to the uid
    optional bool is_granted = 4;

    // Permission flags as per android.content.pm.PermissionFlags
    optional int32 permission_flags = 5;

    // Permission protection flags as per android.content.pm.PermissionInfo.ProtectionFlags
    optional int32 protection_flags = 6;
}

/**
 * Logs when a package is denied access to a device identifier based on the new access requirements.
 *
 * Logged from:
 *     frameworks/base/telephony/java/com/android/internal/telephony/TelephonyPermissions.java
 */
message DeviceIdentifierAccessDenied {
    // The name of the package denied access to the requested device identifier.
    optional string package_name = 1;

    // The name of the device identifier method the package attempted to invoke.
    optional string method_name = 2;

    // True if the package is preinstalled.
    // Starting from Android 11, this boolean is not set and will always be false.
    optional bool is_preinstalled = 3 [deprecated = true];

    // True if the package is privileged.
    // Starting from Android 11, this boolean is not set and will always be false.
    optional bool is_priv_app = 4 [deprecated = true];
}

/**
 * Pulls the ongoing mainline install train version code.
 * Pulled from StatsCompanionService
 */
message TrainInfo {
    optional int64 train_version_code = 1;

    optional TrainExperimentIds train_experiment_id = 2 [(log_mode) = MODE_BYTES];

    optional string train_name = 3;

    enum Status {
        UNKNOWN = 0;
        INSTALL_REQUESTED = 1;
        INSTALL_STARTED = 2;
        INSTALL_STAGED_NOT_READY = 3;
        INSTALL_STAGED_READY = 4;
        INSTALL_SUCCESS = 5;
        // Replaced by INSTALL_FAILURE_DOWNLOAD, INSTALL_FAILURE_STATE_MISMATCH,
        // and INSTALL_FAILURE_COMMIT.
        INSTALL_FAILURE = 6  [deprecated = true];
        // This enum is for installs that are manually cancelled via the Manual Update UI.
        INSTALL_CANCELLED = 7;
        INSTALLER_ROLLBACK_REQUESTED = 8;
        INSTALLER_ROLLBACK_INITIATED = 9;
        INSTALLER_ROLLBACK_INITIATED_FAILURE = 10;
        INSTALLER_ROLLBACK_STAGED = 11;
        INSTALLER_ROLLBACK_STAGED_FAILURE = 12;
        INSTALLER_ROLLBACK_BOOT_TRIGGERED = 13;
        INSTALLER_ROLLBACK_BOOT_TRIGGERED_FAILURE = 14;
        INSTALLER_ROLLBACK_SUCCESS = 15;
        INSTALLER_ROLLBACK_FAILURE = 16;
        INSTALLER_ROLLBACK_STAGED_CANCEL_REQUESTED = 17;
        INSTALLER_ROLLBACK_STAGED_CANCEL_SUCCESS = 18;
        INSTALLER_ROLLBACK_STAGED_CANCEL_FAILURE = 19;
        INSTALL_STAGED_CANCEL_REQUESTED = 20;
        INSTALL_STAGED_CANCEL_SUCCESS = 21;
        INSTALL_STAGED_CANCEL_FAILURE = 22;
        INSTALL_FAILURE_DOWNLOAD = 23;
        INSTALL_FAILURE_STATE_MISMATCH = 24;
        INSTALL_FAILURE_COMMIT = 25;
        REBOOT_TRIGGERED = 26;
    }
    optional Status status = 4;
}

/**
 * Logs the gesture stage changed event.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/
 */
message AssistGestureStageReported {
    optional android.hardware.sensor.assist.AssistGestureStageEnum gesture_stage = 1;
}

/**
 * Logs the feedback type.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/
 */
message AssistGestureFeedbackReported {
    // Whether or not the gesture was used.
    optional android.hardware.sensor.assist.AssistGestureFeedbackEnum feedback_type = 1;
}

/**
 * Logs the progress.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/
 */
message AssistGestureProgressReported {
    // [0,100] progress for the assist gesture.
    optional int32 progress = 1;
}

/*
 * Information about the time zone data on a device.
 */
message TimeZoneDataInfo {
    // A version identifier for the data set on device. e.g. "2018i"
    optional string tzdb_version = 1;
}

/**
 * Logs the GPU stats global health information.
 *
 * Logged from:
 *   frameworks/native/services/gpuservice/gpustats/
 */
message GpuStatsGlobalInfo {
    // Package name of the gpu driver.
    optional string driver_package_name = 1;

    // Version name of the gpu driver.
    optional string driver_version_name = 2;

    // Version code of the gpu driver.
    optional int64 driver_version_code = 3;

    // Build time of the gpu driver in UTC as seconds since January 1, 1970.
    optional int64 driver_build_time = 4;

    // Total count of the gl driver gets loaded.
    optional int64 gl_loading_count = 5;

    // Total count of the gl driver fails to be loaded.
    optional int64 gl_loading_failure_count = 6;

    // Total count of the Vulkan driver gets loaded.
    optional int64 vk_loading_count = 7;

    // Total count of the Vulkan driver fails to be loaded.
    optional int64 vk_loading_failure_count = 8;

    // Api version of the system Vulkan driver.
    optional int32 vulkan_version = 9;

    // Api version of the system CPU Vulkan driver.
    optional int32 cpu_vulkan_version = 10;

    // Api version of the system GLES driver.
    optional int32 gles_version = 11;

    // Total count of the angle driver gets loaded.
    optional int64 angle_loading_count = 12;

    // Total count of the angle driver fails to be loaded.
    optional int64 angle_loading_failure_count = 13;
}

/**
 * GPU driver loading time info.
 */
message GpuDriverLoadingTime {
    // List of all the driver loading times for this app. The list size is
    // capped at 50.
    repeated int64 driver_loading_time = 1;
}

/**
 * Logs the GPU stats per app health information.
 *
 * Logged from:
 *   frameworks/native/services/gpuservice/gpustats/
 */
message GpuStatsAppInfo {
    // Package name of the application that loads the gpu driver. Total number
    // of different packages is capped at 100.
    optional string app_package_name = 1;

    // Version code of the gpu driver this app loads.
    optional int64 driver_version_code = 2;

    // gl driver loading time info.
    optional GpuDriverLoadingTime gl_driver_loading_time = 3
            [(android.os.statsd.log_mode) = MODE_BYTES];

    // Vulkan driver loading time info.
    optional GpuDriverLoadingTime vk_driver_loading_time = 4
            [(android.os.statsd.log_mode) = MODE_BYTES];

    // Angle driver loading time info.
    optional GpuDriverLoadingTime angle_driver_loading_time = 5
            [(android.os.statsd.log_mode) = MODE_BYTES];

    // CPU Vulkan implementation is in use.
    optional bool cpu_vulkan_in_use = 6;

    // App is not doing pre-rotation correctly.
    optional bool false_prerotation = 7;

    // App creates GLESv1 context.
    optional bool gles_1_in_use = 8;

    // ANGLE in use for the app.
    optional bool angle_in_use = 9;
}

/*
 * Logs the size of the system ion heap.
 *
 * Pulled from StatsCompanionService.
 */
message SystemIonHeapSize {
    // Deprecated due to limited support of ion stats in debugfs.
    // Use `IonHeapSize` instead.
    option deprecated = true;

    // Size of the system ion heap in bytes.
    // Read from debugfs.
    optional int64 size_in_bytes = 1;
}

/*
 * Logs the total size of the ion heap.
 *
 * Pulled from StatsCompanionService.
 */
message IonHeapSize {
    // Total size of all ion heaps in kilobytes.
    // Read from: /sys/kernel/ion/total_heaps_kb.
    optional int32 total_size_kb = 1;
}

/*
 * Logs the per-process size of the system ion heap.
 *
 * Pulled from StatsCompanionService.
 */
message ProcessSystemIonHeapSize {
    // The uid if available. -1 means not available.
    optional int32 uid = 1 [(is_uid) = true];

    // The process name (from /proc/PID/cmdline).
    optional string process_name = 2;

    // Sum of sizes of all allocations.
    optional int32 total_size_in_kilobytes = 3;

    // Number of allocations.
    optional int32 allocation_count = 4;

    // Size of the largest allocation.
    optional int32 max_size_in_kilobytes = 5;
}

/*
 * Logs system-wide (primarily kernel) memory stats. Sourced from
 * /proc/meminfo unless explicitly stated otherwise.
 *
 * Pulled from StatsCompanionService.
 */
message SystemMemory {
    // /proc/meminfo SUnreclaim
    optional int32 unreclaimable_slab_kb = 1;

    // /proc/meminfo VmallocUsed
    optional int32 vmalloc_used_kb = 2;

    // /proc/meminfo PageTables
    optional int32 page_tables_kb = 3;

    // /proc/meminfo KernelStack
    optional int32 kernel_stack_kb = 4;

    // Total unreclaimable ion.
    // Reported from os.Debug.getIonHeapsSizeKb (R+)
    optional int32 total_ion_kb = 5;

    // Measures for the amount of memory we could not account for.
    // Essentially points to kernel allocations (as all userspace allocs are
    // already tracked).
    // Device-specific.
    optional int32 unaccounted_kb = 6;

    // GPU kernel driver allocations.
    // Can overlap with ion memory.
    // Reported from os.Debug.getGpuTotalUsageKb (S+)
    optional int32 gpu_total_usage_kb = 7;

    // GPU kernel driver private allocations.
    // Does not overlap with ion memory
    // Computed as total usage - Debug.getGpuDmaBufUsageKb()
    // Only available on supported kernel versions (5.4+)
    optional int32 gpu_private_usage_kb = 8;

    // Total DMABUF memory allocations
    // Reported from os.Debug.getDmabufTotalExportedKb (S+)
    optional int32 dmabuf_total_exported_kb = 9;

    // Total shmem allocations
    optional int32 shmem_kb = 10;
}

/*
 * Log dmabuf memory retained by userspace processes.
 * Pulled from StatsPullAtomService.
 */
 message ProcessDmabufMemory {
  // The uid if available. -1 means not available.
  optional int32 uid = 1 [(is_uid) = true];

  // The process name (from ActivityManager).
  optional string process_name = 2;

  // OOM adj score.
  optional int32 oom_adj_score = 3;

  // Size of dmabufs retained by the process. The buffers are either mapped,
  // retained via an fd, or both.
  // Only available on supported kernel versions (5.4+). When unavailable, set
  // to -1.
  optional int32 retained_dmabuf_kb = 4;

  // Number of buffers retained by the process (mapped / fd).
  // Only available on supported kernel versions (5.4+). When unavailable, set
  // to -1.
  optional int32 retained_dmabuf_count = 5;

  // Size of dmabufs mapped to the process address space.
  optional int32 mapped_dmabuf_kb = 6 [deprecated = true];

  // Number of dmabufs mapped to the process address space.
  optional int32 mapped_dmabuf_count = 7 [deprecated = true];

  // Size of dmabufs mapped to the process address space that are also
  // mapped to the SurfaceFlinger address space. This indicates memory
  // being used by graphics compositing layers. If this data row pertains
  // to SurfaceFlinger itself, then the below field holds the size of all
  // dmabuifs that are shared with any other process. The delta between
  // this field and retained_dmabuf_kb, above, is private dmabufs that
  // SurfaceFlinger is holding but are not shared with other processes.
  optional int32 surfaceflinger_shared_dmabuf_kb = 8;
  // As above, but total number of all dmabufs shared with SurfaceFlinger.
  optional int32 surfaceflinger_shared_dmabuf_count = 9;
}

/**
 * Push network stack events.
 *
 * Log from:
 *     frameworks/base/packages/NetworkStack/
 */
message NetworkStackReported {
    // The id that indicates the event reported from NetworkStack.
    optional int32 event_id = 1;
    // The data for the reported events.
    optional android.stats.connectivity.NetworkStackEventData network_stack_event = 2 [(log_mode) = MODE_BYTES];
}

/**
 * Logs the apps that are installed on the external storage.
 * Pulled from:
 *   StatsCompanionService
 */
message AppsOnExternalStorageInfo {
    // The type of the external storage.
    optional android.stats.storage.ExternalStorageType external_storage_type = 1;
    // The name of the package that is installed on the external storage.
    optional string package_name = 2;
}

/**
 * Logs the settings related to Face.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/stats
 */
message FaceSettings {
    // Whether or not face unlock is allowed on Keyguard.
    optional bool unlock_keyguard_enabled = 1;
    // Whether or not face unlock dismisses the Keyguard.
    optional bool unlock_dismisses_keyguard = 2;
    // Whether or not face unlock requires attention.
    optional bool unlock_attention_required = 3;
    // Whether or not face unlock is allowed for apps (through BiometricPrompt).
    optional bool unlock_app_enabled = 4;
    // Whether or not face unlock always requires user confirmation.
    optional bool unlock_always_require_confirmation = 5;
    // Whether or not a diverse set of poses are required during enrollment.
    optional bool unlock_diversity_required = 6;
}

/**
 * Logs cooling devices maintained by the kernel.
 *
 * Pulled from StatsCompanionService.java
 */
message CoolingDevice {
    // The type of cooling device being reported. Eg. CPU, GPU...
    optional android.os.CoolingTypeEnum device_location = 1;
    // The name of the cooling device source. Eg. CPU0
    optional string device_name = 2;
    // Current throttle state of the cooling device. The value can any unsigned
    // integer between 0 and max_state defined in its driver. 0 means device is
    // not in throttling, higher value means deeper throttling.
    optional int32 state = 3;
}

/**
 * Intelligence has several counter-type events that don't warrant a
 * full separate atom. These are primarily API call counters but also include
 * counters for feature usage and specific failure modes.
 *
 * Logged from the Intelligence mainline module.
 */
message IntelligenceEventReported {
  // The event type.
  optional android.stats.intelligence.EventType event_id = 1;
  // Success, failure.
  optional android.stats.intelligence.Status status = 2;
  // How many times the event occured (to report a batch of high frequency events).
  optional int32 count = 3;
  // How long the event took (sum of durations if count > 1)
  optional int64 duration_millis = 4;
}

/**
 * Logs when Car Power state changed.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/CarStatsLog.java
 */
message CarPowerStateChanged {
    // States come from CpmsState in CarPowerManagementService.java.
    enum State {
       WAIT_FOR_VHAL = 0;
       ON = 1;
       SHUTDOWN_PREPARE = 2;
       WAIT_FOR_FINISH = 3;
       SUSPEND = 4;
       SIMULATE_SLEEP = 5;
    }
    optional State state = 1;
}

/**
 * Logs when Car User Hal is requested to switch/create/remove user.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/hal/UserHalService.java
 */
message CarUserHalModifyUserRequestReported {
    // Request id for the request.
    optional int32 request_id = 1;
    // Request type.
    enum RequestType {
        UNKNOWN = 0;
        // Car user manager requested user switch.
        SWITCH_REQUEST_ANDROID = 1;
        // OEM requested User switch.
        SWITCH_REQUEST_OEM = 2;
        // Hal switch requested after android switch using activity manager.
        SWITCH_REQUEST_LEGACY = 3;
        // Create User
        CREATE_REQUEST = 4;
        // Remove User
        REMOVE_REQUEST = 5;
    }
    optional RequestType request_type = 2;
    // Android User id of the current user which can only be 0, 10, 11 and so on.
    // -1 if not available.
    optional int32 user_id = 3;
    // VHAL flags of the current user. (-1 if not available)
    optional int32 user_flags = 4;
    // Android User id of the target user for switch/create/remove. It can only
    // be 0, 10, 11 and so on. -1 if not available.
    optional int32 target_user_id = 5;
    // VHAL flags of the target user for switch/create/remove. (-1 if not available)
    optional int32 target_user_flags = 6;
    // Request timeout Milliseconds (-1 if not available)
    optional int32 timeout_millis = 7;
}

/**
 * Logs when Car User Hal responds to switch/create user request.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/hal/UserHalService.java
 */
message CarUserHalModifyUserResponseReported {
    // Request id of the request associated with the response.
    optional int32 request_id = 1;
    // Car user hal callback status.
    enum CallbackStatus {
        UNKNOWN = 0;
        // Hal response was invalid.
        INVALID = 1;
        // Hal response was ok.
        OK = 2;
        // Hal timeout during set call.
        HAL_SET_TIMEOUT = 3;
        // Hal response timeout.
        HAL_RESPONSE_TIMEOUT = 4;
        // Hal responded with wrong info.
        WRONG_HAL_RESPONSE = 5;
        // Hal is processing multiple requests simultaneously.
        CONCURRENT_OPERATION = 6;
    }
    optional CallbackStatus callback_status = 2;

    // Hal request status for user switch/create/remove.
    enum HalRequestStatus {
        UNSPECIFIED = 0;
        // Hal request for user switch/create is successful.
        SUCCESS = 1;
        // Hal request for user switch/create failed.
        FAILURE = 2;
    }
    optional HalRequestStatus request_status = 3;
}

/**
 * Logs when post switch response is posted to Car User Hal.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/hal/UserHalService.java
 */
message CarUserHalPostSwitchResponseReported {
    // Request id.
    optional int32 request_id = 1;

    // Android user switch status.
    enum UserSwitchStatus {
        UNKNOWN = 0;
        // Android user switch is successful.
        SUCCESS = 1;
        // Android user switch failed.
        FAILURE = 2;
    }
    optional UserSwitchStatus switch_status = 2;
}

/**
 * Logs when initial user information is requested from Car User Hal.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/hal/UserHalService.java
 */
message CarUserHalInitialUserInfoRequestReported {
    // Request id for the request.
    optional int32 request_id = 1;

    // Request type for initial user information.
    enum InitialUserInfoRequestType {
        UNKNOWN = 0;
        // At the first time Android was booted (or after a factory reset).
        FIRST_BOOT = 1;
        // At the first time Android was booted after the system was updated.
        FIRST_BOOT_AFTER_OTA = 2;
        // When Android was booted "from scratch".
        COLD_BOOT = 3;
        // When Android was resumed after the system was suspended to memory.
        RESUME = 4;
    }
    optional InitialUserInfoRequestType request_type = 2;
    // Request timeout Milliseconds (-1 if not available)
    optional int32 timeout_millis = 3;
}

/**
 * Logs when Car User Hal responds to initial user information requests.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/hal/UserHalService.java
 */
message CarUserHalInitialUserInfoResponseReported {
    // Request id of the request associated with the response.
    optional int32 request_id = 1;
    // Car user hal callback status.
    enum CallbackStatus {
        UNKNOWN = 0;
        // Hal response was invalid.
        INVALID = 1;
        // Hal response was ok.
        OK = 2;
        // Hal timeout during set call.
        HAL_SET_TIMEOUT = 3;
        // Hal response timeout.
        HAL_RESPONSE_TIMEOUT = 4;
        // Hal responded with wrong info.
        WRONG_HAL_RESPONSE = 5;
        // Hal is processing multiple requests simultaneously.
        CONCURRENT_OPERATION = 6;
    }
    optional CallbackStatus callback_status = 2;
    // Response for initial user information request.
    enum InitialUserInfoResponseAction {
        UNSPECIFIED = 0;
        // Let the Android System decide what to do.
        DEFAULT = 1;
        // Switch to an existing Android user.
        SWITCH = 2;
        // Create a new Android user (and switch to it).
        CREATE = 3;
    }
    optional InitialUserInfoResponseAction response_action = 3;
    // Android User id of the target user which can only be 0, 10, 11 and so on.
    // -1 if not available.
    optional int32 target_user = 4;
    // VHAL flags of the current user. (-1 if not available)
    optional int32 target_user_flags = 5;
    // User locales
    optional string user_locales = 6;
}

/**
 * Logs when set user association is requested from Car User Hal.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/hal/UserHalService.java
 */
message CarUserHalUserAssociationRequestReported {
    // Request id for the request.
    optional int32 request_id = 1;
    // Request type.
    enum RequestType {
        UNKNOWN = 0;
        // For setting user association information.
        SET = 1;
        // For getting user association information.
        GET = 2;
    }
    optional RequestType request_type = 2;
    // Android User id of the current user which can only be 0, 10, 11 and so on.
    // -1 if not available.
    optional int32 current_user_id = 3;
    // VHAL flags of the current user. (-1 if not available)
    optional int32 current_user_flags = 4;
    // Number of the set associations requested.
    optional int32 number_associations = 5;
    // Concatenated string for the types from set associations request.
    // This is a string converted from an array of integers.
    optional string user_identification_association_types = 6;
    // Concatenated string for the values from set associations request.
    // This is a string converted from an array of integers.
    optional string user_identification_association_values = 7;
}

/**
 * Logs when Car User Hal responds to set user association requests.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/hal/UserHalService.java
 */
message CarUserHalSetUserAssociationResponseReported {
    // Request id of the request associated with the response.
    optional int32 request_id = 1;
    // Car user hal callback status.
    enum CallbackStatus {
        UNKNOWN = 0;
        // Hal response was invalid.
        INVALID = 1;
        // Hal response was ok.
        OK = 2;
        // Hal timeout during set call.
        HAL_SET_TIMEOUT = 3;
        // Hal response timeout.
        HAL_RESPONSE_TIMEOUT = 4;
        // Hal responded with wrong info.
        WRONG_HAL_RESPONSE = 5;
        // Hal is processing multiple requests simultaneously.
        CONCURRENT_OPERATION = 6;
    }
    optional CallbackStatus callback_status = 2;
    // Number of the set associations in the response.
    optional int32 number_associations = 3;
    // Concatenated string for the types from set associations request.
    // This is a string converted from an array of integers.
    optional string user_identification_association_types = 4;
    // Concatenated string for the values from set associations request.
    // This is a string converted from an array of integers.
    optional string user_identification_association_values = 5;
}

/**
 * Logs whether GarageMode is entered.
 *
 * Logged from:
 *   packages/services/Car/service/src/com/android/car/CarStatsLog.java
 */
message GarageModeInfo {
    // Whether GarageMode is entered.
    optional bool is_garage_mode = 1;
}

/**
 * Historical app ops data per package.
 */
message AppOps {
    // Uid of the package requesting the op
    optional int32 uid = 1 [(is_uid) = true];

    // Name of the package performing the op
    optional string package_name = 2;

    // operation id
    optional android.app.AppOpEnum op_id = 3 [default = APP_OP_NONE];

    // The number of times the op was granted while the app was in the
    // foreground (only for trusted requests)
    optional int64 trusted_foreground_granted_count = 4;

    // The number of times the op was granted while the app was in the
    // background (only for trusted requests)
    optional int64 trusted_background_granted_count = 5;

    // The number of times the op was rejected while the app was in the
    // foreground (only for trusted requests)
    optional int64 trusted_foreground_rejected_count = 6;

    // The number of times the op was rejected while the app was in the
    // background (only for trusted requests)
    optional int64 trusted_background_rejected_count = 7;

    // For long-running operations, total duration of the operation
    // while the app was in the foreground (only for trusted requests)
    optional int64 trusted_foreground_duration_millis = 8;

    // For long-running operations, total duration of the operation
    // while the app was in the background (only for trusted requests)
    optional int64 trusted_background_duration_millis = 9;

    // Whether AppOps is guarded by Runtime permission
    optional bool is_runtime_permission = 10;
}

/**
 * Historical app ops data per package and attribution tag.
 */
message AttributedAppOps {
    // Uid of the package requesting the op
    optional int32 uid = 1 [(is_uid) = true];

    // Name of the package performing the op
    optional string package_name = 2;

    // tag; provided by developer when accessing related API, limited at 50 chars by API.
    // Attributions must be provided through manifest using <attribution> tag available in R and
    // above.
    optional string tag = 3;

    // operation id
    optional android.app.AppOpEnum op = 4 [default = APP_OP_NONE];

    // The number of times the op was granted while the app was in the
    // foreground (only for trusted requests)
    optional int64 trusted_foreground_granted_count = 5;

    // The number of times the op was granted while the app was in the
    // background (only for trusted requests)
    optional int64 trusted_background_granted_count = 6;

    // The number of times the op was rejected while the app was in the
    // foreground (only for trusted requests)
    optional int64 trusted_foreground_rejected_count = 7;

    // The number of times the op was rejected while the app was in the
    // background (only for trusted requests)
    optional int64 trusted_background_rejected_count = 8;

    // For long-running operations, total duration of the operation
    // while the app was in the foreground (only for trusted requests)
    optional int64 trusted_foreground_duration_millis = 9;

    // For long-running operations, total duration of the operation
    // while the app was in the background (only for trusted requests)
    optional int64 trusted_background_duration_millis = 10;

    // Whether AppOps is guarded by Runtime permission
    optional bool is_runtime_permission = 11;

    // Sampling rate used on device, from 0 to 100
    optional int32 sampling_rate = 12;
}

/**
 * Location Manager API Usage information(e.g. API under usage,
 * API call's parameters).
 * Logged from:
 *  frameworks/base/services/core/java/com/android/server/LocationManagerService.java
 */
message LocationManagerApiUsageReported {

    // Indicating if usage starts or usage ends.
    optional android.stats.location.UsageState state = 1;

    // LocationManagerService's API in use.
    // We can identify which API from LocationManager is
    // invoking current LMS API by the combination of
    // API parameter(e.g. is_listener_null, is_intent_null,
    // is_location_request_null)
    optional android.stats.location.LocationManagerServiceApi api_in_use = 2;

    // Name of the package calling the API.
    optional string calling_package_name = 3;

    // Type of the location provider.
    optional android.stats.location.ProviderType provider = 4;

    // Quality of the location request
    optional android.stats.location.LocationRequestQuality quality = 5;

    // The desired interval for active location updates, in milliseconds.
    // Bucketized to reduce cardinality.
    optional android.stats.location.LocationRequestIntervalBucket bucketized_interval = 6;

    // Minimum distance between location updates, in meters.
    // Bucketized to reduce cardinality.
    optional android.stats.location.SmallestDisplacementBucket
            bucketized_smallest_displacement = 7;

    // The number of location updates.
    optional int64 num_updates = 8;

    // The request expiration time, in millisecond since boot.
    // Bucketized to reduce cardinality.
    optional android.stats.location.ExpirationBucket
            bucketized_expire_in = 9;

    // Type of Callback passed in for this API.
    optional android.stats.location.CallbackType callback_type = 10;

    // The radius of the central point of the alert
    // region, in meters. Only for API REQUEST_GEOFENCE.
    // Bucketized to reduce cardinality.
    optional android.stats.location.GeofenceRadiusBucket bucketized_radius = 11;

    // Activity Importance of API caller.
    // Categorized to 3 types that are interesting from location's perspective.
    optional android.stats.location.ActivityImportance activiy_importance = 12;

    // Attribution tag passed to this API.
    optional string attribution_tag = 13;
}

/**
 * Information about a permission grant or denial made by user inside ReviewPermissionsFragment
 */
message ReviewPermissionsFragmentResultReported {
    // unique value identifying a permission group change. A permission group change might result
    // in multiple of these atoms
    optional int64 change_id = 1;

    // UID of package the permission belongs to
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package the permission belongs to
    optional string package_name = 3;

    // The permission to be granted
    optional string permission_name = 4;

    // The result of the permission grant
    optional bool permission_granted = 5;
}

/**
* Information about results of permission upgrade by RuntimePermissionsUpgradeController
* Logged from: RuntimePermissionUpdgradeController
*/
message RuntimePermissionsUpgradeResult {
    // Permission granted as result of upgrade
    optional string permission_name = 1;

    // UID of package granted permission
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package granted permission
    optional string package_name = 3;
}

/**
* Information about a buttons presented in GrantPermissionsActivty and choice made by user
*/
message GrantPermissionsActivityButtonActions {
    // Permission granted as result of upgrade
    optional string permission_group_name = 1;

    // UID of package granted permission
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package requesting permission
    optional string package_name = 3;

    // Buttons presented in the dialog - bit flags, bit numbers are in accordance with
    // LABEL_ constants in GrantPermissionActivity.java
    optional int32 buttons_presented = 4;

    // Button clicked by user - same as bit flags in buttons_presented with only single bit set
    optional int32 button_clicked = 5;

    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 6;

    // Target SDK of the package
    optional int32 target_sdk = 7;

    // Selected precision of the location permission - bit flags indicate which
    // locations were chosen
    optional int32 selected_precision = 8;
}

/**
 * Information about LocationAccessCheck notification presented to user
 */
message LocationAccessCheckNotificationAction {

    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // Uid of package for which location access check is presented
    optional int32 package_uid = 2;

    // Name of package for which location access check is presented
    optional string package_name = 3;

    enum Result {
        UNDEFINED = 0;
        // notification was presented to the user
        NOTIFICATION_PRESENTED = 1;
        // notification was declined by the user
        NOTIFICATION_DECLINED = 2;
        // notification was clicked by the user
        NOTIFICATION_CLICKED = 3;
    }

    // View / interaction recorded
    optional Result result = 4;
}

/**
 * Information about a permission grant or revoke made by user inside AppPermissionFragment
 */
message AppPermissionFragmentActionReported {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // unique value identifying a permission group change. A permission group change might result
    // in multiple of these atoms
    optional int64 change_id = 2;

    // UID of package the permission belongs to
    optional int32 uid = 3 [(is_uid) = true];

    // Name of package the permission belongs to
    optional string package_name = 4;

    // The permission to be granted
    optional string permission_name = 5;

    // The result of the permission grant
    optional bool permission_granted = 6;

    // State of Permission Flags after grant as per android.content.pm.PermissionFlags
    optional int32 permission_flags = 7;

    enum Button {
        UNDEFINED = 0;
        // Allow button
        ALLOW = 1;
        // Deny button
        DENY = 2;
        // Ask every time button
        ASK_EVERY_TIME = 3;
        // Allow all the time button
        ALLOW_ALWAYS = 4;
        // Allow only while using the app button
        ALLOW_FOREGROUND = 5;
        // Same is Deny button but shown in while in use dialog
        DENY_FOREGROUND = 6;
        // Switch button set to ON for location accuracy
        GRANT_FINE_LOCATION = 7;
        // Switch button set to OFF for location accuracy
        REVOKE_FINE_LOCATION = 8;
    }

    // Button pressed in the dialog
    optional Button button_pressed = 8;
}

/**
* Information about a AppPermissionFragment viewed by user
*/
message AppPermissionFragmentViewed {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // UID of package for which permissions are viewed
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package for which permissions are viewed
    optional string package_name = 3;

    // Permission group viewed
    optional string permission_group_name = 4;
}

/**
* Information about a AppPermissionGroupsFragment viewed by user. Fragment has been renamed, but
* the log retains the old fragment name.
*/
message AppPermissionsFragmentViewed {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // id which identifies single view as every view might have several logging records
    // with different package information attached
    optional int64 view_id = 2;

    // Permission group viewed
    optional string permission_group_name = 3;

    // UID of package for which permissions are viewed
    optional int32 uid = 4 [(is_uid) = true];

    // Name of package for which permissions are viewed
    optional string package_name = 5;

    // Category in which permission is included
    enum Category {
      UNDEFINED = 0;
      ALLOWED = 1;
      ALLOWED_FOREGROUND = 2;
      DENIED = 3;
    }
    optional Category category = 6;
}
/**
* Information about a PermissionAppsFragment viewed by user.
* Logged from ui/handheld/PermissionAppsFragment.java
*/
message PermissionAppsFragmentViewed {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // id which identifies single view as every view might have several logging records
    // with different package information attached
    optional int64 view_id = 2;

    // Permission group viewed
    optional string permission_group_name = 3;

    // UID of package for which permissions are viewed
    optional int32 uid = 4 [(is_uid) = true];

    // Name of package for which permissions are viewed
    optional string package_name = 5;

    // Category in which app is included
    enum Category {
        UNDEFINED = 0;
        ALLOWED = 1;
        ALLOWED_FOREGROUND = 2;
        DENIED = 3;
    }
    optional Category category = 6;
}

/**
* Log that the Auto Revoke notification has been clicked
* Logged from ui/ManagePermissionsActivity
*/
message AutoRevokeNotificationClicked {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;
}

/**
* Log that an app has been displayed on the auto revoke page, and lists one permission that was
* auto revoked for it.
* Logged from ui/handheld/AutoRevokeFragment
*/
message AutoRevokeFragmentAppViewed {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // UID of package for which permissions are viewed
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package for which permissions are viewed
    optional string package_name = 3;

    // The name of a permission group that has been revoked
    optional string permission_group_name = 4;

    // The age of the app- more than three months old, or more than six months
    enum Age {
        UNDEFINED = 0;
        NEWER_BUCKET = 1;
        OLDER_BUCKET = 2;
    }

    // How long the app has been unused. Currently, newer bucket is 3 months, older is 6 months
    optional Age age = 5;
}

/**
* Log that the user has interacted with an app on the auto revoke fragment
* Logged from ui/handheld/AutoRevokeFragment
*/
message AutoRevokedAppInteraction {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // UID of package for which permissions are viewed
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package for which permissions are viewed
    optional string package_name = 3;

    enum Action {
        UNDEFINED = 0;
        REMOVE = 1;
        OPEN = 2;
        APP_INFO = 3;
        PERMISSIONS = 4;
        REMOVE_IN_SETTINGS = 5;
        OPEN_IN_SETTINGS = 6;
    }

    // The action the user took to interact with the app
    optional Action action = 4;
}

/**
* Log that the AppPermissionGroupsFragment has been interacted with for the possible purposes of
* auto revoke, or that the auto revoke switch has been changed
* Logged from ui/handheld/AppPermissionGroupsFragment
 */
message AppPermissionGroupsFragmentAutoRevokeAction {
    // id which identifies single session of user interacting with permission controller
    optional int64 session_id = 1;

    // UID of package for which permissions are viewed
    optional int32 uid = 2 [(is_uid) = true];

    // Name of package for which permissions are viewed
    optional string package_name = 3;

    enum Action {
        UNDEFINED = 0;
        OPENED_FOR_AUTO_REVOKE = 1;
        OPENED_FROM_INTENT = 2;
        SWITCH_ENABLED = 3;
        SWITCH_DISABLED = 4;
    }

    // The action the user took to interact with the fragment
    optional Action action = 4;
}

/**
 * Logs when there is a smart selection related event.
 * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java
 * Logged from: TextClassifierEventLogger.java
 */
message TextSelectionEvent {
    // A session ID.
    optional string session_id = 1;

    // Event type of this event.
    optional android.stats.textclassifier.EventType event_type = 2;

    // Name of the annotator model that is involved in this event.
    optional string model_name = 3;

    // Type of widget that was involved in triggering this event.
    optional android.stats.textclassifier.WidgetType widget_type = 4;

    // Index of this event in a session.
    optional int32 event_index = 5;

    // Entity type that is involved.
    optional string entity_type = 6;

    // Relative word index of the start of the selection.
    optional int32 relative_word_start_index = 7;

    // Relative word (exclusive) index of the end of the selection.
    optional int32 relative_word_end_index = 8;

    // Relative word index of the start of the smart selection.
    optional int32 relative_suggested_word_start_index = 9;

    // Relative word (exclusive) index of the end of the smart selection.
    optional int32 relative_suggested_word_end_index = 10;

    // Name of source package.
    optional string package_name = 11;

    // Name of the LangID model that is involved in this event.
    optional string langid_model_name = 12;
}

/**
 * Logs when there is a smart linkify related event.
 * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java
 * Logged from: TextClassifierEventLogger.java
 */
message TextLinkifyEvent {
    // A session ID.
    optional string session_id = 1;

    // Event type of this event.
    optional android.stats.textclassifier.EventType event_type = 2;

    // Name of the annotator model that is involved in this event.
    optional string model_name = 3;

    // Type of widget that was involved in triggering this event.
    optional android.stats.textclassifier.WidgetType widget_type = 4;

    // Index of this event in a session.
    optional int32 event_index = 5;

    // Entity type that is involved.
    optional string entity_type = 6;

    // Number of links detected.
    optional int32 num_links = 7;

    // The total length of all links.
    optional int32 linked_text_length = 8;

    // Length of input text.
    optional int32 text_length = 9;

    // Time spent on generating links in ms.
    optional int64 latency_millis = 10;

    // Name of source package.
    optional string package_name = 11;

    // Name of the LangID model that is involved in this event.
    optional string langid_model_name = 12;
}

/**
 * Logs when there is a conversation actions related event.
 * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java
 * Logged from: TextClassifierEventLogger.java
 */
message ConversationActionsEvent {
    // A session ID.
    optional string session_id = 1;

    // Event type of this event.
    optional android.stats.textclassifier.EventType event_type = 2;

    // Name of the actions model that is involved in this event.
    optional string model_name = 3;

    // Type of widget that was involved in triggering this event.
    optional android.stats.textclassifier.WidgetType widget_type = 4;

    // The first entity type that is involved.
    optional string first_entity_type = 5;

    // The second entity type that is involved.
    optional string second_entity_type = 6;

    // The third entity type that is involved.
    optional string third_entity_type = 7;

    // The score of the first entity type.
    optional float score = 8;

    // Name of source package.
    optional string package_name = 9;

    // Name of the annotator model that is involved in this event.
    optional string annotator_model_name = 10;

    // Name of the LangID model that is involved in this event.
    optional string langid_model_name = 11;
}

/**
 * Logs when there is a language detection related event.
 * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java
 * Logged from: TextClassifierEventLogger.java
 */
message LanguageDetectionEvent {
    // A session ID.
    optional string session_id = 1;

    // Event type of this event.
    optional android.stats.textclassifier.EventType event_type = 2;

    // Name of the language detection model that is involved in this event.
    optional string model_name = 3;

    // Type of widget that was involved in triggering this event.
    optional android.stats.textclassifier.WidgetType widget_type = 4;

    // Detected language.
    optional string language_tag = 5;

    // Score of the detected language.
    optional float score = 6;

    // Position of this action.
    optional int32 action_index = 7;

    // Name of source package.
    optional string package_name = 8;
}

/**
 * Information about an OTA update attempt by update_engine.
 * Logged from platform/system/update_engine/metrics_reporter_android.cc
 */
message UpdateEngineUpdateAttemptReported {
    // The number of attempts for the update engine to apply a given payload.
    optional int32 attempt_number = 1;

    optional android.stats.otaupdate.PayloadType payload_type = 2;

    // The total time in minutes for the update engine to apply a given payload.
    // The time is calculated by calling clock_gettime() / CLOCK_BOOTTIME; and
    // it's increased when the system is sleeping.
    optional int32 duration_boottime_in_minutes = 3;

    // The total time in minutes for the update engine to apply a given payload.
    // The time is calculated by calling clock_gettime() / CLOCK_MONOTONIC_RAW;
    // and it's not increased when the system is sleeping.
    optional int32 duration_monotonic_in_minutes = 4;

    // The size of the payload in MiBs.
    optional int32 payload_size_mib = 5;

    // The attempt result reported by the update engine for an OTA update.
    optional android.stats.otaupdate.AttemptResult attempt_result = 6;

    // The error code reported by the update engine after an OTA update attempt
    // on A/B devices.
    optional android.stats.otaupdate.ErrorCode error_code = 7;

    // The build fingerprint of the source system. The value is read from a
    // system property when the device takes the update. e.g.
    // Android/aosp_sailfish/sailfish:10/QP1A.190425.004/5507117:userdebug/test-keys
    optional string source_fingerprint = 8;

    // Size of super partition.
    optional int64 super_partition_size_bytes = 9;

    // Size of current slot within the super partition.
    optional int64 slot_size_bytes = 10;

    // Free space available in the super partition.
    optional int64 super_free_space_bytes = 11;

    // Whether the device enables Virtual A/B compression.
    optional bool vab_compression_enabled = 12;

    // Whether this update attempt uses Virtual A/B compression.
    optional bool vab_compression_used = 13;
}

/**
 * Information about all the attempts the device make before finishing the
 * successful update.
 * Logged from platform/system/update_engine/metrics_reporter_android.cc
 */
message UpdateEngineSuccessfulUpdateReported {
    // The number of attempts for the update engine to apply the payload for a
    // successful update.
    optional int32 attempt_count = 1;

    optional android.stats.otaupdate.PayloadType payload_type = 2;

    optional int32 payload_size_mib = 3;

    // The total number of bytes downloaded by update_engine since the last
    // successful update.
    optional int32 total_bytes_downloaded_mib = 4;

    // The ratio in percentage of the over-downloaded bytes compared to the
    // total bytes needed to successfully install the update. e.g. 200 if we
    // download 200MiB in total for a 100MiB package.
    optional int32 download_overhead_percentage = 5;

    // The total time in minutes for the update engine to apply the payload for a
    // successful update.
    optional int32 total_duration_minutes = 6;

    // The number of reboot of the device during a successful update.
    optional int32 reboot_count = 7;

    // Whether on device verity computation is enabled
    optional bool fec_enabled = 8;

    // Whether on device hash tree computation is enabled
    optional bool hash_tree_enabled = 9;

}

/**
 * Reported when a client requests to prepare for resume on reboot.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
 */
message RebootEscrowPreparationReported {
  enum Result {
    ROR_NEED_PREPARATION = 0;
    ROR_SKIP_PREPARATION_AND_NOTIFY = 1;
    ROR_SKIP_PREPARATION_NOT_NOTIFY = 2;
  }

  // The uid of the client who requests ror.
  optional int32 requesting_uid = 1 [(is_uid) = true];

  optional Result result = 2;

  // The number of clients who has requested ror, including the current caller.
  optional int32 requested_client_count = 3;
}

/**
 * Reported when the lock screen knowledge factor is captured, while there are clients of
 * resume on reboot to notify.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
 */
message RebootEscrowLskfCaptureReported {
  // The uid of the client to notify about the Lskf capture.
  optional int32 uid_to_notify = 1 [(is_uid) = true];

  // The total number of clients who have requested ror.
  optional int32 requested_client_count = 2;

  // The duration between RoR request - current LSKF capture event.
  optional int32 duration_ror_requested_to_lskf_captured_seconds = 3;
}

/* Reported when a client (e.g. gmscore) requests to reboot with Resume on Reboot.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
 */
message RebootEscrowRebootReported {
  optional int32 error_code = 1;

  // The uid of clients who requested the reboot
  optional int32 request_uid = 2 [(is_uid) = true];

  // All clients that have prepared for RoR before this reboot
  optional int32 prepared_clients_count = 3;

  // The RoR request count for the client who requests reboot.
  optional int32 request_count = 4;

  // Whether the reboot request assumes a slot switch on a/b devices.
  optional bool slot_switch = 5;

  // True if the DeviceConfig shows the device is using server based RoR.
  optional bool server_based = 6;

  // The duration between last LSKF captured - reboot requests
  optional int32 duration_lskf_captured_to_reboot_seconds = 7;

  // The count of LSKF captured since preparation
  optional int32 lskf_captured_counts = 8;
}

/**
 * Logs stats for AppSearch function calls
 */
message AppSearchCallStatsReported {
    // 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;

    // The status code for the call or internal state.
    // 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 the end-to-end function call in AppSearch.
    // It doesn't include binder latency
    optional int32 total_latency_millis = 6;

    // Type of the function call value is in sync with
    // frameworks/base/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/CallStats.java
    optional int32 call_type = 7;

    // Estimated binder latency (estimated as single-trip time * 2)
    optional int32 estimated_binder_latency_millis = 8;

    // Number of operations succeeded for batch operations.
    optional int32 num_operations_succeeded = 9;

    // Number of operations failed for batch operations.
    optional int32 num_operations_failed = 10;

    // Number of actual API calls reported in this atom.
    optional int32 num_reported_calls = 11;
}

/**
 * Logs detailed stats for putting a single document in AppSearch
 */
message AppSearchPutDocumentStatsReported {
    // 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 a put_document
    optional int32 total_latency_millis = 6;

    // Time used to generate a document proto from a Bundle.
    optional int32 generate_document_proto_latency_millis = 7;

    // Time used to rewrite types and namespaces in the document.
    optional int32 rewrite_document_types_latency_millis = 8;

    // Overall time used for the native function call.
    optional int32 native_latency_millis = 9;

    // Time used to store the document.
    optional int32 native_document_store_latency_millis = 10;

    // Time used to index the document. It doesn't include the time to
    // merge indices.
    optional int32 native_index_latency_millis = 11;

    // Time used to merge the indices.
    optional int32 native_index_merge_latency_millis = 12;

    // Document size in bytes.
    optional int32 native_document_size_bytes = 13;

    // Number of tokens added to the index.
    optional int32 native_num_tokens_indexed = 14;

    // Whether the max number of tokens exceeded.
    optional bool native_exceeded_max_num_tokens = 15;
}

/**
 * Logs detailed stats for AppSearch Initialize
 */
message AppSearchInitializeStatsReported {
    // 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];

    // Initialize status code
    // Needs to be sync with AppSearchResult#ResultCode in
    // frameworks/base/apex/appsearch/framework/java/android/app/appsearch/AppSearchResult.java
    optional int32 status_code = 4;

    // Overall time used for initialization, not including binder latency.
    optional int32 total_latency_millis = 5;

    // Whether the initialize() detects desyncs.
    // Desync happens if we lose the visibility doc.
    optional bool has_desync = 6;

    // Time used to read and process the schema and namespaces.
    optional int32 prepare_schema_and_namespaces_latency_millis = 7;

    // Time used to read and process the visibility file.
    optional int32 prepare_visibility_file_latency_millis = 8;

    // Overall time used for the native function call.
    optional int32 native_latency_millis = 9;

    // Needs to be sync with RecoveryCause in google3/third_party/icing/proto/logging.proto
    optional int32 native_document_store_recovery_cause = 10;

    // Needs to be sync with RecoveryCause in google3/third_party/icing/proto/logging.proto
    optional int32 native_index_restoration_cause = 11;

    // Needs to be sync with RecoveryCause in google3/third_party/icing/proto/logging.proto
    optional int32 native_schema_store_recovery_cause = 12;

    // Time used to recover the document store.
    optional int32 native_document_store_recovery_latency_millis = 13;

    // Time used to restore the index.
    optional int32 native_index_restoration_latency_millis = 14;

    // Time used to recover the schema store.
    optional int32 native_schema_store_recovery_latency_millis = 15;

    // Needs to be sync with DocumentStoreDataStatus in google3/third_party/icing/proto/logging.proto
    optional int32 native_document_store_data_status = 16;

    // Number of documents currently in document store. Those may
    // include alive, deleted, and expired documents.
    optional int32 native_num_documents = 17;

    // Number of schema types currently in the schema store.
    optional int32 native_num_schema_types = 18;

    // Whether we had to reset the index, losing all data, during initialization.
    optional bool has_reset = 19;

    // The status code of the reset operation if has_reset is true.
    // Needs to be sync with AppSearchResult#ResultCode in
    // frameworks/base/apex/appsearch/framework/java/android/app/appsearch/AppSearchResult.java
    optional int32 reset_status_code = 20;
}

/**
 * Logs detailed stats for querying in AppSearch
 */
message AppSearchQueryStatsReported {
    // 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 query including estimated binder latency
    optional int32 total_latency_millis = 6;

    // Time used to rewrite the search spec.
    optional int32 rewrite_search_spec_latency_millis = 7;

    // Time used to rewrite the search results.
    optional int32 rewrite_search_result_latency_millis = 8;

    // Whether it is a global query.
    // Needs to be sync with QueryStats#VisibilityScope in
    // frameworks/base/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/QueryStats.java
    optional int32 visibility_scope = 9;

    // Overall time used for the native function call.
    optional int32 native_latency_millis = 10;

    // Number of terms in the query string.
    optional int32 native_num_terms = 11;

    // Length of the query string.
    optional int32 native_query_length = 12;

    // Number of namespaces filtered.
    optional int32 native_num_namespaces_filtered = 13;

    // Number of schema types filtered.
    optional int32 native_num_schema_types_filtered = 14;

    // The requested number of results in one page.
    optional int32 native_requested_page_size = 15;

    // The actual number of results returned in the current page.
    optional int32 native_num_results_returned_current_page = 16;

    // Whether the function call is querying the first page. If it's
    // not, Icing will fetch the results from cache so that some steps
    // may be skipped.
    optional bool native_is_first_page = 17;

    // Time used to parse the query, including 2 parts: tokenizing and
    // transforming tokens into an iterator tree.
    optional int32 native_parse_query_latency_millis = 18;

    // Strategy of scoring and ranking.
    // Needs to be sync with RankingStrategy.Code in google3/third_party/icing/proto/scoring.proto
    optional int32 native_ranking_strategy = 19;

    // Number of documents scored.
    optional int32 native_num_documents_scored = 20;

    // Time used to score the raw results.
    optional int32 native_scoring_latency_millis = 21;

    // Time used to rank the scored results.
    optional int32 native_ranking_latency_millis = 22;

    // Time used to fetch the document protos. Note that it includes the
    // time to snippet if "native_num_results_with_snippets" is NOT zero.
    optional int32 native_document_retrieval_latency_millis = 23;

    // How many snippets are calculated.
    optional int32 native_num_results_with_snippets = 24;
}

/**
 * Logs detailed stats for remove in AppSearch
 */
message AppSearchRemoveStatsReported {
    // 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_previous_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 remove including the binder latency
    optional int32 total_latency_millis = 6;

    // Overall time used for the native function call.
    optional int32 native_latency_millis = 7;

    // Used to indicate what kind of delete(namespace, schemaType etc) calls deleteByQuery here.
    // Needs to be sync with external/icing/proto/icing/proto/logging.proto#DeleteStatsProto
    optional int32 native_delete_type = 8;

    // Number of documents deleted by this call.
    optional int32 native_num_documents_deleted = 9;
}

/**
 * Logs detailed stats for optimization in AppSearch.
 *
 * stats pushed from:
 *   frameworks/base/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
 *
 * Next tag: 14
 */
message AppSearchOptimizeStatsReported {
    // 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_previous_skipped_sample = 2;

    // Needs to be sync with AppSearchResult#ResultCode in
    // frameworks/base/apex/appsearch/framework/java/android/app/appsearch/AppSearchResult.java
    optional int32 status_code = 3;

    // Overall time used for remove including the binder latency
    optional int32 total_latency_millis = 4;

    // Overall time used for the native function call.
    optional int32 native_latency_millis = 5;

    // Time used to optimize the document store in millis.
    optional int32 native_document_store_optimize_latency_millis = 6;

    // Time used to restore the index in millis.
    optional int32 native_index_restoration_latency_millis = 7;

    // Number of documents before the optimization.
    optional int32 native_num_original_documents = 8;

    // Number of documents deleted during the optimization.
    optional int32 native_num_deleted_documents = 9;

    // Number of documents expired during the optimization.
    optional int32 native_num_expired_documents = 10;

    // Size of storage in bytes before the optimization.
    optional int64 native_storage_size_before_bytes = 11;

    // Size of storage in bytes after the optimization.
    optional int64 native_storage_size_after_bytes = 12;

    // The amount of time in millis since the last optimization ran.
    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: 20
 */
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;

    // Whether schema migration is executed during setting schema
    optional bool has_schema_migration = 12;

    // Overall time used for getting schema during schema migration
    optional int32 schema_migration_get_schema_latency_millis = 13;

    // Overall time used for querying and transforming documents during schema migration
    optional int32 schema_migration_query_and_transform_latency_millis = 14;

    // Overall time used for first setSchema during schema migration
    optional int32 schema_migration_first_set_schema_latency_millis = 15;

    // Overall time used for second setSchema during schema migration
    optional int32 schema_migration_second_set_schema_latency_millis = 16;

    // Overall time used for saving documents during schema migration
    optional int32 schema_migration_save_document_latency_millis = 17;

    // Number of migrated documents during schema migration
    optional int32 schema_migration_migrated_document_count = 18;

    // Number of saved documents during schema migration
    optional int32 schema_migration_saved_document_count = 19;
}

// Reports information in external/icing/proto/icing/proto/storage.proto#DocumentStorageInfoProto
// Next tag: 15
message AppSearchDocumentStorageInfo {
    // Total number of alive documents.
    optional int32 num_alive_documents = 1;

    // Total number of deleted documents.
    optional int32 num_deleted_documents = 2;

    // Total number of expired documents.
    optional int32 num_expired_documents = 3;

    // Total size of the document store in bytes. Will be set to -1 if an IO error
    // is encountered while calculating this field.
    optional int64 document_store_size_bytes = 4;

    // Total size of the ground truth in bytes. The ground truth may
    // include deleted or expired documents. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 document_log_size_bytes = 5;

    // Size of the key mapper in bytes. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 key_mapper_size_bytes = 6;

    // Size of the document id mapper in bytes. Will be set to -1 if an IO error
    // is encountered while calculating this field.
    optional int64 document_id_mapper_size_bytes = 7;

    // Size of the score cache in bytes. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 score_cache_size_bytes = 8;

    // Size of the filter cache in bytes. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 filter_cache_size_bytes = 9;

    // Size of the corpus mapper in bytes. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 corpus_mapper_size_bytes = 10;

    // Size of the corpus score cache in bytes. Will be set to -1 if an IO error
    // is encountered while calculating this field.
    optional int64 corpus_score_cache_size_bytes = 11;

    // Size of the namespace id mapper in bytes. Will be set to -1 if an IO error
    // is encountered while calculating this field.
    optional int64 namespace_id_mapper_size_bytes = 12;

    // Number of namespaces seen from the current documents.
    optional int32 num_namespaces = 13;

    // Storage information of each namespace is not included due to that it has string field.

    reserved 14;
}

// Reports information in external/icing/proto/icing/proto/storage.proto#SchemaStoreStorageInfoProto
// Next tag: 5
message AppSearchSchemaStoreStorageInfo {
    // Size of the schema store in bytes. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 schema_store_size_bytes = 1;

    // Total number of schema types.
    optional int32 num_schema_types = 2;

    // Total number of all sections across all types
    optional int32 num_total_sections = 3;

    // Total number of types at the current section limit.
    optional int32 num_schema_types_sections_exhausted = 4;
}

// Reports information in external/icing/proto/icing/proto/storage.proto#IndexStorageInfoProto
// Next tag: 9
message AppSearchIndexStorageInfo {
    // Total size of the index in bytes. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 index_size_bytes = 1;

    // Size of the lite index lexicon in bytes. Will be set to -1 if an IO error
    // is encountered while calculating this field.
    optional int64 lite_index_lexicon_size_bytes = 2;

    // Size of the lite index hit buffer in bytes. Will be set to -1 if an IO
    // error is encountered while calculating this field.
    optional int64 lite_index_hit_buffer_size_bytes = 3;

    // Size of the main index lexicon in bytes. Will be set to -1 if an IO error
    // is encountered while calculating this field.
    optional int64 main_index_lexicon_size_bytes = 4;

    // Size of the main index storage in bytes. Will be set to -1 if an IO error
    // is encountered while calculating this field.
    optional int64 main_index_storage_size_bytes = 5;

    // Size of one main index block in bytes.
    optional int64 main_index_block_size_bytes = 6;

    // Number of main index blocks.
    optional int32 num_blocks = 7;

    // Percentage of the main index blocks that are free, assuming
    // allocated blocks are fully used.
    optional float min_free_fraction = 8;
}

/**
 * Pulls information about storage information per user from AppSearch
 *
 * Pulled from:
 *   frameworks/base/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
 *
 * Next tag: 6
 */
message AppSearchStorageInfo {
    // The associated user (for multi-user feature). Defined in android/os/UserHandle.java
    // This is mainly used as a dimension for the metric, but it can also tell us if
    // the StorageInfo is for a primary user or secondary user.
    optional int32 user = 1;

    // Total size of Icing’s storage in bytes. Will be set to -1 if an IO error is
    // encountered while calculating this field.
    optional int64 total_storage_size_bytes = 2;

    // Storage information of the document store.
    optional AppSearchDocumentStorageInfo document_storage_info = 3
        [(android.os.statsd.log_mode) = MODE_BYTES];

    // Storage information of the schema store.
    optional AppSearchSchemaStoreStorageInfo schema_store_storage_info = 4
        [(android.os.statsd.log_mode) = MODE_BYTES];

    // Storage information of the index.
    optional AppSearchIndexStorageInfo index_storage_info = 5
        [(android.os.statsd.log_mode) = MODE_BYTES];
}


/**
 * Reported when AppSearch Contacts Indexer syncs the contacts data from CP2 to AppSearch
 *
 * Reported from:
 *   packages/modules/AppSearch/service/java/com/android/server/appsearch/contactsindexer/ContactsIndexerManagerService.java
 *
 * Next tag: 11
 */
message ContactsIndexerUpdateStatsReported {
    enum UpdateType {
      UNKNOWN = 0;
      DELTA = 1;
      FULL = 2;
    }

    // Type of the update
    optional UpdateType update_type = 1;

    // Latency for the update in millis
    optional int32 total_latency_millis = 2;

    // Status code to indicate whether the insert new contacts, or update
    // existing contacts succeeds, or fails and why
    // In case of success, it only contains OK.
    // In case of failures, it contains all the possible errors we get.
    repeated int32 update_status_codes = 3;

    // Status code to indicate whether the delete succeeds, or fails and why
    // In case of success, it only contains OK.
    // In case of failures, it contains all the possible errors we get.
    repeated int32 delete_status_codes = 4;

    // Number of new contacts to be updated.
    optional int32 number_of_new_contacts_to_be_updated = 5;

    // Number of old and new contacts has been successfully updated.
    optional int32 number_of_contacts_update_succeeded = 6;

    // Number of old contacts has been successfully deleted.
    optional int32 number_of_contacts_delete_succeeded = 7;

    // Number of old contacts skipped during this update due to no
    // significant change.
    optional int32 number_of_contacts_update_skipped = 8;

    // Number of old and new contacts failed to be updated
    optional int32 number_of_contacts_update_failed = 9;

    // Number of old contacts failed to be deleted
    optional int32 number_of_contacts_delete_failed = 10;
}

/**
 * Reported when the RebootEscrow HAL has attempted to recover the escrowed
 * key to indicate whether it was successful or not.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/locksettings/RebootEscrowManager.java
 */
message RebootEscrowRecoveryReported {
    // Type of the resume on reboot backend provider.
    enum ServiceType {
        UNKNOWN = 0;
        HAL = 1;
        SERVER_BASED = 2;
    }

    // Whether the vbmeta digest of the current slot matches a precomputed value before reboot.
    enum VbmetaDigestStatus {
        MATCH_EXPECTED_SLOT = 0;
        MATCH_FALLBACK_SLOT = 1;
        MISMATCH = 2;
    }

    optional bool successful = 1;
    // The error code for escrow data recovery failure
    optional int32 error_code = 2;

    optional ServiceType type = 3;

    // Number of retries to unwrap the escrow key asynchronously.
    optional int32 get_escrow_key_retry_count = 4;

    // The duration between storing of reboot escrow key ->
    // use of reboot escrow key to unlock CE after reboot
    optional int32 duration_escrow_key_storage_to_unlock_seconds = 5;

    optional VbmetaDigestStatus vbmeta_digest_status = 6;

    // The duration between boot complete -> CE unlock
    optional int32 duration_boot_complete_to_unlock_seconds = 7;
}

/**
 * Global display pipeline metrics reported by SurfaceFlinger.
 * Metrics exist beginning in Android 11.
 * There is a copy of this proto in timestats_atoms.proto in SurfaceFlinger.
 * That proto must be updated if this atom is updated.
 *
 * Pulled from:
 *    frameworks/native/services/surfaceflinger/TimeStats/TimeStats.cpp
 */
message SurfaceflingerStatsGlobalInfo {
    // Aggregated refresh rate buckets that layers were presenting at. Buckets
    // are defined in SurfaceFlinger and are tracked per device.
    // Introduced in Android 12.
    // This is intended to be used as a dimenstion in collecting per-refresh rate
    // jank statistics.
    optional int32 display_refresh_rate_bucket = 18;
    // Aggregated render rate buckets that layers were overridden to run at.
    // Buckets are defined in SurfaceFlinger and are tracked per device.
    // Introduced in Android 12.
    // This is intended to be used as a dimension in collecting per-render rate
    // jank statistics.
    optional int32 render_rate_bucket = 21;
    // Total number of frames presented during the tracing period
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional int64 total_frames = 1;
    // Total number of frames missed
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional int64 missed_frames = 2;
    // Total number of frames that fell back to client composition
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional int64 client_composition_frames = 3;
    // Total time the display was turned on
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional int64 display_on_millis = 4;
    // Total time that was spent performing animations.
    // This is derived from the present-to-present layer histogram.
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional int64 animation_millis = 5;
    // Total number of event connections tracked by SurfaceFlinger at the time
    // of this pull. If this number grows prohibitively large, then this can
    // cause jank due to resource contention.
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional int32 event_connection_count = 6;
    // Set of timings measured from when SurfaceFlinger began compositing a
    // frame, until the frame was requested to be presented to the display. This
    // measures SurfaceFlinger's total CPU walltime on the critical path per
    // frame.
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional FrameTimingHistogram frame_duration = 7
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Set of timings measured from when SurfaceFlinger first began using the
    // GPU to composite a frame, until the GPU has finished compositing that
    // frame. This measures the total additional time SurfaceFlinger needed to
    // perform due to falling back into GPU composition.
    // Note: This stat is not sliced by dimension. It will be duplicated for metrics
    // using render_rate_bucket as a dimension.
    optional FrameTimingHistogram render_engine_timing = 8
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Number of frames where SF saw a frame, based on its frame timeline.
    // Frame timelines may include transactions without updating buffer contents.
    // Introduced in Android 12.
    optional int32 total_timeline_frames = 9;
    // Number of frames where SF saw a janky frame.
    // Introduced in Android 12.
    optional int32 total_janky_frames = 10;
    // Number of janky frames where SF spent a long time on the CPU.
    // Introduced in Android 12.
    optional int32 total_janky_frames_with_long_cpu = 11;
    // Number of janky frames where SF spent a long time on the GPU.
    // Introduced in Android 12.
    optional int32 total_janky_frames_with_long_gpu = 12;
    // Number of janky frames where SF missed the frame deadline, but there
    // was not an attributed reason (e.g., maybe HWC missed?)
    // Introduced in Android 12.
    optional int32 total_janky_frames_sf_unattributed = 13;
    // Number of janky frames where the app missed the frame deadline, but
    // there was not an attributed reason
    // Introduced in Android 12.
    optional int32 total_janky_frames_app_unattributed = 14;
    // Number of janky frames that were caused because of scheduling errors in
    // SF that resulted in early present (e.g., SF sending a buffer to the
    // composition engine earlier than expected, resulting in a present that is
    // one vsync early)
    // Introduced in Android 12.
    optional int32 total_janky_frames_sf_scheduling = 15;
    // Number of frames that were classified as jank because of possible drift in
    // vsync predictions.
    // Introduced in Android 12.
    optional int32 total_jank_frames_sf_prediction_error = 16;
    // Number of janky frames where the app was in a buffer stuffed state (more
    // than one buffer ready to be presented at the same vsync). Usually caused
    // when the first frame is unusually long, the following frames enter into a
    // stuffed state.
    // Introduced in Android 12.
    optional int32 total_jank_frames_app_buffer_stuffing = 17;
    // Buckets of timings in ms by which SurfaceFlinger's deadline was missed
    // while latching and presenting frames.
    // Introduced in Android 12.
    optional FrameTimingHistogram sf_deadline_misses = 19
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Buckets of timings in ms by which the Vsync prediction drifted, when
    // compared to the actual hardware vsync.
    // Introduced in Android 12.
    optional FrameTimingHistogram sf_prediction_errors = 20
        [(android.os.statsd.log_mode) = MODE_BYTES];

    // Next ID: 22
}

/**
 * Per-layer display pipeline metrics reported by SurfaceFlinger.
 * Metrics exist beginning in Android 11.
 * The number of layers uploaded may be restricted due to size limitations.
 * There is a copy of this proto in timestats_atoms.proto in SurfaceFlinger.
 * That proto must be updated if this atom is updated.
 *
 * Pulled from:
 *    frameworks/native/services/surfaceflinger/TimeStats/TimeStats.cpp
 */
message SurfaceflingerStatsLayerInfo {
    // UID of the application who submitted this layer for presentation
    // This is intended to be used as a dimension for surfacing rendering
    // statistics to applications.
    // Introduced in Android 12.
    optional int32 uid = 12 [(is_uid) = true];
    // Refresh rate bucket that the layer was presenting at. Buckets are
    // defined in SurfaceFlinger and are tracked per device.
    // Introduced in Android 12.
    // This is intended to be used as a dimension in collecting per-refresh rate
    // jank statistics
    optional int32 display_refresh_rate_bucket = 22;
    // Render rate bucket that the layer was submitting frames at. Buckets are
    // defined in SurfaceFlinger and are tracked per device.
    // Introduced in Android 12.
    // This is intended to be used as a dimension in collecting per-render rate
    // jank statistics.
    optional int32 render_rate_bucket = 23;

    // Game modes are used only for integrating with GameManager.
    enum GameMode {
         GAME_MODE_UNSPECIFIED = 0;
         GAME_MODE_UNSUPPORTED = 1;
         GAME_MODE_STANDARD = 2;
         GAME_MODE_PERFORMANCE = 3;
         GAME_MODE_BATTERY = 4;
    }

    // Game mode that the layer was running at. Used to track user engagement
    // in different modes. The modes are defined in GameManager.java
    // All non-game layers will have this field set to UNSUPPORTED.
    // Introduced in Android 12
    // This is intended to be used as a dimension in collecting per-game mode
    // fps and frame related metrics.
    optional GameMode game_mode = 26;
    // The layer for this set of metrics
    // In many scenarios the package name is included in the layer name, e.g.,
    // layers created by Window Manager. But this is not a guarantee - in the
    // general case layer names are arbitrary debug names.
    optional string layer_name = 1;
    // Total number of frames presented
    optional int64 total_frames = 2;
    // Total number of dropped frames while latching a buffer for this layer.
    optional int64 dropped_frames = 3;
    // Set of timings measured between successive presentation timestamps.
    optional FrameTimingHistogram present_to_present = 4
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Set of timings measured from when an app queued a buffer for
    // presentation, until the buffer was actually presented to the
    // display.
    optional FrameTimingHistogram post_to_present = 5
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Set of timings measured from when a buffer is ready to be presented,
    // until the buffer was actually presented to the display.
    optional FrameTimingHistogram acquire_to_present = 6
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Set of timings measured from when a buffer was latched by
    // SurfaceFlinger, until the buffer was presented to the display
    optional FrameTimingHistogram latch_to_present = 7
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Set of timings measured from the desired presentation to the actual
    // presentation time
    optional FrameTimingHistogram desired_to_present = 8
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Set of timings measured from when an app queued a buffer for
    // presentation, until the buffer was ready to be presented.
    optional FrameTimingHistogram post_to_acquire = 9
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Frames missed latch because the acquire fence didn't fire
    optional int64 late_acquire_frames = 10;
    // Frames latched early because the desired present time was bad
    optional int64 bad_desired_present_frames = 11;
    // Number of frames where SF saw a frame, based on its frame timeline.
    // Frame timelines may include transactions without updating buffer contents.
    // Introduced in Android 12.
    optional int32 total_timeline_frames = 13;
    // Number of frames where SF saw a janky frame.
    // Introduced in Android 12.
    optional int32 total_janky_frames = 14;
    // Number of janky frames where SF spent a long time on the CPU.
    // Introduced in Android 12.
    optional int32 total_janky_frames_with_long_cpu = 15;
    // Number of janky frames where SF spent a long time on the GPU.
    // Introduced in Android 12.
    optional int32 total_janky_frames_with_long_gpu = 16;
    // Number of janky frames where SF missed the frame deadline, but there
    // was not an attributed reason (e.g., maybe HWC missed?)
    // Introduced in Android 12.
    optional int32 total_janky_frames_sf_unattributed = 17;
    // Number of janky frames where the app missed the frame deadline, but
    // there was not an attributed reason
    // Introduced in Android 12.
    optional int32 total_janky_frames_app_unattributed = 18;
    // Number of janky frames that were caused because of scheduling errors in
    // SF that resulted in early present (e.g., SF sending a buffer to the
    // composition engine earlier than expected, resulting in a present that is
    // one vsync early)
    // Introduced in Android 12.
    optional int32 total_janky_frames_sf_scheduling = 19;
    // Number of frames that were classified as jank because of possible drift in
    // vsync predictions.
    // Introduced in Android 12.
    optional int32 total_jank_frames_sf_prediction_error = 20;
    // Number of janky frames where the app was in a buffer stuffed state (more
    // than one buffer ready to be presented at the same vsync). Usually caused
    // when the first frame is unusually long, the following frames enter into a
    // stuffed state.
    // Introduced in Android 12.
    optional int32 total_jank_frames_app_buffer_stuffing = 21;

    /**
     * Encapsulates the FrameRateVote information sent by the application while
     * calling setFrameRate.
     * Metrics exist beginning in Android 12.
     */
    message SetFrameRateVote {
        // The desired frame rate the application wishes to run on.
        optional float frame_rate = 1;

        enum FrameRateCompatibility {
            FRAME_RATE_UNDEFINED = 0;
            FRAME_RATE_DEFAULT = 1;
            FRAME_RATE_EXACT_OR_MULTIPLE = 2;
        }

        // Specifies how to interpret the frame rate associated with the layer.
        // Defined in Layer.h
        optional FrameRateCompatibility frame_rate_compatibility = 2;

        enum Seamlessness {
            SEAMLESS_UNDEFINED = 0;
            SEAMLESS_SHOULD_BE_SEAMLESS = 1;
            SEAMLESS_NOT_REQUIRED = 2;
        }
        // Indicates whether seamless refresh rate switch is required or not.
        optional Seamlessness seamlessness = 3;
    }

    // The last frame rate vote set by the application.
    // Introduced in Android 12.
    optional SetFrameRateVote set_frame_rate_vote = 24
        [(android.os.statsd.log_mode) = MODE_BYTES];
    // Buckets of timings in ms by which the app deadline was missed while
    // submitting work for a frame.
    // Introduced in Android 12.
    optional FrameTimingHistogram app_deadline_misses = 25
        [(android.os.statsd.log_mode) = MODE_BYTES];

    // Next ID: 27
}

/**
 * Histogram of frame counts bucketed by time in milliseconds.
 * Because of size limitations, we hard-cap the number of buckets, with
 * buckets for corresponding to larger milliseconds being less precise.
 */
message FrameTimingHistogram {
    // Timings in milliseconds that describes a set of histogram buckets
    repeated int32 time_millis_buckets = 1;
    // Number of frames that match to each time_millis, i.e. the bucket
    // contents
    // It's required that len(time_millis) == len(frame_count)
    repeated int64 frame_counts = 2;
}

/**
 * Janky event as reported by SurfaceFlinger.
 * This event is intended to be consumed by a Perfetto subscriber for
 * automated trace collection.
 *
 * Logged from:
 *    frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
 */
message DisplayJankReported {
    // Informational field for how long the janky event lasted in milliseconds
    optional int64 event_duration_millis = 1;
    // Number of frame deadlines missed, where SurfaceFlinger failed to update
    // the display on time.
    optional int32 present_deadlines_missed = 2;
}

message CameraStreamProto {
    // The stream width (in pixels)
    optional int32 width = 1;
    // The stream height (in pixels)
    optional int32 height = 2;
    // The format of the stream
    optional int32 format = 3;
    // The dataspace of the stream
    optional int32 data_space = 4;
    // The usage flag of the stream
    optional int64 usage = 5;

    // The number of requests for this stream
    optional int64 request_count = 6;
    // The number of buffer error for this stream
    optional int64 error_count = 7;
    // The capture latency of first request for this stream
    optional int32 first_capture_latency_millis = 8;

    // The maximum number of hal buffers
    optional int32 max_hal_buffers = 9;
    // The maximum number of app buffers
    optional int32 max_app_buffers = 10;

    // Type of stream histogram
    // 1: Capture latency: bin size in milliseconds
    enum HistogramType {
        UNKNOWN = 0;
        CAPTURE_LATENCY = 1;
    }
    optional HistogramType histogram_type = 11;
    // The boundary values between histogram bins
    // Expected number of fields: 9
    repeated float histogram_bins = 12;
    // The frame counts for each histogram bins
    // Expected number of fields: 10
    repeated int64 histogram_counts = 13;
    // The dynamic range profile of the stream
    optional int64 dynamic_range_profile = 14;
    // The stream use case
    optional int64 stream_use_case = 15;
}

/**
 * Information about camera facing and API level usage.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/camera/CameraServiceProxy.java
 */
message CameraActionEvent {
    // Camera session duration in milliseconds if action is SESSION.
    // 0 if action is OPEN or CLOSE.
    optional int64 duration_millis = 1;

    // Camera API level used.
    // 1 for camera1 API, and 2 for camera2 API.
    optional int32 api_level = 2;

    // Name of client package
    optional string package_name = 3;

    // Camera facing
    enum Facing {
        UNKNOWN = 0;
        BACK = 1;
        FRONT = 2;
        EXTERNAL = 3;
    }
    optional Facing facing = 4;

    // Camera ID
    optional string camera_id = 5;

    // Camera action type
    enum Action {
        UNKNOWN_ACTION = 0;
        OPEN = 1;
        CLOSE = 2;
        SESSION = 3;
    }
    optional Action action = 6;

    // Whether the client is accessing camera using ndk
    optional bool is_ndk = 7;

    // Action OPEN: Open latency
    // Action CLOSE: Close latency
    // Action SESSION: Camera session creation duration.
    //                 If this entry is reusing an existing session, the value is -1.
    optional int32 latency_millis = 8;

    // session type: 0 for normal mode, 1 for constrained high speed mode
    optional int32 operating_mode = 9;

    // If actioh is SESSION: number of internal reconfigurations
    // Else: 0
    optional int32 internal_reconfig = 10;

    // Number of requests for this capture session. Only applicable to SESSION
    // action.
    optional int64 request_count = 11;
    // Number of result errors. Only applicable to SESSION action.
    optional int64 result_error_count = 12;
    // Whether the device runs into error state.
    optional bool device_error = 13;

    // If action is SESSION: Stream states
    // Else: stream_count = 0
    optional int32 stream_count = 14;
    optional CameraStreamProto stream_1 = 15 [(log_mode) = MODE_BYTES];
    optional CameraStreamProto stream_2 = 16 [(log_mode) = MODE_BYTES];
    optional CameraStreamProto stream_3 = 17 [(log_mode) = MODE_BYTES];
    optional CameraStreamProto stream_4 = 18 [(log_mode) = MODE_BYTES];
    optional CameraStreamProto stream_5 = 19 [(log_mode) = MODE_BYTES];

    // User tag string for this session
    optional string user_tag = 20;

    // Video stabilization mode
    // Original type: uint8_t
    optional int32 video_stabilization_mode = 21 [default = -1];
}

/**
 * Logs when a compatibility change is affecting an app.
 *
 * Logged from:
 *   frameworks/base/core/java/android/app/AppCompatCallbacks.java and
 *   frameworks/base/services/core/java/com/android/server/compat/PlatformCompat.java
 */
message AppCompatibilityChangeReported {
    // The UID of the app being affected by the compatibilty change.
    optional int32 uid = 1 [(is_uid) = true];

    // The ID of the change affecting the app.
    optional int64 change_id = 2;

    enum State {
        UNKNOWN_STATE = 0;
        ENABLED = 1;
        DISABLED = 2;
        LOGGED = 3;
    }

    // The state of the change - if logged from gating whether it was enabled or disabled, or just
    // logged otherwise.
    optional State state = 3;

    enum Source {
        UNKNOWN_SOURCE = 0;
        APP_PROCESS = 1;
        SYSTEM_SERVER = 2;
    }

    // Where it was logged from.
    optional Source source = 4;

}

/**
 * Logged from
 *     external/perfetto/src/perfetto_cmd/perfetto_cmd.cc
 *     external/perfetto/src/tracing/service/tracing_service_impl.cc
 */
message PerfettoUploaded {
    // TODO(lalitm): many of the atoms below should be renamed to have a
    // "PERFETTO_CMD" prefix to make clear they are specific to perfetto_cmd.
    // This state exists because of legacy reasons (i.e. these values existed
    // before go/perfetto-monitoring was a thing).
    // Next id: 52.
    enum Event {
        PERFETTO_UNDEFINED = 0;

        // Checkpoints inside perfetto_cmd before tracing is finished.
        PERFETTO_TRACE_BEGIN = 1;
        PERFETTO_BACKGROUND_TRACE_BEGIN = 2;
        PERFETTO_ON_CONNECT = 3;

        // Guardrails inside perfetto_cmd before tracing is finished.
        PERFETTO_ON_TIMEOUT = 16;
        PERFETTO_CMD_USER_BUILD_TRACING_NOT_ALLOWED = 43;
        PERFETTO_CMD_FAILED_TO_INIT_GUARDRAIL_STATE = 44;
        PERFETTO_CMD_INVALID_GUARDRAIL_STATE = 45;
        PERFETTO_CMD_HIT_UPLOAD_LIMIT = 46;

        // Checkpoints inside traced.
        PERFETTO_TRACED_ENABLE_TRACING = 37;
        PERFETTO_TRACED_START_TRACING = 38;
        PERFETTO_TRACED_DISABLE_TRACING = 39;
        PERFETTO_TRACED_NOTIFY_TRACING_DISABLED = 40;

        // Trigger checkpoints inside traced.
        // These atoms are special because, along with the UUID,
        // they log the trigger name.
        PERFETTO_TRACED_TRIGGER_START_TRACING = 41;
        PERFETTO_TRACED_TRIGGER_STOP_TRACING = 42;

        // Guardrails inside traced.
        PERFETTO_TRACED_ENABLE_TRACING_EXISTING_TRACE_SESSION = 18;
        PERFETTO_TRACED_ENABLE_TRACING_TOO_LONG_TRACE = 19;
        PERFETTO_TRACED_ENABLE_TRACING_INVALID_TRIGGER_TIMEOUT = 20;
        PERFETTO_TRACED_ENABLE_TRACING_DURATION_WITH_TRIGGER = 21;
        PERFETTO_TRACED_ENABLE_TRACING_STOP_TRACING_WRITE_INTO_FILE = 22;
        PERFETTO_TRACED_ENABLE_TRACING_DUPLICATE_TRIGGER_NAME = 23;
        PERFETTO_TRACED_ENABLE_TRACING_INVALID_DEFERRED_START = 24;
        PERFETTO_TRACED_ENABLE_TRACING_INVALID_BUFFER_SIZE = 25;
        PERFETTO_TRACED_ENABLE_TRACING_BUFFER_SIZE_TOO_LARGE = 26;
        PERFETTO_TRACED_ENABLE_TRACING_TOO_MANY_BUFFERS = 27;
        PERFETTO_TRACED_ENABLE_TRACING_DUPLICATE_SESSION_NAME = 28;
        PERFETTO_TRACED_ENABLE_TRACING_SESSION_NAME_TOO_RECENT = 29;
        PERFETTO_TRACED_ENABLE_TRACING_TOO_MANY_SESSIONS_FOR_UID = 30;
        PERFETTO_TRACED_ENABLE_TRACING_TOO_MANY_CONCURRENT_SESSIONS = 31;
        PERFETTO_TRACED_ENABLE_TRACING_INVALID_FD_OUTPUT_FILE = 32;
        PERFETTO_TRACED_ENABLE_TRACING_FAILED_TO_CREATE_FILE = 33;
        PERFETTO_TRACED_ENABLE_TRACING_OOM = 34;
        PERFETTO_TRACED_ENABLE_TRACING_UNKNOWN_ERROR = 35;
        PERFETTO_TRACED_START_TRACING_INVALID_SESSION_STATE = 36;
        PERFETTO_TRACED_ENABLE_TRACING_INVALID_FILTER = 47;
        PERFETTO_TRACED_ENABLE_TRACING_OOB_TARGET_BUFFER = 48;

        // Checkpoints inside perfetto_cmd after tracing has finished.
        PERFETTO_ON_TRACING_DISABLED = 4;
        PERFETTO_FINALIZE_TRACE_AND_EXIT = 11;
        PERFETTO_CMD_FW_REPORT_BEGIN = 49;
        // Will be removed once incidentd is no longer used.
        PERFETTO_UPLOAD_INCIDENT_BEGIN = 8;

        // Guardrails inside perfetto_cmd after tracing has finished.
        PERFETTO_CMD_FW_REPORT_EMPTY_TRACE = 50;
        // Will be removed once incidentd is no longer used.
        PERFETTO_UPLOAD_INCIDENT_FAILURE = 10;
        PERFETTO_NOT_UPLOADING_EMPTY_TRACE = 17;

        // "Successful" terminal states inside perfetto_cmd.
        PERFETTO_CMD_FW_REPORT_HANDOFF = 51;

        // Deprecated as "success" is misleading; it simply means we were
        // able to communicate with incidentd. Will be removed once
        // incidentd is no longer used.
        PERFETTO_UPLOAD_INCIDENT_SUCCESS = 9 [deprecated = true];

        // Contained trigger begin/success/failure. Replaced by
        // |PerfettoTriggerAtom| to allow aggregation using a count metric
        // and reduce spam.
        reserved 12, 13, 14;

        // Contained that a guardrail in perfetto_cmd was hit. Replaced with
        // kCmd* guardrails.
        reserved 15;

        // Contained status of Dropbox uploads. Removed as Perfetto no
        // longer supports uploading traces using Dropbox.
        reserved 5, 6, 7;
    }

    // Which stage of the pipeline we are reporting from.
    optional Event event = 1;

    // UUID matching the one set inside the SystemInfo trace packet.
    optional int64 trace_uuid_lsb = 2;
    optional int64 trace_uuid_msb = 3;

    // For trigger checkpoints inside traced, contains the trigger name
    // associated with this trace UUID.
    optional string trigger_name = 4;
}

/**
 * Logged from
 *     external/perfetto/src/tracing/service/tracing_service_impl.cc
 */
message PerfettoTrigger {
    enum Event {
        PERFETTO_UNDEFINED = 0;

        PERFETTO_CMD_TRIGGER = 1;
        PERFETTO_CMD_TRIGGER_FAIL = 2;

        PERFETTO_TRIGGER_PERFETTO_TRIGGER = 3;
        PERFETTO_TRIGGER_PERFETTO_TRIGGER_FAIL = 4;

        PERFETTO_TRACED_LIMIT_PROBABILITY = 5;
        PERFETTO_TRACED_LIMIT_MAX_PER_24_H = 6;

        PERFETTO_PROBES_PRODUCER_TRIGGER = 7;
        PERFETTO_PROBES_PRODUCER_TRIGGER_FAIL = 8;
    }

    // The event which fired.
    optional Event event = 1;

    // The name of the trigger which fired.
    optional string trigger_name = 2;
}

/**
 * Pulls client metrics on data transferred via Vehicle Maps Service.
 * Metrics are keyed by uid + layer.
 *
 * Pulled from:
 *   packages/services/Car/service/src/com/android/car/stats/CarStatsService.java
 */
message VmsClientStats {
    // UID of the VMS client app
    optional int32 uid = 1 [(is_uid) = true];

    // VMS layer definition
    optional int32 layer_type = 2;
    optional int32 layer_channel = 3;
    optional int32 layer_version = 4;

    // Bytes and packets sent by the client for the layer
    optional int64 tx_bytes = 5;
    optional int64 tx_packets = 6;

    // Bytes and packets received by the client for the layer
    optional int64 rx_bytes = 7;
    optional int64 rx_packets = 8;

    // Bytes and packets dropped due to client error
    optional int64 dropped_bytes = 9;
    optional int64 dropped_packets = 10;
}

/**
 * State of a all permission requested by a package - sampled
 * Pulled from: StatsCompanionService.java with data obtained from PackageManager API
*/
message DangerousPermissionStateSampled {
    // Name of the permission
    optional string permission_name = 1;

    // Uid of the package
    optional int32 uid = 2 [(is_uid) = true];

    // If the permission is granted to the uid
    optional bool is_granted = 3;

    // Permission flags as per android.content.pm.PermissionFlags
    optional int32 permission_flags = 4;

    // Permission protection flags as per android.content.pm.PermissionInfo.ProtectionFlags
    optional int32 protection_flags = 5;
}

/**
 * HWUI stats for a given app.
 */
message GraphicsStats {
    // The package name of the app
    optional string package_name = 1;

    // The version code of the app
    optional int64 version_code = 2;

    // The start & end timestamps in UTC as
    // milliseconds since January 1, 1970
    // Compatible with java.util.Date#setTime()
    optional int64 start_millis = 3;

    optional int64 end_millis = 4;

    // HWUI renders pipeline type: GL (1) or Vulkan (2).
    enum PipelineType {
        UNKNOWN = 0;
        GL = 1;
        VULKAN = 2;
    }

    // HWUI renders pipeline type: GL or Vulkan.
    optional PipelineType pipeline = 5;

    // Distinct frame count.
    optional int32 total_frames = 6;

    // Number of "missed vsync" events.
    optional int32 missed_vsync_count = 7;

    // Number of frames in triple-buffering scenario (high input latency)
    optional int32 high_input_latency_count = 8;

    // Number of "slow UI thread" events.
    optional int32 slow_ui_thread_count = 9;

    // Number of "slow bitmap upload" events.
    optional int32 slow_bitmap_upload_count = 10;

    // Number of "slow draw" events.
    optional int32 slow_draw_count = 11;

    // Number of frames that missed their deadline (aka, visibly janked)
    optional int32 missed_deadline_count = 12;

    // The frame time histogram for the package
    optional FrameTimingHistogram cpu_histogram = 13
    [(android.os.statsd.log_mode) = MODE_BYTES];

    // The gpu frame time histogram for the package
    optional FrameTimingHistogram gpu_histogram = 14
    [(android.os.statsd.log_mode) = MODE_BYTES];

    // UI mainline module version.
    optional int64 version_ui_module = 15;

    // If true, these are HWUI stats for up to a 24h period for a given app from today.
    // If false, these are HWUI stats for a 24h period for a given app from the last complete
    // day (yesterday). Stats from yesterday stay constant, while stats from today may change as
    // more apps are running / rendering.
    optional bool is_today = 16;
}

/**
 * Message related to dangerous (runtime) app ops access
 */
message RuntimeAppOpAccess {
    // Uid of the package accessing app op
    optional int32 uid = 1 [(is_uid) = true];

    // Name of the package accessing app op
    optional string package_name = 2;

    // deprecated - set to empty string
    optional string op_deprecated = 3 [deprecated = true];

    // attribution_tag; provided by developer when accessing related API, limited at 50 chars by
    // API. Attributions must be provided through manifest using <attribution> tag available in R
    // and above.
    optional string attribution_tag = 4;

    // message related to app op access, limited to 600 chars by API
    optional string message = 5;

    enum SamplingStrategy {
        DEFAULT = 0;
        UNIFORM = 1;
        RARELY_USED = 2;
        BOOT_TIME_SAMPLING = 3;
        UNIFORM_OPS = 4;
    }

    // sampling strategy used to collect this message
    optional SamplingStrategy sampling_strategy = 6;

    // operation id
    optional android.app.AppOpEnum op = 7 [default = APP_OP_NONE];
}

/*
 * Logs userspace reboot outcome and duration.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/server/BootReceiver.java
 */
message UserspaceRebootReported {
    // Possible outcomes of userspace reboot.
    enum Outcome {
        // Default value in case platform failed to determine the outcome.
        OUTCOME_UNKNOWN = 0;
        // Userspace reboot succeeded (i.e. boot completed without a fall back to hard reboot).
        SUCCESS = 1;
        // Userspace reboot shutdown sequence was aborted.
        FAILED_SHUTDOWN_SEQUENCE_ABORTED = 2;
        // Remounting userdata into checkpointing mode failed.
        FAILED_USERDATA_REMOUNT = 3;
        // Device didn't finish booting before timeout and userspace reboot watchdog issued a hard
        // reboot.
        FAILED_USERSPACE_REBOOT_WATCHDOG_TRIGGERED = 4;
    }
    // Outcome of userspace reboot. Always set.
    optional Outcome outcome = 1;
    // Duration of userspace reboot in case it has a successful outcome.
    // Duration is measured as time between userspace reboot was initiated and until boot completed
    // (e.g. sys.boot_completed=1).
    optional int64 duration_millis = 2;
    // State of primary user's (user0) credential encryption storage.
    enum UserEncryptionState {
        // Default value.
        USER_ENCRYPTION_STATE_UNKNOWN = 0;
        // Credential encrypted storage is unlocked.
        UNLOCKED = 1;
        // Credential encrypted storage is locked.
        LOCKED = 2;
    }
    // State of primary user's encryption storage at the moment boot completed. Always set.
    optional UserEncryptionState user_encryption_state = 3;
}

/*
 * Logs integrity check information during each install.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
 */
message IntegrityCheckResultReported {
    optional string package_name = 1;
    optional string app_certificate_hash = 2;
    optional int64 version_code = 3;
    optional string installer_package_name = 4;
    enum Response {
        UNKNOWN = 0;
        ALLOWED = 1;
        REJECTED = 2;
        FORCE_ALLOWED = 3;
    }
    optional Response response = 5;
    // An estimate on the cause of the response. This will only be populated for
    // REJECTED and FORCE_ALLOWED
    optional bool caused_by_app_cert_rule = 6;
    optional bool caused_by_installer_rule = 7;
}

/**
 * Logs the information about the rules and the provider whenever rules are
 * pushed into AppIntegrityManager.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
 */
message IntegrityRulesPushed {
    optional bool success = 1;
    // Package name of the app that pushed the rules.
    optional string rule_provider = 2;
    // Version string of arbitrary format provided by the rule provider to
    // identify the rules.
    optional string rule_version = 3;
}

/**
 * Logs when a cell broadcast message is received on the device.
 *
 * Logged from Cell Broadcast module and platform:
 *   packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice/
 *   packages/apps/CellBroadcastReceiver/src/com/android/cellbroadcastreceiver/
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/CellBroadcastServiceManager.java
 */
message CellBroadcastMessageReported {
    // The type of Cell Broadcast message
    enum CbType {
        UNKNOWN_TYPE = 0;
        GSM = 1;
        CDMA = 2;
        CDMA_SPC = 3;
    }

    // The parts of the cell broadcast message pipeline
    enum ReportSource {
        UNKNOWN_SOURCE = 0;
        FRAMEWORK = 1;
        CB_SERVICE = 2;
        CB_RECEIVER_APP = 3;
    }

    // GSM, CDMA, CDMA-SCP
    optional CbType type = 1;
    // The source of the report
    optional ReportSource source = 2;
    // The Message Identifier, as defined in 3GPP 23.041 clause 9.4.1.2.1
    optional int32 serial_number = 3;
    // The Message Identifier, as defined in 3GPP 23.041 clause 9.4.1.2.2
    optional int32 message_id = 4;
}

/**
 * Logs when a cell broadcast message is filtered out,
 * or otherwise intentionally not sent to CBR, or not shown to users for reason
 *
 * Logged from Cell Broadcast module:
 *   packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice/
 *   packages/apps/CellBroadcastReceiver/src/com/android/cellbroadcastreceiver/
 */
message CellBroadcastMessageFiltered {
    enum FilterReason {
        // shown message to the user
        NOT_FILTERED = 0;
        // filtered message due to duplication (message body, service category, cross sim)
        DUPLICATE_MESSAGE = 1;
        // filtered message due to outside of coordinate range
        GEOFENCED_MESSAGE = 2;
        // filtered message due to not using for emergency alert but for update cell information on Setting Menu
        AREA_INFO_MESSAGE = 3;
        // filtered message due to OEM set config value ‘filtered message for duplication’ as ‘true’
        DISABLED_BY_OEM = 4;
        // when in ECBM(Emergency CallBack Mode) status
        NOTSHOW_ECBM = 5;
        // when user turn off preference of channel
        NOTSHOW_USER_PREF = 6;
        // when Empty content or Unsupported charset
        NOTSHOW_EMPTY_BODY = 7;
        // when language code in message is not same with preference of second language
        NOTSHOW_MISMATCH_PREF_SECOND_LANG = 8;
        // when user turn off preference of second language
        NOTSHOW_PREF_SECONDLANG_OFF = 9;
        // when language code in message is not same with device language setting
        NOTSHOW_MISMATCH_DEVICE_LANG_SETTING = 10;
        // when channel has feature ‘testing_mode = true’ and device is not in cb test_mode
        NOTSHOW_MESSAGE_FOR_TESTMODE = 11;
        // when the message contains ‘filter’ string from properties
        NOTSHOW_FILTER_STRING = 12;
    }

    // GSM, CDMA, CDMA-SCP
    optional CellBroadcastMessageReported.CbType type = 1;
    // The source of the report
    optional FilterReason filter = 2;
    // The Message Identifier, as defined in 3GPP 23.041 clause 9.4.1.2.1
    optional int32 serial_number = 3;
    // The Message Identifier, as defined in 3GPP 23.041 clause 9.4.1.2.2
    optional int32 message_id = 4;
}

/**
 * Logs when an error occurs while handling a cell broadcast message;
 *
 * Logged from CellBroadcastService module:
 *   packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice/
 */
message CellBroadcastMessageError {
    // The type of error raised when trying to handle a cell broadcast message
    enum ErrorType {
        UNKNOWN_TYPE = 0;
        CDMA_DECODING_ERROR = 1;
        CDMA_SCP_EMPTY = 2;
        CDMA_SCP_HANDLING_ERROR = 3;
        GSM_INVALID_HEADER_LENGTH = 4;
        GSM_UNSUPPORTED_HEADER_MESSAGE_TYPE = 5;
        GSM_UNSUPPORTED_HEADER_DATA_CODING_SCHEME = 6;
        GSM_INVALID_PDU = 7;
        GSM_INVALID_GEO_FENCING_DATA = 8;
        GSM_UMTS_INVALID_WAC = 9;
        FAILED_TO_INSERT_TO_DB = 10;
        UNEXPECTED_GEOMETRY_FROM_FWK = 11;
        UNEXPECTED_GSM_MESSAGE_TYPE_FROM_FWK = 12;
        UNEXPECTED_CDMA_MESSAGE_TYPE_FROM_FWK = 13;
        UNEXPECTED_CDMA_SCP_MESSAGE_TYPE_FROM_FWK = 14;
        NO_CONNECTION_TO_CB_SERVICE = 15;
    }

    // What kind of error occurred
    optional ErrorType type = 1;
    // Exception message (or log message) associated with the error (max 1000 chars)
    optional string exception_message = 2;
}

/**
 * CellBroadcast channel range
 * Refer from CellBroadcastConfigUpdated, CellBroadcastReceiverFeature
 * Logged from Cell Broadcast module:
 *   packages/apps/CellBroadcastReceiver/src/com/android/cellbroadcastreceiver/
 */
message CellBroadcastChannelRange {
    optional int32 start = 1;
    optional int32 end = 2;
}
/**
 * CellBroadcast channel ranges
 * Nested field for repeated
 * Logged from Cell Broadcast module:
 *   packages/apps/CellBroadcastReceiver/src/com/android/cellbroadcastreceiver/
 */
message CellBroadcastChannelRanges {
    repeated CellBroadcastChannelRange channel_ranges = 1;
}

/**
 * Logs when an channel configuration is updated with mcc-mnc
 *
 * Logged from Cell Broadcast module:
 *   packages/apps/CellBroadcastReceiver/src/com/android/cellbroadcastreceiver/
 */
message CellBroadcastConfigUpdated  {
    // mcc_mnc value of Network operator for the roaming case
    optional string roaming_mcc_mnc = 1;
    // The channel ranges to be updated logged as bytes
    optional CellBroadcastChannelRanges channel_ranges = 2 [(log_mode) = MODE_BYTES];
}

/**
 * Logs when a cell broadcast message is activated with the feature below
 * or when channel configuration is changed with the feature below
 *
 * Logged from Cell Broadcast module:
 *   packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice
 */
message CellBroadcastServiceFeature {
    // Not for mainline devices, but for android-go devices, OEM can register package names.
    // if there is a data then true otherwise false
    optional bool overlay_additional_cbr_packages = 1;
    // package name which will get area info message
    // if there is a data except “com.android.settings” then true, or false
    optional bool overlay_area_info_packages = 2;
    // Reset Area Info when device goes out of service
    optional bool reset_area_info = 3;
}

/**
 * Logs when a cell broadcast message is activated with the feature below
 * or when channel configuration is changed with the feature below
 *
 * Logged from Cell Broadcast module:
 *   packages/apps/CellBroadcastReceiver/src/com/android/cellbroadcastreceiver/
 */
message CellBroadcastReceiverFeature {
    // Whether to enable alert handling during active voice call
    optional bool alert_during_call = 1;
    // Play alert sound in full volume regardless DND is on
    // [none:0][all:Integer.MAX_VALUE][partial:4370 4380 50]
    optional CellBroadcastChannelRanges override_dnd = 2 [(log_mode) = MODE_BYTES];
    // Whether to Support roaming for attached network operator
    optional bool roaming_support = 3;
    // Whether to save alerts to sms inbox database
    optional bool store_sms = 4;
    // whether the device is in test mode through *#*#CMAS#*#*
    optional bool testing_mode = 5;
    // whether Text To Speech is on/off
    optional bool tts_mode = 6;
    // whether the device is able to enter test mode even on user build
    optional bool testing_mode_on_user_build = 7;
}

/**
 * Logs when exception is occurred in the device
 *
 * Logged from Cell Broadcast module:
 *   packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice/
 *   packages/apps/CellBroadcastReceiver/
 */
message CellBroadcastModuleError {
    enum ErrorType {
        ERROR_UNKNOWN = 0;
        ERROR_BAD_CONFIG = 1;
        ERROR_DB_MIGRATION = 2;
        ERROR_DEFAULT_RES = 3;
        ERROR_ENABLE_CHANNEL = 4;
        ERROR_GET_LOCATION = 5;
        ERROR_MISSING_RES = 6;
        ERROR_PLAY_FLASH = 7;
        ERROR_PLAY_SOUND = 8;
        ERROR_PLAY_TTS = 9;
        ERROR_PREF_MIGRATION = 10;
        ERROR_PROVIDER_INIT = 11;
        ERROR_RESET_CHANNEL_R = 12;
        ERROR_STATUS_BAR = 13;
        ERROR_REMINDER_INTERVAL = 14;
        ERROR_ICON_RESOURCE = 15;
        ERROR_CHANNEL_RANGE_PARSE = 16;
        ERROR_DB_INIT = 17;
        ERROR_NOT_FOUND_DEFAULT_CBR_PKGS = 18;
        ERROR_FOUND_MULTIPLE_CBR_PKGS = 19;
    }

    // The source of the report
    optional CellBroadcastMessageReported.ReportSource source = 1;

    // The error type
    optional ErrorType type = 2;
}

/**
 * Logs when a TV Input Service Session changes tune state
 * This is atom ID 327.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/tv/TvInputManagerService.java
 */
message TifTuneStateChanged {

    // Tv Input Service uid, TV Player uid
    repeated AttributionNode attribution_node = 1 [
        (state_field_option).primary_field_first_uid = true
    ];
    optional android.stats.tv.TifTuneState state = 2 [
        (state_field_option).exclusive_state = true,
        (state_field_option).default_state_value = 0,
        (state_field_option).nested = false
    ];
    // This a globally unique 128 bit random number created by TvInputManagerService when
    // android.media.tv.TvInputManager#createSession is called.
    // It is has no device or user association.
    // See android.media.tv.TvInputService.onCreateSession(java.lang.String, java.lang.String)
    // WARNING: Any changes to this field should be carefully reviewed for privacy.
    //          Inspect the code at
    //          framework/base/cmds/statsd/src/atoms.proto
    //               TifTuneState
    //          frameworks/base/services/core/java/com/android/server/tv/TvInputManagerService.java
    //              logTuneStateChanged
    //              BinderService.createSession
    //              SessionState.sessionId
    optional string tif_session_id = 3 [(state_field_option).primary_field = true];
    optional android.stats.tv.TifInputType type = 4;
    // The id of this TV Input, only unique to a given TV Input Service.
    // This is specifically NOT android.media.tv.TvInputInfo.getId()
    // which is a string that contains the package name of its TvInputService.
    optional int32 input_id = 5  [(state_field_option).primary_field = true];
    // The HDMI port id
    // Only valid when type == HDMI
    optional int32 hdmi_port = 6  [(state_field_option).primary_field = true];
}

/**
 * Logs when a tune occurs through device's Frontend.
 * This is atom ID 276.
 *
 * Logged from:
 *   frameworks/base/media/java/android/media/tv/tuner/Tuner.java
 */
message TvTunerStateChanged {
    enum State {
        UNKNOWN = 0;
        TUNING = 1; // Signal is tuned
        LOCKED = 2;    // the signal is locked
        NOT_LOCKED = 3; // the signal isn’t locked.
        SIGNAL_LOST = 4; // the signal was locked, but is lost now.
        SCANNING = 5; // the signal is scanned
        SCAN_STOPPED = 6; // the scan is stopped.
    }
    // The uid of the application that sent this custom atom.
    optional int32 uid = 1 [(is_uid) = true];
    //  new state
    optional State state = 2;
}

/**
 * Logs the status of a dvr playback or record.
 * This is atom ID 279.
 *
 * Logged from:
 *   frameworks/base/media/java/android/media/tv/tuner/dvr
 */
message TvTunerDvrStatus {
    enum Type {
        UNKNOWN_TYPE = 0;
        PLAYBACK = 1; // is a playback
        RECORD = 2; // is a record
    }
    enum State {
        UNKNOWN_STATE = 0;
        STARTED = 1; // DVR is started
        STOPPED = 2; // DVR is stopped
    }
    // The uid of the application that sent this custom atom.
    optional int32 uid = 1 [(is_uid) = true];
    // DVR type
    optional Type type = 2;
    //  DVR state
    optional State state = 3;
    //  Identify the segment of a record or playback
    optional int32 segment_id = 4;
    // indicate how many overflow or underflow happened between started to stopped
    optional int32 overflow_underflow_count = 5;
}

/**
 * Logs when a cas session opened through MediaCas.
 * This is atom ID 280.
 *
 * Logged from:
 *   frameworks/base/media/java/android/media/MediaCas.java
 */
message TvCasSessionOpenStatus {
    enum State {
        UNKNOWN = 0;
        SUCCEEDED = 1; // indicate that the session is opened successfully.
        FAILED = 2; // indicate that the session isn’t opened successfully.
    }
    // The uid of the application that sent this custom atom.
    optional int32 uid = 1 [(is_uid) = true];
    //  Cas system Id
    optional int32 cas_system_id = 2;
    // State of the session
    optional State state = 3;
}

/**
 * Logs for ContactsProvider general usage.
 * This is atom ID 301.
 *
 * Logged from:
 *   packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java
 */
message ContactsProviderStatusReported {
    enum ApiType {
        UNKNOWN_API = 0;
        QUERY = 1;
        // INSERT includes insert and bulkInsert, and inserts triggered by applyBatch.
        INSERT = 2;
        // UPDATE and DELETE includes update/delete and the ones triggered by applyBatch.
        UPDATE = 3;
        DELETE = 4;
        CALL = 5;
    }

    // Method called for ApiType.CALL
    enum MethodCall {
        UNKNOWN_METHOD = 0;
        ADD_SIM_ACCOUNTS = 1;
        REMOVE_SIM_ACCOUNTS = 2;
        GET_SIM_ACCOUNTS = 3;
    }

    enum ResultType {
        UNKNOWN_RESULT = 0;
        SUCCESS = 1;
        FAIL = 2;
        ILLEGAL_ARGUMENT = 3;
        UNSUPPORTED_OPERATION = 4;
    }

    enum CallerType {
        UNSPECIFIED_CALLER_TYPE = 0;
        CALLER_IS_SYNC_ADAPTER = 1;
        CALLER_IS_NOT_SYNC_ADAPTER = 2;
    }

    enum TaskType {
        UNKNOWN_TASK = 0;
        DANGLING_CONTACTS_CLEANUP_TASK = 1;
    }

    optional ApiType api_type = 1;
    // Defined in
    // packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java
    optional int32 uri_type = 2;
    optional CallerType caller_type = 3;
    optional ResultType result_type = 4;
    optional int32 result_count = 5;
    optional int64 latency_micros = 6;
    optional TaskType task_type = 7;
    // Set when api_type == CALL
    optional MethodCall method_called = 8;
}

/**
 * Logs when an app is frozen or unfrozen.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/CachedAppOptimizer.java
 */
message AppFreezeChanged {
    // The type of event.
    enum Action {
        UNKNOWN = 0;
        FREEZE_APP = 1;
        UNFREEZE_APP = 2;
    }
    optional Action action = 1;

    // Pid of the process being frozen.
    optional int32 pid = 2;

    // Name of the process being frozen.
    optional string process_name = 3;

    // Time since last unfrozen.
    optional int64 time_unfrozen_millis = 4;
}

/**
 * Pulls information for a single voice call.
 *
 * Each pull creates multiple atoms, one for each call. The sequence is randomized when pulled.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message VoiceCallSession {
    // Bearer (IMS or CS) when the call started.
    optional android.telephony.CallBearerEnum bearer_at_start = 1;

    // Bearer (IMS or CS) when the call ended.
    // The bearer may change during the call, e.g. due to SRVCC.
    optional android.telephony.CallBearerEnum bearer_at_end = 2;

    // Direction of the call (incoming or outgoing).
    optional android.telephony.CallDirectionEnum direction = 3;

    // Time spent setting up the call.
    optional android.telephony.CallSetupDurationEnum setup_duration = 4;

    // Whether the call ended before the setup was completed.
    optional bool setup_failed = 5;

    // IMS reason code or CS disconnect cause.
    // For IMS, see: frameworks/base/telephony/java/android/telephony/ims/ImsReasonInfo.java
    // For CS, see: frameworks/base/telephony/java/android/telephony/DisconnectCause.java
    optional int32 disconnect_reason_code = 6;

    // IMS extra code or CS precise disconnect cause.
    // For IMS, this code is vendor-specific
    // For CS, see: frameworks/base/telephony/java/android/telephony/PreciseDisconnectCause.java
    optional int32 disconnect_extra_code = 7;

    // IMS extra message or CS vendor cause.
    optional string disconnect_extra_message = 8;

    // Radio access technology (RAT) used when call started.
    optional android.telephony.NetworkTypeEnum rat_at_start = 9;

    // Radio access technology (RAT) used when call terminated.
    optional android.telephony.NetworkTypeEnum rat_at_end = 10;

    // Number of times RAT changed during the call.
    optional int64 rat_switch_count = 11;

    // A bitmask of all codecs used during the call.
    // See: frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
    optional int64 codec_bitmask = 12;

    // Number of other calls going on during call setup, for the same SIM slot.
    optional int32 concurrent_call_count_at_start = 13;

    // Number of other calls going on during call termination, for the same SIM slot.
    optional int32 concurrent_call_count_at_end = 14;

    // Index of the SIM used, 0 for single-SIM devices.
    optional int32 sim_slot_index = 15;

    // Whether the device was in multi-SIM mode (with multiple active SIM profiles).
    optional bool is_multi_sim = 16;

    // Whether the call was made with an eSIM profile.
    optional bool is_esim = 17;

    // Carrier ID of the SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 18;

    // Whether an SRVCC has been completed successfully for this call.
    optional bool srvcc_completed = 19;

    // Number of SRVCC failures.
    optional int64 srvcc_failure_count = 20;

    // Number of SRVCC cancellations.
    optional int64 srvcc_cancellation_count = 21;

    // Whether the Real-Time Text (RTT) was ever used in the call (rather than whether RTT was
    // enabled in the dialer's settings).
    optional bool rtt_enabled = 22;

    // Whether this was an emergency call.
    optional bool is_emergency = 23;

    // Whether the call was performed while roaming.
    optional bool is_roaming = 24;

    // A random number used as the dimension field to pull multiple atoms.
    optional int32 dimension = 25;

    // Signal strength at the end of the call. This value is applicable to both cellular and WiFi.
    optional android.telephony.SignalStrengthEnum signal_strength_at_end = 26;

    // Band at the end of the call. Value 0 is used if the band is unknown.
    // See GeranBands, UtranBands and EutranBands in IRadio interface, depending on the RAT at
    // the end of the call.
    optional int32 band_at_end = 27;

    // Time spent setting up the call in milliseconds.
    // The time is measured from dial to ringing for outgoing calls, and from answer to connected
    // for incoming calls.
    optional int32 setup_duration_millis = 28;

    // Main codec quality. The codec quality was equal to or greater than this value for at least
    // 70% of the call.
    optional android.telephony.CodecQuality main_codec_quality = 29;

    // Whether video was enabled at any point during the call.
    optional bool video_enabled = 30;

    // Radio access technology (RAT) used when call is connected.
    optional android.telephony.NetworkTypeEnum rat_at_connected = 31;

    // Whether the call was a conference call (applicable only for calls over IMS).
    optional bool is_multiparty = 32;

    // Duration after the call was connected.
    optional android.telephony.CallDuration call_duration = 33;
}

/**
 * Pulls voice call radio access technology (RAT) usage.
 *
 * Each pull creates multiple atoms, one for each carrier/RAT, the order of which is irrelevant to
 * time. The atom will be skipped if not enough data is available.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message VoiceCallRatUsage {
    // Carrier ID (https://source.android.com/devices/tech/config/carrierid).
    optional int32 carrier_id = 1;

    // Radio access technology.
    optional android.telephony.NetworkTypeEnum rat = 2;

    // Total duration that voice calls spent on this carrier and RAT, rounded to 5 minutes.
    optional int64 total_duration_seconds = 3;

    // Total number of calls using this carrier and RAT.
    // A call is counted once even if it used the RAT multiple times.
    optional int64 call_count = 4;
}

/**
 * Pulls amount of time spend in each cellular service state.
 *
 * Each pull creates multiple atoms, one for each SIM slot/carrier/RAT(including ENDC), the order of
 * which is irrelevant to time. If multi SIM settings changes during the period, durations will be
 * counted separately before and after the change. Airplane mode does not count towards durations.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message CellularServiceState {
    // Radio access technology (RAT) for voice.
    // NETWORK_TYPE_UNKNOWN when the device is not in-service.
    // NETWORK_TYPE_IWLAN when the device is using VoWiFi.
    optional android.telephony.NetworkTypeEnum voice_rat = 1;

    // Radio access technology (RAT) for data.
    // NETWORK_TYPE_UNKNOWN when the device is not in-service.
    // Only cellular RATs are valid and show where the device is camped.
    optional android.telephony.NetworkTypeEnum data_rat = 2;

    // Whether the device was in roaming (domestic or international) for voice.
    optional android.telephony.RoamingTypeEnum voice_roaming_type = 3;

    // Whether the device was in roaming (domestic or international) for data.
    optional android.telephony.RoamingTypeEnum data_roaming_type = 4;

    // Whether the device is on LTE and has access to NR NSA, i.e. cell supports 5G (ENDC) and UE
    // registration (attach/TAU) indicates ENDC is not restricted.
    optional bool is_endc = 5;

    // Index of the SIM used, 0 for single-SIM devices.
    optional int32 sim_slot_index = 6;

    // Whether the device was in multi-SIM mode (with multiple active SIM profiles).
    optional bool is_multi_sim = 7;

    // Carrier ID of the SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 8;

    // Total time spent in this service state, rounded to 5 minutes.
    optional int32 total_time_seconds = 9;

    // Whether the device is in limited service (only emergency voice
    // call available). Voice and data RAT will be recorded as
    // NETWORK_TYPE_UNKNOWN in this case.
    optional bool is_emergency_only = 10;
}

/**
 * Pulls the number of times cellular data service state switches.
 *
 * Each pull creates multiple atoms, one for each RAT combination, the order of which is irrelevant
 * to time. Switches for different SIM slots, carrier IDs, or multi-SIM settings are counted
 * separately.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message CellularDataServiceSwitch {
    // Cellular RAT of the DATA domain from where the switch occurred.
    optional android.telephony.NetworkTypeEnum rat_from = 1;

    // Cellular RAT of the DATA domain to where the switch occurred.
    optional android.telephony.NetworkTypeEnum rat_to = 2;

    // Index of the SIM used, 0 for single-SIM devices.
    optional int32 sim_slot_index = 3;

    // Whether the device was in multi-SIM mode (with multiple active SIM profiles).
    optional bool is_multi_sim = 4;

    // Carrier ID of the SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 5;

    // Number of switches from rat_from to rat_to.
    optional int32 switch_count = 6;
}

/**
 * Pulls the number of active SIM slots and SIMs/eSIM profiles.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message SimSlotState {
    // Number of active SIM slots (both physical and eSIM profiles) in the device.
    optional int32 active_slot_count = 1;

    // Number of SIM cards (both physical and active eSIM profiles).
    // This number may be greater than the number of active SIM slots, if multiple profiles are
    // enabled on the same eUICC.
    optional int32 sim_count = 2;

    // Number of active eSIM profiles.
    // This number is always equal to or less than the number of SIMs.
    optional int32 esim_count = 3;
}

/**
 * Pulls supported cellular radio access technologies.
 *
 * This atom reports the capabilities of the device, rather than the network it has access to.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message SupportedRadioAccessFamily {
    // A bitmask of supported radio technologies.
    // See android.telephony.TelephonyManager.NetworkTypeBitMask.
    optional int64 network_type_bitmask = 1;
}

/**
 * Pulls the status of device-level telephony properties.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message DeviceTelephonyProperties {
    // True if the device adopts the data stack came out in T
    optional bool using_t_data_stack = 1;
}

/**
 * This atom is deprecated starting in T, use TelephonyNetworkRequestsV2 instead.
 *
 * Pulls information about network requests.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message TelephonyNetworkRequests {
    // Carrier ID of the SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 1;
    // Number of times the enterprise capability was requested.
    optional int32 enterprise_request_count = 2;
    // Number of times the enterprise capability was released.
    optional int32 enterprise_release_count = 3;
}

/**
 * Pulls information about network requests.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message TelephonyNetworkRequestsV2 {
    enum NetworkCapability {
        // Unknown capability was requested.
        UNKNOWN = 0;
        // Low latency capability (URLLC) was requested.
        PRIORITIZE_LATENCY = 1;
        // High bandwidth capability (EMBB) was requested.
        PRIORITIZE_BANDWIDTH = 2;
        // CBS (Carrier Branded Services) capability was requested.
        CBS = 3;
        // Enterprise capability was requested.
        ENTERPRISE = 4;
    }
    // Carrier ID of the SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 1;
    // The capability that was requested.
    optional NetworkCapability capability = 2;
    // Number of times the capability was requested.
    optional int32 request_count = 3;
}

/**
 * Pulls information for a single incoming SMS.
 *
 * Each pull creates multiple atoms, one for each SMS. The sequence is randomized when pulled.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message IncomingSms {
    // Format of the SMS (3GPP or 3GPP2).
    optional android.telephony.SmsFormatEnum sms_format = 1;

    // Technology of the SMS (CS or IMS).
    optional android.telephony.SmsTechEnum sms_tech = 2;

    // Radio access technology (RAT) used for the SMS. It can be IWLAN in case of IMS.
    optional android.telephony.NetworkTypeEnum rat = 3;

    // Type the SMS.
    optional android.telephony.SmsTypeEnum sms_type = 4;

    // Number of total parts.
    optional int32 total_parts = 5;

    // Number of received parts (if smaller than total parts, the SMS was dropped).
    optional int32 received_parts = 6;

    // Indicates if the incoming SMS was blocked.
    optional bool blocked = 7;

    // Indicate a specific error handling the SMS
    optional android.telephony.SmsIncomingErrorEnum error = 8;

    // Whether the SMS was received while roaming.
    optional bool is_roaming = 9;

    // Index of the SIM used, 0 for single-SIM devices.
    optional int32 sim_slot_index = 10;

    // Whether the device was in multi-SIM mode (with multiple active SIM profiles).
    optional bool is_multi_sim = 11;

    // Whether the message was received with an eSIM profile.
    optional bool is_esim = 12;

    // Carrier ID of the SIM card used for the SMS.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 13;

    // Random message ID.
    optional int64 message_id = 14;
}

/**
 * Pulls information for a single outgoing SMS.
 *
 * Each pull creates multiple atoms, one for each SMS. The sequence is randomized when pulled.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message OutgoingSms {
    // Format of the SMS (3GPP or 3GPP2).
    optional android.telephony.SmsFormatEnum sms_format = 1;

    // Technology of the SMS (CS or IMS).
    optional android.telephony.SmsTechEnum sms_tech = 2;

    // Radio access technology (RAT) used for the SMS. It can be IWLAN in case of IMS.
    optional android.telephony.NetworkTypeEnum rat = 3;

    // Result of the SMS sending.
    optional android.telephony.SmsSendResultEnum send_result = 4;

    // Error code
    // For IMS technology, see @SmsManager.Result in
    // http://cs/android/frameworks/base/telephony/java/android/telephony/SmsManager.java
    // For CS technology:
    //  - GSM format: see GsmSmsErrorCode (3GPP 27.005 clause 3.2.5)
    //  - CDMA format: see CdmaSmsErrorCode (3GPP2 N.S0005 (IS-41-C) Table 171)
    optional int32 error_code = 5;

    // Whether the SMS was sent while roaming.
    optional bool is_roaming = 6;

    // Whether the default SMS application generated the SMS (regardless of which application).
    optional bool is_from_default_app = 7;

    // Index of the SIM used, 0 for single-SIM devices.
    optional int32 sim_slot_index = 8;

    // Whether the device was in multi-SIM mode (with multiple active SIM profiles).
    optional bool is_multi_sim = 9;

    // Whether the message was sent with an eSIM profile.
    optional bool is_esim = 10;

    // Carrier ID of the SIM card used for the SMS.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 11;

    // Random message ID.
    optional int64 message_id = 12;

    // Retry count: 0 for the first attempt and then increasing for each attempt.
    optional int32 retry_id = 13;

    // Time in milliseconds to complete the SMS send to the network.
    optional int64 interval_millis = 14;
}

/**
 * Logs information about usage of airplane mode.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/AirplaneModeStats.java
 */
message AirplaneMode {
    // Status of airplane mode
    optional bool is_enabled = 1;

    // When is_enabled is false, indicates if this was a very short airplane mode toggle
    // (i.e. airplane mode was disabled after less than 10 seconds from enablement).
    optional bool short_toggle = 2;

    // Carrier ID of the SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 3;
}

/**
 * Logs information about modem restarts.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/ModemRestartStats.java
 */
message ModemRestart {
    // Software version of the modem, as provided by android.os.Build.getRadioVersion().
    optional string baseband_version = 1;

    // Reason of the modem restart, as provided in the modemReset indication of IRadio HAL.
    optional string reason = 2;

    // Carrier ID of the first SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 3;
}

/**
 * Logs the SIM card details when the carrier ID match is not complete.
 *
 * The atom is pushed when a SIM card is initialized and the MCC/MNC is not present in the
 * carrier ID table, or the SIM card contains a GID1 value that is not present in the carrier ID
 * table. This atom is pushed only once for each type of SIM card.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/CarrierIdMatchStats.java
 */
message CarrierIdMismatchReported {
    // Matched carrier ID. The value -1 is used if no match is found.
    optional int32 carrier_id = 1;

    // MCC/MNC of the SIM card.
    optional string mcc_mnc = 2;

    // Group identifier (level 1) of the SIM card.
    optional string gid1 = 3;

    // SPN value of the SIM card.
    optional string spn = 4;

    // First record of the PNN in the SIM card. This field is populated only if the SPN is missing
    // or empty.
    optional string pnn = 5;
}

/**
 * Logs the version of the carrier ID matching table at first power up and when it is updated.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/CarrierIdMatchStats.java
 */
message CarrierIdTableUpdated {
    // Version of the CarrierId matching table.
    optional int32 table_version = 1;
}

/**
 * Pulls the version of the carrier ID matching table.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message CarrierIdTableVersion {
    // Version of the CarrierId matching table.
    optional int32 table_version = 1;
}

/**
 * Pulls information for a single data call session
 *
 * Each pull creates multiple atoms, one for each data call session.
 * The sequence is randomized when pulled.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message DataCallSession {
    // A random number to be used as dimension to capture multiple atoms
    optional int32 dimension = 1;

    // Whether the device was in multi-SIM mode (with multiple active SIM profiles).
    optional bool is_multi_sim = 2;

    // Whether the call was made with an eSIM profile.
    optional bool is_esim = 3;

    // Data profile of this call (for what purpose this call was made)
    optional android.telephony.DataProfileEnum profile = 4 [deprecated = true];

    // APN type bitmask of the APN used:
    // @ApnType in frameworks/base/telephony/java/android/telephony/Annotation.java.
    optional int32 apn_type_bitmask = 5;

    // Carrier ID of the SIM
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 6;

    // Whether the subscription is roaming
    optional bool is_roaming = 7;

    // Data RAT when the call ended, can be IWLAN for IMS/MMS, otherwise should be WWAN PS RAT.
    // In the case that the connection hasn't ended yet, this field holds the current RAT.
    // In the case the call ended due to Out Of Service (OOS),
    // this field should be the last known RAT.
    optional android.telephony.NetworkTypeEnum rat_at_end = 8;

    // Was the data call ended due to OOS
    optional bool oos_at_end = 9;

    // Number of RAT switches during the data call
    optional int64 rat_switch_count = 10;

    // Whether the call is on an opportunistic subscription
    optional bool is_opportunistic = 11;

    // Packet data protocol used
    optional android.telephony.ApnProtocolEnum ip_type = 12;

    // Whether the data call terminated before being established
    optional bool setup_failed = 13;

    // Reason why the data call terminated, as in RIL_DataCallFailCause from ril.h
    optional int32 failure_cause = 14;

    // Suggested retry back-off timer value from RIL
    optional int32 suggested_retry_millis = 15;

    // Why the data call was deactivated
    // Set by telephony for MO deactivations (unrelated to failure_cause)
    optional android.telephony.DataDeactivateReasonEnum deactivate_reason = 16;

    // Duration of the data call, rounded into the closest 5 minutes.
    optional int64 duration_minutes = 17;

    // Whether the data call is still connected when the atom is collected.
    optional bool ongoing = 18;

    // Band at the end of the data call. Value 0 is used if the band is unknown.
    // See GeranBands, UtranBands and EutranBands in IRadio interface, depending
    // on the RAT at the end of the data call.
    optional int32 band_at_end = 19;

    // Reason why the data call handover failed, as in RIL_DataCallFailCause from ril.h
    repeated int32 handover_failure_causes = 20;
}

/**
 * Logs data stall recovery event
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/data/
 *   DataStallRecoveryManager.java
 */
message DataStallRecoveryReported {
    // Carrier ID of the SIM
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 1;

    // Data RAT when the stall happened
    optional android.telephony.NetworkTypeEnum rat = 2;

    // Signal strength when stall happened
    optional android.telephony.SignalStrengthEnum signal_strength = 3;

    // Action taken to recover
    optional android.telephony.DataStallRecoveryActionEnum action = 4;

    // Whether the subscription is opportunistic
    optional bool is_opportunistic = 5;

    // Whether the device is in multi-SIM mode
    optional bool is_multi_sim = 6;

    // Band used when the stall/recovery took place.
    // Value 0 is used if the band is unknown.
    // See GeranBands, UtranBands and EutranBands in IRadio interface, depending
    // on the RAT used at the time.
    optional int32 band = 7;

    // Whether the data stall is recovered.
    optional bool recovered = 8;

    // The elapsed time between start of the data stall and result of current action.
    optional int32 duration_millis = 9;

    // The data stall recovered reason. Available from Android T.
    optional android.telephony.DataStallRecoveredReason reason = 10;
}

/**
 * Pulls IMS registration terminations.
 *
 * Each pull generates multiple atoms, one for each termination condition happened during the day.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message ImsRegistrationTermination {
    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 1;

    // Whether the device is in multi-SIM mode when the registration terminated.
    optional bool is_multi_sim = 2;

    // Radio access technology (RAT) used by the registration when it terminated.
    // This can be IWLAN if IMS was registered over Wifi.
    optional android.telephony.NetworkTypeEnum rat_at_end = 3;

    // Whether the IMS registration failed before it was established.
    optional bool setup_failed = 4;

    // IMS reason code indicating the termination reason.
    // See: frameworks/base/telephony/java/android/telephony/ims/ImsReasonInfo.java
    optional int32 reason_code = 5;

    // IMS extra code indicating the termination reason.
    optional int32 extra_code = 6;

    // IMS extra message indicating the termination reason.
    // This string is truncated to 128 characters if its length exceeds the limit.
    optional string extra_message = 7;

    // Total number of instances of registration termination that matches the above conditions.
    optional int32 count = 8;
}

/**
 * Pulls IMS registration statistics.
 *
 * Each pull generates multiple atoms, one for each carrier, SIM slot, and radio access technology
 * (RAT) combination. Durations are aggregated from all registrations with matching criteria,
 * including ones that are currently active.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message ImsRegistrationStats {
    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    optional int32 sim_slot_index = 2;

    // Radio access technology (RAT) used by the registration.
    // This can be IWLAN if IMS was registered over Wifi.
    optional android.telephony.NetworkTypeEnum rat = 3;

    // Total time IMS was registered (connected time), rounded to 5 minutes.
    optional int32 registered_seconds = 4;

    // Durations that each feature (Voice, Video, UT, SMS) is capable (supported/enabled by the
    // network/device) and available (registered and ready to use).
    // All durations are rounded to 5 minutes and should be equal to or shorter than
    // registered_seconds.
    optional int32 voice_capable_seconds = 5;
    optional int32 voice_available_seconds = 6;
    optional int32 sms_capable_seconds = 7;
    optional int32 sms_available_seconds = 8;
    optional int32 video_capable_seconds = 9;
    optional int32 video_available_seconds = 10;
    optional int32 ut_capable_seconds = 11;
    optional int32 ut_available_seconds = 12;
}

/*
 * Logs information related to PIN storage and automatic PIN operations.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/PinStorage.java
 */
message PinStorageEvent {
    // The type of event.
    enum Event {
        UNKNOWN = 0;
        // The PIN was verified automatically successfully.
        PIN_VERIFICATION_SUCCESS = 1;
        // The PIN was verified automatically unsuccessfully.
        PIN_VERIFICATION_FAILURE = 2;
        // The PIN(s) was cached, but discarded after reboot (e.g. SIM not present after reboot).
        CACHED_PIN_DISCARDED = 3;
        // The PIN(s) was stored to be used after unattended reboot.
        PIN_STORED_FOR_VERIFICATION = 4;
        // The PIN(s) is not available for storage and will be required after unattended reboot.
        PIN_REQUIRED_AFTER_REBOOT = 5;
        // The PIN was not verified automatically because the SIM card did not match.
        PIN_VERIFICATION_SKIPPED_SIM_CARD_MISMATCH = 6;
        // The available PINs after reboot does not match the number of stored PINs before reboot.
        PIN_COUNT_NOT_MATCHING_AFTER_REBOOT = 7;
        // Error while decrypting the PIN
        PIN_DECRYPTION_ERROR = 8;
        // Error while encrypting the PIN
        PIN_ENCRYPTION_ERROR = 9;
    }
    optional Event event = 1;

    // Number of PINs stored or discarded.
    optional int32 number_of_pins = 2;

    // The caller package name
    optional string package_name = 3;
}

/**
 * Logs flip to screen off events.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/server/power/FaceDownDetector.java
 */
message FaceDownReported {
    enum Response{
        UNKNOWN = 1;
        // The phone was flipped before the screen turns off.
        UNFLIP = 2;
        // User interacts with the screen after a face down is detected.
        USER_INTERACTION = 3;
        // A flip leads to screen turning off. This is the expected outcome.
        SCREEN_OFF = 4;
    }

    // Logs the action that occurs from a flip event, whether by user or system
    // action.
    optional Response face_down_response = 1;

    // After a flip is detected, how long until a system or user action occurs.
    optional int64 millis_since_flip = 2;

    // Difference between the flip time and when the timeout would otherwise
    // occur.
    optional int64 millis_until_normal_timeout = 3;

    // How quickly the user turns the screen back on after a flip event.
    // A low value may indicate a false negative. Logged only when Response is
    // SCREEN_OFF.
    optional int64 millis_until_next_screen_on = 4;
}

/**
 * Logs timeout extended events which occur from consecutive undims.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/server/power/ScreenUndimDetector.java
 */
message TimeoutAutoExtendedReported {
    enum Outcome {
        UNKNOWN = 0;
        POWER_BUTTON = 1;
        TIMEOUT = 2;
    }

    // Logs the action that occurs after timeout is extended from undim.
    optional Outcome outcome = 1;
    // Time from timeout extension to the outcome.
    optional int64 time_to_outcome_millis = 2;
    // Time of first interaction after undim if an interaction occurs.
    // -1 if no interaction occurs before screen turns off.
    optional int64 time_to_first_interaction_millis = 3;
}

/**
 * Logs gnss stats from location service provider
 *
 * Pulled from:
 *  frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
 */
message GnssStats {
    // Number of location reports since boot
    optional int64 location_reports = 1;

    // Total pulled reports of Location failures since boot
    optional int64 location_failure_reports = 2;

    // Number of time to first fix reports since boot
    optional int64 time_to_first_fix_reports = 3;

    // Total pulled reported time to first fix (in milli-seconds) since boot
    optional int64 time_to_first_fix_millis = 4;

    // Number of position accuracy reports since boot
    optional int64 position_accuracy_reports = 5;

    // Total pulled reported position accuracy (in meters) since boot
    optional int64 position_accuracy_meters = 6;

    // Number of top 4 average CN0 reports since boot
    optional int64 top_four_average_cn0_reports = 7;

    // Total pulled reported of top 4 average CN0 (dB-mHz) since boot
    optional int64 top_four_average_cn0_db_mhz = 8;

    // Number of l5 top 4 average CN0 reports since boot
    optional int64 l5_top_four_average_cn0_reports = 9;

    // Total pulled reported of l5 top 4 average CN0 (dB-mHz) since boot
    optional int64 l5_top_four_average_cn0_db_mhz = 10;

    // Total number of sv status messages reports since boot
    optional int64 sv_status_reports = 11;

    // Total number of sv status messages reports, where sv is used in fix since boot
    optional int64 sv_status_reports_used_in_fix = 12;

    // Total number of L5 sv status messages reports since boot
    optional int64 l5_sv_status_reports = 13;

    // Total number of L5 sv status messages reports, where sv is used in fix since boot
    optional int64 l5_sv_status_reports_used_in_fix = 14;
}

/**
 * Logs power usage data from GNSS subsystem.
 *
 * Logged from:
 *   /frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
 */
message GnssPowerStats {
    // Relative precision of the alignment of the reported power stats measurement.
    optional int64 elapsed_realtime_uncertainty_nanos = 1;

    // Total GNSS energy consumption in micro-joules (or micro Watt-seconds).
    optional int64 total_energy_micro_joule = 2;

    // Total energy consumption in micro-joules (or micro Watt-seconds) for which the GNSS engine is
    // tracking signals of a single frequency band.
    optional int64 singleband_tracking_mode_energy_micro_joule = 3;

    // Total energy consumption in micro-joules (or micro Watt-seconds) for which the GNSS engine is
    // tracking signals of multiple frequency bands.
    optional int64 multiband_tracking_mode_energy_micro_joule = 4;

    // Total energy consumption in micro-joules (or micro Watt-seconds) for which the GNSS engine is
    // acquiring signals of a single frequency band.
    optional int64 singleband_acquisition_mode_energy_micro_joule = 5;

    // Total energy consumption in micro-joules (or micro Watt-seconds) for which the GNSS engine is
    // acquiring signals of multiple frequency bands.
    optional int64 multiband_acquisition_mode_energy_micro_joule = 6;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 0)
    optional int64 vendor_specific_power_modes_energy_micro_joule_0 = 7;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 1)
    optional int64 vendor_specific_power_modes_energy_micro_joule_1 = 8;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 2)
    optional int64 vendor_specific_power_modes_energy_micro_joule_2 = 9;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 3)
    optional int64 vendor_specific_power_modes_energy_micro_joule_3 = 10;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 4)
    optional int64 vendor_specific_power_modes_energy_micro_joule_4 = 11;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 5)
    optional int64 vendor_specific_power_modes_energy_micro_joule_5 = 12;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 6)
    optional int64 vendor_specific_power_modes_energy_micro_joule_6 = 13;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 7)
    optional int64 vendor_specific_power_modes_energy_micro_joule_7 = 14;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 8)
    optional int64 vendor_specific_power_modes_energy_micro_joule_8 = 15;

    // Total energy consumption in micro-joules (microWatt-seconds) for which the GNSS engine is
    // operating in each of the vendor-specific power modes. (Index 9)
    optional int64 vendor_specific_power_modes_energy_micro_joule_9 = 16;
}

/**
 * Logs when an app is moved to a different standby bucket.
 *
 * Logged from:
 *   frameworks/base/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java
 */
message AppStandbyBucketChanged {
    optional string package_name = 1;

    // Should be 0, 10, 11, 12, etc. where 0 is the owner. See UserHandle for more documentation.
    optional int32 user_id = 2;

    // These enum values match the constants defined in UsageStatsManager.java.
    enum Bucket {
        BUCKET_UNKNOWN = 0;
        BUCKET_EXEMPTED = 5;
        BUCKET_ACTIVE = 10;
        BUCKET_WORKING_SET = 20;
        BUCKET_FREQUENT = 30;
        BUCKET_RARE = 40;
        BUCKET_RESTRICTED = 45;
        BUCKET_NEVER = 50;
    }
    optional Bucket bucket = 3;

    enum MainReason {
        MAIN_UNKNOWN = 0;
        MAIN_DEFAULT = 0x0100;
        MAIN_TIMEOUT = 0x0200;
        MAIN_USAGE = 0x0300;
        MAIN_FORCED_BY_USER = 0x0400;
        MAIN_PREDICTED = 0x0500;
        MAIN_FORCED_BY_SYSTEM = 0x0600;
    }
    optional MainReason main_reason = 4;

    // A more detailed reason for the standby bucket change. The sub reason name is dependent on
    // the main reason. Values are one of the REASON_SUB_XXX constants defined in
    // UsageStatsManager.java.
    optional int32 sub_reason = 5;
}

/**
* Reports a started sharesheet transaction.
*
* Logged from:
*   frameworks/base/core/java/com/android/internal/app/ChooserActivity.java
*/
message SharesheetStarted {
    // The event_id (as for UiEventReported).
    optional int32 event_id = 1;
    // The calling app's package name.
    optional string package_name = 2;
    // An identifier to tie together multiple logs relating to the same share event
    optional int32 instance_id = 3;
    // The mime type of the share
    optional string mime_type = 4;
    // The number of direct targets the calling app is providing that will be shown.
    optional int32 num_app_provided_direct_targets = 5;
    // The number of app targets the calling app is providing that will be shown.
    optional int32 num_app_provided_app_targets = 6;
    // True if the share originates from the workprofile
    optional bool is_workprofile = 7;

    enum SharesheetPreviewType {  // Constants from ChooserActivity.java
        CONTENT_PREVIEW_TYPE_UNKNOWN = 0;  // Default for proto 2 / 3 compatibility.
        CONTENT_PREVIEW_IMAGE = 1;  // The preview shown in the sharesheet is an image.
        CONTENT_PREVIEW_FILE = 2;  // The preview shown in the sharesheet is a file.
        CONTENT_PREVIEW_TEXT = 3;  // The preview shown in the sharesheet is text.
    }
    // How the sharesheet preview is presented.
    optional SharesheetPreviewType preview_type = 8;

    enum ResolverActivityIntent { // Intents handled by ResolverActivity.java
        INTENT_DEFAULT = 0;
        INTENT_ACTION_VIEW = 1;
        INTENT_ACTION_EDIT = 2;
        INTENT_ACTION_SEND = 3;
        INTENT_ACTION_SENDTO = 4;
        INTENT_ACTION_SEND_MULTIPLE = 5;
        INTENT_ACTION_IMAGE_CAPTURE = 6;
        INTENT_ACTION_MAIN = 7;
    }
    // The intent being processed (only SEND and SEND_MULTIPLE are system sharesheet)
    optional ResolverActivityIntent intent_type = 9;
}

/**
 * Reports a ranking selection event.
 *
 * Logged from:
 *   frameworks/base/core/java/com/android/internal/app/ChooserActivity.java (sharesheet)
 */
message RankingSelected {
    // The event_id (as for UiEventReported).
    optional int32 event_id = 1;
    // The relevant app's package name (can be source or picked package).
    optional string package_name = 2;
    // An identifier to tie together multiple logs relating to the same share event.
    optional int32 instance_id = 3;
    // Which of the ranked targets got picked, default starting position 0.
    optional int32 position_picked = 4;
    // Whether the selected target is pinned.
    optional bool is_pinned = 5;
}

/**
 * Logs when TvSettings UI is interacted at.
 *
 * Logged from: packages/apps/TvSettings
 */
message TvSettingsUIInteracted {

    /** The UI action category */
    optional android.app.tvsettings.Action action = 1;

    /** The ID of the entry that the users actioned on */
    optional android.app.tvsettings.ItemId item_id = 2;
}

/**
 * Logs information about a package installation using package installer V2 APIs.
 *
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/pm/PackageInstallerSession.java
 */
message PackageInstallerV2Reported {
    // Whether this installation uses Incremental File System
    optional bool is_incremental = 1;
    // Name of the package that is intended to be installed
    optional string package_name = 2;
    // The duration between when the install was requested to when the install has completed
    optional int64 duration_millis = 3;
    // Installation result in final integer, which are SystemApi's.
    // Return_code 1 indicates success.
    // For full list, see frameworks/base/core/java/android/content/pm/PackageManager.java
    optional int32 return_code  = 4;
    // Total size of the APKs installed for this package
    optional int64 apks_size_bytes = 5;
    // UID of the package. -1 if the installation failed.
    optional int32 uid = 6 [(is_uid) = true];
}

/**
 * Logs settings provider values.
 *
 * Use DeviceConfig.getProperties to get a list Setting key, query the data from content provider,
 * then write the value to proto.
 *
 */
message SettingSnapshot {

    // Setting key
    optional string name = 1;

    enum SettingsValueType {
        NOTASSIGNED = 0;
        ASSIGNED_BOOL_TYPE = 1;
        ASSIGNED_INT_TYPE = 2;
        ASSIGNED_FLOAT_TYPE = 3;
        ASSIGNED_STRING_TYPE = 4;
    };
    // Setting value type
    optional SettingsValueType type = 2;

    optional bool bool_value = 3;

    optional int32 int_value = 4;

    optional float float_value = 5;

    optional string str_value = 6;

    // Android user index. 0 for primary user, 10, 11 for secondary or profile user
    optional int32 user_id = 7;
}

/**
 * An event logged to indicate that a user journey is about to be performed. This atom includes
 * relevant information about the users involved in the journey. A UserLifecycleEventOccurred event
 * will immediately follow this atom which will describe the event(s) and its state.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/UserController.java
 *   frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java
 */
message UserLifecycleJourneyReported {
    // An identifier to track a chain of user lifecycle events occurring (referenced in the
    // UserLifecycleEventOccurred atom)
    optional int64 session_id = 1;

    // Indicates what type of user journey this session is related to
    enum Journey {
        UNKNOWN = 0; // Undefined user lifecycle journey
        USER_SWITCH_UI = 1; // A user switch journey where a UI is shown
        USER_SWITCH_FG = 2; // A user switch journey without a UI shown
        USER_START = 3; // A user start journey
        USER_CREATE = 4; // A user creation journey
        USER_STOP = 5; // A user stop journey
        USER_REMOVE = 6; // A user removal journey
    }
    optional Journey journey = 2;
    // Which user the journey is originating from - could be -1 for certain phases (eg USER_CREATE)
    // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest)
    optional int32 origin_user = 3;
    // Which user the journey is targeting
    // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest)
    optional int32 target_user = 4;

    // What is the user type of the target user
    // These should be in sync with USER_TYPE_* flags defined in UserManager.java
    enum UserType {
        TYPE_UNKNOWN = 0;
        FULL_SYSTEM = 1;
        FULL_SECONDARY = 2;
        FULL_GUEST = 3;
        FULL_DEMO = 4;
        FULL_RESTRICTED = 5;
        PROFILE_MANAGED = 6;
        SYSTEM_HEADLESS = 7;
        PROFILE_CLONE = 8;
    }
    optional UserType user_type = 5;
    // What are the flags attached to the target user
    optional int32 user_flags = 6;
}

/**
 * An event logged when a specific user lifecycle event is performed. These events should be
 * correlated with a UserLifecycleJourneyReported atom via the session_id.
 * Note: journeys can span over multiple events, hence some events may share a single session id.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/UserController.java
 *   frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java
 */
message UserLifecycleEventOccurred {
    // An id which links back to user details (reported in the UserLifecycleJourneyReported atom)
    optional int64 session_id = 1;
    // The target user for this event (same as target_user in the UserLifecycleJourneyReported atom)
    // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest)
    optional int32 user_id = 2;

    enum Event {
        UNKNOWN = 0; // Indicates that the associated user journey timed-out or resulted in an error
        SWITCH_USER = 1; // Indicates that this is a user switch event
        START_USER = 2; // Indicates that this is a user start event
        CREATE_USER = 3; // Indicates that this is a user create event
        USER_RUNNING_LOCKED = 4; // Indicates that user is running in locked state
        UNLOCKING_USER = 5; // Indicates that this is a user unlocking event
        UNLOCKED_USER = 6; // Indicates that this is a user unlocked event
        STOP_USER = 7; // Indicates that this is a user stop event
        REMOVE_USER = 8; // Indicates that this is a user removal event
    }
    optional Event event = 3;

    enum State {
        NONE = 0; // Indicates the associated event has no start/end defined
        BEGIN = 1;
        FINISH = 2;
    }
    optional State state = 4; // Represents the state of an event (beginning/ending)
}

/**
 * The UserInfo information about an Android user (as used in UserManager multiuser).
 *
 * This will be pulled from
 *     frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java
 */
message UserInfo {
    // The @UserIdInt userId of the user
    optional int32 user_id = 1;

    // The type of user, if AOSP-defined, such as {@link UserManager#USER_TYPE_PROFILE_MANAGED}
    optional UserLifecycleJourneyReported.UserType user_type = 2;

    // The type of user if not AOSP-defined. Will be empty if user_type is not TYPE_UNKNOWN.
    optional string user_type_custom = 3;

    // The @UserInfoFlag UserInfo flags of user.
    optional int32 user_flags = 4;

    // Wall-clock time in milliseconds when user was created, according to System.currentTimeMillis
    optional int64 creation_time_millis = 5;

    // Wall-clock time in milliseconds when user last entered the state of STATE_RUNNING_UNLOCKED,
    // according to System.currentTimeMillis
    optional int64 last_logged_in_time_millis = 6;

    // True if user is currently running and unlocked
    optional bool is_user_running_unlocked = 7;
}

/**
 * Logs when accessibility shortcut clicked.
 *
 * Logged from:
 *   frameworks/base/services/accessibility/java/com/android/server/accessibility
 */
message AccessibilityShortcutReported {
    // The accessibility feature(including installed a11y service, framework a11y feature,
    // and installed a11y activity) package name that is assigned to the accessibility shortcut.
    optional string package_name = 1;

    // The definition of the accessibility shortcut.
    // From frameworks/proto_logging/stats/enums/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.ShortcutType shortcut_type = 2;

    // The definition of the service status.
    // From frameworks/proto_logging/stats/enums/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.ServiceStatus service_status = 3;
}

/**
 * Logs when accessibility service status changed.
 *
 * Logged from:
 *   packages/apps/Settings/src/com/android/settings/accessibility
 */
message AccessibilityServiceReported {
    // The accessibility service package name.
    optional string package_name = 1;

    // The definition of the service status.
    // From frameworks/proto_logging/stats/enums/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.ServiceStatus service_status = 2;
}

/**
 * Logs when accessibility floating menu changed its position by user.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu
 */
message AccessibilityFloatingMenuUIChanged {
    // Normalized screen position of the accessibility floating menu. The range is between 0 and 1.
    optional float normalized_x_position = 1;
    optional float normalized_y_position = 2;

    enum Orientation {
        UNKNOWN = 0;
        PORTRAIT = 1;
        LANDSCAPE = 2;
    }
    // Orientation of the device when accessibility floating menu changed.
    optional Orientation orientation = 3;
}

/**
 * Pulls accessibility shortcuts status.
 *
 * Pulled from:
 *   StatsPullAtomService
 */
message AccessibilityShortcutStats {
    // The definition of the accessibility software shortcut.
    // From frameworks/proto_logging/stats/enums/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.ShortcutType software_shortcut_type = 1;
    // Number of accessibility services in accessibility software shortcut.
    optional int32 software_shortcut_service_num = 2;

    // The definition of the accessibility hardware shortcut.
    // From frameworks/proto_logging/stats/enums/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.ShortcutType hardware_shortcut_type = 3;
    // Number of accessibility services in accessibility hardware shortcut.
    optional int32 hardware_shortcut_service_num = 4;

    // The definition of the accessibility gesture shortcut.
    // From frameworks/proto_logging/stats/enums/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.ShortcutType gesture_shortcut_type = 5;
    // Number of accessibility services in accessibility gesture shortcut.
    optional int32 gesture_shortcut_service_num = 6;
}

/**
 * Pulls accessibility floating menu status.
 *
 * Pulled from:
 *   StatsPullAtomService
 */
message AccessibilityFloatingMenuStats {
    // Size of the accessibility floating menu.
    optional int32 size = 1;
    // Icon shape of the accessibility floating menu.
    optional int32 icon_type = 2;
    // Whether the accessibility floating menu is enable auto fade ability.
    optional bool fade_enabled = 3;
    // Opacity of the accessibility floating menu. The range is between 0 and 1.
    optional float opacity = 4;
}

/**
 * Logs when display wake up.
 *
 * Logged from:
 *   services/core/java/com/android/server/power/Notifier.java
 */

message DisplayWakeReported {
    // Wake_up_reason code
    // If LOWORD(wake_up_reason) = 0
    //     reference to HIWORD(wake_up_reason) PowerManager.WAKE_REASON_XXX
    //     else reference wake_up_reason to
    //     services/core/java/com/android/server/power/Notifier.java#onWakeUp
    optional int32 wake_up_reason = 1;
}

/**
 * Logs app usage events.
 */
message AppUsageEventOccurred {
    optional int32 uid = 1 [(is_uid) = true];
    optional string package_name = 2;
    optional string class_name = 3;

    enum EventType {
        NONE = 0;
        MOVE_TO_FOREGROUND = 1;
        MOVE_TO_BACKGROUND = 2;
    }
    optional EventType event_type = 4;
}

/*
 * Quality metrics logged when EVS cameras are active.
 *
 * Logged from:
 *  packages/services/Car/evs/manager/1.1/Enumerator.cpp
 */
message EvsUsageStatsReported {

    // Camera identifier to distinguish the source camera device.  This is not
    // globally unique and therefore cannot be used to identify the user and/or
    // the device.
    optional int32 device_id = 1;

    // Peak number of clients during the service
    optional int32 peak_num_clients = 2;

    // Number of erroneous events during the service
    optional int32 num_errors = 3;

    // Round trip latency of the very first frame
    optional int64 first_latency_millis = 4;

    // Average frame round trip latency
    optional float avg_latency_millis = 5;

    // Peak frame round trip latency
    optional int64 peak_latency_millis = 6;

    // Total number of frames received
    optional int64 total_frames = 7;

    // Number of frames ignored
    optional int64 ignored_frames = 8;

    // Number of dropped frames to synchronize camera devices
    optional int64 dropped_frames_to_sync = 9;

    // The duration of the service
    optional int64 duration_millis = 10;
}

/**
 * Logs audio power usage stats.
 *
 * Pushed from:
 *  frameworks/av/services/mediametrics/AudioPowerUsage.cpp
 */
message AudioPowerUsageDataReported {
    /**
     * Device used for input/output
     *
     * All audio devices please refer to below file:
     * system/media/audio/include/system/audio-base.h
     *
     * Define our own enum values because we don't report all audio devices.
     * Currently, we only report built-in audio devices such as handset, speaker,
     * built-in mics, common audio devices such as wired headset, usb headset
     * and bluetooth devices.
     */
    enum AudioDevice {
        OUTPUT_EARPIECE         = 0x1; // handset
        OUTPUT_SPEAKER          = 0x2; // dual speaker
        OUTPUT_WIRED_HEADSET    = 0x4; // 3.5mm headset
        OUTPUT_USB_HEADSET      = 0x8; // usb headset
        OUTPUT_BLUETOOTH_SCO    = 0x10; // bluetooth sco
        OUTPUT_BLUETOOTH_A2DP   = 0x20; // a2dp
        OUTPUT_SPEAKER_SAFE     = 0x40; // bottom speaker

        INPUT_DEVICE_BIT        = 0x40000000; // non-negative positive int32.
        INPUT_BUILTIN_MIC       = 0x40000001; // buildin mic
        INPUT_BUILTIN_BACK_MIC  = 0x40000002; // buildin back mic
        INPUT_WIRED_HEADSET_MIC = 0x40000004; // 3.5mm headset mic
        INPUT_USB_HEADSET_MIC   = 0x40000008; // usb headset mic
        INPUT_BLUETOOTH_SCO     = 0x40000010; // bluetooth sco mic
    }
    optional AudioDevice audio_device = 1;

    // Duration of the audio in seconds
    optional int32 duration_secs = 2;

    // Average volume (0 ... 1.0)
    optional float average_volume = 3;

    enum AudioType {
        UNKNOWN_TYPE = 0;
        VOICE_CALL_TYPE = 1; // voice call
        VOIP_CALL_TYPE = 2; // voip call, including uplink and downlink
        MEDIA_TYPE = 3; // music and system sound
        RINGTONE_NOTIFICATION_TYPE = 4; // ringtone and notification
        ALARM_TYPE = 5; // alarm type
        // record type
        CAMCORDER_TYPE = 6; // camcorder
        RECORD_TYPE = 7;  // other recording
    }
    optional AudioType type = 4;

    // Minimum volume duration of the audio in seconds
    optional int32 minimum_volume_duration_secs = 5;

    // Minimum volume (0 ... 1.0)
    optional float minimum_volume = 6;

    // Maximum volume duration of the audio in seconds
    optional int32 maximum_volume_duration_secs = 7;

    // Maximum volume (0 ... 1.0)
    optional float maximum_volume = 8;
}

/**
  * Pulls bytes transferred over WiFi and mobile networks sliced by uid, is_metered, and tag.
  *
  * Pulled from:
  *   StatsPullAtomService, which uses NetworkStatsService to query NetworkStats.
  */
message BytesTransferByTagAndMetered {
    optional int32 uid = 1 [(is_uid) = true];

    optional bool is_metered = 2;

    optional int32 tag = 3;

    optional int64 rx_bytes = 4;

    optional int64 rx_packets = 5;

    optional int64 tx_bytes = 6;

    optional int64 tx_packets = 7;
}

/*
 * Logs when the Media Output Switcher finishes a media switch operation.
 *
 * Logged from:
 *  packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputMetricLogger.java
 */
message MediaOutputOpSwitchReported {
    // Source medium type before switching.
    optional android.app.settings.mediaoutput.MediumType source = 1;

    // Target medium type after switching.
    optional android.app.settings.mediaoutput.MediumType target = 2;

    // The result of switching.
    optional android.app.settings.mediaoutput.SwitchResult result = 3;

    // The detail code of a switching result.
    optional android.app.settings.mediaoutput.SubResult subresult = 4;

    /*
     * The package name of a pre-installed app, whose media session is being switched.
     */
    optional string media_session_package_name = 5;

    // The amount of available wired devices when a switching is being performed.
    optional int32 available_wired_device_count = 6;

    // The amount of available Bluetooth devices a switching is being performed.
    optional int32 available_bt_device_count = 7;

    // The amount of available remote devices when a switching is being performed.
    optional int32 available_remote_device_count = 8;

    // The amount of applied devices within a remote dynamic group after a switching is done.
    optional int32 applied_device_count_within_remote_group = 9;
}

/*
 * Logs when the user interact with Media Output Switcher.
 *
 * Logged from:
 *  packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputMetricLogger.java
 */
message MediaOutputOpInteractionReported {
    /** * The type of interaction with the output switch dialog. */
    enum InteractionType {
        EXPANSION = 0;
        ADJUST_VOLUME = 1;
        STOP_CASTING = 2;
    }

    // Type of interaction.
    optional InteractionType interaction_type = 1;

    // Type of device that interaction with.
    optional android.app.settings.mediaoutput.MediumType target = 2;
}

/**
 * Logs when the Assistant is invoked.
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
 */
message AssistantInvocationReported {

    // The event_id (as for UiEventReported).
    optional int32 event_id = 1;

    // The registered Assistant's uid and package (as for UiEventReported).
    optional int32 uid = 2 [(is_uid) = true];
    optional string package_name = 3;

    // An identifier used to disambiguate which logs refer to a particular invocation of the
    // Assistant  (as for UiEventReported).
    optional int32 instance_id = 4;

    // The state of the device at the time of invocation.
    enum DeviceState {
        UNKNOWN_DEVICE_STATE = 0;
        AOD1 = 1;
        AOD2 = 2;
        BOUNCER = 3;
        UNLOCKED_LOCKSCREEN = 4;
        LAUNCHER_HOME = 5;
        LAUNCHER_OVERVIEW = 6;
        LAUNCHER_ALL_APPS = 7;
        APP_DEFAULT = 8;
        APP_IMMERSIVE = 9;
        APP_FULLSCREEN = 10;
    }
    optional DeviceState device_state = 5;

    // Whether the Assistant handles were showing at the time of invocation.
    optional bool assistant_handles_showing = 6;
}

/**
 * Logs when an AudioRecord finishes running on an audio device
 *
 * Logged from:
 *   frameworks/av/services/mediametrics/AudioAnalytics.cpp
 */
message MediametricsAudioRecordDeviceUsageReported {
    // The devices connected to this AudioRecord.
    // A string OR of various input device categories, e.g. "DEVICE1|DEVICE2".
    // See lookup<INPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    // See audio_device_t in system/media/audio/include/system/audio-base.h
    optional string devices = 1;

    // The name of the remote device attached to the device, typically available for USB or BT.
    // This may be empty for a fixed device, or separated by "|" if more than one.
    optional string device_names = 2;

    // The amount of time spent in the device as measured by the active track in AudioFlinger.
    optional int64 device_time_nanos = 3;

    // The audio data format used for encoding.
    // An enumeration from system/media/audio/include/system/audio-base.h audio_format_t
    optional string encoding = 4;

    // The client-server buffer framecount.
    // The framecount is generally between 960 - 48000 for PCM encoding.
    // The framecount represents raw buffer size in bytes for non-PCM encoding.
    optional int32 frame_count = 5;

    // The number of audio intervals (contiguous, continuous playbacks).
    optional int32 interval_count = 6;

    // The sample rate of the AudioRecord.
    // A number generally between 8000-96000 (frames per second).
    optional int32 sample_rate = 7;

    // The audio input flags used to construct the AudioRecord.
    // A string OR from system/media/audio/include/system/audio-base.h audio_input_flags_t
    optional string flags = 8;

    // The santized package name of the audio client associated with the AudioRecord.
    // See getSanitizedPackageNameAndVersionCode() in
    // frameworks/av/services/mediametrics/MediaMetricsService.cpp
    optional string package_name = 9;

    // The selected device id (nonzero if a non-default device is selected)
    optional int32 selected_device_id = 10;

    // The caller of the AudioRecord.
    // See lookup<CALLER_NAME>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    optional string caller = 11;

    // The audio source for AudioRecord.
    // An enumeration from system/media/audio/include/system/audio-base.h audio_source_t
    optional string source = 12;

    // Android S
    // Metric log session id, a Base64Url encoded string of a randomly generated 128-bit integer.
    // An empty string means no session id is set.
    optional string log_session_id = 13;
}

/**
 * Logs when an AudioThread finishes running on an audio device
 *
 * Logged from:
 *   frameworks/av/services/mediametrics/AudioAnalytics.cpp
 */
message MediametricsAudioThreadDeviceUsageReported {
    // The devices connected to this audio thread.
    // A string OR of various input device categories, e.g. "DEVICE1|DEVICE2".
    // (for record threads):
    // See lookup<INPUT_DEVICE> in frameworks/av/services/mediametrics/AudioTypes.cpp
    // (for playback threads):
    // See lookup<OUTPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    // See audio_device_t in system/media/audio/include/system/audio-base.h
    optional string devices = 1;

    // The name of the remote device attached to the device, typically available for USB or BT.
    // This may be empty for a fixed device, or separated by "|" if more than one.
    optional string device_names = 2;

    // The amount of time spent in the device as measured by the active track in AudioFlinger.
    optional int64 device_time_nanos = 3;

    // The audio data format used for encoding.
    // An enumeration from system/media/audio/include/system/audio-base.h audio_format_t
    optional string encoding = 4;

    // The framecount of the buffer delivered to (or from) the HAL.
    // The framecount is generally ~960 for PCM encoding.
    // The framecount represents raw buffer size in bytes for non-PCM encoding.
    optional int32 frame_count = 5;

    // The number of audio intervals (contiguous, continuous playbacks).
    optional int32 interval_count = 6;

    // The sample rate of the audio thread.
    // A number generally between 8000-96000 (frames per second).
    optional int32 sample_rate = 7;

    // The audio flags used to construct the thread
    // (for record threads):
    // A string OR from system/media/audio/include/system/audio-base.h audio_input_flags_t
    // (for playback threads):
    // A string OR from system/media/audio/include/system/audio-base.h audio_output_flags_t
    optional string flags = 8;

    // The number of underruns encountered for a playback thread or the
    // number of overruns encountered for a capture thread.
    optional int32 xruns = 9;

    // The type of thread
    // A thread type enumeration from
    // frameworks/av/mediametrics/services/Translate.h
    optional string type = 10;
}

/**
 * Logs when an AudioTrack finishes running on an audio device
 *
 * Logged from:
 *   frameworks/av/services/mediametrics/AudioAnalytics.cpp
 */
message MediametricsAudioTrackDeviceUsageReported {
    // The output devices connected to this AudioTrack.
    // A string OR of various output device categories, e.g. "DEVICE1|DEVICE2".
    // See lookup<OUTPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    // See audio_device_t in system/media/audio/include/system/audio-base.h
    optional string devices = 1;

    // The name of the remote device attached to the device, typically available for USB or BT.
    // This may be empty for a fixed device, or separated by "|" if more than one.
    optional string device_names = 2;

    // The amount of time spent in the device as measured by the active track in AudioFlinger.
    optional int64 device_time_nanos = 3;

    // The audio data format used for encoding.
    // An enumeration from system/media/audio/include/system/audio-base.h audio_format_t
    optional string encoding = 4;

    // The client-server buffer framecount.
    // The framecount is generally between 960 - 48000 for PCM encoding.
    // The framecount represents raw buffer size in bytes for non-PCM encoding.
    // A static track (see traits) may have a very large framecount.
    optional int32 frame_count = 5;

    // The number of audio intervals (contiguous, continuous playbacks).
    optional int32 interval_count = 6;

    // The sample rate of the AudioTrack.
    // A number generally between 8000-96000 (frames per second).
    optional int32 sample_rate = 7;

    // The audio flags used to construct the AudioTrack.
    // A string OR from system/media/audio/include/system/audio-base.h audio_output_flags_t
    optional string flags = 8;

    // The number of underruns encountered.
    optional int32 xruns = 9;

    // The santized package name of the audio client associated with the AudioTrack.
    // See getSanitizedPackageNameAndVersionCode() in
    // frameworks/av/services/mediametrics/MediaMetricsService.cpp
    optional string package_name = 10;

    // The latency of the last sample in the buffer in milliseconds.
    optional float device_latency_millis = 11;

    // The startup time in milliseconds from start() to sample played.
    optional float device_startup_millis = 12;

    // The average volume of the track on the device [ 0.f - 1.f ]
    optional float device_volume = 13;

    // The selected device id (nonzero if a non-default device is selected)
    optional int32 selected_device_id = 14;

    // The stream_type category for the AudioTrack.
    // An enumeration from system/media/audio/include/system/audio-base.h audio_stream_type_t
    optional string stream_type = 15;

    // The usage for the AudioTrack.
    // An enumeration from system/media/audio/include/system/audio-base.h audio_usage_t
    optional string usage = 16;

    // The content type of the AudioTrack.
    // An enumeration from system/media/audio/include/system/audio-base.h audio_content_type_t
    optional string content_type = 17;

    // The caller of the AudioTrack.
    // See lookup<CALLER_NAME>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    optional string caller = 18;

    // The traits of the AudioTrack.
    // A string OR of different traits, may be empty string.
    // Only "static" is supported for R.
    // See lookup<TRACK_TRAITS>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    optional string traits = 19;

    // Android S
    // Metric log session id, a Base64Url encoded string of a randomly generated 128-bit integer.
    // An empty string means no session id is set.
    optional string log_session_id = 20;
}

/**
 * Logs the status of an audio device connection attempt.
 *
 * Logged from:
 *   frameworks/av/services/mediametrics/AudioAnalytics.cpp
 */
message MediametricsAudioDeviceConnectionReported {
    // The input devices represented by this report.
    // A string OR of various input device categories, e.g. "DEVICE1|DEVICE2".
    // See lookup<INPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    // See audio_device_t in system/media/audio/include/system/audio-base.h
    optional string input_devices = 1;

    // The output devices represented by this report.
    // A string OR of various output device categories.
    // See lookup<OUTPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp
    // See audio_device_t in system/media/audio/include/system/audio-base.h
    optional string output_devices = 2;

    // The name of the remote device attached to the device, typically available for USB or BT.
    // This may be empty for a fixed device, or separated by "|" if more than one.
    optional string device_names = 3;

    // The result of the audio device connection.
    // 0 indicates success: connection verified.
    // 1 indicates unknown: connection not verified or not known if diverted properly.
    // Other values indicate specific status.
    // See DeviceConnectionResult in frameworks/av/services/mediametrics/AudioTypes.h
    optional int32 result = 4;

    // Average milliseconds of time to connect
    optional float time_to_connect_millis = 5;

    // Number of connections if aggregated statistics, otherwise 1.
    optional int32 connection_count = 6;
}

/**
 * Logs the status of an AudioRecord operation.
 *
 * Logged from:
 *   frameworks/av/services/mediametrics/AudioAnalytics.cpp
 */
message MediametricsAudioRecordStatusReported {
    // General status code for categorization of status.
    optional android.media.Status status = 1;

    // Status or error message, e.g. logcat.
    optional string debug_message = 2;

    // Supplemental status subcode for AudioRecord.
    optional int32 status_subcode = 3;

    // Uid associated with the AudioRecord.
    optional int32 uid = 4 [(is_uid) = true];

    // The AudioRecord event.
    optional android.media.audio.AudioRecordEvent event = 5;

    // Requested AudioRecord flags, with each flag bitwise ORed.
    // One or more bits from system/media/audio/include/system/audio-hal-enums.h
    // audio_input_flags_t
    optional int32 input_flags = 6;

    // An enumeration from system/media/audio/include/system/audio-hal-enums.h
    // audio_source_t, representing the input source for the AudioRecord.
    optional android.media.audio.Source source = 7;

    // An enumeration from system/media/audio/include/system/audio-hal-enums.h
    // audio_format_t, representing the encoding of the AudioRecord data.
    optional android.media.audio.Encoding encoding = 8;

    // Channel mask, with each channel position bitwise ORed.
    // One or more bits from system/media/audio/include/system/audio-hal-enums.h
    // audio_channel_mask_t, representing the input channel configuration
    // of AudioRecord data.
    optional int64 channel_mask = 9;

    // The size of the AudioRecord buffer in frames.
    // If an error occurs during creation, this may be a small integer requested size
    // as AudioFlinger is entitled to increase this as required.
    optional int32 buffer_frame_count = 10;

    // Sample rate in Hz.
    optional int32 sample_rate = 11;
}

/**
 * Logs the status of an AudioTrack operation.
 *
 * Logged from:
 *   frameworks/av/services/mediametrics/AudioAnalytics.cpp
 */
message MediametricsAudioTrackStatusReported {
    // General status code for categorization of status.
    optional android.media.Status status = 1;

    // Status or error message, e.g. logcat.
    optional string debug_message = 2;

    // Supplemental status subcode for AudioTrack.
    optional int32 status_subcode = 3;

    // Uid associated with track
    optional int32 uid = 4 [(is_uid) = true];

    // The AudioTrack event.
    optional android.media.audio.AudioTrackEvent event = 5;

    // Requested AudioTrack flags, with each flag bitwise ORed.
    // One or more bits from system/media/audio/include/system/audio-hal-enums.h
    // audio_output_flags_t
    optional int32 output_flags = 6;

    // An enumeration from system/media/audio/include/system/audio-hal-enums.h
    // audio_content_type_t, representing the content type of the AudioTrack.
    optional android.media.audio.ContentType content_type = 7;

    // An enumeration from system/media/audio/include/system/audio-hal-enums.h
    // audio_usage_t, representing the use case for the AudioTrack.
    optional android.media.audio.Usage usage = 8;

    // An enumeration from system/media/audio/include/system/audio-hal-enums.h
    // audio_format_t, representing the encoding of the AudioTrack data.
    optional android.media.audio.Encoding encoding = 9;

    // Channel mask, with each channel position bitwise ORed.
    // One or more bits from system/media/audio/include/system/audio-hal-enums.h
    // audio_channel_mask_t, representing the channel configuration of AudioTrack data.
    optional int64 channel_mask = 10;

    // The size of the AudioTrack buffer in frames.
    // If an error occurs during creation, this may be a small integer requested size
    // as AudioFlinger is entitled to increase this as required.
    optional int32 buffer_frame_count = 11;

    // Sample rate in Hz.
    optional int32 sample_rate = 12;

    // Playback speed, nominal 1.f representing 1x.
    optional float speed = 13;

    // Playback pitch, nominal 1.f representing 1x.
    optional float pitch = 14;
}

/**
 * Logs: i) creation of different types of cryptographic keys in the keystore,
 * ii) operations performed using the keys,
 * iii) attestation of the keys
 * Logged from: system/security/keystore/key_event_log_handler.cpp
 */
message KeystoreKeyEventReported {

    enum Algorithm {
        /** Asymmetric algorithms. */
        RSA = 1;
        // 2 removed, do not reuse.
        EC = 3;
        /** Block cipher algorithms */
        AES = 32;
        TRIPLE_DES = 33;
        /** MAC algorithms */
        HMAC = 128;
    };
    /** Algorithm associated with the key */
    optional Algorithm algorithm = 1;

    /** Size of the key */
    optional int32 key_size = 2;

    enum KeyOrigin {
        /** Generated in keymaster.  Should not exist outside the TEE. */
        GENERATED = 0;
        /** Derived inside keymaster.  Likely exists off-device. */
        DERIVED = 1;
        /** Imported into keymaster.  Existed as cleartext in Android. */
        IMPORTED = 2;
        /** Keymaster did not record origin. */
        UNKNOWN = 3;
        /** Securely imported into Keymaster. */
        SECURELY_IMPORTED = 4;
    };
    /* Logs whether the key was generated, imported, securely imported, or derived.*/
    optional KeyOrigin key_origin = 3;

    enum HardwareAuthenticatorType {
        NONE = 0;
        PASSWORD = 1;
        FINGERPRINT = 2;
        // Additional entries must be powers of 2.
    };
    /**
     * What auth types does this key require? If none,
     * then no auth required.
     */
    optional HardwareAuthenticatorType user_auth_type = 4;

    /**
     * If user authentication is required, is the requirement time based? If it
     * is not time based then this field will not be used and the key is per
     * operation. Per operation keys must be user authenticated on each usage.
     */
    optional int32 user_auth_key_timeout_secs = 5;

    /**
     * padding mode, digest, block_mode and purpose should ideally be repeated
     * fields. However, since statsd does not support repeated fields in
     * pushed atoms, they are represented using bitmaps.
     */

    /** Track which padding mode is being used.*/
    optional int32 padding_mode_bitmap = 6;

    /** Track which digest is being used. */
    optional int32 digest_bitmap = 7;

    /** Track what block mode is being used (for encryption). */
    optional int32 block_mode_bitmap = 8;

    /** Track what purpose is this key serving. */
    optional int32 purpose_bitmap = 9;

    enum EcCurve {
        P_224 = 0;
        P_256 = 1;
        P_384 = 2;
        P_521 = 3;
    };
    /** Which ec curve was selected if elliptic curve cryptography is in use **/
    optional EcCurve ec_curve = 10;

    enum KeyBlobUsageRequirements {
        STANDALONE = 0;
        REQUIRES_FILE_SYSTEM = 1;
    };
    /** Standalone or is a file system required */
    optional KeyBlobUsageRequirements key_blob_usage_reqs = 11;

    enum Type {
        key_operation = 0;
        key_creation = 1;
        key_attestation = 2;
    }
    /** Key creation event, operation event or attestation event? */
    optional Type type = 12;

    /** Was the key creation, operation, or attestation successful? */
    optional bool was_successful = 13;

    /** Response code or error code */
    optional int32 error_code = 14;
}

/**
 * Logs: key creation events with Algorithm, Origin, Error and Attestation info.
 * Logged from: system/security/keystore2/metrics.rs
 */
message Keystore2KeyCreationWithGeneralInfo {

    // Algorithm associated with the key
    optional android.system.security.keystore2.Algorithm algorithm = 1;

    // Size of the key, based on the algorithm used.
    optional int32 key_size = 2;

    enum EcCurve {
        // Unspecified takes 0. Other values are incremented by 1 compared to keymint spec.
        EC_CURVE_UNSPECIFIED = 0;
        P_224 = 1;
        P_256 = 2;
        P_384 = 3;
        P_521 = 4;
        CURVE_25519 = 5;
    };
    // Which ec curve was selected if elliptic curve cryptography is in use
    optional EcCurve ec_curve = 3;

    enum KeyOrigin {
        // Unspecified takes 0. Other values are incremented by 1 compared to keymint spec.
        ORIGIN_UNSPECIFIED = 0;
        // Generated in keymaster.  Should not exist outside the TEE.
        GENERATED = 1;
        // Derived inside keymaster.  Likely exists off-device.
        DERIVED = 2;
        // Imported into keymaster.  Existed as cleartext in Android.
        IMPORTED = 3;
        // Previously used for another purpose that is now obsolete.
        RESERVED = 4;
        // Securely imported into Keymaster.
        SECURELY_IMPORTED = 5;
    };
    // Logs whether the key was generated, imported, securely imported, or derived.
    optional KeyOrigin key_origin = 4;

    /**
     * Response code (system/hardware/interfaces/keystore2/aidl/../ResponseCode.aidl)
     * or
     * error code (hardware/interfaces/security/keymint/aidl/../ErrorCode.aidl)
     */
    optional int32 error_code = 5;

    // Indicates whether key attestation is requested in creation
    optional bool attestation_requested = 6;

    // Count of a particular combination of field values of this atom
    optional int32 count = 7;
}

/**
 * Logs: key creation events with authentication info.
 * Logged from: system/security/keystore2/metrics.rs
 */
message Keystore2KeyCreationWithAuthInfo {

    enum HardwareAuthenticatorType {
        // Unspecified takes 0. Other values are incremented by 1 compared to keymint spec.
        AUTH_TYPE_UNSPECIFIED = 0;
        NONE = 1;
        PASSWORD = 2;
        FINGERPRINT = 3;
        ANY = 5;
    };
    /**
     * What auth types does this key require? If none,
     * then no auth required.
     */
    optional HardwareAuthenticatorType user_auth_type = 1;

    /**
     * If user authentication is required, is the requirement time based? If it
     * is time based then this field indicates the base 10 logarithm of time out in seconds.
     * Logarithm is taken in order to reduce the cardinaltiy.
     */
    optional int32 log_auth_timeout_seconds = 2;

    // Security level of the Keymint instance which creates the key.
    optional android.system.security.keystore2.SecurityLevelEnum security_level = 3;

    // Count of a particular combination of field values of this atom
    optional int32 count = 4;
}

/**
 * Logs: key creation events with purpose and modes info.
 * Logged from: system/security/keystore2/metrics.rs
 */
message Keystore2KeyCreationWithPurposeAndModesInfo {
    // Algorithm associated with the key
    optional android.system.security.keystore2.Algorithm algorithm = 1;

	/**
     * Track which purpose is being used.
     * Bitmap composition is given by KeyPurposeBitPosition enum
     * defined in system/security/keystore2/metrics.rs.
     */
    optional int32 purpose_bitmap = 2;

    /**
     * Track which padding mode is being used.
     * Bitmap composition is given by PaddingModeBitPosition enum
     * defined in system/security/keystore2/metrics.rs.
     */
    optional int32 padding_mode_bitmap = 3;

    /**
     * Track which digest is being used.
     * Bitmap composition is given by DigestBitPosition enum
     * defined in system/security/keystore2/metrics.rs.
     */
    optional int32 digest_bitmap = 4;

    /**
     * Track which block mode is being used.
     * Bitmap composition is given by BlockModeBitPosition enum
     * defined in system/security/keystore2/metrics.rs.
     */
    optional int32 block_mode_bitmap = 5;

    // Count of a particular combination of field values of this atom
    optional int32 count = 6;
}

/**
 * Logs the atom id of the atoms associated with key creation/operation events, that have reached
 * the maximum storage limit allocated for different atom objects of that atom,
 * in keystore in-memory store.
 *
 * Size of the storage bucket for each atom is limited considering their expected cardinaltity.
 * This limit may exceed if the dimensions of the atoms take a large number of unexpected
 * combinations. This atom is used to track such cases.
 */
message Keystore2AtomWithOverflow {

    // Atom id as defined in atoms.proto
    optional int32 atom_id = 1;

    // Count of the objects of this atom type that have overflowed.
    optional int32 count = 2;
}

/**
 * Logs: key operations events with purpose and modes info.
 * Logged from: system/security/keystore2/metrics.rs
 */
message Keystore2KeyOperationWithPurposeAndModesInfo {

    enum KeyPurpose {
        // Unspecified takes 0. Other values are incremented by 1 compared to keymint spec.
        KEY_PURPOSE_UNSPECIFIED = 0;

        // Usable with RSA, 3DES and AES keys.
        ENCRYPT = 1;

        // Usable with RSA, 3DES and AES keys.
        DECRYPT = 2;

        // Usable with RSA, EC and HMAC keys.
        SIGN = 3;

        // Usable with RSA, EC and HMAC keys.
        VERIFY = 4;

        // 5 is reserved
        // Usable with RSA keys.
        WRAP_KEY = 6;

        // Key Agreement, usable with EC keys.
        AGREE_KEY = 7;

        // Usable as an attestation signing key.
        ATTEST_KEY = 8;
    }
    // Purpose of the key operation
    optional KeyPurpose purpose = 1;

    /**
     * Track which padding mode is being used.
     * Bitmap composition is given by PaddingModeBitPosition enum
     * defined in system/security/keystore2/metrics.rs.
     */
    optional int32 padding_mode_bitmap = 2;

    /**
     * Track which digest is being used.
     * Bitmap composition is given by DigestBitPosition enum
     * defined in system/security/keystore2/metrics.rs.
     */
    optional int32 digest_bitmap = 3;

    /**
     * Track which block mode is being used.
     * Bitmap composition is given by BlockModeBitPosition enum
     * defined in system/security/keystore2/metrics.rs.
     */
    optional int32 block_mode_bitmap = 4;

    // Count of a particular combination of field values of this atom
    optional int32 count = 5;
}

/**
 * Logs key operations events with outcome, error_code, security level and whether the key is
 * upgraded during the operation.
 * Logged from: system/security/keystore2/metrics.rs
 */
message Keystore2KeyOperationWithGeneralInfo {

    enum Outcome {
        OUTCOME_UNSPECIFIED = 0;
        DROPPED = 1;
        SUCCESS = 2;
        ABORT = 3;
        PRUNED = 4;
        ERROR = 5;
    }
    // Outcome of the operation
    optional Outcome outcome = 1;

    // Response code or error code in case of error outcome
    optional int32 error_code = 2;

    // Indicates whether the key was upgraded during the operation
    optional bool key_upgraded = 3;

    // Security level of the Keymint instance which performs the operation.
    optional android.system.security.keystore2.SecurityLevelEnum security_level = 4;

    // Count of a particular combination of field values of this atom
    optional int32 count = 5;
}

/**
 * Logs: Keystore 2 storage statistics.
 * Logged from: system/security/keystore2
 */
message Keystore2StorageStats {
    enum Storage {
       STORAGE_UNSPECIFIED = 0;
       KEY_ENTRY = 1;
       KEY_ENTRY_ID_INDEX = 2;
       KEY_ENTRY_DOMAIN_NAMESPACE_INDEX = 3;
       BLOB_ENTRY = 4;
       BLOB_ENTRY_KEY_ENTRY_ID_INDEX = 5;
       KEY_PARAMETER = 6;
       KEY_PARAMETER_KEY_ENTRY_ID_INDEX = 7;
       KEY_METADATA = 8;
       KEY_METADATA_KEY_ENTRY_ID_INDEX = 9;
       GRANT = 10;
       AUTH_TOKEN = 11;
       BLOB_METADATA = 12;
       BLOB_METADATA_BLOB_ENTRY_ID_INDEX =13;
       METADATA = 14;
       DATABASE = 15;
       LEGACY_STORAGE = 16;
    }
    // Type of the storage (database table or legacy storage) of which the size is reported.
    optional Storage storage_type = 1;
    // Storage size in bytes
    optional int64 size = 2;
    // Unused space, in bytes. The total storage size may be larger, indicating
    // inefficiencies in the packing of data in the database.
    optional int64 unused_size = 3;
}

/**
 * Logs Remote Key Provisioning (RKP) related error events.
 * Logged from: system/security/keystore2
 */
message RkpErrorStats {

    enum RkpError {
        RKP_ERROR_UNSPECIFIED = 0;
        // The key pool is out of keys.
        OUT_OF_KEYS = 1;
        // Falling back to factory provisioned keys during hybrid mode.
        FALL_BACK_DURING_HYBRID = 2;
    }
    // Type of the error event
    optional RkpError rkp_error = 1;

    // Count of a particular error occurred.
    optional int32 count = 2;

    /**
     * Security level of the IRemotelyProvisionedComponent.
     */
    optional android.system.security.keystore2.SecurityLevelEnum security_level = 3;
}


/**
 * Logs: Status of the attestation key pool related to
 * Remote Key Provisioning (RKP).
 * Logged from: system/security/keystore2
 */
message RkpPoolStats {
    /**
     * Security level of the Keymint instance associated with the
     * attestation pool status.
     */
    optional android.system.security.keystore2.SecurityLevelEnum security_level = 1;

    /**
     * The number of signed attestation certificate chains which are
     * expired.
     */
    optional int32 expiring = 2;

    /**
     * The number of signed attestation certificate chains which have
     * not yet been assigned to an app.
     */
    optional int32 unassigned = 3;

    /**
     * The number of signed attestation keys.
     */
    optional int32 attested = 4;

    /**
     * The total number of attestation keys.
     */
    optional int32 total = 5;

}

/**
 * Logs: Number of keystore2 crashes per-boot cycle.
 * Logged from: system/security/keystore2
 */
message Keystore2CrashStats {
    optional int32 count_of_crash_events = 1;
}

// Blob Committer stats
// Keep in sync between:
//     frameworks/proto_logging/stats/enums/server/blobstoremanagerservice.proto
//     frameworks/base/cmds/statsd/src/atoms.proto
message BlobCommitterProto {
    // Committer app's uid
    optional int32 uid = 1 [(is_uid) = true];

    // Unix epoch timestamp of the commit in milliseconds
    optional int64 commit_timestamp_millis = 2;

    // Flags of what access types the committer has set for the Blob
    optional int32 access_mode = 3;

    // Number of packages that have been whitelisted for ACCESS_TYPE_WHITELIST
    optional int32 num_whitelisted_package = 4;
}

// Blob Leasee stats
// Keep in sync between:
//     frameworks/proto_logging/stats/enums/server/blobstoremanagerservice.proto
//     frameworks/base/cmds/statsd/src/atoms.proto
message BlobLeaseeProto {
    // Leasee app's uid
    optional int32 uid = 1 [(is_uid) = true];

    // Unix epoch timestamp for lease expiration in milliseconds
    optional int64 lease_expiry_timestamp_millis = 2;
}

// List of Blob Committers
// Keep in sync between:
//     frameworks/proto_logging/stats/enums/server/blobstoremanagerservice.proto
//     frameworks/base/cmds/statsd/src/atoms.proto
message BlobCommitterListProto {
    repeated BlobCommitterProto committer = 1;
}

// List of Blob Leasees
// Keep in sync between:
//     frameworks/proto_logging/stats/enums/server/blobstoremanagerservice.proto
//     frameworks/base/cmds/statsd/src/atoms.proto
message BlobLeaseeListProto {
    repeated BlobLeaseeProto leasee = 1;
}

/**
 * Logs the current state of a Blob committed with BlobStoreManager
 *
 * Pulled from:
 *  frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
 */
message BlobInfo {
    // Id of the Blob
    optional int64 blob_id = 1;

    // Size of the Blob data
    optional int64 size = 2;

    // Unix epoch timestamp of the Blob's expiration in milliseconds
    optional int64 expiry_timestamp_millis = 3;

    // List of committers of this Blob
    optional BlobCommitterListProto committers = 4 [(log_mode) = MODE_BYTES];

    // List of leasees of this Blob
    optional BlobLeaseeListProto leasees = 5 [(log_mode) = MODE_BYTES];
}

/**
 * Logs when the HDMI CEC active source changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/hdmi/HdmiCecAtomWriter.java
 */
message HdmiCecActiveSourceChanged {
    // The logical address of the active source.
    optional android.stats.hdmi.LogicalAddress active_source_logical_address = 1;

    // The physical address of the active source. Consists of four hexadecimal nibbles.
    // Examples: 0x1234, 0x0000 (root device). 0xFFFF represents an unknown or invalid address.
    // See section 8.7 in the HDMI 1.4b spec for details.
    optional int32 active_source_physical_address = 2;

    // The relationship between this device and the active source.
    optional android.stats.hdmi.PathRelationship local_relationship = 3;
}

/**
 * Logs when an HDMI CEC message is sent or received.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/hdmi/HdmiCecAtomWriter.java
 */
message HdmiCecMessageReported {
    // The calling uid of the application that caused this atom to be written.
    optional int32 uid = 1 [(is_uid) = true];

    // Whether a HDMI CEC message is sent from this device, to this device, or neither.
    optional android.stats.hdmi.MessageDirection direction = 2;

    // The HDMI CEC logical address of the initiator.
    optional android.stats.hdmi.LogicalAddress initiator_logical_address = 3;

    // The HDMI CEC logical address of the destination.
    optional android.stats.hdmi.LogicalAddress destination_logical_address = 4;

    // The opcode of the message. Ranges from 0x00 to 0xFF.
    // For all values, see section "CEC 15 Message Descriptions" in the HDMI CEC 1.4b spec.
    optional int32 opcode = 5;

    // The result of attempting to send the message on its final retransmission attempt.
    // Only applicable to outgoing messages; set to SEND_MESSAGE_RESULT_UNKNOWN otherwise.
    optional android.stats.hdmi.SendMessageResult send_message_result = 6;

    // Fields specific to <User Control Pressed> messages

    // The user control command that was received.
    optional android.stats.hdmi.UserControlPressedCommand user_control_pressed_command = 7;

    // Fields specific to <Feature Abort> messages

    // The opcode of the message that was feature aborted.
    // Set to 0x100 when unknown or not applicable.
    optional int32 feature_abort_opcode = 8;

    // The reason for the feature abort.
    optional android.stats.hdmi.FeatureAbortReason feature_abort_reason = 9;
}

/**
 * Logs when an auto rotate event occurs while smart auto rotate is enabled.
 */
message AutoRotateReported {
    enum Orientation {
        UNKNOWN = 0;
        DEPRECATED = 1;
        ROTATION_0 = 2;
        ROTATION_90 = 3;
        ROTATION_180 = 4;
        ROTATION_270 = 5;
        DISABLED = 6;
        UNAVAILABLE = 7;
        FAILURE = 8;
    }

    // Orientation of the device when a rotation was detected.
    optional Orientation current_orientation = 1;
    // The orientation of the phone after rotation before going through the recommendation service.
    optional Orientation proposed_orientation = 2;
    // Orientation recommended by the smart autorotate service component outside of the platform. It
    // may or may not match the proposed_orientation. Can be disabled or unavailable if the
    // recommendation service is disabled or unavailable. Will be unknown if the service failed.
    optional Orientation recommended_orientation = 3;
    // Time taken to calculate the rotation recommendation.
    optional int64 recommendation_process_duration_millis = 4;
}

/**
 * Logs when sensors only autorotate is triggered. Associated event can be a rotation preindication,
 * actual event or a "data ready to be pulled" indication. More info: go/autorotate-logging.
 *
 * Logged from:
 *    platform/vendor/unbundled_google/packages/SystemUIGoogle/src/com/google/android/systemui/autorotate/DataLogger.java
 */

message DeviceRotated {
  // Timestamp of the event in millis. We log the timestamp explicitly since
  // data logging will follow the event logging and all these
  // will be joined with other logs such as rotation button clicked.
  optional int64 timestamp_millis = 1;
  // Device orientation
  optional android.stats.wm.Orientation proposed_orientation = 2;

  enum RotationEventType{
    UNKNOWN = 0;
    // An early indication of device might be rotated.
    PREINDICATION = 1;
    // Device rotation is detected.
    ACTUAL_EVENT = 2;
    // Device rotated and the data associated with it is ready to be pulled.
    // This happens after the ACTUAL_EVENT since some data after the event is
    // also useful.
    DATA_READY = 3;
  }
  optional RotationEventType rotation_event_type = 3;
}

/**
 * Records the raw sensor data published by the device orientation debug sensor. The pull will be
 * configured to be conditioned on the {@code DeviceRotated} atom.
 *
 * Logged from:
 *     platform/vendor/unbundled_google/packages/SystemUIGoogle/src/com/google/android/systemui/autorotate/DataLogger.java
 */
message DeviceRotatedData {
  // All the sensor data and timestamps used to calculate the orientation
  optional DeviceRotatedSensorData snapshot = 1 [(log_mode) = MODE_BYTES];
  // Resulting orientation
  optional android.stats.wm.Orientation proposed_orientation = 2;
}

message DeviceRotatedSensorData {
  optional DeviceRotatedSensorHeader header = 1 [(log_mode) = MODE_BYTES];
  repeated DeviceRotatedSensorSample sample = 2 [(log_mode) = MODE_BYTES];
}

message DeviceRotatedSensorHeader {
  optional int64 timestamp_base_millis = 1;
}

message DeviceRotatedSensorSample{
  optional int32 timestamp_offset_millis = 1;
  enum SensorType {
    UNKNOWN = 0;
    ACCEL = 1;
    GYRO = 2;
  }
  optional SensorType sensor_type = 2;
  optional float x_value = 3;
  optional float y_value = 4;
  optional float z_value = 5;
}

/**
  * Pushes TLS handshake counters from Conscrypt.
  * Pulled from:
  *   external/conscrypt/common/src/main/java/org/conscrypt/ConscryptEngineSocket.java
  *   external/conscrypt/common/src/main/java/org/conscrypt/ConscryptFileDescriptorSocket.java
  */
message TlsHandshakeReported {
    optional bool success = 1;

    optional android.stats.tls.Protocol protocol = 2;

    optional android.stats.tls.CipherSuite cipher_suite = 3;

    optional int32 handshake_duration_millis = 4;
}

/**
 * Logs when a TextClassifier API is invoked.
 *
 * See frameworks/base/core/java/android/view/textclassifier/TextClassifier.java
 * Logged from: external/libtextclassifier/java/
 */
message TextClassifierApiUsageReported {
    enum ApiType {
        UNKNOWN_API = 0;
        SUGGEST_SELECTION = 1;
        CLASSIFY_TEXT = 2;
        GENERATE_LINKS = 3;
        DETECT_LANGUAGES = 4;
        SUGGEST_CONVERSATION_ACTIONS = 5;
    }
    optional ApiType api_type = 1;

    enum ResultType {
        UNKNOWN_RESULT = 0;
        SUCCESS = 1;
        FAIL = 2;
    }
    optional ResultType result_type = 2;
    optional int64 latency_millis = 3;
    optional string session_id = 4;
}

/**
 * Logs when TextClassifier Model Downloader finishes a download task.
 *
 * Currently we create a downlaod task for each new manifest to download.
 *
 * Logged from: external/libtextclassifier/java/
 */
message TextClassifierDownloadReported {
    // The model type to download
    enum ModelType {
        UNKNOWN_MODEL_TYPE = 0;
        ANNOTATOR = 1;
        LANG_ID = 2;
        ACTIONS_SUGGESTIONS = 3;
    }
    optional ModelType model_type = 1;
    // The file type to download
    enum FileType {
        UNKNOWN_FILE_TYPE = 0;
        MANIFEST = 1;
        MODEL = 2;
    }
    // Deprecated: now manifest and model files are downloaded together.
    optional FileType file_type = 2;
    // The status of the download
    enum DownloadStatus {
        UNKNOWN_STATUS = 0;
        SCHEDULED = 1;
        SUCCEEDED = 2;
        FAILED_AND_RETRY = 3;
        FAILED_AND_ABORT = 4;
    }
    optional DownloadStatus download_status = 3;
    // The public GStatic url we used to download the model. Contains locale info.
    optional string url_suffix = 4;
    // Failure reason, only set if this is for a failure status
    enum FailureReason {
        reserved 1, 8, 9;

        UNKNOWN_FAILURE_REASON = 0;
        FAILED_TO_DOWNLOAD_SERVICE_CONN_BROKEN = 2;
        FAILED_TO_DOWNLOAD_404_ERROR = 3;
        FAILED_TO_DOWNLOAD_OTHER = 4;
        DOWNLOADED_FILE_MISSING = 5;
        FAILED_TO_PARSE_MANIFEST = 6;
        FAILED_TO_VALIDATE_MODEL = 7;
    }
    optional FailureReason failure_reason = 5;
    // How many attempts we have tried for the same task at a terminal status (i.e. SUCCEEDED or
    // FAILED_AND_ABORT).
    optional int32 run_attempt_count = 6;

    // Custom failure code for downloader lib internal failures (E.g. 404 error).
    optional int32 downloader_lib_failure_code = 7;

    // Time elapsed for the whole download task
    optional int64 download_duration_millis = 8;

    // The id of the WorkManager work that launched this download.
    optional int64 work_id = 9;
}

/**
 * Logs when TextClassifier Model Downloader schedules a WorkManager work.
 *
 * Logged from: external/libtextclassifier/java/
 */
message TextClassifierDownloadWorkScheduled {
    optional int64 work_id = 1;

    enum ReasonToSchedule {
        UNKNOWN_REASON_TO_SCHEDULE = 0;
        TCS_STARTED = 1;
        LOCALE_SETTINGS_CHANGED = 2;
        DEVICE_CONFIG_UPDATED = 3;
    }
    optional ReasonToSchedule reason_to_schedule = 2;

    optional bool failed_to_schedule = 3;
}

/**
 * Logs when TextClassifier Model Downloader finishes a WorkManager work.
 *
 * A WorkManager work includes one or more downlad tasks. We log this atom when
 * all tasks finished. The work_id can be used to join work log and task logs.
 *
 * Logged from: external/libtextclassifier/java/
 */
message TextClassifierDownloadWorkCompleted {
    optional int64 work_id = 1;

    enum WorkResult {
        UNKNOWN_WORK_RESULT = 0;
        SUCCESS_MODEL_DOWNLOADED = 1;
        SUCCESS_NO_UPDATE_AVAILABLE = 2;
        FAILURE_MODEL_DOWNLOADER_DISABLED = 3;
        FAILURE_MAX_RUN_ATTEMPT_REACHED = 4;
        RETRY_MODEL_DOWNLOAD_FAILED = 5;
        RETRY_RUNTIME_EXCEPTION = 6;
        RETRY_STOPPED_BY_OS = 7;
    }
    optional WorkResult work_result = 2;

    // How many attempts we have tried for this work.
    optional int32 run_attempt_count = 3;

    optional int64 work_scheduled_to_started_duration_millis = 4;
    optional int64 work_started_to_ended_duration_millis = 5;
}

/**
 * Logs telemetry for Android Virtualization framework
 *
 * On CreateVM requests, an atom is pushed that records what hypervisor is being used.
 * the protected status of the new VM, and if the VM creation succeeded
 * Logged from: packages/modules/Virtualization/
 */
message VmCreationRequested {
    enum Hypervisor {
        UNKNOWN = 0;
        PKVM = 1;
        OTHER = 2;
    }
    optional Hypervisor hypervisor = 1;
    // Is the VM started in protected mode?
    optional bool is_protected = 2;
    // Did the VM creation succeed
    optional bool creation_succeeded = 3;
    // Binder exception Code thrown by createVm request
    optional int32 binder_exception_code = 4;
}

/**
 * Logs telemetry for Early boot CompOsArtifacts checks (done by odsign)
 *
 * odsign is a binary that runs during early boot. One of its responsibility is
 * to check if the device can use compOS and check if so, validate the compos
 * generated artifacts. An atom is pushed on each such check. Note: We only
 * push an atom from devices/configurations that can use compOs.
 */
message EarlyBootCompOsArtifactsCheckReported {
  // Are the current Artifacts okay (This check is done by odrefresh).
  // (current_artifacts_ok == true) => compilationRequired is false
  optional bool current_artifacts_ok = 1;
  // Has CompOs generated any Artifacts
  optional bool comp_os_pending_artifacts_exists = 2;
  // The device will be using CompOs generated artifacts. Note: the value of
  // this is meaningless if current_artifacts_ok = true
  optional bool use_comp_os_generated_artifacts = 3;
}

/**
 * Logs telemetry when Isolation compilation job is scheduled.
 *
 * The atoms are sent by IsolatedCompilationService (fragment of system_server)
 * when apex are staged and need compilation.
 */
message IsolatedCompilationScheduled {
    enum Result {
        SCHEDULING_RESULT_UNKNOWN = 0;
        SCHEDULING_FAILURE = 1;
        SCHEDULING_SUCCESS = 2;
    }
    optional Result scheduling_result = 1;
}

/**
 * Logs telemetry Isolation compilation completion.
 *
 * The atoms is sent by IsolatedCompilationService by compilation ends
 * and contain results/timings of compilation
 */
message IsolatedCompilationEnded {
    enum Result {
        RESULT_UNKNOWN = 0;
        RESULT_SUCCESS = 1;
        RESULT_UNKNOWN_FAILURE = 2;
        RESULT_FAILED_TO_START = 3;
        RESULT_JOB_CANCELED = 4;
        RESULT_COMPILATION_FAILED = 5;
        RESULT_UNEXPECTED_COMPILATION_RESULT = 6;
        RESULT_COMPOSD_DIED = 7;
    }
    // Time between compilation job starts to when it ends.
    // Note: this does not include the time between compilation job being scheduled (or when apex is staged)
    // and it actually starting
    optional int64 compilation_time_millis = 1;
    // Result of compilation
    optional Result compilation_result = 2;
}

/**
 * Logs the current state of an application/process before it is killed.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Pushed from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogKillStatsReported {
    // Linux process uid for the package.
    optional int32 uid = 1 [(is_uid) = true];

    // State of the uid when it was killed.
    enum UidState {
        UNKNOWN_UID_STATE = 0;
        BACKGROUND_MODE = 1;
        FOREGROUND_MODE = 2;
    }
    optional UidState uid_state = 2;

    // System state indicating whether the system was in normal mode or garage mode.
    enum SystemState {
        UNKNOWN_SYSTEM_STATE = 0;
        USER_INTERACTION_MODE = 1;
        USER_NO_INTERACTION_MODE = 2;
        GARAGE_MODE = 3;
    }
    optional SystemState system_state = 3;

    // Reason for killing the application.
    // Keep in sync with proto file at packages/services/Car/cpp/watchdog/proto
    enum KillReason {
        UNKNOWN_KILL_REASON = 0;
        KILLED_ON_ANR = 1;
        KILLED_ON_IO_OVERUSE = 2;
        KILLED_ON_MEMORY_OVERUSE = 3;
    }
    optional KillReason kill_reason = 4;

    // Stats of the processes owned by the application when the application was killed.
    // The process stack traces are not collected when the application was killed due to IO_OVERUSE.
    optional CarWatchdogProcessStats process_stats = 5 [(log_mode) = MODE_BYTES];

    // The application's I/O overuse stats logged only when the kill reason is KILLED_ON_IO_OVERUSE.
    optional CarWatchdogIoOveruseStats io_overuse_stats = 6 [(log_mode) = MODE_BYTES];
}

/**
 * Logs the I/O overuse stats for an application on detecting I/O overuse.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Pushed from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogIoOveruseStatsReported {
    // Linux process uid for the package.
    optional int32 uid = 1 [(is_uid) = true];

    // The application's I/O overuse stats.
    optional CarWatchdogIoOveruseStats io_overuse_stats = 2 [(log_mode) = MODE_BYTES];
}

/**
 * Logs I/O overuse stats for a package.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Logged from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogIoOveruseStats {
    enum Period {
        UNKNOWN_PERIOD = 0;
        DAILY = 1;
        WEEKLY = 2;
    }

    // Threshold and usage stats period.
    optional Period period = 1;

    // Threshold in-terms of write bytes defined for the package.
    optional CarWatchdogPerStateBytes threshold = 2;

    // Number of write bytes in each state for the specified period.
    optional CarWatchdogPerStateBytes written_bytes = 3;

    // Application or service uptime during the aforementioned period.
    optional uint64 uptime_millis = 4;
};

/**
 * Logs bytes attributed to each application and system states.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Logged from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogPerStateBytes {
    // Number of bytes attributed to the application foreground.
    optional int64 foreground_bytes = 1;

    // Number of bytes attributed to the application background.
    optional int64 background_bytes = 2;

    // Number of bytes attributed to the garage mode.
    optional int64 garage_mode_bytes = 3;
}

/**
 * Logs each CarWatchdogProcessStat in CarWatchdogProcessStats.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Logged from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogProcessStats {
    // Records the stats of the processes owned by an application.
    repeated CarWatchdogProcessStat process_stat = 1;
}

/**
 * Logs a process's stats.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Logged from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogProcessStat {
    // Command name of the process.
    optional string process_name = 1;

    // Process uptime.
    optional uint64 uptime_millis = 2;

    // Number of major page faults caused by the process and its children.
    optional uint64 major_page_faults = 3;

    // Peak virtual memory size in kb.
    optional uint64 vm_peak_kb = 4;

    // Virtual memory size in kb.
    optional uint64 vm_size_kb = 5;

    // Peak resident set size (high water mark) in kb.
    optional uint64 vm_hwm_kb = 6;

    // Resident set size in kb.
    optional uint64 vm_rss_kb = 7;
}

/**
 * Logs total I/O usage summary for all applications and services running in the system.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Pulled from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogSystemIoUsageSummary {
    // I/O usage summary for the system.
    optional CarWatchdogIoUsageSummary io_usage_summary = 1 [(log_mode) = MODE_BYTES];

    // Start time of the event in milliseconds since epoch.
    // Note: This field must be a top-level field as it is used to slice the metrics.
    optional int64 start_time_millis = 2;
}

/**
 * Logs I/O usage summary for an UID.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Pulled from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogUidIoUsageSummary {
    // UID of the application/service whose usage summary are recorded.
    optional int32 uid = 1 [(is_uid) = true];

    // I/O usage summary for the UID.
    optional CarWatchdogIoUsageSummary io_usage_summary = 2 [(log_mode) = MODE_BYTES];

    // Start time of the event in milliseconds since epoch.
    // Note: This field must be a top-level field as it is used to slice the metrics.
    optional int64 start_time_millis = 3;
}

/**
 * Logs I/O usage summary for a time period.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Pulled from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogIoUsageSummary {
    // Summary event time period.
    optional CarWatchdogEventTimePeriod event_time_period = 1;

    // Daily I/O usage summary for the period. Logs summary entries only for days with I/O usage.
    // The entries are ordered beginning from the event_time_period.start_time_millis.
    repeated CarWatchdogDailyIoUsageSummary daily_io_usage_summary = 2;
}

/**
 * Logs a car watchdog event's time period.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Pulled from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogEventTimePeriod {
    enum Period {
        UNKNOWN_PERIOD = 0;
        WEEKLY = 1;
        BIWEEKLY = 2;
        MONTHLY = 3;
    }

    // Deprecated field - Start time of the event in milliseconds since epoch.
    optional uint64 start_time_millis = 1 [deprecated = true];

    // Period for the event.
    optional Period period = 2;
}

/**
 * Logs daily I/O usage summary.
 *
 * Keep in sync with proto file at
 * packages/services/Car/service/src/com/android/car/watchdog/proto/atoms.proto
 *
 * Pulled from:
 *  packages/services/Car/service/src/com/android/car/watchdog/WatchdogPerfHandler.java
 */
message CarWatchdogDailyIoUsageSummary {
    // Total bytes written to disk during a day.
    optional CarWatchdogPerStateBytes written_bytes = 1;

    // Total uptime for the system or service or application during a day.
    optional uint64 uptime_millis = 2;

    // Total disk I/O overuses during a day.
    optional int32 overuse_count = 3;
}

/*
 * pushes Media playback information.
 * Logged from
 *  frameworks/base/services/core/java/com/android/server/media/metrics/
 *      MediaMetricsManagerService.java
 */
message MediametricsPlaybackReported {
    optional int32 uid = 1 [(is_uid) = true];

    // Randomly generated log session ID. A Base64 encoded hex string representing a
    // 128-bit integer.
    optional string log_session_id = 2;
    // The total length of the media in milliseconds. 0 for live contents.
    optional int64 media_duration_millis = 3;
    // Network, device, or mixed.
    optional android.stats.mediametrics.StreamSourceType stream_source = 4;
    // Stream type. DASH, HLS, etc
    optional android.stats.mediametrics.StreamType stream_type = 5;
    // Live, VOD, others
    optional android.stats.mediametrics.PlaybackType playback_type = 6;
    // DRM type
    optional android.stats.mediametrics.DrmType drm_type = 7;
    // Main, AD, others
    optional android.stats.mediametrics.ContentType content_type = 8;
    // Player name. E.g. ExoPlayer
    optional string player_name = 9;
    // Player version. E.g. 1.10.3e
    optional string player_version = 10;
    // Player related experiment IDs
    optional Experiments experiment_ids = 11 [(log_mode) = MODE_BYTES];
    // Number of frames played. Dropped frames included. -1 means unknown.
    optional int32 video_frames_played = 12;
    // Number of frames dropped. -1 means unknown.
    optional int32 video_frames_dropped = 13;
    // Number of audio underruns. -1 means unknown.
    optional int32 audio_underrun_count = 14;
    // Total number of bytes read from the network
    optional int64 network_bytes_read = 15;
    // Total number of bytes read from on-device sources
    optional int64 local_bytes_read = 16;
    // Total transfer spent reading from the network in ms.
    // For parallel requests, the overlapping time intervals are counted only once.
    optional int64 network_transfer_duration_millis = 17;
    // A session ID generated from DRM to distinguish different DRM sessions.
    optional string drm_session_id = 18;
}

message MediaNetworkInfoChanged {
    // Randomly generated log session ID. A Base64 encoded hex string representing a
    // 128-bit integer.
    optional string log_session_id = 1;
    //  New network type
    optional android.stats.mediametrics.NetworkType type = 2;
    // When the network info change occurred relative to playback creation
    // time in milliseconds.
    // It is in absolute time (e.g. always ticks even if the playback is paused).
    optional int64 time_since_playback_created_millis = 3;
}

message MediaPlaybackStateChanged {
    // Randomly generated log session ID. A Base64 encoded hex string representing a
    // 128-bit integer.
    optional string log_session_id = 1;
    //  New playback state
    optional android.stats.mediametrics.PlaybackState playback_state = 2;
    // When the state change occurred relative to playback creation time in
    // milliseconds.
    // It is in absolute time (e.g. always ticks even if the playback is paused).
    optional int64 time_since_playback_created_millis = 3;
}

message MediaPlaybackErrorReported {
    // Randomly generated log session ID. A Base64 encoded hex string representing a
    // 128-bit integer.
    optional string log_session_id = 1;
    //  A shortened call stack of the error
    optional string exception_stack = 2;
    //  Error code
    optional android.stats.mediametrics.PlaybackErrorCode error_code = 3;
    //  Sub-code of error type specified by the error code.
    optional int32 sub_error_code = 4;
    // When the error occurred relative to playback creation time in millisecond.
    // It is in absolute time (e.g. always ticks even if the playback is paused).
    optional int64 time_since_playback_created_millis = 5;
}

message MediaPlaybackTrackChanged {
    // Randomly generated log session ID. A Base64 encoded hex string representing a
    // 128-bit integer.
    optional string log_session_id = 1;
    //  The track is on or off after the change
    optional android.stats.mediametrics.TrackState state = 2;
    //  The reason of the track change
    optional android.stats.mediametrics.TrackChangeReason reason = 3;
    //  The MIME type of the container. E.g. video/mp4
    optional string container_mime_type = 4;
    //  The sample MIME type of the track. E.g. video/avc
    optional string sample_mime_type = 5;

    //  Codec name
    optional string codec_name = 6;
    //  Bits per second. 0 means unknown.
    optional int32 bitrate = 7;

   // When the track change occurred, relative to playback creation time in
   // millisecond.
   // It is in absolute time (e.g. always ticks even if the playback is paused).
   optional int64 time_since_playback_created_millis = 8;

    //  Track type. Audio, Video, Text
    optional android.stats.mediametrics.TrackType type = 9;
    //  2-letter ISO 639-1 language code.
    optional string language = 10;
    //  IETF BCP 47 optional language region subtag based on a two-letter country code
    optional string language_region = 11;
    //  Number of channels
    optional int32 channel_count = 12;
    //  Samples per second
    optional int32 sample_rate = 13;
    //  The width of the video in pixels.
    optional int32 width = 14;
    //  The height of the video in pixels.
    optional int32 height = 15;
    //  Video frame rate in frames per second.
    optional float video_frame_rate = 16;
}

message Experiments {
    // Experiment IDs sent by the player.
    repeated int64 experiments = 1;
}

/**
 * Logs when a Wifi network scan happens.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMetrics.java
 */
message WifiScanReported {
    enum Type {
        TYPE_UNKNOWN = 0;

        // Single scan.
        TYPE_SINGLE = 1;

        // Background scan (deprecated, should not happen).
        TYPE_BACKGROUND = 2;
    }

    enum Result {
        RESULT_UNKNOWN = 0;

        // Failed to start scan.
        RESULT_FAILED_TO_START = 1;

        // The HAL reported a scan failure after the scan was started.
        RESULT_FAILED_TO_SCAN = 2;

        // Scan succeeded.
        RESULT_SUCCESS = 3;
    }

    enum Source {
        SOURCE_UNKNOWN = 0;

        // No work source set - not possible to determine the origin.
        SOURCE_NO_WORK_SOURCE = 1;

        // The Wifi stack.
        SOURCE_WIFI_STACK = 2;

        // GMS on behalf of some other app.
        SOURCE_GMS = 3;

        // Settings app.
        SOURCE_SETTINGS_APP = 4;

        // Other app directly.
        SOURCE_OTHER_APP = 5;
    }

    enum Importance {
        IMPORTANCE_UNKNOWN = 0;

        // Foreground app. Corresponds to the value of
        // ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND or less.
        IMPORTANCE_FOREGROUND = 1;

        // Foreground service. Corresponds to the value of
        // ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE
        IMPORTANCE_FOREGROUND_SERVICE = 2;

        // Everything else.
        IMPORTANCE_BACKGROUND = 3;
    }

    // Scan type
    optional Type type = 1;

    // Outcome: success/failure
    optional Result result = 2;

    // What initiated a scan.
    optional Source source = 3;

    // Process importance of the initiator.
    // This is only available for non-system calls.
    optional Importance importance = 4;

    // Time taken for the scan.
    optional int32 scan_duration_millis = 5;

    // Count of found networks.
    optional int32 count_networks_found = 6;
}

/**
 * Logs when a Wifi PNO (Preferred Network Offload) scan happens.
 *
 * Logged from:
 *   frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMetrics.java
 */
message WifiPnoScanReported {
    enum State {
        UNKNOWN = 0;

        // Scan started.
        STARTED = 1;

        // Scan failed to start (e.g. bad request, unsupported by hardware, etc).
        FAILED_TO_START = 2;

        // Scan completed and a network was found.
        // Note - due to implementation constraints, nothing is reported when a scan completes but
        // doesn't find any networks.
        FINISHED_NETWORKS_FOUND = 3;

        // Scan failed.
        FAILED = 4;
    }

    optional State state = 1;
}

/**
 * Logs when the entitlement configuration of an IMS service is queried/updated.
 *
 * Logged from: ImsServiceEntitlement app
 */
message ImsServiceEntitlementUpdated {
    // The purpose of entitlement query/update
    enum Purpose {
        UNKNOWN_PURPOSE = 0;

        // Initial service activation in foreground
        ACTIVATION = 1;

        // Updating service configuration in foreground
        UPDATE = 2;

        // Background polling for querying service entitlement
        POLLING = 3;
    }

    // The IMS services
    enum ServiceType {
        UNKNOWN_SERVICE = 0;
        VOWIFI = 1;
        VOLTE = 2;
        SMSOIP = 3;
    }

    // The result of activation
    enum AppResult {
        UNKNOWN_RESULT = 0;
        ENABLED = 1;
        DISABLED = 2;
        INCOMPATIBLE = 3;
        PROVISIONING = 4;
        SUCCESSFUL = 5;
        FAILED = 6;
        CANCELED = 7;
        TIMEOUT = 8;
        UNEXPECTED_RESULT = 9;
    }

    // The Android carrier ID for the carrier providing the IMS service.
    // This may not be the actual carrier of the device, e.g. a MVNO
    // may use the IMS service of its MNO.
    optional int64 carrier_id = 1;

    // The Android carrier ID of the actual carrier.
    // E.g. a MVNO may use its MNO's IMS service. In this case,
    // actual_carrier_id is the MVNO and carrier_id is the MNO.
    optional int64 actual_carrier_id = 2;

    // The purpose of this query/update.
    optional Purpose purpose = 3;

    // Which IMS service's entitlement status were queried/updated.
    optional ServiceType service_type = 4;

    // Result of this query/update.
    optional AppResult app_result = 5;

    // How long (in milliseconds) this query/update took.
    optional int64 duration_millis = 6;
}

// Indicates which compile filter was used for the package being loaded in an ART session.
enum ArtCompileFilter {
    ART_COMPILATION_FILTER_UNSPECIFIED = 0;
    ART_COMPILATION_FILTER_ERROR = 1;
    ART_COMPILATION_FILTER_UNKNOWN = 2;
    ART_COMPILATION_FILTER_ASSUMED_VERIFIED = 3;
    ART_COMPILATION_FILTER_EXTRACT = 4;
    ART_COMPILATION_FILTER_VERIFY = 5;
    ART_COMPILATION_FILTER_QUICKEN = 6;
    ART_COMPILATION_FILTER_SPACE_PROFILE = 7;
    ART_COMPILATION_FILTER_SPACE = 8;
    ART_COMPILATION_FILTER_SPEED_PROFILE = 9;
    ART_COMPILATION_FILTER_SPEED = 10;
    ART_COMPILATION_FILTER_EVERYTHING_PROFILE = 11;
    ART_COMPILATION_FILTER_EVERYTHING = 12;
    ART_COMPILATION_FILTER_FAKE_RUN_FROM_APK = 13;
    ART_COMPILATION_FILTER_FAKE_RUN_FROM_APK_FALLBACK = 14;
    ART_COMPILATION_FILTER_FAKE_RUN_FROM_VDEX_FALLBACK = 15;
}

enum ArtCompilationReason {
    ART_COMPILATION_REASON_UNSPECIFIED = 0;
    ART_COMPILATION_REASON_ERROR = 1;
    ART_COMPILATION_REASON_UNKNOWN = 2;
    ART_COMPILATION_REASON_FIRST_BOOT = 3;
    ART_COMPILATION_REASON_BOOT = 4;
    ART_COMPILATION_REASON_INSTALL = 5;
    ART_COMPILATION_REASON_BG_DEXOPT = 6;
    ART_COMPILATION_REASON_AB_OTA = 7;
    ART_COMPILATION_REASON_INACTIVE = 8;
    ART_COMPILATION_REASON_SHARED = 9;
    ART_COMPILATION_REASON_INSTALL_WITH_DEX_METADATA = 10;
    ART_COMPILATION_REASON_POST_BOOT = 11;
    ART_COMPILATION_REASON_INSTALL_FAST = 12;
    ART_COMPILATION_REASON_INSTALL_BULK = 13;
    ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY = 14;
    ART_COMPILATION_REASON_INSTALL_BULK_DOWNGRADED = 15;
    ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY_DOWNGRADED = 16;
    ART_COMPILATION_REASON_BOOT_AFTER_OTA = 17;
    ART_COMPILATION_REASON_PREBUILT = 18;
    ART_COMPILATION_REASON_CMDLINE = 19;
    ART_COMPILATION_REASON_VDEX = 20;
}

// Indicates which kind of measurement ART is reporting.
//
// Where it makes sense, the datum ID ends with the type of datum (counter or histogram) and the
// units.
// Note: Histograms are not yet reported by statsd.
enum ArtDatumId {
    ART_DATUM_INVALID = 0;
    ART_DATUM_GC_WORLD_STOP_TIME_AVG_MICROS = 1;
    ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_TIME_HISTO_MILLIS = 2;
    ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_COUNT = 3;
    ART_DATUM_GC_FULL_HEAP_COLLECTION_TIME_HISTO_MILLIS = 4;
    ART_DATUM_GC_FULL_HEAP_COLLECTION_COUNT = 5;
    ART_DATUM_JIT_METHOD_COMPILE_TIME_MICROS = 6;
    ART_DATUM_AOT_COMPILE_TIME = 7;
    ART_DATUM_CLASS_VERIFICATION_TIME_COUNTER_MICROS = 8;
    ART_DATUM_CLASS_LOADING_TIME_COUNTER_MICROS = 9;

    // Metrics IDs for dex2oat.
    ART_DATUM_DEX2OAT_RESULT_CODE = 10;
    ART_DATUM_DEX2OAT_DEX_CODE_COUNTER_BYTES = 11;
    ART_DATUM_DEX2OAT_TOTAL_TIME_COUNTER_MILLIS = 12;
    ART_DATUM_DEX2OAT_VERIFY_DEX_FILE_TIME_COUNTER_MILLIS = 13;
    ART_DATUM_DEX2OAT_FAST_VERIFY_TIME_COUNTER_MILLIS = 14;
    ART_DATUM_DEX2OAT_RESOLVE_METHODS_AND_FIELDS_TIME_COUNTER_MILLIS = 15;

    ART_DATUM_CLASS_VERIFICATION_COUNT = 16;
    ART_DATUM_GC_TOTAL_BYTES_ALLOCATED = 17;
    ART_DATUM_GC_TOTAL_METADATA_SIZE_BYTES = 18 [deprecated=true];
    ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_THROUGHPUT_HISTO_MB_PER_SEC = 19;
    ART_DATUM_GC_FULL_HEAP_COLLECTION_THROUGHPUT_HISTO_MB_PER_SEC = 20;
    ART_DATUM_JIT_METHOD_COMPILE_COUNT = 21;
    ART_DATUM_GC_YOUNG_GENERATION_TRACING_THROUGHPUT_HISTO_MB_PER_SEC = 22;
    ART_DATUM_GC_FULL_HEAP_TRACING_THROUGHPUT_HISTO_MB_PER_SEC = 23;
    ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_THROUGHPUT_AVG_MB_PER_SEC = 24;
    ART_DATUM_GC_FULL_HEAP_COLLECTION_THROUGHPUT_AVG_MB_PER_SEC = 25;
    ART_DATUM_GC_YOUNG_GENERATION_TRACING_THROUGHPUT_AVG_MB_PER_SEC = 26;
    ART_DATUM_GC_FULL_HEAP_TRACING_THROUGHPUT_AVG_MB_PER_SEC = 27;
    ART_DATUM_GC_TOTAL_COLLECTION_TIME_MS = 28;
}

// Indicates what class of thread the reported values apply to.
enum ArtThreadType {
    ART_THREAD_UNKNOWN = 0;
    ART_THREAD_MAIN = 1;
    ART_THREAD_BACKGROUND = 2;
}

// Indicates the type of dex metadata.
enum ArtDexMetadataType {
  ART_DEX_METADATA_TYPE_UNKNOWN = 0;
  ART_DEX_METADATA_TYPE_PROFILE = 1;
  ART_DEX_METADATA_TYPE_VDEX = 2;
  ART_DEX_METADATA_TYPE_PROFILE_AND_VDEX = 3;
  ART_DEX_METADATA_TYPE_NONE = 4;
  ART_DEX_METADATA_TYPE_ERROR = 5;
}

// Indicates the type of the apk.
enum ArtApkType {
    ART_APK_TYPE_UNKNOWN = 0;
    ART_APK_TYPE_BASE = 1;
    ART_APK_TYPE_SPLIT = 2;
}

// Indicates the ISA.
enum ArtIsa {
    ART_ISA_UNKNOWN = 0;
    ART_ISA_ARM = 1;
    ART_ISA_ARM64 = 2;
    ART_ISA_X86 = 3;
    ART_ISA_X86_64 = 4;
    ART_ISA_MIPS = 5;
    ART_ISA_MIPS64 = 6;
}

message ArtDatumReported {
    // The session ID is used to correlate this report with others from the same ART instance.
    optional int64 session_id = 1;

    // The UID of the app that ART is running on behalf of.
    optional int32 uid = 2 [(is_uid) = true];

    // What compiler filter the APK or DEX file was compiled with.
    optional ArtCompileFilter compile_filter = 3;

    // Why the package was compiled the way it was.
    optional ArtCompilationReason compilation_reason = 4;

    // The number of milliseconds since the ART runtime instance was started.
    optional int64 timestamp_millis = 5;

    // What kind of thread (UI or background) this metric corresponds to.
    optional ArtThreadType thread_type = 6;

    // Which counter this is that is being reported.
    optional ArtDatumId kind = 7;

    // The value of the counter.
    optional int64 value = 8;

    // The type of dex metadata
    optional ArtDexMetadataType dex_metadata_type = 9;

    // The type of the APK file.
    optional ArtApkType apk_type = 10;

    // The ISA of the device.
    optional ArtIsa isa = 11;
}

/**
 * Logged when a SIM-specific settings restore was attempted.
 *
 * Logged from:
 *    packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java
 */
message SimSpecificSettingsRestored {
    optional android.telephony.SimSpecfifcSettingsRestoreResult result = 1;

    // Indicates which restore flow was followed.
    optional android.telephony.SimSpecificSettingsRestoreCase restored_from_suw = 2;

    // Indicates which criteria was used to match the inserted SIM to backed up
    // SIM. Only relevant when result is SUCCESS
    optional android.telephony.SimSpecificSettingsRestoreMatchingCriteria matching_criteria = 3;
}

/**
 * The latency of Binder calls broken down by calling API and method name.
 * This is different from BinderCalls as it collects a histogram of the
 * latencies (to get more detailed data) not just the count, sum, and maximum.
 *
 * Logged from:
 * frameworks/base/core/java/com/android/internal/os/BinderLatencyObserver.java
 */
message BinderLatencyReported {
    message Dims {
        enum ProcessSource {
            UNKNOWN_PROCESS_SOURCE = 0;
            SYSTEM_SERVER = 1;
            TELEPHONY = 2;
            BLUETOOTH = 3;
            WIFI = 4;
        }
        enum ServiceClassName {
            UNKNOWN_CLASS = 0;
        }
        enum ServiceMethodName {
            UNKNOWN_METHOD = 0;
        }

        // Required.
        optional ProcessSource process_source = 1;

        // The class name of the API making the call to Binder. Enum value
        // is preferred as uses much less data to store.
        // This field does not contain PII.
        oneof service_class {
            ServiceClassName service_class_name_as_enum = 2;
            string service_class_name = 3;
        }

        // Method name of the API call. It can also be a transaction code if we
        // cannot resolve it to a name. See Binder#getTransactionName. Enum value
        // is preferred as uses much less data to store.
        // This field does not contain PII.
        oneof service_method {
            ServiceMethodName service_method_name_as_enum = 4;
            string service_method_name = 5;
        }
    }

    message ApiStats {
        // required.
        optional Dims dims = 1;

        // Indicates the first bucket that had any data. Allows omitting any empty
        // buckets at the start of the bucket list and thus save on data size.
        optional int32 first_bucket_index = 2;
        // Stores the count of samples for each bucket. The number of buckets and
        // their sizes are controlled server side with a flag.
        repeated int32 buckets = 3;
    }

    message RepeatedApiStats {
        repeated ApiStats api_stats = 1;
    }

    // The binder latency data broken down by the dimensions specified above.
    // The message wrapper is used for the repeated field as top level repeated
    // fields are not allowed.
    // MODE_BYTES is used as nested messages are not allowed otherwise.
    // Required.
    optional RepeatedApiStats repeated_api_stats = 1 [(android.os.statsd.log_mode) = MODE_BYTES];

    // The fraction of samples that are recorded in the histogram.
    // Required.
    optional float sampling_rate = 2;

    // Indicates how many shards the APIs are divided in - e.g. for 3 every
    // 3rd API will be included in the data for this shard.
    // Required.
    optional int32 sharding_modulo = 3;

    // Params for histogram buckets.
    // The number of buckets the histogram should have.
    optional int32 bucket_count = 4;

    // The size (upper bound) of the first bucket (used to avoid creating an
    // excessive amount of small buckets). E.g. for first_bucket_size of 5, the
    // first bucket will be [0, 5) and the second will be [5, 5 * scaleFactor).
    optional int32 first_bucket_size = 5;

    // The rate in which each consecutive bucket increases (before rounding).
    // Implemented in: com.android.internal.os.BinderLatencyBuckets.
    optional float scale_factor = 6;
}

/**
 * Log audio device types that are used for input/output.
 * Next Tag: 2
 */
message AudioDevice {
    // See audio_devices_t in system/media/audio/include/system/audio-hal-enums.h
    repeated int32 type = 1;
}

/**
 * Track information about AAudio Stream
 * Logged from
 *   frameworks/av/services/mediametrics/AudioAnalytics.cpp
 */
message MediametricsAAudioStreamReported {
    // The implementation of aaudio.
    enum CallerPath {
        CALLER_PATH_UNKNOWN = 0;
        CALLER_PATH_LEGACY = 1;
        CALLER_PATH_MMAP = 2;
    }
    optional CallerPath path = 1;

    // The direction of the stream.
    // See aaudio_direction_t in frameworks/av/media/libaaudio/include/aaudio/AAudio.h
    // The Direction values are different from aaudio_direction_t to avoid having 0 at the first
    // value since first value will be used as default value.
    // See lookup<AAUDIO_DIRECTION> in frameworks/av/services/mediametrics/AudioTypes.cpp
    // for conversion from aaudio_direction_t to Direction.
    enum Direction {
        // The direction is unknown.
        DIRECTION_UNKNOWN = 0;
        // Audio data will travel out of the device.
        DIRECTION_OUTPUT = 1;
        // Audio data will travel into the device.
        DIRECTION_INPUT = 2;
    }
    optional Direction direction = 2;

    // The amount read or written in one shot by the Mixer or DSP.
    optional int32 frames_per_burst = 3;
    // The number of frames that the buffer is used.
    optional int32 buffer_size = 4;
    // The allocated number of frames for the buffer.
    optional int32 buffer_capacity = 5;
    // The channel count of the aaudio stream.
    optional int32 channel_count = 6;
    // Total frames transferred (written or read)
    optional int64 total_frames_transferred = 7;

    // The performance mode.
    // See aaudio_performance_mode_t in frameworks/av/media/libaaudio/include/aaudio/AAudio.h
    enum PerformanceMode {
        // The performance mode is unknown.
        PERFORMANCE_MODE_UNKNOWN = 0;
        // No particular performance mode needs. Default.
        PERFORMANCE_MODE_NONE = 10;
        // Extending battery life is more important than low latency.
        PERFORMANCE_MODE_POWER_SAVING = 11;
        // Reducing latency is more important than battery life.
        PERFORMANCE_MODE_LOW_LATENCY = 12;
    }
    // The performance mode requested by the applications.
    optional PerformanceMode perf_mode_requested = 8;
    // The actual performance mode used by aaudio.
    optional PerformanceMode perf_mode_actual = 9;

    // The mode requested for sharing the device
    // See aaudio_sharing_mode_t in frameworks/av/media/libaaudio/include/aaudio/AAudio.h
    // The SharingMode values are different from aaudio_direction_t to avoid having 0 at the first
    // value since first value will be used as default value.
    // See lookup<AAUDIO_SHARING_MODE> in frameworks/av/services/mediametrics/AudioTypes.cpp
    // for conversion from aaudio_sharing_mode_t to SharingMode.
    enum SharingMode {
        // The sharing mode is unknown
        SHARING_MODE_UNKNOWN = 0;
        // This will be the only stream using a particular source or sink.
        SHARING_MODE_EXCLUSIVE = 1;
        // Multiple application will be mixed by the AAudio server.
        SHARING_MODE_SHARED = 2;
    }
    optional SharingMode sharing = 10;

    // Approximate number of glitches.
    // Underrun on output stream. Overrun on input stream.
    optional int32 xrun_count = 11;
    // Devices that are used by the aaudio stream.
    optional AudioDevice types = 12 [(log_mode) = MODE_BYTES];

    // Format request by the applications
    optional int32 format_app = 13;
    // Format processed by the framework
    optional int32 format_device = 14;

    // Android S metric log session id, a Base64Url encoded string representing a 128-bit integer.
    optional string log_session_id = 15;

    // The sample rate of the aaudio stream.
    optional int32 sample_rate = 16;

    // The content type of the aaudio stream.
    // An enumeration from system/media/audio/include/system/audio-hal-enums.h audio_content_type_t
    enum ContentType {
        CONTENT_TYPE_UNKNOWN = 0;
        CONTENT_TYPE_SPEECH = 1;
        CONTENT_TYPE_MUSIC = 2;
        CONTENT_TYPE_MOVIE = 3;
        CONTENT_TYPE_SONIFICATION = 4;
        CONTENT_TYPE_INVALID = -1;
    }
    optional ContentType content_type = 17;

    // The mode of sharing the device requested by the client.
    optional SharingMode sharing_requested = 18;
}

/**
 * Logs media transcoding session ended events.
 *
 * Logged from:
 *   frameworks/av/media/libmediatranscoding/TranscoderWrapper.cpp
 */
message MediaTranscodingSessionEnded {

    enum Reason {
        UNKNOWN = 0;       // Unused.
        FINISHED = 1;      // Transcoding session finished successfully.
        ERROR = 2;         // Transcoding session returned error while running.
        PAUSED = 3;        // Transcoding session was paused, potentially failed.
        CANCELLED = 4;     // Transcoding session was cancelled.
        START_FAILED = 5;  // Transcoding session failed to start.
        RESUME_FAILED = 6; // Transcoding session failed to resume.
        CREATE_FAILED = 7; // Transcoder instance failed to crate.
        CONFIG_SRC_FAILED = 8;    // Configure source failed.
        CONFIG_DST_FAILED = 9;    // Configure destination failed.
        CONFIG_TRACK_FAILED = 10; // Configure track failed.
        OPEN_SRC_FD_FAILED = 11;  // Open source fd failed.
        OPEN_DST_FD_FAILED = 12;  // Open destination fd failed.
        NO_TRACKS = 13;  // No tracks in source file.
    }

    // Reason for logging the atom.
    optional Reason reason = 1;

    // UID of client connecting to media transcoding service.
    optional int32 calling_uid = 2 [(is_uid) = true];

    // Transcode session status flag (media_status_t).
    optional int32 transcode_status = 3;

    // Transcode speed as framerate, if status is success.
    optional int32 transcode_fps = 4;

    // Source video dimensions.
    optional int32 src_width = 5;
    optional int32 src_height = 6;

    // Source video codec information.
    optional string src_codec_type = 7;
    optional int32 src_profile = 8;
    optional int32 src_level = 9;

    // Source video framerate.
    optional int32 src_fps = 10;

    // Source video duration.
    optional int32 src_duration_millis = 11;

    // Whether source video is HDR.
    optional bool src_is_hdr = 12;

    // Destination video dimensions.
    optional int32 dst_width = 13;
    optional int32 dst_height = 14;

    // Destination video codec information.
    optional string dst_codec_type = 15;

    // Whether destination video is HDR.
    optional bool dst_is_hdr = 16;
}

/** Logs information about an unattended reboot that took place. This is logged
 *  after the next boot, when the device is first unlocked.
 *
 * Logged from:
 *   packages/modules/Scheduling/service/java/com/android/server/RebootReadinessLogger.java
 */
message UnattendedRebootOccurred {

    // Time between the reboot readiness state checks starting, and the device
    // becoming reboot-ready.
    optional int64 time_until_reboot_ready_millis= 1;

    // Time taken for the device to be unlocked (i.e. for the keyguard to be
    // gone) after an unattended reboot took place.
    optional int64 time_until_first_unlock_millis = 2;

    // Number of times the reboot was blocked by the device being interactive.
    optional int32 times_blocked_by_interactivity = 3;

    // Number of times the reboot was blocked by a callback registered by a
    // subsystem or a privileged app.
    optional int32 times_blocked_by_subsystems = 4;

    // Number of times the reboot was blocked by background app activity.
    optional int32 times_blocked_by_app_activity = 5;

    // Time until next user interaction with the device.
    optional int64 time_until_next_interaction_ms = 6;
}


/**
 * Logs information about an app uid or registered system component that has
 * been blocking the device from being reboot-ready for a long time.
 *
 * Logged from:
 *   packages/modules/Scheduling/service/java/com/android/server/RebootReadinessLogger.java
 */
message LongRebootBlockingReported {

    enum RebootBlockReason {
        SYSTEM_COMPONENT = 1;
        APP_UID = 2;
    }

    // The reason why the reboot has been blocked. This is either a system
    // component that has registered a callback, or an app UID running in the
    // background.
    optional RebootBlockReason reboot_block_reason = 1;

    // Only one of the following two fields should be set, depending on the
    // RebootBlockReason.

    // The name supplied by a system component when it registered a callback
    // to block the reboot.
    optional string component_name = 2;

    // The uid of an app that is running in the background.
    optional int32 uid = 3;
}

/**
 * Logs the magnification activated mode and its duration of the usage
 * when the magnification is disabled.
 *
 * Logged from:
 *   frameworks/base/services/accessibility/java/com/android/server/accessibility
 */
message MagnificationUsageReported {
    // The definition of the magnification mode.
    // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.MagnificationMode activated_mode = 1;

    // The duration of this magnification mode activation in milliseconds
    optional int64 duration_millis = 2;
}

/**
 * Logs the magnification activated mode when IME dialog shows on the screen.
 *
 * Logged from:
 *   frameworks/base/services/accessibility/java/com/android/server/accessibility
 */
message MagnificationModeWithImeOnReported {
    // The definition of the magnification mode.
    // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto.
    optional android.stats.accessibility.MagnificationMode activated_mode = 1;
}

/**
 * Logs the duration for the magnification session which is activated by the triple tap and
 * hold gesture.
 *
 * Logged from:
 *   frameworks/base/services/accessibility/java/com/android/server/accessibility
 */
message MagnificationTripleTapAndHoldActivatedSessionReported {
    // The duration of the triple tap and hold activated session in milliseconds
    optional int64 duration_millis = 1;
}

/**
 * Logs the duration for the following typing focus activated session.
 *
 * Logged from:
 *   frameworks/base/services/accessibility/java/com/android/server/accessibility
 */
message MagnificationFollowTypingFocusActivatedSessionReported {
    // The duration of the following typing focus activated session in milliseconds
    optional int64 duration_millis = 1;
}

/*
 * Reports a device controls user interaction
 *
 * Logged from:
 *   frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ControlsMetricsLoggerImpl.kt
 */
message DeviceControlChanged {
    // The event_id
    optional int32 event_id = 1;
    // An identifier to tie together multiple logs relating to the same controls session
    optional int32 instance_id = 2;
    // The type of device the user has interacted with (android.service.controls.DeviceTypes)
    optional int32 device_type = 3;
    // The service app uid.
    optional int32 uid = 4 [(is_uid) = true];
    // Is the device locked while the action started
    optional bool is_locked = 5;
}

/*
 * Logged when hardware based user-configurable device state changes.
 *
 * Logged from:
 *     frameworks/base/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java
 */
message DeviceStateChanged {
    optional int32 new_device_state = 1
            [(state_field_option).exclusive_state = true, (state_field_option).nested = false];
    optional bool boot_state = 2;
}

/*
 * Logged when device folded state changes.
 *
 * Logged from:
 *     frameworks/base/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLogger.kt
 */
message FoldStateDurationReported {
    enum State {
      UNKNOWN = 0;
      OPEN = 1;
      CLOSED = 2;
      HALF_OPEN = 3;
    }

    optional State start_state = 1;
    optional State end_state = 2;
    optional int64 duration_millis = 3;
}

/**
 * This metric is collected at the end of playback
 * as a pulled atom.
 *
 *   DrmHal::cleanup() {
 *     // ...
 *     reportFrameworkMetrics(reportPluginMetrics());
 *     // ...
 *   }
 * This proto should be kept in-sync with
 * frameworks/av/drm/libmediadrm/protos/metrics.proto.
 */
message DrmFrameworkMetrics {

    // Attributes are associated with a recorded value. E.g. A counter may
    // represent a count of an operation returning a specific error code. The
    // error code will be an attribute.
    message Attributes {
        // Reserved for compatibility with logging proto.
        reserved 2 to 13;

        // A general purpose error code where 0 means OK.
        optional int32 error_code = 1;

        // Defined at ::android::hardware::drm::V1_0::KeyStatusType;
        optional uint32 key_status_type = 14;

        // Defined at ::android::hardware::drm::V1_0::EventType;
        optional uint32 event_type = 15;
    }

    // The Counter message is used to store a count value with an associated
    // Attribute.
    message Counter {
        optional uint64 count = 1;
        // Represents the attributes associated with this counter instance.
        optional Attributes attributes = 2;
    }

    // The DistributionMetric is meant to capture the moments of a normally
    // distributed (or approximately normal) value.
    message DistributionMetric {
        optional float min = 1;
        optional float max = 2;
        optional float mean = 3;
        optional double variance = 4;
        optional uint64 operation_count = 5;

        // Represents the attributes associated with this distribution metric
        // instance.
        optional Attributes attributes = 6;
    }

    message SessionLifetime {
        // Start time of the session in milliseconds since epoch.
        optional uint64 start_time_millis = 1;
        // End time of the session in milliseconds since epoch.
        optional uint64 end_time_millis = 2;
    }

    // The count of open session operations. Each instance has a specific error
    // code associated with it.
    repeated Counter open_session_counter = 1;

    // The count of close session operations. Each instance has a specific error
    // code associated with it.
    repeated Counter close_session_counter = 2;

    // Count and execution time of getKeyRequest calls.
    repeated DistributionMetric get_key_request_time_us = 3;

    // Count and execution time of provideKeyResponse calls.
    repeated DistributionMetric provide_key_response_time_us = 4;

    // Count of getProvisionRequest calls.
    repeated Counter get_provisioning_request_counter = 5;

    // Count of provideProvisionResponse calls.
    repeated Counter provide_provisioning_response_counter = 6;

    // Count of key status events broken out by status type.
    repeated Counter key_status_change_counter = 7;

    // Count of events broken out by event type
    repeated Counter event_callback_counter = 8;

    // Count getPropertyByteArray calls to retrieve the device unique id.
    repeated Counter get_device_unique_id_counter = 9;

    message SessionLifetimeEntry {
        optional string session_id = 1;
        optional SessionLifetime session_lifetime = 2;
    }
    // Session ids to lifetime (start and end time) map.
    // Session ids are strings of hex-encoded byte arrays.
    // This field is equivalent to the map<string, SessionLifetime>
    // field in frameworks/av/drm/libmediadrm/protos/metrics.proto.
    repeated SessionLifetimeEntry session_lifetimes = 10;
}

/**
 * The metric is collected at the end of playback
 * as a pulled atom MediaDrmActivityInfo.
 *
 * The framework_metrics is defined in
 * frameworks/av/drm/libmediadrm/protos/metrics.proto.
 *
 * The format of vendor_metrics is  MediaDrm plugin dependent.
 *
 *   DrmHal::cleanup() {
 *     // ...
 *     reportFrameworkMetrics(reportPluginMetrics());
 *     // ...
 *   }
 *
 * This pulled atom is then collected in
 * frameworks/av/services/mediametrics/MediaMetricsService.cpp.
 */
message MediaDrmActivityInfo {
    optional string package_name = 1;
    optional int64 package_version_code = 2;

    // vendor+description tell about which DRM plugin is in use on this device
    optional string vendor = 3;
    optional string description = 4;

    optional DrmFrameworkMetrics framework_metrics = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
    optional bytes vendor_metrics = 6 [(android.os.statsd.log_mode) = MODE_BYTES];
}

/*
 * A canonical form time zone suggestion for metrics use.
 */
message MetricsTimeZoneSuggestion {
    enum Type {
        UNKNOWN = 0;
        CERTAIN = 1;
        UNCERTAIN = 2;
    }
    optional Type type = 1;

    // The ordinals for time zone(s) in the suggestion. Always empty for
    // UNCERTAIN, and can be empty for CERTAIN, for example when the device is in
    // a disputed area / on an ocean.
    //
    // The suggestion's time zone IDs (which relate to location) are obfuscated by
    // mapping them to an ordinal. When the ordinal is assigned consistently across
    // several objects (i.e. so the same time zone ID is always mapped to the same
    // ordinal), this allows comparisons between those objects. For example, we can
    // answer "did these two suggestions agree?", "does the suggestion match the
    // device's current time zone?", without leaking knowledge of location. Ordinals
    // are also significantly more compact than full IANA TZDB IDs, albeit unstable
    // and of limited use.
    repeated int32 time_zone_ordinals = 2;

    // The actual time zone ID(s) in the suggestion. Similar to time_zone_ordinals
    // but contains the actual string IDs.
    //
    // This information is only captured / reported for some devices based on the
    // value of a server side flag, i.e. it could be enabled for internal testers.
    // Therefore the list can be empty even when time_zone_ordinals is populated.
    //
    // When enabled, see time_zone_ordinals for the expected number of values.
    repeated string time_zone_ids = 3;
}

/*
 * Logs a snapshot of time zone detector state.
 *
 * Logged from:
 * frameworks/base/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
 */
message TimeZoneDetectorState {

    // True if telephony-based time zone detection is supported on the device.
    optional bool telephony_supported = 1;

    // True if geo-based time zone detection is supported on the device.
    optional bool geo_supported = 2;

    // The current user's master location setting value.
    optional bool location_enabled = 3;

    // The current user's auto time zone detection enabled setting value.
    optional bool auto_detection_setting = 4;

    // The current user's geo detection enabled setting.
    optional bool geo_detection_setting = 5;

    enum DetectionMode {
        UNKNOWN = 0;
        MANUAL = 1;
        TELEPHONY = 2;
        GEO = 3;
    }

    // The functional / behavioral state for how time zones are currently determined on the device.
    // Avoids needing to duplicate the logic used.
    optional DetectionMode detection_mode = 6;

    // The device's current time zone ordinal (see MetricsTimeZoneSuggestion).
    optional int32 device_time_zone_ordinal = 7;

    // The latest suggestion received from the user, e.g. via SettingsUI (non-persistent).
    optional MetricsTimeZoneSuggestion latest_manual_suggestion = 8
            [(log_mode) = MODE_BYTES];

    // The latest telephony-derived suggestion (non-persistent).
    optional MetricsTimeZoneSuggestion latest_telephony_suggestion = 9
            [(log_mode) = MODE_BYTES];

    // The latest geo-derived suggestion (non-persistent).
    optional MetricsTimeZoneSuggestion latest_geo_suggestion = 10
            [(log_mode) = MODE_BYTES];

    // True if fallback to telephony time zone detection is supported on the device.
    optional bool telephony_time_zone_fallback_supported = 11;

    // The device's current time zone ID (see MetricsTimeZoneSuggestion).
    optional string device_time_zone_id = 12;

    // True if enhanced metrics collection is enabled.
    optional bool enhanced_metrics_collection_enabled = 13;

    // True if the device may run geolocation time zone detection in the
    // background. This is the raw server flag value, not the value after
    // considering other state like the user's "use location" setting that also
    // affects runtime behavior. See LocationTimeZoneProviderController for
    // details.
    optional bool geo_detection_run_in_background_enabled = 14;
}

/*
 * Logs information about an individual location time zone provider's state.
 *
 * Logged from:
 * frameworks/base/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java
 */
message LocationTimeZoneProviderStateChanged {
    // The index of the provider (primary = 0, secondary = 1)
    optional int32 provider_index = 1 [(state_field_option).primary_field = true];

    enum State {
        // A placeholder for unknown values.
        UNKNOWN = 0;

        // The provider is initializing.
        INITIALIZING = 1;

        // The provider is certain of the time zone.
        CERTAIN = 2;

        // The provider is uncertain of the time zone.
        UNCERTAIN = 3;

        // The provider has been stopped.
        STOPPED = 4;

        // The provider has failed.
        PERM_FAILED = 5;

        // The provider has been destroyed.
        DESTROYED = 6;
    }

    // The state of the provider.
    optional State state = 2 [(state_field_option).exclusive_state = true];
}

/*
 * Logs information about the location time zone provider controller's state.
 *
 * Logged from:
 * frameworks/base/services/core/java/com/android/server/timezonedetector/location/RealControllerMetricsLogger.java
 */
message LocationTimeZoneProviderControllerStateChanged {

    enum State {
        // A placeholder for unknown values.
        UNKNOWN = 0;

        // The providers are initializing.
        PROVIDERS_INITIALIZING = 1;

        // The controller is / has been stopped.
        STOPPED = 2;

        // The controller is started and is initializing.
        INITIALIZING = 3;

        // The controller is started and is certain of the time zone.
        CERTAIN = 4;

        // The controller is started and is uncertain of the time zone.
        UNCERTAIN = 5;

        // The controller has been destroyed.
        DESTROYED = 6;

        // The controller has failed.
        FAILED = 7;
    }

    // The state of the provider.
    optional State state = 1;
}

/*
 * Reports fdtrack state change.
 *
 * Logged from:
 *   frameworks/base/services/java/com/android/server/SystemServer.java
 */
message FdtrackEventOccurred {
    enum FdtrackEventType {
      DISABLED = 1;
      ENABLED = 2;

      // Aborting because we're above the abort threshold.
      ABORTING = 3;
    }

    optional FdtrackEventType event = 1;
    optional int32 fd_count = 2;
}

/**
 * Pushed when delivering a batch of alarms.
 *
 * Logged from:
 * frameworks/base/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
 */
message AlarmBatchDelivered {
    optional int32 num_alarms = 1;
    optional int32 wakeups = 2;
}

/**
 * Pushed when an app schedules an alarm.
 *
 * Logged from:
 * frameworks/base/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
 */
message AlarmScheduled {
    optional int32 calling_uid = 1 [(is_uid) = true];

    optional bool is_exact = 2;
    optional bool is_wakeup = 3;
    optional bool is_allow_while_idle = 4;
    optional bool is_alarm_clock = 5;
    optional bool is_repeating = 6;

    enum ReasonCode {
        NOT_APPLICABLE = 0;
        PERMISSION = 1;
        ALLOW_LIST = 2;
        CHANGE_DISABLED = 3;
        POLICY_PERMISSION = 4;
    }
    optional ReasonCode exact_alarm_allowed_reason = 7;
    optional bool is_rtc = 8;
    // The state of the callingUid, from frameworks/proto_logging/stats/enums/app/enums.proto.
    optional android.app.ProcessStateEnum calling_process_state = 9;
}

/**
 * Logs statistics about pending alarms.
 *
 * Pulled from:
 * frameworks/base/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
 */
message PendingAlarmInfo {
    optional int32 num_total = 1;
    optional int32 num_exact = 2;
    optional int32 num_wakeup = 3;
    optional int32 num_allow_while_idle = 4;
    optional int32 num_prioritized = 5;
    optional int32 num_foreground_service = 6;
    optional int32 num_activity = 7;
    optional int32 num_service = 8;
    optional int32 num_listener = 9;
    optional int32 num_indefinite_future = 10;
    optional int32 num_repeating = 11;
    optional int32 num_alarm_clock = 12;
    optional int32 num_rtc = 13;
}

/*
 * Logs information about on-device refresh of ART AOT artifacts for boot classpath extensions
 * and system_server.
 *
 * Logged from:
 *   art/odrefresh/odrefresh.cc
 */
message OdrefreshReported {
    optional int64 art_apex_version = 1;

    enum Trigger {
        // A placeholder for unknown values.
        TRIGGER_UNKNOWN = 0;

        // ART apex version has changed since time artifacts were generated.
        TRIGGER_APEX_VERSION_MISMATCH = 1;

        // Dex files on the boot classpath or system_server classpath have changed.
        TRIGGER_DEX_FILES_CHANGED = 2;

        // Missing artifacts.
        TRIGGER_MISSING_ARTIFACTS = 3;
    }

    optional Trigger trigger = 2;

    enum Stage {
        // A placeholder for unknown values.
        STAGE_UNKNOWN = 0;

        // Checking stage.
        STAGE_CHECK = 10;

        // Preparation for compilation.
        STAGE_PREPARATION = 20;

        // Compilation of primary boot classpath extensions.
        STAGE_PRIMARY_BOOT_CLASSPATH = 30;

        // Compilation of secondary boot classpath extensions.
        STAGE_SECONDARY_BOOT_CLASSPATH = 40;

        // Compilation of system_server classpath.
        STAGE_SYSTEM_SERVER_CLASSPATH = 50;

        // All stages completed.
        STAGE_COMPLETE = 60;
    }

    optional Stage stage_reached = 3;

    enum Status {
        // A placeholder for unknown values.
        STATUS_UNKNOWN = 0;

        // OK, no problems encountered.
        STATUS_OK = 1;

        // Insufficient space.
        STATUS_NO_SPACE = 2;

        // Storage operation failed.
        STATUS_IO_ERROR = 3;

        // Dex2oat reported an error.
        STATUS_DEX2OAT_ERROR = 4;

        // Time limit exceeded.
        STATUS_TIME_LIMIT_EXCEEDED = 5;

        // Failure creating staging area.
        STATUS_STAGING_FAILED = 6;

        // Installation of artifacts failed.
        STATUS_INSTALL_FAILED = 7;
    }

    optional Status status = 4;

    // Compilation time iof primary boot classpath extensions.
    optional int32 primary_bcp_compilation_seconds = 5;

    // Compilation time of secondary boot classpath extensions.
    optional int32 secondary_bcp_compilation_seconds = 6;

    // Compilation time of system_server classpath.
    optional int32 system_server_compilation_seconds = 7;

    // Cache space at start of update.
    optional int32 cache_space_free_start_mib = 8;

    // Cache space at end of update.
    optional int32 cache_space_free_end_mib = 9;
};

/*
 * Logged when a package's user-level hibernation state changes.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/apphibernation/AppHibernationService.java
 */
 message UserLevelHibernationStateChanged {
    // Name of the package that had its hibernation state change.
    optional string package_name = 1;

    // Android user id to which this event belongs. This can only be 0, 10, 11 and so on.
    optional int32 user_id = 2;

    // New hibernation state. True if hibernating, false otherwise
    optional bool is_hibernating = 3;
}

/*
 * Pull atom for the number of hibernated packages on the device for the given user.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/apphibernation/AppHibernationService.java
 */
message UserLevelHibernatedApps {
    // Total number of apps hibernated for the user
    optional int32 hibernated_app_count = 1;

    // Android user id of the queried user which can only be 0, 10, 11 and so on.
    optional int32 user_id = 2;
}

/**
 * Pull atom for total number of globally hibernated packages on the device and the storage savings
 * from these apps being hibernated.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/apphibernation/AppHibernationService.java
 */
message GlobalHibernatedApps {
    // Total number of apps in global hibernation
    optional int32 hibernated_app_count = 1;

    // Cumulative storage savings from apps being hibernated
    optional int64 storage_saved_mb = 2;
}

/*
 * Report the event of app process kills.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/AppExitInfoTracker.java
 */
message AppProcessDied {
    // Uid of the package of the dying process
    optional int32 uid = 1 [(is_uid) = true];

    // Name of the dying process, it'll be omitted if the process name and package name are the same
    optional string process_name = 2;

    // The reason code of why the process dies
    optional android.app.AppExitReasonCode reason = 3;

    // The supplemental reason code of why the process dies
    optional android.app.AppExitSubReasonCode sub_reason = 4;

    // The importance of the process when it dies
    optional android.app.Importance importance = 5;

    // The last known PSS (in kB) of the process before it dies, could be 0.
    optional int32 pss = 6;

    // The last known RSS (in kB) of the process before it dies, could be 0.
    optional int32 rss = 7;

    // Whether or not this process is hosting one or more foregound services.
    optional bool has_foreground_services = 8;
}

/**
 * Logs input event statistics.
 * Pulls the statistics.
 *
 * Logged from:
 *   frameworks/native/services/inputflinger
 */
message InputEventLatencySketch {
    /**
     * The 'bytes' field is the serialized KLL sketch. It is to be deserialized into an object of
     * KLL proto, which would then be converted into a KLL sketch. The KLL sketch is a histogram
     * of the data.
     *
     * The goal of this data is to identify the bottlenecks in processing of input events.
     * All sketches measure durations in a streaming fashion.
     * The units are "hundreds of microseconds", or 0.1 ms. They are chosen like this in order
     * to reduce the occupied space.
     * The start and end points for each value are described in the comments.
     *
     * We distinguish between 'DOWN' event latency (when the pointer first goes down), and 'MOVE'
     * event latency, which characterizes the scrolling experience.
     */

    // -------------------------- DOWN event sketches ------ START ---------------------------------
    // Start: the input event was created (touch events: the touch interrupt received in the driver)
    // End: the event was read in userspace (in EventHub)
    optional bytes event_to_read_100micros_down_sketch = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the event was read in EventHub
    // End: the event was send to the app via the InputChannel (written to the socket)
    optional bytes read_to_deliver_100micros_down_sketch = 2 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the input event was sent to the app
    // End: the app consumed the input event
    optional bytes deliver_to_consume_100micros_down_sketch = 3 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the app consumed the event
    // End: the app's 'finishInputEvent' call was received in inputflinger
    // The end point can also be called "the app finished processing input event"
    optional bytes consume_to_finish_100micros_down_sketch = 4 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the app consumed the input event
    // End: the app produced a buffer
    optional bytes consume_to_gpu_complete_100micros_down_sketch = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the app produced a buffer
    // End: the frame was shown on the display
    optional bytes gpu_complete_to_present_100micros_down_sketch = 6 [(android.os.statsd.log_mode) = MODE_BYTES];
    // The end-to-end touch latency
    // Start: the input event was created (touch events: the touch interrupt received in the driver)
    // End: the frame was presented on the display
    optional bytes end_to_end_100micros_down_sketch = 7 [(android.os.statsd.log_mode) = MODE_BYTES];
    // -------------------------- DOWN event sketches ------ END -----------------------------------

    // -------------------------- MOVE event sketches ------ START ---------------------------------
    // Start: the input event was created (touch events: the touch interrupt received in the driver)
    // End: the event was read in userspace (in EventHub)
    optional bytes event_to_read_100micros_move_sketch = 8 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the event was read in EventHub
    // End: the event was send to the app via the InputChannel (written to the socket)
    optional bytes read_to_deliver_100micros_move_sketch = 9 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the input event was sent to the app
    // End: the app consumed the input event
    optional bytes deliver_to_consume_100micros_move_sketch = 10 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the app consumed the event
    // End: the app's 'finishInputEvent' call was received in inputflinger
    // The end point can also be called "the app finished processing input event"
    optional bytes consume_to_finish_100micros_move_sketch = 11 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the app consumed the input event
    // End: the app produced a buffer
    optional bytes consume_to_gpu_complete_100micros_move_sketch = 12 [(android.os.statsd.log_mode) = MODE_BYTES];
    // Start: the app produced a buffer
    // End: the frame was shown on the display
    optional bytes gpu_complete_to_present_100micros_move_sketch = 13 [(android.os.statsd.log_mode) = MODE_BYTES];
    // The end-to-end touch latency
    // Start: the input event was created (touch events: the touch interrupt received in the driver)
    // End: the frame was presented on the display
    optional bytes end_to_end_100micros_move_sketch = 14 [(android.os.statsd.log_mode) = MODE_BYTES];
    // -------------------------- MOVE event sketches ------ END -----------------------------------
}

// Each pull creates multiple atoms. One for each incremental package.
message InstalledIncrementalPackage {
    optional int32 uid = 1 [(is_uid) = true];
}

/**
 * Memory management statistics pulled atom based on /proc/vmstat.
 * Logged from StatsPullAtomService.
 */
message VmStat {
    optional int32 oom_kill_count = 1;
}

/**
* Log that the user has interacted with an app on the permission usage
* fragment.
* Logged from permission/debug/PermissionUsageV2Frament.kt
*/
message PermissionUsageFragmentInteraction {
    // id which identifies single session of user interacting with permission hub
    optional int64 session_id = 1;

    enum Action {
        UNDEFINED = 0;
        OPEN = 1;
        LOCATION_ACCESS_TIMELINE_VIEWED = 2;
        CAMERA_ACCESS_TIMELINE_VIEWED = 3;
        MICROPHONE_ACCESS_TIMELINE_VIEWED = 4;
        SHOW_SYSTEM_CLICKED = 5;
        SEE_OTHER_PERMISSIONS_CLICKED = 6;
    }

    // The action the user took to interact with the fragment
    optional Action action = 2;
}

/**
* Log that the user has clicked on .
* Logged from permission/debug/PermissionDetailsFragment.kt
*/
message PermissionDetailsInteraction {
    // id which identifies single session of user interacting with permission details fragment.
    optional int64 session_id = 1;

    // The name of a permission group whose details are viewed.
    optional string permission_group_name = 2;

    enum Action {
        UNDEFINED = 0;
        SHOW_SYSTEM_CLICKED = 1;
        INFO_ICON_CLICKED = 2;
    }

    // Package name for which the info icon was clicked.
    optional string package_name = 3;

    // The action the user took to interact with the fragment
    optional Action action = 4;
}

/**
* Log that the user has toggled the sensor privacy.
*/
message PrivacySensorToggleInteraction {

    enum Sensor {
        SENSOR_UNKNOWN = 0;
        MICROPHONE = 1;
        CAMERA = 2;
    }

    // Sensor for which sensor privacy was toggled.
    optional Sensor sensor = 1;

    enum Action {
        ACTION_UNKNOWN = 0;
        TOGGLE_ON = 1;
        TOGGLE_OFF = 2;
    }

    // Action taken on sensor.
    optional Action action = 2;

    enum Source {
        SOURCE_UNKNOWN = 0;
        DIALOG = 1;
        SETTINGS = 2;
        QS_TILE = 3;
    }

    // Source for the toggling.
    optional Source source = 3;

    // Amount of time a user spent in the previous sensor privacy state in minutes.
    optional int64 time_in_previous_state_in_mins = 4;
}

message PrivacyToggleDialogInteraction {

    enum Action {
        ACTION_UNKNOWN = 0;
        ENABLE = 1;
        CANCEL = 2;
    }

    // Action taken on the toggle dialog.
    optional Action action = 1;

    // Name of the package for which the dialog was shown.
    optional string package_name = 2;
}

message VendorApexInfo {
  optional string package_name = 1;
  optional string version_code = 2;
  optional string version_name = 3;
  optional string source_dir = 4;
  optional string signing_certs_hash = 5;
  optional string file_hash = 6;
}

/**
 * Logs the non-a11yTool service warning status and its duration of the usage.
 *
 * Logged from:
 *   frameworks/base/services/accessibility/java/com/android/server/accessibility
 *   packages/apps/Settings
 */
message NonA11yToolServiceWarningReported {
    // Package name of the non-a11yTool service.
    optional string package_name = 1;

    // Warning status of the non-a11yTool service.
    optional android.stats.accessibility.WarningStatus status = 2;

    // Duration between status in milliseconds.
    optional int64 duration_millis = 3;
}

message MediaCapabilities {
    message AudioEncodings {
        repeated android.stats.mediametrics.AudioEncoding audio_encodings = 1;
    }

    message HdrFormats {
        repeated android.stats.mediametrics.HdrFormat hdr_formats = 1;
    }


    message DisplayMode {
        optional int32 height = 1;
        optional int32 width = 2;
        optional float refresh_rate = 3;
        optional int32 seamless_refresh_rates_group_id = 4;
    }

    message DisplayModes {
        repeated DisplayMode display_modes = 1;
    }

    // Surround sound capabilities

    // List of surround sound encodings supported by this device
    optional AudioEncodings surround_encodings = 1 [(log_mode) = MODE_BYTES];
    // List of surround sound encodings supported by the sink device
    optional AudioEncodings sink_surround_encodings = 2 [(log_mode) = MODE_BYTES];
    // List of supported surround sound encodings disabled by user
    optional AudioEncodings user_disabled_surround_encodings = 3 [(log_mode) = MODE_BYTES];
    // List of unsupported surround sound encodings enabled by user
    optional AudioEncodings user_enabled_surround_encodings = 4 [(log_mode) = MODE_BYTES];
     // The surround sound output mode chosen by user
    optional android.stats.mediametrics.EncodedSurroundOutputMode surround_output_mode = 5;


    // Display capabilities

    // List of HDR display formats supported by the sink device
    optional HdrFormats sink_hdr_formats = 6 [(log_mode) = MODE_BYTES];
    // List of modes supported by the sink device. Each mode has height, width, refresh rate and a list
    // of refresh-rates between which a seamless switch is possible.
    optional DisplayModes sink_display_modes = 7 [(log_mode) = MODE_BYTES];
    // The HDCP level with which the display is connected
    optional int32 hdcp_level = 8;

    // Display settings

    // The Match content refresh rate user preference
    optional android.stats.mediametrics.MatchContentFrameRatePreference
                match_content_refresh_rate_preference = 9;
    // List of HDR formats disabled by the user
    optional HdrFormats user_disabled_hdr_formats = 10 [(log_mode) = MODE_BYTES];
    // The resolution height selected by the user
    optional int32 user_preferred_resolution_height = 11;
    // The resolution width selected by the user
    optional int32 user_preferred_resolution_width = 12;
    // The refresh rate selected by the user
    optional float user_preferred_refresh_rate = 13;
    // Whether the user has disabled auto low latency mode
    optional bool has_user_disabled_allm = 14;
}

/**
 * Logs when NNAPI model is compiled successfully
 * Logged from
 *   modules/NeuralNetworks/runtime/TelemetryStatsd.cpp
 */
message NeuralNetworksCompilationCompleted {
    // Linux process uid for the package.
    optional int32 uid = 1 [(is_uid) = true];

    // id which identifies single session of client interacting with NNAPI runtime
    optional int32 session_id = 2;

    // NNAPI mainline module version.
    optional int64 version_nnapi_module = 3;

    // An identifier that can be used to match events for ML model architecture.
    // Hash is generated from model operations and operands definition, but not weights.
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    optional bytes model_arch_hash = 4 [(log_mode) = MODE_BYTES];

    // Device driver identifier used by this compilation.
    // NeuralNetworks models are compiled/prepared for one or more device drivers (e.g., DSP, GPU,
    // TPU, CPU). The device driver identifier is a concatenation of [device driver name, =, and
    // device driver version]. If multiple device drivers are used, all device driver identifiers
    // are sorted and concatenated with comma as a separator.
    optional string device_id = 5;

    // Type of tensors used for inputs
    optional android.neuralnetworks.DataClass input_data_class = 6;

    // Type of tensors used for outputs
    optional android.neuralnetworks.DataClass output_data_class = 7;

    // Did the compilation had to fallback to cpu due to an error?
    optional bool fallback_to_cpu_from_error = 8;

    // Did client name target devices explicitly?
    optional bool introspection_enabled = 9;

    // Was cache enabled?
    optional bool cache_enabled = 10;

    // Was control flow used in the model?
    optional bool has_control_flow = 11;

    // Whether there exists a partition boundary in the compilation that has dynamic size
    optional bool has_dynamic_temporaries = 12;

    // Time taken to compile a model
    optional int64 compilation_time_sum_millis = 13;
    optional int64 compilation_time_min_millis = 14;
    optional int64 compilation_time_max_millis = 15;
    optional int64 compilation_time_sum_squared_millis = 16;
    optional int32 compilation_time_count = 17;

    // How many times this atom occurred locally before being pushed.
    optional int32 count = 18;

    // model_arch_hash compressed to 64 bits by bitwise-xor each 64 chunk of model_arch_hash.
    optional int64 model_arch_hash_64 = 19;
}

/**
 * Logs when NNAPI model fails compilation
 * Logged from
 *   modules/NeuralNetworks/runtime/TelemetryStatsd.cpp
 */
message NeuralNetworksCompilationFailed {
    // Linux process uid for the package.
    optional int32 uid = 1 [(is_uid) = true];

    // id which identifies single session of client interacting with NNAPI runtime
    optional int32 session_id = 2;

    // NNAPI mainline module version.
    optional int64 version_nnapi_module = 3;

    // An identifier that can be used to match events for ML model architecture.
    // Hash is generated from model operations and operands definition, but not weights.
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    optional bytes model_arch_hash = 4 [(log_mode) = MODE_BYTES];

    // Device driver identifier used by this compilation.
    // NeuralNetworks models are compiled/prepared for one or more device drivers (e.g., DSP, GPU,
    // TPU, CPU). The device driver identifier is a concatenation of [device driver name, =, and
    // device driver version]. If multiple device drivers are used, all device driver identifiers
    // are sorted and concatenated with comma as a separator.
    optional string device_id = 5;

    // Type of tensors used for inputs
    optional android.neuralnetworks.DataClass input_data_class = 6;

    // Type of tensors used for outputs
    optional android.neuralnetworks.DataClass output_data_class = 7;

    // Error code returned by compilation call
    optional android.neuralnetworks.ResultCode error_code = 8;

    // Did client name target devices explicitly?
    optional bool introspection_enabled = 9;

    // Was cache enabled?
    optional bool cache_enabled = 10;

    // Was control flow used in the model?
    optional bool has_control_flow = 11;

    // Whether there exists a partition boundary in the compilation that has dynamic size
    optional bool has_dynamic_temporaries = 12;

    // How many times this atom occurred locally before being pushed.
    optional int32 count = 13;

    // model_arch_hash compressed to 64 bits by bitwise-xor each 64 chunk of model_arch_hash.
    optional int64 model_arch_hash_64 = 14;
}

/**
 * Logs when NNAPI model is executed successfully
 *
 * Logged from
 *   modules/NeuralNetworks/runtime/TelemetryStatsd.cpp
 */
message NeuralNetworksExecutionCompleted {
    // Linux process uid for the package.
    optional int32 uid = 1 [(is_uid) = true];

    // id which identifies single session of client interacting with NNAPI runtime
    optional int32 session_id = 2;

    // NNAPI mainline module version.
    optional int64 version_nnapi_module = 3;

    // An identifier that can be used to match events for ML model architecture.
    // Hash is generated from model operations and operands definition, but not weights.
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    optional bytes model_arch_hash = 4 [(log_mode) = MODE_BYTES];

    // Device driver identifier used by this execution.
    // NeuralNetworks models are executed on one or more device drivers (e.g., DSP, GPU, TPU, CPU).
    // The device driver identifier is a concatenation of [device driver name, =, and device driver
    // version]. If multiple device drivers are used, all device driver identifiers are sorted and
    // concatenated with comma as a separator.
    optional string device_id = 5;

    // Execution mode
    optional android.neuralnetworks.Mode mode = 6;

    // Type of tensors used for inputs
    optional android.neuralnetworks.DataClass input_data_class = 7;

    // Type of tensors used for outputs
    optional android.neuralnetworks.DataClass output_data_class = 8;

    // Did client name target devices explicitly?
    optional bool introspection_enabled = 9;

    // Was cache enabled?
    optional bool cache_enabled = 10;

    // Was control flow used in the model?
    optional bool has_control_flow = 11;

    // Whether there exists a partition boundary in the compilation that has dynamic size
    optional bool has_dynamic_temporaries = 12;

    // Time taken to execute from runtime, including runtime/ipc overhead
    optional int64 duration_runtime_sum_micros = 13;
    optional int64 duration_runtime_min_micros = 14;
    optional int64 duration_runtime_max_micros = 15;
    optional int64 duration_runtime_sum_squared_micros = 16;
    optional int32 duration_runtime_count = 17;

    // Time taken to execute in the driver, excluding runtime/ipc overhead
    optional int64 duration_driver_sum_micros = 18;
    optional int64 duration_driver_min_micros = 19;
    optional int64 duration_driver_max_micros = 20;
    optional int64 duration_driver_sum_squared_micros = 21;
    optional int32 duration_driver_count = 22;

    // Time taken to execute on the hardware, excluding driver overhead
    optional int64 duration_hardware_sum_micros = 23;
    optional int64 duration_hardware_min_micros = 24;
    optional int64 duration_hardware_max_micros = 25;
    optional int64 duration_hardware_sum_squared_micros = 26;
    optional int32 duration_hardware_count = 27;

    // How many times this atom occurred locally before being pushed.
    optional int32 count = 28;

    // model_arch_hash compressed to 64 bits by bitwise-xor each 64 chunk of model_arch_hash.
    optional int64 model_arch_hash_64 = 29;
}

/**
 * Logs when NNAPI model fails execution
 * Logged from
 *   modules/NeuralNetworks/runtime/TelemetryStatsd.cpp
 */
message NeuralNetworksExecutionFailed {
    // Linux process uid for the package.
    optional int32 uid = 1 [(is_uid) = true];

    // id which identifies single session of client interacting with NNAPI runtime
    optional int32 session_id = 2;

    // NNAPI mainline module version.
    optional int64 version_nnapi_module = 3;

    // An identifier that can be used to match events for ML model architecture.
    // Hash is generated from model operations and operands definition, but not weights.
    // Hash algorithm: HMAC-SHA256
    // Size: 32 byte
    optional bytes model_arch_hash = 4 [(log_mode) = MODE_BYTES];

    // Device driver identifier used by this execution.
    // NeuralNetworks models are executed on one or more device drivers (e.g., DSP, GPU, TPU, CPU).
    // The device driver identifier is a concatenation of [device driver name, =, and device driver
    // version]. If multiple device drivers are used, all device driver identifiers are sorted and
    // concatenated with comma as a separator.
    optional string device_id = 5;

    // Execution mode
    optional android.neuralnetworks.Mode mode = 6;

    // Type of tensors used for inputs
    optional android.neuralnetworks.DataClass input_data_class = 7;

    // Type of tensors used for outputs
    optional android.neuralnetworks.DataClass output_data_class = 8;

    // Error code returned by execution call
    optional android.neuralnetworks.ResultCode error_code = 9;

    // Did client name target devices explicitly?
    optional bool introspection_enabled = 10;

    // Was cache enabled?
    optional bool cache_enabled = 11;

    // Was control flow used in the model?
    optional bool has_control_flow = 12;

    // Whether there exists a partition boundary in the compilation that has dynamic size
    optional bool has_dynamic_temporaries = 13;

    // How many times this atom occurred locally before being pushed.
    optional int32 count = 14;

    // model_arch_hash compressed to 64 bits by bitwise-xor each 64 chunk of model_arch_hash.
    optional int64 model_arch_hash_64 = 15;
}

/**
 * Logs boot-time info for a Context Hub.
 */
message ContextHubBooted {
  // The amount of time it took the framework to connect to CHRE/Context Hub HAL
  // since the framework has booted.
  optional int64 boot_time_nanos = 1;

  // The number of Context Hub instances found on this system.
  optional int32 num_context_hubs = 2;
}

/**
 * Logs Context Hub restart events (e.g. crashes).
 */
message ContextHubRestarted {
  // The duration of time between the last time Context Hub restart and this event.
  // This should use the SystemClock.elapsedRealTime() API.
  optional int64 elapsed_time_millis_since_boot = 1;

  // The ID of the Context Hub that has restarted (zero-indexed).
  optional int32 context_hub_id = 2;
}

/**
 * Logs a snapshot of all the nanoapps loaded on this Context Hub.
 */
message ContextHubLoadedNanoappSnapshotReported {
  // The ID of the Context Hub the snapshot is for (zero-indexed).
  optional int32 context_hub_id = 1;

  // The nanoapp this snapshot is for. The nanoapp ID is the 64-bit unique identifier
  // for the application, and the version is the semantic versioning (https://semver.org)
  // used to determine the software version.
  optional int64 nanoapp_id = 2;
  optional int32 nanoapp_version = 3;
}

/**
 * Logs details of a dynamic CHRE nanoapp code download transaction.
 */
message ChreCodeDownloadTransacted {
  enum Type {
    TYPE_UNKNOWN = 0;
    TYPE_LOAD = 1;
    TYPE_UNLOAD = 2;
  }
  // The ID/version of the nanoapp this code download was for.
  optional int64 nanoapp_id = 1;
  optional int32 nanoapp_version = 2;

  // The type of code download transaction.
  optional Type transaction_type = 3;

  // The result of this transaction.
  optional android.contexthub.ContextHubTransactionResult transaction_result = 4;
}

/**
 * Stats about each feature tag that was included in the registration.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message ImsRegistrationFeatureTagStats {
    // the carrier id associated with this SIP delegate
    // Used as a dimension
    optional int32 carrier_id = 1;

    // The slot id associated with this SIP delegate
    // Used as a dimension
    optional int32 slot_id = 2;

    // The name of the feature tag
    // used as a dimension
    optional android.telephony.ImsFeatureTag feature_tag_name = 3;

    // The underlying radio technology type associated with the feature tag
    // used as a dimension
    // See the ImsRegistrationImplBase#REGISTRATION_TECH*
    optional int32 registration_tech = 4;

    // The time this feature tag was registered, rounded to 5 minutes
    optional int32 registered_seconds = 5;
}

/**
 * Stats about the messaging client interacting with telephony
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message RcsClientProvisioningStats {
    enum EventType {
        EVENT_TYPE_UNSPECIFIED = 0;
        // The client sent its client params to the ACS service.
        CLIENT_PARAMS_SENT = 1;
        // The client has manually triggered reconfiguration
        TRIGGER_RCS_RECONFIGURATION = 2;
        // Default messaging application changed.
        DMA_CHANGED = 3;
    }
    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    // Used as a dimension
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    // Used as a dimension
    optional int32 slot_id = 2;

    // Used as a dimension
    optional EventType event = 3;

    // The number of times this event has occurred.
    optional int32 count = 4;
}

/**
 * Stats about the RCS provisioning via ACS
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message RcsAcsProvisioningStats {
    enum ResponseType {
        RESPONSE_TYPE_UNSPECIFIED = 0;
        // a provisioning request resulted in an error.
        ERROR = 1;
        // a provisioning request succeeded and provided an xml
        PROVISIONING_XML = 2;
        // a provisioning request has resulted in a "pre-provisioning" xml, which
        // means RCS is not provisioned and requires the user to intervene.
        PRE_PROVISIONING_XML = 3;
    }

    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    // Used as a dimension
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    // Used as a dimension
    optional int32 slot_id = 2;

    // The response code of provisioning if the provisioning resulted in
    // ResponseType.ERROR
    // Used as a dimension
    optional int32 response_code = 3;

    // used as a dimension.
    optional ResponseType response_type = 4;

    // Does the provisioning XML have single registration provisioned.
    // Populated if response_type is ResponseType.PROVISIONING_XML
    // used as a dimension
    optional bool is_single_registration_enabled = 5;

    // The number of times this event has occurred.
    optional int32 count = 6;

    // The amount of time in seconds that the device was in this state in total, rounded 5 minutes
    optional int32 state_timer_sec = 7;
}

/**
 * Metrics surrounding the lifetime of a SIP delegate created by applications.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message SipDelegateStats {
    // The random number identifier with this SIP delegate
    optional int32 dimension = 1;

    // The carrier id associated with this SIP delegate
    optional int32 carrier_id = 2;

    // The slot id associated with this SIP delegate
    optional int32 slot_id = 3;

    // The total uptime of this delegate, rounded 5 minutes
    optional int32 uptime_seconds = 4;

    // The reason why this SIP delegate was destroyed.
    // See the SipDelegateManager#SIP_DELEGATE_DESTROY_REASON*
    optional int32 destroy_reason = 5;
}

/**
 * Tracks each feature tag associated with the SipDelegates that are currently active.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message SipTransportFeatureTagStats {
    // the carrier id associated with this SIP delegate
    // Used as a dimension
    optional int32 carrier_id = 1;

    // The slot id associated with this SIP delegate
    // Used as a dimension
    optional int32 slot_id = 2;

    // The name of the feature tag
    // used as a dimension
    optional android.telephony.ImsFeatureTag feature_tag_name = 3;

    // The reason why this feature tag was denied on the SIP Transport
    // used as a dimension
    // Use SIP transport denied reason.
    // See the SipDelegateManager#DENIED_REASON*
    optional int32 sip_transport_denied_reason = 4;

    // The reason why this feature tag was associated with the SIP Transport but not
    // marked as deregistered.
    // used as a dimension
    // Use SIP transport deregistered reason.
    // See the DelegateRegistrationState#DEREGISTERING_REASON*
    optional int32 sip_transport_deregistered_reason = 5;

    // the time this feature tag was in this state, rounded 5 minutes
    optional int32 associated_seconds = 6;
}

/**
 * Tracks each SIP message and the response from either the app or network.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message SipMessageResponse {
    enum Direction {
        UNKNOWN = 0;
        INCOMING = 1;
        OUTGOING = 2;
    }
    // the carrier id associated with this SIP delegate
    // Used as a dimension
    optional int32 carrier_id = 1;

    // The slot id associated with this SIP delegate
    // Used as a dimension
    optional int32 slot_id = 2;

    // The SIP message method type (INVITE, MESSAGE, etc...)
    // used as a dimension
    optional android.telephony.SipRequestMethodType sip_message_method = 3;

    // The SIP message response code, used if this is a response to a request.
    // used as a dimension.
    optional int32 sip_message_response = 4;

    // The SIP message direction
    // used as a dimension
    optional Direction sip_message_direction = 5;

    // The response from the SIP stack to sending/receiving the message
    // used as a dimension
    // See the SipDelegateManager#MESSAGE_FAILURE_REASON*
    optional int32 message_error = 6;

    // The number of messages that fit this criteria.
    optional int32 count = 7;
}

/**
 * Tracks SIP sessions managed by the SIP transport.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message SipTransportSession {
    enum Direction {
        UNKNOWN = 0;
        INCOMING = 1;
        OUTGOING = 2;
    }
    // the carrier id associated with this SIP delegate
    // Used as a dimension
    optional int32 carrier_id = 1;

    // The slot id associated with this SIP delegate
    // Used as a dimension
    optional int32 slot_id = 2;

    // The SIP message method that started the session (INVITE, SUBSCRIBE, etc...)
    // used as a dimension
    optional android.telephony.SipRequestMethodType session_method = 3;

    // The SIP message direction
    // used as a dimension
    optional Direction sip_message_direction = 4;

    // The response from the SIP stack or network.
    // used as a dimension.
    optional int32 sip_response = 5;

    // The number of these sessions counted
    optional int32 session_count = 6;

    // The number of sessions that were started properly and did not require
    // the SIP transport to forcefully close them.
    optional int32 ended_gracefully_count = 7;
}

/**
 * Used to determine if there were dedicated bearers set up for a specific listener.
 * If not, this indicates that there may have been a network issue in the dedicated bearer setup.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message ImsDedicatedBearerListenerEvent {
    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    // Used as a dimension
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    // Used as a dimension
    optional int32 slot_id = 2;

    // Radio access technology (RAT) used by the registration when it terminated.
    // The value is either 4G or 5G.
    // Used as a dimension
    optional android.telephony.NetworkTypeEnum rat_at_end = 3;

    // QoS class identifier.
    // dimension
    optional int32 qci = 4;

    // True if there was a dedicated bearer established for this listener.
    // dimension
    optional bool dedicated_bearer_established = 5;

    // The count of listeners with this result.
    optional int32 event_count = 6;
}

/**
 * Logs information related to ims dedicated bearer which fulfills required qos and provides guaranteed service.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message ImsDedicatedBearerEvent {
    enum State {
        STATE_UNSPECIFIED = 0;
        STATE_ADDED = 1;
        STATE_MODIFIED = 2;
        STATE_DELETED = 3;
    }
    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    // Used as a dimension
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    // Used as a dimension
    optional int32 slot_id = 2;

    // Radio access technology (RAT) used by the registration when it terminated.
    // The value is either 4G or 5G.
    // Used as a dimension
    optional android.telephony.NetworkTypeEnum rat_at_end = 3;

    // Qos class identifier.
    // Used as a dimension
    optional int32 qci = 4;

    // Dedicated bearer state from the network.
    // Used as a dimension
    optional State bearer_state = 5;

    // Whether location connection information is received.
    // Used as a dimension
    optional bool local_connection_info_received = 6;

    // Whether remote connection information is received.
    // Used as a dimension
    optional bool remote_connection_info_received = 7;

    // Whether or not the QoS indication had listeners.
    // Used as a dimension
    optional bool has_listeners = 8;

    // The count that matches the above conditions.
    optional int32 count = 9;
}

/**
 * Stats about each ServiceDescription that was included in the PIDF XML sent to the network during publish.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message ImsRegistrationServiceDescStats {
    // Describe Service IDs will be included PUBLISH
    // See RcsContactPresenceTuple.java
    enum ServiceId {
        SERVICE_ID_UNSPECIFIED = 0;
        SERVICE_ID_CUSTOM = 1;
        SERVICE_ID_MMTEL = 2;
        SERVICE_ID_CHAT_V1 = 3;
        SERVICE_ID_CHAT_V2 = 4;
        SERVICE_ID_FT = 5;
        SERVICE_ID_FT_OVER_SMS = 6;
        SERVICE_ID_GEO_PUSH = 7;
        SERVICE_ID_GEO_PUSH_VIA_SMS = 8;
        SERVICE_ID_CALL_COMPOSER = 9;
        SERVICE_ID_POST_CALL = 10;
        SERVICE_ID_SHARED_MAP = 11;
        SERVICE_ID_SHARED_SKETCH = 12;
        SERVICE_ID_CHATBOT = 13;
        SERVICE_ID_CHATBOT_STANDALONE = 14;
        SERVICE_ID_CHATBOT_ROLE = 15;
    }

    // the carrier id associated with this SIP delegate
    // Used as a dimension
    optional int32 carrier_id = 1;

    // The slot id associated with this SIP delegate
    // Used as a dimension
    optional int32 slot_id = 2;

    // The service id portion of the ServiceDescription
    // used as a dimension
    optional ServiceId service_id_name = 3;

    // The version portion of the ServiceDescription
    // used as a dimension
    optional float service_id_version = 4;

    // The underlying radio technology type associated with the feature tag
    // used as a dimension
    // See the ImsRegistrationImplBase#REGISTRATION_TECH*
    optional int32 registration_tech = 5;

    // the time this feature tag was registered, rounded 5 minutes
    optional int32 published_seconds = 6;
}

/**
 * Stats related to UCE queries to the network
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message UceEventStats {
    enum MessageType {
        MESSAGE_TYPE_UNSPECIFIED = 0;
        PUBLISH = 1;
        SUBSCRIBE = 2;
        INCOMING_OPTION = 3;
        OUTGOING_OPTION = 4;
    }
    enum CommandCode {
        SERVICE_UNKNOWN = 0;
        GENERIC_FAILURE = 1;
        INVALID_PARAM = 2;
        FETCH_ERROR = 3;
        REQUEST_TIMEOUT = 4;
        INSUFFICIENT_MEMORY = 5;
        LOST_NETWORK_CONNECTION = 6;
        NOT_SUPPORTED = 7;
        NOT_FOUND = 8;
        SERVICE_UNAVAILABLE = 9;
        NO_CHANGE = 10;
    }
    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    // Used as a dimension
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    // Used as a dimension
    optional int32 slot_id = 2;

    // Used to identify the message type.
    // Used as a dimension
    optional MessageType type = 3;

    // Whether the UCE event is successfully finished. If false, the request to the
    // modem timed out and we sent a timeout error back to the requesting app.
    // Used as a dimension
    optional bool successful = 4;

    // The command error code for the Uce event. Not populated if the modem
    // accepted the request and delivered a network_response.
    // Used as a dimension
    optional CommandCode command_code = 5;

    // The network response code for the Uce event. Will not be populated if
    // command_code is present.
    // Used as a dimension
    optional int32 network_response = 6;

    // The count that matches the above conditions;
    optional int32 count = 7;
}

/**
 * Information related to a SIP NOTIFY event from modem.
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message PresenceNotifyEvent {
    // See RFC3265 Section 3.2.4 for more information about these subscription states.
    enum TerminatedReason {
        REASON_UNSPECIFIED = 0;
        // Not spec defined, the network returned a custom code that is not spec defined.
        REASON_CUSTOM = 1;
        REASON_DEACTIVATED = 2;
        REASON_PROBATION = 3;
        REASON_REJECTED = 4;
        REASON_TIMEOUT = 5;
        REASON_GIVEUP = 6;
        REASON_NORESOURCE = 7;
    }

    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    // Used as a dimension
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    // Used as a dimension
    optional int32 slot_id = 2;

    // The terminated reason associated with the subscription state.
    // Used as a dimension
    optional TerminatedReason reason = 3;

    // Whether or not the NOTIFY received contained at least one body with PIDF
    // content before moving to the terminated state.
    // Used as a dimension
    optional bool content_body_received = 4;

    // The count of PIDF info received that contained RCS caps.
    optional int32 rcs_caps_count = 5;

    // The count of PIDF info received that contained MMTEL caps.
    optional int32 mmtel_caps_count = 6;

    // The count of PIDF info received that contained no mmtel or RCS caps.
    optional int32 no_caps_count = 7;

    // The count that matches the above conditions;
    optional int32 count = 8;
}

/**
 * Tracks GBA requests from applications
 *
 * Logged from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/RcsStats.java
 */
message GbaEvent {
    enum FailedReason {
        UNKNOWN = 0;
        FEATURE_NOT_SUPPORTED = 1;
        FEATURE_NOT_READY = 2;
        NETWORK_FAILURE = 3;
        INCORRECT_NAF_ID = 4;
        SECURITY_PROTOCOL_NOT_SUPPORTED = 5;
    }
    // Carrier ID of the SIM used for IMS registration.
    // See https://source.android.com/devices/tech/config/carrierid.
    // Used as a dimension
    optional int32 carrier_id = 1;

    // Index of the SIM used, 0 for single-SIM devices.
    // Used as a dimension
    optional int32 slot_id = 2;

    // Whether the GBA event is successful.
    // Used as a dimension
    optional bool successful = 3;

    // Gba authentication failed reason.
    // Used as a dimension
    optional FailedReason failed_reason = 4;

    // The count that matches the above conditions.
    optional int32 count = 5;
}

/*
 * Logs details of initiated UWB ranging session
 * Logged from packages/modules/Uwb/service/java/com/android/server/uwb/UwbMetrics.java
 */
message UwbSessionInitiated {
    // UWB profiles
    optional android.uwb.Profile profile = 1;
    // Scrambled timestamp sequence (STS) Type
    optional android.uwb.Sts sts = 2;
    // Was it an initiator as opposed to responder?
    optional bool is_initiator = 3;
    // Was it a controller as opposed to controlee?
    optional bool is_controller = 4;
    // Was the discovery done by the framework?
    optional bool is_discovered_by_framework = 5;
    // Was it out-of-band connection as opposed to in-band connection?
    // Note that this field is ignored if is_discovered_by_framework is false.
    optional bool is_out_of_band = 6;
    // UWB channel 5, 6, 9, etc.
    optional int32 channel = 7;
    // The status code of session initialization.
    optional android.uwb.Status status = 8;
    // Initialization latency in ms if is_discovered_by_framework is true.
    optional int32 latency_ms = 9;
    // Initialization latency in step size of 200 ms if is_discovered_by_framework is true.
    optional int32 latency_200ms = 10;
}

/*
 * Logs details of closed UWB ranging session
 * Logged from packages/modules/Uwb/service/java/com/android/server/uwb/UwbMetrics.java
 */
message UwbSessionClosed {
    // UWB profiles
    optional android.uwb.Profile profile = 1;
    // Scrambled timestamp sequence (STS) Type
    optional android.uwb.Sts sts = 2;
    // Was it an initiator as opposed to responder?
    optional bool is_initiator = 3;
    // Was it a controller as opposed to controlee?
    optional bool is_controller = 4;
    // Was the connection done by the app as opposed to by the framework?
    optional bool is_framework_initiated = 5;
    // Was it out-of-band connection as opposed to in-band connection?
    // Note that this field is ignored if is_framework_initiated is false.
    optional bool is_out_of_band = 6;
    // Session active duration in seconds
    optional int32 duration_sec = 7;
    // Session active duration bucket
    optional android.uwb.DurationBucket duration_bucket = 8;
    // Total ranging measurement count
    optional int32 ranging_count = 9;
    // Valid ranging measurement count
    optional int32 valid_ranging_count = 10;
    // Ranging measurement count bucket.
    optional android.uwb.CountBucket ranging_count_bucket = 11;
    // Valid ranging measurement count bucket.
    optional android.uwb.CountBucket valid_ranging_count_bucket = 12;
    // Ranging start count
    optional int32 start_count = 13;
    // Ranging start failure count
    optional int32 start_failure_count = 14;
    // Ranging start without valid ranging result count
    optional int32 start_no_valid_report_count = 15;
}

/*
 * Log that the ranging measurement is received
 * Logged from packages/modules/Uwb/service/java/com/android/server/uwb/UwbMetrics.java
 */
message UwbRangingMeasurementReceived {
    // UWB profiles
    optional android.uwb.Profile profile = 1;
    // None-Line-of-sight (LOS) indication
    optional android.uwb.Nlos nlos = 2;
    // Was the distance valid?
    optional bool is_distance_valid = 3;
    // The distance measurement in centimeters.
    optional int32 distance_cm = 4;
    // The distance measurement in step size of 50 cm
    optional int32 distance_50cm = 5;
    // RSSI of ranging report, in dBm
    optional int32 rssi = 6;
    // Was azimuth angle valid?
    optional bool is_azimuth_valid = 7;
    // The azimuth angle measurement in degrees.
    optional int32 azimuth_degree = 8;
    // The azimuth angle measurement in step size of 10 degree.
    optional int32 azimuth_10degree = 9;
    // The figure of merit of azimuth angle measurement.
    optional int32 azimuth_fom = 10;
    // Was elevation angle valid?
    optional bool is_elevation_valid = 11;
    // The elevation angle measurement in degrees.
    optional int32 elevation_degree = 12;
    // The elevation angle measurement in step size of 10 degree.
    optional int32 elevation_10degree = 13;
    // The figure of merit of elevation angle measurement.
    optional int32 elevation_fom = 14;
}

/*
 * Log that the first ranging measurement is received
 * Logged from packages/modules/Uwb/service/java/com/android/server/uwb/UwbMetrics.java
 */
message UwbFirstRangingReceived {
    // UWB profiles
    optional android.uwb.Profile profile = 1;
    // The latency between the ranging start/resume and 1st ranging measurement, in ms.
    optional int32 latency_ms = 2;
    // The ranging latency in 200ms.
    optional int32 latency_200ms = 3;
}

/*
 * Log that UWB device error is detected
 * Logged from packages/modules/Uwb/service/java/com/android/server/uwb/UwbMetrics.java
 */
message UwbDeviceErrorReported {
    enum Type {
        UNKNOWN = 0;
        // Initialization error
        INIT_ERROR = 1;
        // Device status error
        DEVICE_STATUS_ERROR = 2;
        // UCI generic error
        UCI_GENERIC_ERROR = 3;
    }
    // Error type
    optional Type type= 1;
}

/**
 * Log that the clipboard has been cleared
 * Logged from frameworks/base/services/core/java/android/content/ClipboardAutoWipeService.java
 */
message ClipboardCleared {
    enum Source {
        SOURCE_UNKNOWN = 0;
        AUTO_CLEAR = 1;
    }

    // Source of the wipe
    optional Source source = 1;
}

/**
 * Pulls status for a SIM.
 *
 * Each pull creates multiple atoms, one for each SIM. The atom holds the status for a SIM that's
 * sensitive per carrier. The atom would be aggregated per carrier for analysis.
 *
 * Pulled from:
 *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
 */
message PerSimStatus {
    enum WfcMode {
        UNKNOWN = 0;
        WIFI_ONLY = 1;
        CELLULAR_PREFERRED = 2;
        WIFI_PREFERRED = 3;
    }
    enum SimVoltageClass {
        VOLTAGE_CLASS_UNKNOWN = 0;
        VOLTAGE_CLASS_A = 1;
        VOLTAGE_CLASS_B = 2;
        VOLTAGE_CLASS_C = 3;
    }

    // Index of the SIM, 0 for single-SIM devices.
    optional int32 sim_slot_index = 1;

    // Carrier ID of the SIM.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 2;

    // Indicates whether phone number source UICC provides a phone number
    // and whether it agrees with other sources:
    //  - 0: no number provided
    //  - a positive integer (> 0): sources providing the same phone number
    //    shall use the same integer. The integer shall start from 1, and
    //    for each new unique source the next integer (2, 3, …) is used.
    // This way, the raw phone number cannot be derived from the value of
    // this field.
    // This also allows a quick check of conflicts: any field > 1 means conflict,
    // and the max means the count of unique phone numbers.
    optional int32 phone_number_source_uicc = 3;

    // Indicates whether phone number source CARRIER provides a phone number
    // and whether it agrees with other sources.
    // See field phone_number_source_uicc.
    optional int32 phone_number_source_carrier = 4;

    // Indicates whether phone number source IMS provides a phone number
    // and whether it agrees with other sources.
    // See field phone_number_source_uicc.
    optional int32 phone_number_source_ims = 5;

    // Indicates whether VoLTE is enabled
    optional bool volte_enabled = 6;

    // Indicates whether WFC is enabled
    optional bool wfc_enabled = 7;

    // Indicates the user's WFC mode
    optional WfcMode wfc_mode = 8;

    // Indicates the user's WFC mode when roaming
    optional WfcMode wfc_roaming_mode = 9;

    // Indicates the user's setting for video calling.
    optional bool video_calling_enabled = 10;

    // Indicates if data roaming is enabled
    optional bool data_roaming_enabled = 11;

    // Indicates the list of networks allowed by the user. Bitmask is encoded as
    // TelephonyManager#NetworkTypeBitMask.
    optional int64 allowed_networks_by_user = 12;

    // Indicates if 2G is disabled by the user using the "Allow 2G" toggle
    optional bool is_2g_disabled = 13;

    // Indicates if PIN1 of the SIM card is enabled
    optional bool is_pin1_enabled = 14;

    // Indicates the lowest voltage class supported by the SIM
    optional SimVoltageClass sim_voltage_class = 15;

    // APN type bitmask of the APNs added or modified by user:
    // @ApnType in frameworks/base/telephony/java/android/telephony/Annotation.java.
    optional int32 user_modified_apn_type_bitmask = 16;
}

/*
 * Logs Device Scan State events generated by Nearby Scan API.
 */
message NearbyDeviceScanStateChanged {
  // Uid of the client that triggers the Nearby scan.
  optional int32 uid = 1 [(is_uid) = true];

  // Scan start timestamp as session id.
  optional int64 scan_session_id = 2;

  // Scan state.
  optional android.nearby.NearbyScanState scan_state = 3;

  // Scan type.
  optional android.nearby.NearbyScanType scan_type = 4;

  // Medium that this device was discovered/lost.
  optional android.nearby.NearbyNetworkMedium network_medium = 5;

  // Received Signal Strength Indication (RSSI) value of the device discovered/lost.
  optional int32 rssi = 6;

  // Model of the device discovered/lost.
  optional string scanned_device_model = 7;

  // Manufacturer of the device discovered/lost.
  optional string scanned_device_manufacturer = 8;
}

/**
 * Logs when locales of an application are changed.
 * Logged from
 *   frameworks/base/services/core/java/com/android/server/locales/LocaleManagerService.java
 */
message ApplicationLocalesChanged {
    // The uid which invoked this update. The locales for an application
    // could be changed from the in-app picker OR from the settings UI.
    optional int32 calling_uid = 1 [(is_uid) = true];

    // The uid for which the locale change is being done.
    optional int32 target_uid = 2 [(is_uid) = true];

    // The new locales for the target package. A comma separated list of BCP 47
    // locale identifiers, compatible with LocaleList#forLanguageTags.
    optional string new_locales = 3;

    // The previous locales for the target package. A comma separated list of
    // BCP 47 locale identifiers, compatible with LocaleList#forLanguageTags.
    optional string prev_locales = 4;

    // Application locales changed status.
    enum Status {
        // A placeholder for unspecified values.
        STATUS_UNSPECIFIED = 0;

        // New locales were committed.
        CONFIG_COMMITTED = 1;

        // Likely because no change is required.
        CONFIG_UNCOMMITTED = 2;

        // Failed because the target package is invalid.
        FAILURE_INVALID_TARGET_PACKAGE = 3;

        // Failed because the calling package does not have the required permission.
        FAILURE_PERMISSION_ABSENT = 4;
    }

    optional Status status = 5;
}

/* Logs when the display HBM state changes.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/display/HighBrightnessModeController.java
 */
message DisplayHbmStateChanged {
    optional int32 display_id = 1;

    // New HBM state
    optional android.server.display.HbmState state = 2;

    // The reason the state changes.
    optional android.server.display.HbmStateTransitionReason reason = 3;
}

/*
 * Logs when the display HBM brightness changes.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/display/AutomaticBrightnessControllerjava
 */
message DisplayHbmBrightnessChanged {
    optional int32 display_id = 1;

    // display brightness
    optional float brightness = 2;
}

/**
 * Per-UID time spent running work on the GPU.
 *
 * Each pull creates multiple atoms, one per (GPU ID, UID) pair, for at most 10
 * randomly selected UIDs.
 *
 * Pulled from:
 *    frameworks/native/services/gpuservice/gpuwork/GpuWork.cpp
 */
message GpuWorkPerUid {
  // The UID (i.e. app id) that scheduled work on the GPU.
  optional int32 uid = 1 [(is_uid) = true];

  // The GPU ID for which we have work information.
  optional int32 gpu_id = 2;

  // The time duration (in seconds) over which this data was collected (most
  // likely 24 hours).
  optional int32 time_duration_seconds = 3;

  // The total amount of time (in milliseconds) the GPU spent running work for
  // |uid|.
  optional int32 total_active_duration_millis = 4;

  // The total amount of time (in milliseconds) the GPU was inactive while
  // running "continuous" work for |uid|. This is estimated by adding up the
  // duration of the small gaps between GPU work for |uid|.
  optional int32 total_inactive_duration_millis = 5;
}

/**
 * Logs when entries are dropped in DropBox and the reason for the drop.
 *
 * Logged from: frameworks/base/services/
 */
message DropboxEntryDropped {
    // Explains at which stage of the DropBox workflow the entry was dropped.
    enum DropReason {
        UNKNOWN = 0;
        CLEARING_DATA = 3;
        AGED = 4;
        WRITE_FAILURE = 5;

        reserved 1, 2;
    }

    optional DropReason drop_reason = 1;

    // Tag describing the type of dropbox entry.
    optional string tag = 2;

    // The age (millis) of the dropped dropbox entry.
    optional int64 age_millis = 3;
}

message PersistentUriPermissionsFlushed {
    // Current amount of persistent uri permissions overall
    optional int32 permissions_flushed_amount = 1;
}

message PersistentUriPermissionsAmountPerPackage {
    // The uid persistent uri permissions amount reported for
    optional int32 uid = 1 [(is_uid) = true];
    // Current amount of persistent uri permissions for this package
    optional int32 amount = 2;
}

/**
 * VBMeta Digest cryptographically encapsulates the composition of signed images or partitions of
 * a particular build.
 *
 * Logs when boot is complete.
 * Pushed from:
 *    frameworks/base/services/core/java/com/android/server/BinaryTransparencyService.java
 */
message VBMetaDigestReported {
    // the hex encoded string of VBMeta Digest value
    optional string vbmeta_digest = 1;
}

/**
 * APEXs can either be signed by Google or OEMs. This atom captures basic metadata of APEXs
 * pre-installed on a build or a device.
 *
 * Logs when boot is complete.
 * Pushed from:
 *    frameworks/base/services/core/java/com/android/server/BinaryTransparencyService.java
 */
message ApexInfoGathered {
    // APEX package names are determined by OEMs
    optional string package_name = 1;
    // the version code of the APEX
    optional int64 version_code = 2;
    // the hex encoded SHA256 digest of the APEX file
    optional string sha256_digest = 3;
}

/**
 * PVM is protected virtual machine. This atom captures the notion of a container
 * that describes a virtual machine.
 *
 * Will be pushed from:
 *      frameworks/base/services/core/java/com/android/server/BinaryTransparencyService.java
 */
message PvmInfoGathered {
    // PVM names are determined by OEMs
    optional string name = 1;
    // an int describing the version of the VM
    optional int64 version = 2;
    // the hex encoded SHA256 digest of the pvm descriptor file
    optional string sha256_digest = 3;
}

/**
 * This will be pulled from
 *     frameworks/base/services/core/java/com/android/server/BinaryTransparencyService.java
 */
message SignedPartitionInfo {
    // partition name (e.g. vendor, product) is determined by OEM
    optional string partition_name = 1;
    // the hex encoded SHA256 digest of the partition image file
    optional string sha256_digest = 2;
}

/**
 * Logs when Wear Settings UI is interacted with
 */
message WearSettingsUIInteracted {
    /** The UI action category */
    optional android.app.wearsettings.Action action = 1;

    /** The ID of the entry that the users actioned on. */
    optional android.app.wearsettings.ItemId item_id = 2;
}

message TracingServiceReportEvent {
    enum Event {
      TRACING_SERVICE_REPORT_UNDEFINED = 0;

      // Checkpoints inside TracingServiceProxy.
      TRACING_SERVICE_REPORT_BEGIN = 1;
      TRACING_SERVICE_REPORT_SVC_HANDOFF = 2;

      // Guardrails inside TracingServiceProxy.
      TRACING_SERVICE_REPORT_BIND_PERM_INCORRECT = 3;
      TRACING_SERVICE_REPORT_SVC_PERM_MISSING = 4;
      TRACING_SERVICE_REPORT_SVC_COMM_ERROR = 5;
  }

  // Which stage of the pipeline we are reporting from.
  optional Event event = 1;

  // UUID of the trace.
  optional int64 trace_uuid_lsb = 2;
  optional int64 trace_uuid_msb = 3;
}

/** Pulled from PinnerService. */
message PinnedFileSizesPerPackage {
    // If the file is pinned but not as part of a specific pinned app,
    // this will be set to 1000 - the value of system_server.
    optional int32 uid = 1 [(is_uid) = true];

    // Consists of only the pinned file's filename, not its full path; for example
    // Given a pinned file at ‘/vendor/lib64/libCB.so’, then this field will be
    // Determined to have have the value ‘libCB.so’.
    optional string filename = 2;

    // The size of the pinned file, in kilobytes.
    optional int32 size_kb = 3;
}

/** Pulled from PendingIntentController. */
message PendingIntentsPerPackage {
    // The UID of the app that sent the PendingIntent.
    optional int32 uid = 1 [(is_uid) = true];
    // The total number of currently active PendingIntents belonging to this uid.
    optional int32 pending_intent_count = 2;
    // The total size of all currently active PendingIntents belonging to this uid, in kilobytes.
    optional int32 pending_intent_total_bundle_size_kb = 3;
}

/**
 * Logs for Launcher latency. Uses KLL to reduce the data pression
 *
 * Logged from:
 *      vendor/unbundled_google/packages/NexusLauncher
 */
message LauncherLatency {
    // The event id generated from go/uievents
    optional int32 event_id = 1;
    // The instance id to track multiple partial durations or parellel running durations
    optional int32 instance_id = 2;
    optional int32 package_id = 3;
    optional int64 latency_in_millis = 4;
    optional int32 type = 5;
    optional int32 query_length = 6 [default = -1];
}

/*
 * Logs changes to game state set by game applications via GameService.
 */
message GameStateChanged {
    enum State {
        // Game mode is unknown.
        MODE_UNKNOWN = 0;

        // The game is not in active play, e.g.e the user is using a game menu.
        MODE_NONE = 1;

        // The game is in active, but interruptible, game play.
        MODE_GAMEPLAY_INTERRUPTIBLE = 2;

        // The game is in active user play mode, which cannot be interrupted.
        MODE_GAMEPLAY_UNINTERRUPTIBLE = 3;

        // The current content shown is not gameplay related (e.g. an ad).
        MODE_CONTENT = 4;
    }

    // Provided to ensure package is available even with UID sharing.
    optional string package_name = 1;

    // The UID (i.e. app id).
    optional int32 uid = 2 [(is_uid) = true];

    // Whether the device enabled performance boost when the state was changed.
    optional bool boost_enabled = 3;

    // This includes a top-level state for the game.
    optional State state = 4;

    // Indicates if the game is loading assets/resources/compiling/etc.
    optional bool is_loading = 5;

    // A developer-selected enum, for example to indicate level or scene.
    optional int32 label = 6;

    // A developer-supplied enum, e.g. to indicate the current quality level.
    optional int32 quality = 7;
}

/**
 * Logs information related to creating hotword detector.
 */
message HotwordDetectorCreateRequested {
    // The type of detector.
    optional android.hotword.HotwordDetectorType detector_type = 1;

    // True if the detector is created successfully.
    optional bool is_created_done = 2;

    // The UID for which assistant application is active.
    optional int32 uid = 3 [(is_uid) = true];
}

/**
 * Logs information related to hotword detection service init result.
 */
message HotwordDetectionServiceInitResultReported {
    // The type of detector.
    optional android.hotword.HotwordDetectorType detector_type = 1;

    // The result of initialization.
    enum Result {
        // Indicates that the service was initialized successfully.
        CALLBACK_INIT_STATE_SUCCESS = 0;

        // Indicates that the service was not initialized successfully.
        CALLBACK_INIT_STATE_ERROR = 1;

        // Indicates that the callback was invoked without init state.
        CALLBACK_INIT_STATE_UNKNOWN_NO_VALUE = 2;

        // Indicates that the callback was invoked, but the init state value exceeded
        // the defined maximum.
        CALLBACK_INIT_STATE_UNKNOWN_OVER_MAX_CUSTOM_VALUE = 3;

        // Indicates that the callback was not invoked within timeout.
        CALLBACK_INIT_STATE_UNKNOWN_TIMEOUT = 4;
    }
    optional Result result = 2;
}

/**
 * Logs information related to restarting hotword detection service.
 */
message HotwordDetectionServiceRestarted {
    // The type of detector.
    optional android.hotword.HotwordDetectorType detector_type = 1;

    // The reason for restarting service.
    enum Reason {
        // UNKNOWN value.
        UNKNOWN = 0;

        // Indicates that the service was restarted due to audio service died.
        AUDIO_SERVICE_DIED = 1;

        // Indicates that the service was restarted regularly.
        SCHEDULE = 2;

        // Indicates that the service was restarted due to service crashed.
        CRASH = 3;
    }
    optional Reason reason = 2;
}

/**
 * Logs information related to keyphrase trigger.
 */
message HotwordDetectorKeyphraseTriggered {
    // The type of detector.
    optional android.hotword.HotwordDetectorType detector_type = 1;

    // The result of detection.
    enum Result {
        // 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;

        // Indicates that the callback was not invoked within timeout after informing
        // the service.
        DETECT_TIMEOUT = 2;

        // Indicates that the system got the exception after informing the service.
        DETECT_EXCEPTION = 3;

        // Indicates that the service crashed.
        SERVICE_CRASH = 4;

        // Indicates that the keyphrase was detected.
        DETECTED = 5;

        // Indicates that the keyphrase was not detected.
        REJECTED = 6;

        // Indicates that the system got the unexpected detected callback.
        DETECT_UNEXPECTED_CALLBACK = 7;

        // Indicates that the system got the security exception when handling detected callback.
        DETECT_SECURITY_EXCEPTION = 8;

        // Indicates that the system got the unexpected rejected callback.
        REJECT_UNEXPECTED_CALLBACK = 9;

        // Indicates that the system called rejected callback when the trusted process was
        // restarted.
        REJECTED_FROM_RESTART = 10;
    }
    // What result after detecting.
    optional Result result = 2;
}

/**
 * Logs information related to hotword detector events.
 */
message HotwordDetectorEvents {
    // The type of detector.
    optional android.hotword.HotwordDetectorType detector_type = 1;

    // The type of event.
    enum Event {
        // UNKNOWN value.
        UNKNOWN = 0;

        // Indicates that the system requested to bind the service.
        REQUEST_BIND_SERVICE = 1;

        // Indicates that the system connected the service successfully.
        ON_CONNECTED = 2;

        // Indicates that the system failed to bind the service.
        REQUEST_BIND_SERVICE_FAIL = 3;

        // Indicates that the system called the updateState function of service.
        REQUEST_UPDATE_STATE = 4;

        // Indicates that the callback was not invoked within timeout after calling
        // the updateState function of service.
        CALLBACK_UPDATE_STATE_AFTER_TIMEOUT = 5;

        // Indicates that no starting recognition after creating the detector.
        DID_NOT_CALL_START_RECOGNITION = 6;
    }
    optional Event event = 2;

    // The UID for which assistant application is active.
    optional int32 uid = 3 [(is_uid) = true];
}

/**
 * Logs when an AdServices api is called.
 */
message AdServicesApiCalled {
    // The name of the api that was called.
    // Can be classified as one of the three:
    //
    // Targeting
    //  * GetTopics()
    //
    // FLEDGE
    //  * joinCustomAudience()
    //  * leaveCustomAudience()
    //  * overrideCustomAudienceRemoteInfo()
    //  * removeCustomAudienceRemoteInfoOverride()
    //  * resetAllCustomAudienceOverrides()
    //  * runAdSelection()
    //  * reportImpression()
    //  * overrideAdSelectionConfigRemoteInfo()
    //  * removeAdSelectionConfigRemoteInfoOverride()
    //  * resetAllAdSelectionConfigRemoteOverrides()
    //
    // Measurement - client side
    //   * register()
    //   * deleteRegistrations()


    enum AdServicesApiClassType {
        UNKNOWN = 0;
        TARGETING = 1;
        FLEDGE = 2;
        MEASUREMENT = 3;
    }

    enum AdServicesApiName {
        API_NAME_UNKNOWN = 0;
        GET_TOPICS = 1;
        JOIN_CUSTOM_AUDIENCE = 2;
        LEAVE_CUSTOM_AUDIENCE = 3;
        RUN_AD_SELECTION = 4;
        REGISTER = 5;
        DELETE_REGISTRATIONS = 6;
        REPORT_IMPRESSION = 7;
        OVERRIDE_CUSTOM_AUDIENCE_REMOTE_INFO = 8;
        REMOVE_CUSTOM_AUDIENCE_REMOTE_INFO_OVERRIDE = 9;
        RESET_ALL_CUSTOM_AUDIENCE_OVERRIDES = 10;
        OVERRIDE_AD_SELECTION_CONFIG_REMOTE_INFO = 11;
        REMOVE_AD_SELECTION_CONFIG_REMOTE_INFO_OVERRIDE = 12;
        RESET_ALL_AD_SELECTION_CONFIG_REMOTE_OVERRIDES = 13;
    }

    optional AdServicesApiClassType api_class = 1;

    // 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 sdk_package_name = 4;

    optional int32 latency_millis = 5;

    // response_code is the error/failure code for the given api.
    optional int32 response_code = 6;
}

/**
 * Logs when an AdServices measurement reports are being uploaded.
 */
message AdServicesMeasurementReportsUploaded {
    enum ReportType {
        UNKNOWN_REPORT = 0;
        EVENT = 1;
        AGGREGATE = 2;
    }

    optional ReportType type = 1;

    enum ReportUploadStatus {
        UNKNOWN_STATUS = 0;
        SUCCESS = 1;
        FAILURE = 2;
    }

    optional ReportUploadStatus response_code = 2;
}

/**
 * Log the duration of executing all receivers of LOCKED_BOOT_COMPLETED or BOOT_COMPLETED broadcast.
 * The dispatch latency is the dispatchTime - enqueueTime.
 * The completion latency is the completeTime - enqueueTime.
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
 */
message BootCompletedBroadcastCompletionLatencyReported {
    enum Event {
        UNKNOWN = 0;
        LOCKED_BOOT_COMPLETED = 1;
        BOOT_COMPLETED = 2;
    }

    optional Event event = 1;
    // from enqueueTime to dispatchTime.
    optional int32 dispatch_latency_uptime_millis = 2;
    // from enqueueTime to completeTime.
    optional int32 complete_latency_uptime_millis = 3;
    // from enqueueRealTime to dispatchRealTime.
    optional int32 dispatch_latency_realtime_millis = 4;
    // from enqueueRealTime to completeRealTime.
    optional int32 complete_latency_realtime_millis = 5;

    optional int32 user_id = 6;
    optional UserLifecycleJourneyReported.UserType user_type = 7;
}

/**
 * Logs information about app background restrictions.
 *
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/am/AppRestrictionController.java
 */
message AppBackgroundRestrictionsInfo {
    // the uid of the app.
    optional int32 uid = 1 [(is_uid) = true];

    enum RestrictionLevel {
        LEVEL_UNKNOWN = 0;
        LEVEL_UNRESTRICTED = 1;
        LEVEL_EXEMPTED = 2;
        LEVEL_ADAPTIVE_BUCKET = 3;
        LEVEL_RESTRICTED_BUCKET = 4;
        LEVEL_BACKGROUND_RESTRICTED = 5;
        LEVEL_HIBERNATION = 6;
    }
    // indicates the app background restriction level.
    optional RestrictionLevel restriction_level = 2;

    enum Threshold {
        THRESHOLD_UNKNOWN = 0;
        THRESHOLD_RESTRICTED = 1; // app was background restricted by the system.
        THRESHOLD_USER = 2; // app was background restricted by user action.
    }
    // indicates which threshold caused the app to be put into bg restriction.
    optional Threshold threshold = 3;

    enum StateTracker {
        UNKNOWN_TRACKER = 0;
        BATTERY_TRACKER = 1;
        BATTERY_EXEMPTION_TRACKER = 2;
        FGS_TRACKER = 3;
        MEDIA_SESSION_TRACKER = 4;
        PERMISSION_TRACKER = 5;
        BROADCAST_EVENTS_TRACKER = 6;
        BIND_SERVICE_EVENTS_TRACKER = 7;
    }
    // indicates the reason/tracker which caused the app to hit the threshold.
    optional StateTracker tracker = 4;

    message FgsTrackerInfo {
        // indicates whether an fgs notification was visible for this app or not.
        optional bool fgs_notification_visible = 1;
        // total FGS duration for this app.
        optional int64 fgs_duration = 2;
    }
    optional FgsTrackerInfo fgs_tracker_info = 5 [(log_mode) = MODE_BYTES];

    message BatteryTrackerInfo {
        // total battery usage within last 24h (1/10000th)
        optional int32 battery_24h = 1;
        // background battery usage (1/10000th)
        optional int32 battery_usage_background = 2;
        // FGS battery usage (1/10000th)
        optional int32 battery_usage_fgs = 3;
        // Foreground battery usage (1/10000th)
        optional int32 battery_usage_foreground = 4;
        // Cached battery usage (1/10000th)
        optional int32 battery_usage_cached = 5;
    }
    optional BatteryTrackerInfo battery_tracker_info = 6 [(log_mode) = MODE_BYTES];

    message BroadcastEventsTrackerInfo {
        // the number of broadcasts sent by this app.
        optional int32 broadcasts_sent = 1;
    }
    optional BroadcastEventsTrackerInfo broadcast_events_tracker_info = 7 [(log_mode) = MODE_BYTES];

    message BindServiceEventsTrackerInfo {
        // the number of bind service requests by this app.
        optional int32 bind_service_requests = 1;
    }
    optional BindServiceEventsTrackerInfo bind_service_events_tracker_info =
        8 [(log_mode) = MODE_BYTES];

    // The reasons listed below are defined in PowerExemptionManager.java
    enum ExemptionReason {
        // range 0-9 is reserved for default reasons
        REASON_UNKNOWN = 0;
        REASON_DENIED = 1;
        REASON_OTHER = 2;
        // range 10-49 is reserved for BG-FGS-launch allowed proc states
        REASON_PROC_STATE_PERSISTENT = 10;
        REASON_PROC_STATE_PERSISTENT_UI = 11;
        REASON_PROC_STATE_TOP = 12;
        REASON_PROC_STATE_BTOP = 13;
        REASON_PROC_STATE_FGS = 14;
        REASON_PROC_STATE_BFGS = 15;
        // range 50-99 is reserved for BG-FGS-launch allowed reasons
        REASON_UID_VISIBLE = 50;
        REASON_SYSTEM_UID = 51;
        REASON_ACTIVITY_STARTER = 52;
        REASON_START_ACTIVITY_FLAG = 53;
        REASON_FGS_BINDING = 54;
        REASON_DEVICE_OWNER = 55;
        REASON_PROFILE_OWNER = 56;
        REASON_COMPANION_DEVICE_MANAGER = 57;
        REASON_BACKGROUND_ACTIVITY_PERMISSION = 58;
        REASON_BACKGROUND_FGS_PERMISSION = 59;
        REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION = 60;
        REASON_INSTR_BACKGROUND_FGS_PERMISSION = 61;
        REASON_SYSTEM_ALERT_WINDOW_PERMISSION = 62;
        REASON_DEVICE_DEMO_MODE = 63;
        REASON_ALLOWLISTED_PACKAGE = 65;
        REASON_APPOP = 66;
        REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD = 67;
        REASON_OP_ACTIVATE_VPN = 68;
        REASON_OP_ACTIVATE_PLATFORM_VPN = 69;
        REASON_TEMP_ALLOWED_WHILE_IN_USE = 70;
        REASON_CURRENT_INPUT_METHOD = 71;
        // range 100-199 is reserved for public reasons
        REASON_GEOFENCING = 100;
        REASON_PUSH_MESSAGING = 101;
        REASON_PUSH_MESSAGING_OVER_QUOTA = 102;
        REASON_ACTIVITY_RECOGNITION = 103;
        REASON_ACCOUNT_TRANSFER = 104;
        // range 200-299 is reserved for broadcast actions
        REASON_BOOT_COMPLETED = 200;
        REASON_PRE_BOOT_COMPLETED = 201;
        REASON_LOCKED_BOOT_COMPLETED = 202;
        REASON_BLUETOOTH_BROADCAST = 203;
        REASON_TIMEZONE_CHANGED = 204;
        REASON_TIME_CHANGED = 205;
        REASON_LOCALE_CHANGED = 206;
        REASON_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED = 207;
        REASON_REFRESH_SAFETY_SOURCES = 208;
        // range 300-399 is reserved for other internal reasons
        REASON_SYSTEM_ALLOW_LISTED = 300;
        REASON_ALARM_MANAGER_ALARM_CLOCK = 301;
        REASON_ALARM_MANAGER_WHILE_IDLE = 302;
        REASON_SERVICE_LAUNCH = 303;
        REASON_KEY_CHAIN = 304;
        REASON_PACKAGE_VERIFIER = 305;
        REASON_SYNC_MANAGER = 306;
        REASON_DOMAIN_VERIFICATION_V1 = 307;
        REASON_DOMAIN_VERIFICATION_V2 = 308;
        REASON_VPN = 309;
        REASON_NOTIFICATION_SERVICE = 310;
        REASON_PACKAGE_REPLACED = 311;
        REASON_LOCATION_PROVIDER = 312;
        REASON_MEDIA_BUTTON = 313;
        REASON_EVENT_SMS = 314;
        REASON_EVENT_MMS = 315;
        REASON_SHELL = 316;
        REASON_MEDIA_SESSION_CALLBACK = 317;
        REASON_ROLE_DIALER = 318;
        REASON_ROLE_EMERGENCY = 319;
        REASON_SYSTEM_MODULE = 320;
        REASON_CARRIER_PRIVILEGED_APP = 321;
        REASON_DPO_PROTECTED_APP = 322;
        REASON_DISALLOW_APPS_CONTROL = 323;
        REASON_ACTIVE_DEVICE_ADMIN = 324;
        // app requested to be exempt
        REASON_OPT_OUT_REQUESTED = 1000;
    }
    // indicates if the app is exempt from background restrictions and the reason if applicable.
    optional ExemptionReason exemption_reason = 9;

    enum OptimizationLevel {
        UNKNOWN = 0;
        OPTIMIZED = 1;
        BACKGROUND_RESTRICTED = 2;
        NOT_OPTIMIZED = 3;
    }
    // the user choice for the optimization level of the app.
    optional OptimizationLevel opt_level = 10;

    enum TargetSdk {
        SDK_UNKNOWN = 0;
        SDK_PRE_S = 1;
        SDK_S = 2;
        SDK_T = 3;
    }
    // indicates the target sdk level for this app.
    optional TargetSdk target_sdk = 11;

    // indicates if the current device is a low ram device.
    optional bool low_mem_device = 12;

    // indicates previous background restriction level.
    optional RestrictionLevel previous_restriction_level = 13;
}

/**
 * Log that the permission reminder notification has been displayed or clicked.
 */
message PermissionReminderNotificationInteracted {
    // id which identifies single session of user interacting with permission
    // controller
    optional int64 session_id = 1;

    enum Result {
        UNDEFINED = 0;
        // notification was presented to the user
        NOTIFICATION_PRESENTED = 1;
        // notification was clicked by the user
        NOTIFICATION_CLICKED = 2;
    }

    // View / interaction recorded
    optional Result result = 2;
}

/**
 * Log that the user has interacted with the permission decision screen.
 */
message RecentPermissionDecisionsInteracted {
    // id which identifies single session of user interacting with permission
    // controller
    optional int64 session_id = 1;

    enum Action {
        ACTION_UNKNOWN = 0;
        SCREEN_VIEWED = 1;
        REVIEW_DECISION = 2;
        VIEW_ALL_CLICKED = 3;
    }

    // Action taken on the recent permission decisions page.
    optional Action action = 2;

    // Uid of the package for the permission decision being reviewed
    optional int32 uid = 3 [(is_uid) = true];

    // Name of the permission for the permission decision being reviewed.
    optional string permission_group_name = 4;
}

/**
 * Logs for task manager events
 *
 * Logged from SystemUI
 */
message TaskManagerEventReported {

    enum Event {
        VIEWED = 1;
        STOPPED = 2;
    }

    optional int32 uid = 1 [(is_uid) = true];

    optional Event event = 2;

    optional int64 time_running_ms = 3;
}

/** Log for autofill events. This captures events till the view goes out of
 * focus. For each auttofilled view going out of focus, and coming back, a
 * separate event would be generated.
 *
 * Logged from:
 * frameworks/base/services/autofill/java/com/android/server/autofill/
 */
message AutofillPresentationEventReported {
  enum PresentationEventResult {
    NONE_SHOWN_UNKNOWN_REASON =
        0;  // Includes reasons where losses can be partial: eg: IME not showing
            // certain datasets, while others are filtered out because user
            // started typing. So, it can either refer to a set of mixed of
            // known or unknown reasons.
    ANY_SHOWN =
        1;  // This is counter to the event name, but we need it in order to get
            // overall success rate.
    // Below ones corresponds to no presentation getting shown
    NONE_SHOWN_VIEW_FOCUS_CHANGED =
        2;  // User action leads to focus getting shifted to another field
    NONE_SHOWN_VIEW_CHANGED =
        3;  // This would also include if view becomes invisible.
    NONE_SHOWN_ACTIVITY_FINISHED = 4;  // Eg: User pressed back
    NONE_SHOWN_REQUEST_TIMEOUT =
        5;  // Autofill provider didn't respond in the given time.
    NONE_SHOWN_SESSION_COMMITTED_PREMATURELY =
        6;  // Session was prematurely committed. This can happen due to various
            // reasons, eg: app developers calling commit() earlier than when
            // they should.
  }

  // Id number which increases for each subsequent request.
  optional int32 request_id = 1;

  // SessionId to aggregate requests within a session, and see overall
  // performance.
  optional int32 session_id = 2;

  // Result of autofill event.
  optional PresentationEventResult presentation_event_result = 3;

  // Count of datasets that should've been available for display. If the request
  // times out, this won't be populated.
  optional int32 available_count = 4;

  // Count of datasets that are shown to the user.
  optional int32 count_shown = 5;

  // Count of datasets that are eligible to be shown to the user, but aren't
  // shown because user started typing already, and the results were filtered.
  // If the user starts typing, dataset isn't shown at the moment, but then the
  // user deletes text, and the dataset becomes visible, it would count as
  // shown, and not as filtered out.
  optional int32 count_filtered_user_typing = 6;

  // Count of datasets that aren't shown because IME didn't use datasets at all.
  optional int32 count_not_shown_unused_by_ime = 7;

  // Count of datasets that are eligible to be shown to the user, but aren't
  // shown because display didn't show them (probably user didn't scroll to see
  // the view). The dataset was requested by display, but not shown.
  optional int32 count_not_shown_never_visible = 8;

  // How the dataset is supposed to be shown to the user
  optional AutofillDisplayPresentationType display_presentation_type = 9;
}

// Tells how Autofill dataset was/will-be displayed.
enum AutofillDisplayPresentationType {
  UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE = 0;
  MENU = 1;    // aka drop-down
  INLINE = 2;  // shown via IME
  DIALOG = 3;  // aka Bottom-sheet dialog
}

/**
 * Logs when text and reading options changed.
 *
 * Logged from:
 *   packages/apps/Settings/src/com/android/settings/accessibility
 */
message AccessibilityTextReadingOptionsChanged {
    // The item name of the accessibility feature "Text and Reading Options".
    optional android.stats.accessibility.TextReadingOption name = 1;

    // The status value of the item of the accessibility feature "Text and Reading Options".
    optional int32 value = 2;

    // The entry point from which page.
    optional android.stats.accessibility.TextReadingEntry entry_point = 3;
}

/** Log the CompanionDeviceManager associations are created by various device
 * profiles
 *
 * Logged from:
 * frameworks/base/services/companion/java/com/android/server/companion/
 * CompanionDeviceManagerService.java
 */
message CdmAssociationAction {
    enum Action {
        UNKNOWN = 0;
        CREATED = 1;
        REMOVED = 2;
    }

    enum DeviceProfile{
        DEVICE_PROFILE_NULL = 0;
        DEVICE_PROFILE_WATCH = 1;
        DEVICE_PROFILE_APP_STREAMING = 2;
        DEVICE_PROFILE_AUTO_PROJECTION = 3;
        DEVICE_PROFILE_COMPUTER = 4;
    }

    // Action taken on the CDM association been created by companion apps.
    optional Action action = 1;

    // Name of the CDM Association Request profiles.
    optional DeviceProfile device_profile = 2;
}

/**
 * Logs when a telephony anomaly is reported.
 *
 * Logged from:
 *   frameworks/base/telephony/java/android/telephony/AnomalyReporter.java
 */
message TelephonyAnomalyDetected {
    // Carrier ID of the SIM card.
    // See https://source.android.com/devices/tech/config/carrierid.
    optional int32 carrier_id = 1;
    // UUID of the anomaly, as generated by android.telephony.AnomalyReporter
    optional int64 event_id_lsb = 2;
    optional int64 event_id_msb = 3;
}
/*
 * Pushed atom logged by ONS service.
 */
message OnsOpportunisticEsimProvisioningComplete {
    enum ResultCode {
        // Unknown
        RESULT_UNKNOWN = 0;

        // Operation was successful.
        RESULT_SUCCESS = 1;

        // Device capabilities not met such as eSIM and MultiSIM not supported.
        RESULT_DEVICE_NOT_CAPABLE = 2;

        // Internet connection is not available while trying to download opportunistic eSIM.
        RESULT_INTERNET_NOT_AVAILABLE = 3;

        // Error occurred while switching device from Single to MultiSIM mode.
        RESULT_SWITCH_TO_MULTISIM_FAILED = 4;

        // Connection error occurred while downloading opportunistic eSIM from SMDP server.
        RESULT_CONNECTION_ERROR = 5;

        // Download failed because there is no sufficient storage available in eUICC memory.
        RESULT_MEMORY_FULL = 6;

        // Installation of downloaded eSIM failed.
        RESULT_INSTALL_ESIM_PROFILE_FAILED = 7;

        // Unresolvable errors such as Invalid SMDP address or activation code.
        RESULT_UNRESOLVABLE_ERROR = 8;

        //Auto provisioning disabled
        RESULT_AUTO_PROVISIONING_DISABLED = 9;
    }

    // CBRS carrier id. Filled only while reporting failure cases.
    optional int32 carrier_id = 1;

    // carrier id of the opportunistic eSIM downloaded from the SMDP server.
    // Filled only while reporting failure cases.
    optional int32 opportunistic_esim_carrier_id = 2;

    // Flag to indicate that the data connection was used for downloading.
    optional bool is_mobile_data_used = 3;

    // Error code occurred during the above operation.
    optional ResultCode error_code = 4;

    // Retry count of the above operation.
    optional int32 retry_count = 5;

    // Detailed error code.
    optional int32 detailed_error_code = 6;
}

/**
 * Logs when a background dexopt job is ended.
 *
 * Logged from:
 *   frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java
 */
message BackgroundDexoptJobEnded {
    // Corresponds to `BackgroundDexOptService.Status`, except for
    // `STATUS_JOB_FINISHED`.
    enum Status {
        STATUS_UNKNOWN = 0;

        // The job has finished. This value is used even if some packages have
        // failed compilation during the job. (Corresponds to either
        // `BackgroundDexOptService.Status.STATUS_OK` or
        // `BackgroundDexOptService.Status.STATUS_DEX_OPT_FAILED`.)
        STATUS_JOB_FINISHED = 1;

        STATUS_ABORT_BY_CANCELLATION = 2;
        STATUS_ABORT_NO_SPACE_LEFT = 3;
        STATUS_ABORT_THERMAL = 4;
        STATUS_ABORT_BATTERY = 5;
    }

    optional Status status = 1;

    // If `status` is `STATUS_ABORT_BY_CANCELLATION`, the reason of the
    // cancellation.
    optional android.app.job.StopReasonEnum cancellation_reason = 2;

    // The duration of the job run, in milliseconds, not counting time spent in
    // sleep.
    optional int64 duration_ms = 3;

    // The duration of the job run, in milliseconds, including time spent in
    // sleep.
    optional int64 duration_including_sleep_ms = 4;
}

/**
 * Logs information about sync exemptions when they occur.
 *
 * Logged from:
 *      frameworks/base/services/core/java/com/android/server/content/ContentService.java
 */
message SyncExemptionOccurred {
    optional int32 uid = 1 [(is_uid) = true]; // the uid of the app.

    enum ProcState {
        UNKNOWN = 0;
        PERSISTENT = 1;
        PERSISTENT_UI = 2;
        TOP = 3;
        BOUND_TOP = 4;
        FOREGROUND_SERVICE = 5;
        BOUND_FOREGROUND_SERVICE = 6;
        IMPORTANT_FOREGROUND = 7;
        IMPORTANT_BACKGROUND = 8;
        TRANSIENT_BACKGROUND = 9;
        BACKUP = 10;
        SERVICE = 11;
        RECEIVER = 12;
        TOP_SLEEPING = 13;
        HEAVY_WEIGHT = 14;
        HOME = 15;
        LAST_ACTIVITY = 16;
        CACHED_ACTIVITY = 17;
        CACHED_ACTIVITY_CLIENT = 18;
        CACHED_RECENT = 19;
        CACHED_EMPTY = 20;
    }
    optional ProcState proc_state = 2; // the proc state of the app when the exemption occurred.

    optional bool is_uid_active = 3; // was the uid active when the exemption occurred.

    optional AppBackgroundRestrictionsInfo.RestrictionLevel restriction_level = 4;
}

// Logs when the remote key provisioner application is invoked, either
// due to a periodically scheduled job, due to an attestation key being
// consumed from the pool, or when the system has detected that it's
// completely out of attestation keys.
//
// Logged from:
//   packages/apps/RemoteProvisioner/src/com/android/remoteprovisioner/
message RemoteKeyProvisioningAttempt {
    // The reason for the provisioning attempt.
    enum Cause {
        CAUSE_UNKNOWN = 0;
        SCHEDULED = 1;          // A scheduled job issued the request
        KEY_CONSUMED = 2;       // A provisioned key was consumed from the pool
        OUT_OF_KEYS = 3;        // The system is out of keys
    }
    optional Cause cause = 1;

    // The name of the remotely provisioned component for whom keys are being
    // generated and certified. The string value is determined by the vendor,
    // and is fixed for the lifetime of the device. The number of unique string
    // values on a given device is determined by how many remotely provisioned
    // component HALs are on a given device. Typically, this is 2-3 HALs.
    optional string remotely_provisioned_component = 2;

    // The uptime of the device, organized into time ranges of interest.
    enum UpTime {
        UPTIME_UNKNOWN = 0;
        LESS_THAN_5_MINUTES = 1;
        BETWEEN_5_AND_60_MINUTES = 2;
        MORE_THAN_60_MINUTES = 3;
    }
    optional UpTime uptime = 3;

    // The state of remote provisioning enablement
    enum Enablement {
        ENABLEMENT_UNKNOWN = 0;
        ENABLED_WITH_FALLBACK = 1;
        ENABLED_RKP_ONLY = 2;
        DISABLED = 3;
    }
    optional Enablement enablement = 4;

    // If the key pool is completely exhausted, this is set to true. Typically,
    // we do not expect to see a pool with no spare keys available.
    optional bool is_key_pool_empty = 5;

    // Indicates success or failure of the provisioning attempt.
    optional com.android.remoteprovisioner.RemoteKeyProvisioningStatus status = 6;
}

// Logs that correlate remote key provisioning status with the active
// network for the given provisioning attempt.
//
// Logged from:
//   packages/apps/RemoteProvisioner/src/com/android/remoteprovisioner/
message RemoteKeyProvisioningNetworkInfo {
    // The network transport, according ConnectivityManager::getActiveNetwork().
    optional android.stats.connectivity.TransportType transport_type = 1;

    // Indicates success or failure of the provisioning attempt.
    optional com.android.remoteprovisioner.RemoteKeyProvisioningStatus status = 2;

    // If an HTTP error was received, this contains the code. Else, contains 200.
    optional int32 http_status_error = 3;
}

// Logs indicating timing data to understand how long the remote provisioner is
// taking to perform various sub-tasks. This is intended to be used with KLL metrics.
//
// Logged from:
//   packages/apps/RemoteProvisioner/src/com/android/remoteprovisioner/
message RemoteKeyProvisioningTiming {
    // Time spent waiting on the RKP service to reply.
    optional int32 server_wait_millis = 1;

    // Time spent waiting on internal binder calls to the provisioning service.
    optional int32 binder_wait_millis = 2;

    // Time spent waiting on the serialization lock.
    optional int32 lock_wait_millis = 3;

    // Total time spent processing the attempt.
    optional int32 total_processing_time = 4;

    // The network transport, according ConnectivityManager::getActiveNetwork().
    optional android.stats.connectivity.TransportType transport_type = 5;

    // The name of the remotely provisioned component for whom keys are being
    // generated and certified. The string value is determined by the vendor,
    // and is fixed for the lifetime of the device. The number of unique string
    // values on a given device is determined by how many remotely provisioned
    // component HALs are on a given device. Typically, this is 2-3 HALs.
    optional string remotely_provisioned_component = 6;
}

// Counters that track how many errors we're seeing on the device for the
// given boot.
//
// Logged from:
//   packages/apps/RemoteProvisioner/src/com/android/remoteprovisioner/
message RemoteKeyProvisioningErrorCounts {
    // The total number of RKP attempts there have been this boot.
    optional int32 total_count = 1;

    // How many errors this device has encountered this boot.
    optional int32 error_count = 2;

    // How many bytes of data have been sent that resulted in errors. These
    // bytes count against an error budget, so it's important to track.
    optional int32 error_bytes = 3;
}

// Logs the overall Safety State of the device (as cached by the Safety Center)
message SafetyState {
    // The overall severity level of the Safety Center.
    optional android.stats.safetycenter.SafetySeverityLevel overall_severity_level = 1;

    // The number of open issues in the Safety Center.
    optional int64 open_issues_count = 2;

    // The number of dismissed issues in the Safety Center.
    optional int64 dismissed_issues_count = 3;
}

// Logs the state of an individual Safety Source when overall SafetyState is
// collected.
message SafetySourceStateCollected {
    optional int64 encoded_safety_source_id = 1;

    optional android.stats.safetycenter.SafetySourceProfileType safety_source_profile_type = 2;

    // The severity level of this source.
    optional android.stats.safetycenter.SafetySeverityLevel severity_level = 3;

    // The number of open issues belonging to this Safety Source.
    optional int64 open_issues_count = 4;

    // The number of dismissed issues belonging to this Safety Source.
    optional int64 dismissed_issues_count = 5;
}

// Logs system-health and performance related events from the Safety Center
message SafetyCenterSystemEventReported {
    enum EventType {
        EVENT_TYPE_UNKNOWN = 0;
        SINGLE_SOURCE_GET_NEW_DATA = 1;
        SINGLE_SOURCE_RESCAN = 2;
        COMPLETE_GET_NEW_DATA = 3;
        COMPLETE_RESCAN = 4;
        INLINE_ACTION = 5;
    }
    optional EventType event_type = 1;

    // Unset if this event isn't source-specific.
    optional int64 encoded_safety_source_id = 2;

    // Unset if this event isn't source-specific.
    optional android.stats.safetycenter.SafetySourceProfileType safety_source_profile_type = 3;

    // Unset if this event isn't specific to an issue.
    optional int64 encoded_issue_type_id = 4;

    optional int64 duration_millis = 5;

    enum Result {
        RESULT_UNKNOWN = 0;
        SUCCESS = 1;
        TIMEOUT = 2;
        ERROR = 3;
    }
    optional Result result = 6;
}

// Logs a user interaction with the Safety Center. Various fields may or may not be
// set depending on the Action reported.
message SafetyCenterInteractionReported {
    // ID which identifies single session of user interacting with Safety Center.
    optional int64 session_id = 1;

    enum Action {
        ACTION_UNKNOWN = 0;

        SAFETY_CENTER_VIEWED = 1;
        SAFETY_ISSUE_VIEWED = 2;

        SCAN_INITIATED = 3;

        ISSUE_PRIMARY_ACTION_CLICKED = 4;
        ISSUE_SECONDARY_ACTION_CLICKED = 5;
        ISSUE_DISMISS_CLICKED = 6;

        MORE_ISSUES_CLICKED = 7;
        ENTRY_CLICKED = 8;
        ENTRY_ICON_ACTION_CLICKED = 9;
        STATIC_ENTRY_CLICKED = 10;

        PRIVACY_CONTROL_TOGGLE_CLICKED = 11;
        SENSOR_PERMISSION_REVOKE_CLICKED = 12;
        SENSOR_PERMISSION_SEE_USAGES_CLICKED = 13;
        REVIEW_SETTINGS_CLICKED = 14;
    }

    // Action taken in the Safety Center.
    optional Action action = 2;

    enum ViewType {
        VIEW_TYPE_UNKNOWN = 0;
        FULL = 1;
        QUICK_SETTINGS = 2;
    }

    // Which view of the Safety Center this interaction occurred in.
    optional ViewType view_type = 3;

    enum NavigationSource {
        SOURCE_UNKNOWN = 0;
        NOTIFICATION = 1;
        QUICK_SETTINGS_TILE = 2;
        SETTINGS = 3;
        SENSOR_INDICATOR = 4;
    }

    // Where the session was initiated from.
    optional NavigationSource navigation_source = 4;

    // Severity level of the particular issue or entry, or the overall Safety
    // Center this interaction is associated with.
    optional android.stats.safetycenter.SafetySeverityLevel severity_level = 5;

    // The hashed ID of the Safety Source that this interaction was with performed with,
    // or nothing if this event isn't source-specific.
    optional int64 encoded_safety_source_id = 6;

    // The kind of profile that this safety source originated from (sources from
    // personal and work profiles may have the same source ID)
    optional android.stats.safetycenter.SafetySourceProfileType safety_source_profile_type = 7;

    // A hash of the loggable issue type ID that this interaction was performed with.
    optional int64 encoded_issue_type_id = 8;

    enum Sensor {
        SENSOR_UNKNOWN = 0;
        MICROPHONE = 1;
        CAMERA = 2;
        LOCATION = 3;
    }

    // Which sensor was associated with this interaction (if any).
    optional Sensor sensor = 9;
}

message PrivacySignalNotificationInteraction {

    enum Action {
        UNKNOWN = 0;
        NOTIFICATION_SHOWN = 1;
        NOTIFICATION_CLICKED = 2;
        DISMISSED = 3;
    }

    // Privacy source that triggered the notification
    optional android.stats.privacysignals.PrivacySource privacy_source = 1;

    // Optional Uid of the package for which the notification was sent.
    optional int32 uid = 2 [(is_uid) = true];

    // Action taken on the notification.
    optional Action action = 3;

    // Session Id to link the notification with the issue card.
    optional int64 session_id = 4; // to map the notification and issue card interaction
}

message PrivacySignalIssueCardInteraction {

    enum Action {
        ACTION_UNKNOWN = 0;
        CARD_SHOWN = 1;
        CARD_CLICKED = 2;
        CARD_DISMISSED = 3;
        CLICKED_CTA1 = 4;
        CLICKED_CTA2 = 5;
    }

    // Privacy source  that pushed the issue card.
    optional android.stats.privacysignals.PrivacySource privacy_source = 1;

    // Optional Uid of the package for which the issue card was sent.
    optional int32 uid = 2 [(is_uid) = true];

    // Action taken on the issue card.
    optional Action action = 3;

    // Session Id to link the notification with the issue card.
    optional int64 session_id = 4;
}

message PrivacySignalsJobFailure {

    // Which privacy source for which the daily job failed.
    optional android.stats.privacysignals.PrivacySource privacy_source = 1;

    enum JobFailureReason {
        REASON_UNKNOWN = 0;
        TIMEOUT = 1;
        COROUTINE_CANCELLED = 2;
    }
    optional JobFailureReason reason =2;
}

// Logs when an API call from app to sandbox process is made
message SandboxApiCalled {
    enum Method {
        METHOD_UNSPECIFIED = 0;
        LOAD_SDK = 1;
        LOAD_SANDBOX_AND_SDK = 2;
        REQUEST_SURFACE_PACKAGE = 3;
    }

    // The method which was called.
    optional Method method = 1;

    //Time taken from the initiation of the API till the callback was received
    optional int32 latency_millis = 2;

    // The success status of the callback
    optional bool success = 3;
}

//Logs periodically the storage of SDKs used by the app
message SandboxSdkStorage {

    // Boolean value to specify if the storage belongs to SDK or is shared
    optional bool shared = 1;

    // Storage
    optional int32 storage_kb = 2;
}

/**
 * Logs stats on the download status of file groups. Provides information on
 * download latency and download penetration.
 */
message MobileDataDownloadFileGroupDownloadStatusReported {
  // The status of the file group on device: PENDING, DOWNLOADED, FAILED
  optional android.stats.mobiledatadownload.DownloadStatus
      file_group_download_status = 1;
  // Timestamp of when this file group was added to the device.
  optional int64 group_added_timestamp = 2;
  // Timestamp of when MDD completed downloading the file group.
  optional int64 group_downloaded_timestamp = 3;
  // Stats specific to the file group
  optional MobileDataDownloadFileGroupStats file_group_stats = 4 [(android.os.statsd.log_mode) = MODE_BYTES];
  // Number of days since the last time the device attempted to log file group download status for any file group.
  optional int32 days_since_last_log = 5;
}

/** Shared data among MobileDataDownload statistics. Not meant to be a top level atom proto.*/
message MobileDataDownloadFileGroupStats {
  // The name of the file group. This a string set server side used to retrieve
  // the files. Does not contain PII.
  optional string file_group_name = 1;
  // Allows the clients to identify a file group based on a given set of
  // properties. This string is set server side and does not contain PII.
  optional string variant_id = 2;
  // Identifier for the data file group created to identify the version of the
  // file group.
  optional int64 build_id = 3;
  // The number of files in the file group.
  optional int32 file_count = 4;
  // Whether the file group has an account associated with it.
  optional bool has_account = 5;
  // Inverse of the sampling rate used to sample this event.
  optional int32 sampling_interval = 6;
  // Note: we do not have owner_package since that's already transmitted.
}