/*
 * Copyright (C) 2016 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";
option java_multiple_files = true;

package android.os;

import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/os/powermanager.proto";
import "frameworks/base/core/proto/android/telephony/enums.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";

message BatteryStatsProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    optional int32 report_version = 1;
    optional int64 parcel_version = 2;
    optional string start_platform_version = 3;
    optional string end_platform_version = 4;
    repeated UidProto uids = 5;
    optional SystemProto system = 6;
}

message ControllerActivityProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    // Time (milliseconds) spent in the idle state.
    optional int64 idle_duration_ms = 1;
    // Time (milliseconds) spent in the receive state.
    optional int64 rx_duration_ms = 2;
    // Total power (mAh) consumed by the controller in all states. The value may
    // always be 0 if the device doesn't support power calculations.
    optional int64 power_mah = 3;

    // Represents a transmit level, where each level may draw a different amount
    // of power. The levels themselves are controller-specific (and may possibly
    // be device specific...yet to be confirmed).
    message TxLevel {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Transmit level. Higher levels draw more power.
        optional int32 level = 1;
        // Time spent in this specific transmit level state.
        optional int64 duration_ms = 2;
    }
    repeated TxLevel tx = 4;
}

message SystemProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    message Battery {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Wall clock time when the data collection started.
        // In case of device time manually reset by users:
        //     start_clock_time_ms keeps the same value in the current collection
        //     period and changes for later collection periods.
        optional int64 start_clock_time_ms = 1;
        // #times the device has been started since start_clock_time_millis.
        optional int64 start_count = 2;
        // Total realtime duration (= SINCE_UNPLUGGED battery_realtime_millis.)
        optional int64 total_realtime_ms = 3;
        optional int64 total_uptime_ms = 4;
        // Realtime duration on battery.
        optional int64 battery_realtime_ms = 5;
        // Uptime duration (i.e., not suspend).
        // Uptime is anytime the CPUs were on. The radio and Wifi chip
        // can be running while the CPUs are off.
        optional int64 battery_uptime_ms = 6;
        // Total realtime duration measured with screen off or dozing.
        optional int64 screen_off_realtime_ms = 7;
        // Total uptime duration measured with screen off or dozing.
        optional int64 screen_off_uptime_ms = 8;
        // Total time the screen was dozing while the device was running on battery.
        // For historical reasons, screen_doze_duration_msec is a subset of
        // screen_off_realtime_msec.
        optional int64 screen_doze_duration_ms = 9;
        // The estimated real battery capacity, which may be less than the declared
        // battery capacity (for example, because of battery aging). This field is
        // less reliable than min(max)_learned_battery_capacity_uah, use those two
        // fields whenever possible.
        optional int64 estimated_battery_capacity_mah = 10;
        // The minimum learned battery capacity in uAh.
        optional int64 min_learned_battery_capacity_uah = 11;
        // The maximum learned battery capacity in uAh.
        optional int64 max_learned_battery_capacity_uah = 12;
    };
    optional Battery battery = 1;

    message BatteryDischarge {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Discharged battery percentage points since the stats were last reset
        // after charging (lower bound approximation).
        optional int32 lower_bound_since_charge = 1;
        // Upper bound approximation.
        optional int32 upper_bound_since_charge = 2;
        // Discharged points while screen is on.
        optional int32 screen_on_since_charge = 3;
        // Discharged points while screen is off.
        optional int32 screen_off_since_charge = 4;
        // Discharged points while screen was dozing. For historical reasons,
        // screen_doze_since_charge is a subset of screen_off_since_charge.
        optional int32 screen_doze_since_charge = 5;
        // Total amount of battery discharged in mAh. This will only be non-zero for
        // devices that report battery discharge via a coulomb counter.
        optional int64 total_mah = 6;
        // Total amount of battery discharged while the screen was off in mAh.
        // This will only be non-zero for devices that report battery discharge
        // via a coulomb counter.
        optional int64 total_mah_screen_off = 7;
        // Total amount of battery discharged while the screen was dozing in mAh.
        // This will only be non-zero for devices that report battery discharge
        // via a coulomb counter. For historical reasons, total_mah_screen_doze is
        // a subset of total_mah_screen_off.
        optional int64 total_mah_screen_doze = 8;
        // Total amount of battery discharged in mAh while the device was in light doze mode.
        // This will only be non-zero for devices that report battery discharge
        // via a coulomb counter.
        optional int64 total_mah_light_doze = 9;
        // Total amount of battery discharged in mAh while the device was in deep doze mode.
        // This will only be non-zero for devices that report battery discharge
        // via a coulomb counter.
        optional int64 total_mah_deep_doze = 10;
    };
    optional BatteryDischarge battery_discharge = 2;

    oneof time_remaining {
        // Approximation for how much time remains until the battery is fully
        // charged. The device will print -1 if there wasn't enough data to
        // calculate an estimate, or if the battery is currently discharging.
        int64 charge_time_remaining_ms = 3;
        // Approximation for how much time remains until the battery is fully
        // discharged. The device will print -1 if there wasn't enough data to
        // calculate an estimate, or if the battery is currently charging.
        int64 discharge_time_remaining_ms = 4;
    }

    // BatteryLevelStep tracks data for which conditions were continuously held for
    // the entire duration. Field for which the conditions were not consistent
    // for the entire duration should be marked MIXED.
    message BatteryLevelStep {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // How long the battery was at the current level.
        optional int64 duration_ms = 1;
        // Battery level
        optional int32 level = 2;

        // State of the display. A special enum is used rather than
        // DisplayProto.State because a MIXED value needs to be in the enum, and
        // batterystats doesn't care about all of the different display states.
        enum DisplayState {
            DS_MIXED = 0;
            DS_ON = 1;
            DS_OFF = 2;
            DS_DOZE = 3;
            DS_DOZE_SUSPEND = 4;
            // Any display state error that comes through should be sent to hackbod@.
            DS_ERROR = 5;
        }
        // The state of the display for the entire battery level step. MIXED is used
        // if there were multiple states for this step.
        optional DisplayState display_state = 3;

        // Indicates status in power save mode.
        enum PowerSaveMode {
            PSM_MIXED = 0;
            PSM_ON = 1;
            PSM_OFF = 2;
        }
        // Battery Saver mode for the entire battery level step. MIXED is used
        // if there were multiple states for this step.
        optional PowerSaveMode power_save_mode = 4;

        // Indicates status in idle mode.
        enum IdleMode {
            IM_MIXED = 0;
            IM_ON = 2;
            IM_OFF = 3;
        }
        // Doze mode for the entire battery level step. MIXED is used if there were
        // multiple states for this step.
        optional IdleMode idle_mode = 5;
    };
    // Battery level steps when the device was charging.
    repeated BatteryLevelStep charge_step = 5;
    // Battery level steps when the device was discharging.
    repeated BatteryLevelStep discharge_step = 6;

    // All CPU frequencies of the device.
    repeated int64 cpu_frequency = 7;

    message DataConnection {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;
        oneof type {
            android.telephony.NetworkTypeEnum name = 1;
            // If is_none is not set, then the name is a valid network type.
            bool is_none = 2;
        }
        optional TimerProto total = 3;
    };
    repeated DataConnection data_connection = 8;

    optional ControllerActivityProto global_bluetooth_controller = 9;
    optional ControllerActivityProto global_modem_controller = 10;
    optional ControllerActivityProto global_wifi_controller = 11;

    message GlobalNetwork {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Total Bytes received on mobile connections.
        optional int64 mobile_bytes_rx = 1;
        // Total Bytes transmitted on mobile connections.
        optional int64 mobile_bytes_tx = 2;
        // Total Bytes received on wifi connections.
        optional int64 wifi_bytes_rx = 3;
        // Total Bytes transmitted on wifi connections.
        optional int64 wifi_bytes_tx = 4;
        // Total Packets received on mobile connections.
        optional int64 mobile_packets_rx = 5;
        // Total Packets transmitted on mobile connections.
        optional int64 mobile_packets_tx = 6;
        // Total Packets received on wifi connections.
        optional int64 wifi_packets_rx = 7;
        // Total Packets transmitted on wifi connections.
        optional int64 wifi_packets_tx = 8;
        // Total Bytes received on bluetooth connections.
        optional int64 bt_bytes_rx = 9;
        // Total Bytes transmitted on bluetooth connections.
        optional int64 bt_bytes_tx = 10;
    };
    optional GlobalNetwork global_network = 12;

    message GlobalWifi {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // The amount of time that wifi has been on while the device was running on
        // battery.
        optional int64 on_duration_ms = 1;
        // The amount of time that wifi has been on and the driver has been in the
        // running state while the device was running on battery.
        optional int64 running_duration_ms = 2;
    }
    optional GlobalWifi global_wifi = 13;

    // Kernel wakelock metrics are only recorded when the device is unplugged
    // *and* the screen is off.
    message KernelWakelock {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string name = 1;
        // Kernel wakelock stats aren't apportioned across all kernel wakelocks (as
        // app wakelocks stats are).
        optional TimerProto total = 2;
        // The kernel doesn't have the data to enable printing out current and max
        // durations.
    };
    repeated KernelWakelock kernel_wakelock = 14;

    message Misc {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int64 screen_on_duration_ms = 1;
        optional int64 phone_on_duration_ms = 2;
        optional int64 full_wakelock_total_duration_ms = 3;
        // The total elapsed time that a partial wakelock was held. This duration
        // does not double count wakelocks held at the same time.
        optional int64 partial_wakelock_total_duration_ms = 4;
        optional int64 mobile_radio_active_duration_ms = 5;
        // The time that is the difference between the mobile radio time we saw
        // based on the elapsed timestamp when going down vs. the given time stamp
        // from the radio.
        optional int64 mobile_radio_active_adjusted_time_ms = 6;
        optional int32 mobile_radio_active_count = 7;
        // The amount of time that the mobile network has been active (in a high
        // power state) but not being able to blame on an app.
        optional int32 mobile_radio_active_unknown_duration_ms = 8;
        // Total amount of time the device was in the interactive state.
        optional int64 interactive_duration_ms = 9;
        optional int64 battery_saver_mode_enabled_duration_ms = 10;
        optional int32 num_connectivity_changes = 11;
        // Amount of time the device was in deep Doze.
        optional int64 deep_doze_enabled_duration_ms = 12;
        // How many times the device went into deep Doze mode.
        optional int32 deep_doze_count = 13;
        // Amount of time the device was idling in deep Doze. Idling time
        // encompasses "doze" time and the maintenance windows that allow apps to
        // operate.
        optional int64 deep_doze_idling_duration_ms = 14;
        // How many times the device idling for deep Doze mode.
        optional int32 deep_doze_idling_count = 15;
        optional int64 longest_deep_doze_duration_ms = 16;
        // Amount of time the device was in Doze Light.
        optional int64 light_doze_enabled_duration_ms = 17;
        // How many times the device went into Doze Light mode.
        optional int32 light_doze_count = 18;
        // Amount of time the device was idling in Doze Light. Idling time
        // encompasses "doze" time and the maintenance windows that allow apps to
        // operate.
        optional int64 light_doze_idling_duration_ms = 19;
        // How many times the device idling for Doze Light mode.
        optional int32 light_doze_idling_count = 20;
        optional int64 longest_light_doze_duration_ms = 21;
    }
    optional Misc misc = 15;

    message PhoneSignalStrength {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional android.telephony.SignalStrengthEnum name = 1;
        optional TimerProto total = 2;
    };
    repeated PhoneSignalStrength phone_signal_strength = 16;

    message PowerUseItem {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        enum Sipper {
            UNKNOWN_SIPPER = 0;
            IDLE = 1;
            CELL = 2;
            PHONE = 3;
            WIFI = 4;
            BLUETOOTH = 5;
            FLASHLIGHT = 6;
            SCREEN = 7;
            USER = 8;
            UNACCOUNTED = 9;
            OVERCOUNTED = 10;
            CAMERA = 11;
            MEMORY = 12;
            AMBIENT_DISPLAY = 13;
        };
        optional Sipper name = 1;
        // UID, only valid for the USER sipper.
        optional int32 uid = 2;
        // Estimated power use in mAh.
        optional double computed_power_mah = 3;
        // Starting in Oreo, Battery Settings has two modes to display the battery
        // info. The first is "app usage list". In this mode, items with should_hide
        // enabled are hidden.
        optional bool should_hide = 4;
        // Smeared power from screen usage. Screen usage power is split and smeared
        // among apps, based on activity time.
        optional double screen_power_mah = 5;
        // Smeared power using proportional method. Power usage from hidden sippers
        // is smeared to all apps proportionally (except for screen usage).
        optional double proportional_smear_mah = 6;
    };
    repeated PowerUseItem power_use_item = 17;

    message PowerUseSummary {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional double battery_capacity_mah = 1;
        optional double computed_power_mah = 2;
        // Lower bound of actual power drained.
        optional double min_drained_power_mah = 3;
        // Upper bound of actual power drained.
        optional double max_drained_power_mah = 4;
    };
    optional PowerUseSummary power_use_summary = 18;

    message ResourcePowerManager {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Either StateName or StateName.VoterName.
        optional string name = 1;
        optional TimerProto total = 2;
        optional TimerProto screen_off = 3;
    }
    repeated ResourcePowerManager resource_power_manager = 19;

    message ScreenBrightness {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        enum Name {
            DARK = 0; // Not screen-off.
            DIM = 1;
            MEDIUM = 2;
            LIGHT = 3;
            BRIGHT = 4;
        };
        optional Name name = 1;
        optional TimerProto total = 2;
    };
    repeated ScreenBrightness screen_brightness = 20;

    // Duration and number of times trying to acquire a signal
    optional TimerProto signal_scanning = 21;

    message WakeupReason {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string name = 1;
        optional TimerProto total = 2;
    };
    repeated WakeupReason wakeup_reason = 22;

    message WifiMulticastWakelockTotal {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int64 duration_ms = 1;
        optional int32 count = 2;
    }
    optional WifiMulticastWakelockTotal wifi_multicast_wakelock_total = 23;

    message WifiSignalStrength {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        enum Name {
            NONE = 0;
            POOR = 1;
            MODERATE = 2;
            GOOD = 3;
            GREAT = 4;
        };
        optional Name name = 1;
        optional TimerProto total = 2;
    };
    repeated WifiSignalStrength wifi_signal_strength = 24;

    message WifiState {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        enum Name {
            OFF = 0;
            OFF_SCANNING = 1;
            ON_NO_NETWORKS = 2;
            ON_DISCONNECTED = 3;
            ON_CONNECTED_STA = 4;
            ON_CONNECTED_P2P = 5;
            ON_CONNECTED_STA_P2P = 6;
            SOFT_AP = 7;
        };
        optional Name name = 1;
        optional TimerProto total = 2;
    };
    repeated WifiState wifi_state = 25;

    message WifiSupplicantState {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        enum Name {
            INVALID = 0;
            DISCONNECTED = 1;
            INTERFACE_DISABLED = 2;
            INACTIVE = 3;
            SCANNING = 4;
            AUTHENTICATING = 5;
            ASSOCIATING = 6;
            ASSOCIATED = 7;
            FOUR_WAY_HANDSHAKE = 8;
            GROUP_HANDSHAKE = 9;
            COMPLETED = 10;
            DORMANT = 11;
            UNINITIALIZED = 12;
        };
        optional Name name = 1;
        optional TimerProto total = 2;
    };
    repeated WifiSupplicantState wifi_supplicant_state = 26;
}

message TimerProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    // This may be an apportioned time.
    optional int64 duration_ms = 1;
    optional int64 count = 2;
    // The max duration if it is being tracked. Not all Timer subclasses
    // track the max duration.
    optional int64 max_duration_ms = 3;
    // The current time the timer has been active, if it is being tracked.
    // Not all Timer subclasses track the current duration.
    optional int64 current_duration_ms = 4;
    // The total cumulative duration (i.e. sum of past durations) that this timer
    // has been on since reset. This may differ from duration_ms since, depending
    // on the Timer, getTotalTimeLocked may represent the total 'blamed' or
    // 'pooled' time, rather than the actual time. By contrast, total_duration_ms
    // always gives the actual total time. Not all Timer subclasses track the
    // total duration.
    optional int64 total_duration_ms = 5;
}

message UidProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    // Combination of app ID and user ID.
    optional int32 uid = 1;

    // The statistics associated with a particular package.
    message Package {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string name = 1;

        message Service {
            option (android.msg_privacy).dest = DEST_AUTOMATIC;

            optional string name = 1;
            // Time spent started.
            optional int64 start_duration_ms = 2;
            optional int32 start_count = 3;
            optional int32 launch_count = 4;
        }
        repeated Service services = 2;
    }
    repeated Package packages = 2;

    optional ControllerActivityProto bluetooth_controller = 3;
    optional ControllerActivityProto modem_controller = 4;
    optional ControllerActivityProto wifi_controller = 5;

    // Bluetooth misc data.
    message BluetoothMisc {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Duration spent BLE scanning blamed on this App (i.e. apportioned to this
        // app amongst all apps doing BLE scanning; see explanation of 'apportioned'
        // in App's comment).
        optional TimerProto apportioned_ble_scan = 1;
        // Background times aren't apportioned.
        optional TimerProto background_ble_scan = 2;
        // Running unoptimized BLE scanning, as defined by Bluetooth's
        // AppScanStats.recordScanStart. As of May 2017, these are unfiltered,
        // non-opportunistic, non-first-match scans. Durations are not
        // pooled/apportioned.
        optional TimerProto unoptimized_ble_scan = 3;
        // Running unoptimized BLE scanning when app is in background. Durations are
        // not pooled/apportioned.
        optional TimerProto background_unoptimized_ble_scan = 4;
        // Count of results returned by BLE scanning.
        optional int32 ble_scan_result_count = 5;
        // Count of results returned by BLE scans when app is in background.
        // (Included in ble_scan_result_count.)
        optional int32 background_ble_scan_result_count = 6;
    }
    optional BluetoothMisc bluetooth_misc = 6;

    message Cpu {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Total CPU time with processes executing in userspace. Summed up across
        // multiple cores.
        optional int64 user_duration_ms = 1;
        // Total CPU time with processes executing kernel syscalls. Summed up across
        // multiple cores.
        optional int64 system_duration_ms = 2;

        // CPU time broken down by CPU frequency (go/cpu-battery-metrics).
        //
        // These are real CPU time measurement from the kernel, so their sum can
        // be different from the sum of user_duration_millis and
        // system_duration_millis, which are just approximations. Data is not
        // tracked when device is charging.
        message ByFrequency {
            option (android.msg_privacy).dest = DEST_AUTOMATIC;

            // Index of the frequency in system.cpu_frequency. It starts from 1, to
            // make it easier to analyze.
            optional int32 frequency_index = 1;
            // CPU time in milliseconds.
            optional int64 total_duration_ms = 2;
            // Screen-off CPU time in milliseconds.
            optional int64 screen_off_duration_ms = 3;
        }
        // CPU times accumulated across all process states.
        repeated ByFrequency by_frequency = 3;

        enum ProcessState {
            TOP = 0;
            FOREGROUND_SERVICE = 1;
            FOREGROUND = 2;
            BACKGROUND = 3;
            TOP_SLEEPING = 4;
            HEAVY_WEIGHT = 5;
            CACHED = 6;
        }
        // CPU times at different process states.
        message ByProcessState {
            option (android.msg_privacy).dest = DEST_AUTOMATIC;

            optional ProcessState process_state = 1;
            repeated ByFrequency by_frequency = 2;
        }
        repeated ByProcessState by_process_state = 4;
    }
    optional Cpu cpu = 7;

    // Duration is pooled/apportioned.
    optional TimerProto audio = 8;
    // Duration is pooled/apportioned.
    optional TimerProto camera = 9;
    // Duration is pooled/apportioned.
    optional TimerProto flashlight = 10;
    // Duration is not pooled/apportioned.
    optional TimerProto foreground_activity = 11;
    // Duration is not pooled/apportioned.
    optional TimerProto foreground_service = 12;
    // Duration is not pooled/apportioned.
    optional TimerProto vibrator = 13;
    // Duration is pooled/apportioned.
    optional TimerProto video = 14;

    message Job {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string name = 1;
        // Job times aren't apportioned.
        optional TimerProto total = 2;
        optional TimerProto background = 3;
    }
    repeated Job jobs = 15;

    message JobCompletion {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Job name.
        optional string name = 1;

        message ReasonCount {
            option (android.msg_privacy).dest = DEST_AUTOMATIC;

            optional android.app.job.StopReasonEnum name = 1;
            optional int32 count = 2;
        }
        repeated ReasonCount reason_count = 2;
    };
    repeated JobCompletion job_completion = 16;

    message Network {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Mobile data traffic (total, background + foreground).
        optional int64 mobile_bytes_rx = 1;
        optional int64 mobile_bytes_tx = 2;
        // Wifi data traffic (total, background + foreground).
        optional int64 wifi_bytes_rx = 3;
        optional int64 wifi_bytes_tx = 4;
        // Bluetooth data traffic (total, background + foreground).
        optional int64 bt_bytes_rx = 5;
        optional int64 bt_bytes_tx = 6;
        // In packets (total, background + foreground).
        optional int64 mobile_packets_rx = 7;
        optional int64 mobile_packets_tx = 8;
        optional int64 wifi_packets_rx = 9;
        optional int64 wifi_packets_tx = 10;
        // Radio active duration.
        optional int64 mobile_active_duration_ms = 11;
        optional int32 mobile_active_count = 12;
        // Number of times the app woke up the mobile radio.
        optional int32 mobile_wakeup_count = 13;
        // Number of times the app woke up the wifi radio.
        optional int32 wifi_wakeup_count = 14;
        // Mobile data traffic in the background only, included in total above.
        optional int64 mobile_bytes_bg_rx = 15;
        optional int64 mobile_bytes_bg_tx = 16;
        // Wifi data traffic in the background only, included in total above.
        optional int64 wifi_bytes_bg_rx = 17;
        optional int64 wifi_bytes_bg_tx = 18;
        // In packets (background only, included in total packets above).
        optional int64 mobile_packets_bg_rx = 19;
        optional int64 mobile_packets_bg_tx = 20;
        optional int64 wifi_packets_bg_rx = 21;
        optional int64 wifi_packets_bg_tx = 22;
    };
    optional Network network = 17;

    // TODO: combine System and App messages?
    message PowerUseItem {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Estimated power use in mAh.
        optional double computed_power_mah = 1;
        // Starting in Oreo, Battery Settings has two modes to display the battery
        // info. The first is "app usage list". In this mode, items with should_hide
        // enabled are hidden.
        optional bool should_hide = 2;
        // Smeared power from screen usage. Screen usage power is split and smeared
        // among apps, based on activity time.
        optional double screen_power_mah = 3;
        // Smeared power using proportional method. Power usage from hidden sippers
        // is smeared to all apps proportionally (except for screen usage).
        optional double proportional_smear_mah = 4;
    };
    optional PowerUseItem power_use_item = 18;

    // Durations are not pooled/apportioned.
    message Process {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string name = 1;
        // Time spent executing in user code.
        optional int64 user_duration_ms = 2;
        // Time spent executing in kernel code.
        optional int64 system_duration_ms = 3;
        // Time the process was running in the foreground.
        optional int64 foreground_duration_ms = 4;
        // Number of times the process has been started.
        optional int32 start_count = 5;
        // Number of times the process has had an ANR.
        optional int32 anr_count = 6;
        // Number of times the process has crashed.
        optional int32 crash_count = 7;
    };
    repeated Process process = 19;

    message StateTime {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // All of these (non-deprecated) states are mutually exclusive and can be
        // added together to find the total time a uid has had any processes running
        // at all.

        // In approximate order or priority (top being what the framework considers
        // most important and is thus least likely to kill when resources are
        // needed:
        // top > foreground service > foreground > background > top sleeping > heavy weight > cache
        enum State {
            // Time this uid has any processes in the top state.
            PROCESS_STATE_TOP = 0;
            // Time this uid has any process with a started foreground service, but
            // none in the "top" state.
            PROCESS_STATE_FOREGROUND_SERVICE = 1;
            // Time this uid has any process in an active foreground state, but none in the
            // "foreground service" or better state. Persistent and other foreground states go here.
            PROCESS_STATE_FOREGROUND = 2;
            // Time this uid has any process in an active background state, but none
            // in the "foreground" or better state.
            PROCESS_STATE_BACKGROUND = 3;
            // Time this uid has any process that is top while the device is sleeping,
            // but not active for any other reason. We consider is a kind of cached
            // process for execution restrictions. Sleeping is mostly screen off, but
            // also includes the time when the screen is on but the device has not yet
            // been unlocked.
            PROCESS_STATE_TOP_SLEEPING = 4;
            // Time this uid has any process that is in the background but it has an
            // activity marked as "can't save state". This is essentially a cached
            // process, though the system will try much harder than normal to avoid
            // killing it.
            PROCESS_STATE_HEAVY_WEIGHT = 5;
            // Time this uid has any processes that are sitting around cached, not in
            // one of the other active states.
            PROCESS_STATE_CACHED = 6;
        }
        optional State state = 1;
        optional int64 duration_ms = 2;
    }
    repeated StateTime states = 20;

    message Sensor {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int32 id = 1;
        optional TimerProto apportioned = 2;
        // Background times aren't apportioned.
        optional TimerProto background = 3;
    }
    repeated Sensor sensors = 21;

    message Sync {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string name = 1;
        // Sync times aren't apportioned.
        optional TimerProto total = 2;
        optional TimerProto background = 3;
    }
    repeated Sync syncs = 22;

    message UserActivity {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional android.os.PowerManagerProto.UserActivityEvent name = 1;
        optional int32 count = 2;
    };
    repeated UserActivity user_activity = 23;

    // Aggregated wakelock data for an app overall, across all of its wakelocks.
    // The Wakelock message holds data about each *individual* wakelock, but it
    // cannot be used to ascertain the aggregated time the app spent holding
    // wakelocks, since merely summing Wakelock data will either underestimate (in
    // the case of wakelock.partial.duration_ms) or overestimate (in the case of
    // wakelock.partial.total_duration_ms) the total time, due to overlapping
    // wakelocks. AggregatedWakelock, on the other hand, holds overall per-app
    // wakelock data.
    message AggregatedWakelock {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // The total duration that the app spent holding partial wakelocks.
        // It includes both foreground + background use.
        optional int64 partial_duration_ms = 1;
        // The total duration that the app spent holding partial wakelocks while the
        // app was in the background. Subtracting from partial_duration_ms will
        // yield foreground usage.
        optional int64 background_partial_duration_ms = 2;
    };
    optional AggregatedWakelock aggregated_wakelock = 24;

    message Wakelock {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string name = 1;

        // Full wakelocks keep the screen on. Based on
        // PowerManager.SCREEN_BRIGHT_WAKE_LOCK (deprecated in API 13) and
        // PowerManager.SCREEN_DIM_WAKE_LOCK (deprecated in API 17). Current, max,
        // and total durations are not tracked for full wakelocks.
        optional TimerProto full = 2;

        // Partial wakelocks ensure the CPU is running while allowing the screen
        // to turn off. Based on PowerManager.PARTIAL_WAKE_LOCK.
        // Partial wakelock metrics are only recorded when the device is unplugged
        // *and* the screen is off. Current, max, and total durations are tracked
        // for partial wakelocks.
        optional TimerProto partial = 3;

        // These fields are for tracking partial wakelocks (see above), but only
        // the time the wakelock was held while the app was in a background state.
        // Since all background tracking is 'actual', not 'apportioned',
        // background_partial.duration_ms is identical to
        // background_partial.total_duration_ms.
        optional TimerProto background_partial = 4;

        // Window wakelocks keep the screen on. Current, max, and total durations
        // are not tracked for window wakelocks.
        optional TimerProto window = 5;
    };
    repeated Wakelock wakelocks = 25;

    message WakeupAlarm {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Wakeup alarm name.
        optional string name = 1;
        // Only includes counts when screen-off (& on battery).
        optional int32 count = 2;
    }
    repeated WakeupAlarm wakeup_alarm = 26;

    message Wifi {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Duration holding Wifi-lock. This time is apportioned.
        optional int64 full_wifi_lock_duration_ms = 1;
        // Duration running Wifi. This time is apportioned.
        optional int64 running_duration_ms = 2;
        // Duration performing Wifi-scan blamed on this App (i.e. apportioned to
        // this app amongst all apps doing Wifi-scanning; see explanation of
        // 'apportioned' in App's comment).
        optional TimerProto apportioned_scan = 3;
        // Scans performed when app is in background. (Included in
        // apportioned_scan). This value is not apportioned. Subtracting
        // background_scan.total_duration_ms from apportioned_scan.total_duration_ms
        // will yield foreground usage.
        optional TimerProto background_scan = 4;
    };
    optional Wifi wifi = 27;

    // WiFi Multicast Wakelock
    // This timer tracks the duration and count for the app to request the
    // wakelock for wifi multicast traffic.
    // This wakelock disables the filtering of multicast packets to reach the host
    // processor, and results in a power penalty.
    // It is useful to monitor the applications resulting in that
    optional TimerProto wifi_multicast_wakelock = 28;
}
