/*
 * Copyright (C) 2020 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.service;

import "frameworks/base/core/proto/android/privacy.proto";

option java_multiple_files = true;

/*
 * Notes:
 * 1. When using ProtoOutputStream to write this proto message, must call
 *    token = ProtoOutputStream#start(fieldId) before and ProtoOutputStream#end(token) after
 *    writing a nested message.
 * 2. Never reuse a proto field number. When removing a field, mark it as reserved.
 */

// Proto dump of android::SensorService. dumpsys sensorservice --proto
message SensorServiceProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    enum OperatingModeEnum {
        OP_MODE_UNKNOWN = 0;
        OP_MODE_NORMAL = 1;
        OP_MODE_RESTRICTED = 2;
        OP_MODE_DATA_INJECTION = 3;
    }
    optional sint32 init_status = 16;
    optional int64 current_time_ms = 1;
    optional SensorDeviceProto sensor_device = 2;
    optional SensorListProto sensors = 3;
    optional SensorFusionProto fusion_state = 4;
    optional SensorEventsProto sensor_events = 5;
    repeated ActiveSensorProto active_sensors = 6;
    optional int32 socket_buffer_size = 7;
    optional int32 socket_buffer_size_in_events = 8;
    optional bool wake_lock_acquired = 9;
    optional OperatingModeEnum operating_mode = 10;
    // Non-empty only if operating_mode is RESTRICTED or DATA_INJECTION.
    optional string whitelisted_package = 11;
    optional bool sensor_privacy = 12;
    repeated SensorEventConnectionProto active_connections = 13;
    repeated SensorDirectConnectionProto direct_connections = 14;
    repeated SensorRegistrationInfoProto previous_registrations = 15;

    // Next tag: 17
}

// Proto dump of android::SensorDevice
message SensorDeviceProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    optional bool initialized = 1;
    optional int32 total_sensors = 2;
    optional int32 active_sensors = 3;

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

        optional int32 handle = 1;
        optional int32 active_count = 2;
        repeated float sampling_period_ms = 3;
        optional float sampling_period_selected = 4;
        repeated float batching_period_ms = 5;
        optional float batching_period_selected = 6;
    }
    repeated SensorProto sensors = 4;
}

// Proto dump of android::SensorServiceUtil::SensorList
message SensorListProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    enum ReportingModeEnum {
        RM_UNKNOWN = 0;
        RM_CONTINUOUS = 1;
        RM_ON_CHANGE = 2;
        RM_ONE_SHOT = 3;
        RM_SPECIAL_TRIGGER = 4;
    }

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

        optional int32 handle = 1;
        optional string name = 2;
        optional string vendor = 3;
        optional int32 version = 4;
        optional string string_type = 5;
        optional int32 type = 6;
        optional string required_permission = 7;
        optional int32 flags = 8;
        optional ReportingModeEnum reporting_mode = 9;
        optional int32 max_delay_us = 10;
        optional int32 min_delay_us = 11;
        optional int32 fifo_max_event_count = 12;
        optional int32 fifo_reserved_event_count = 13;
        optional bool is_wakeup = 14;
        optional bool data_injection_supported = 15;
        optional bool is_dynamic = 16;
        optional bool has_additional_info = 17;
        optional int32 highest_rate_level = 18;
        optional bool ashmem = 19;
        optional bool gralloc = 20;
        optional float min_value = 21;
        optional float max_value = 22;
        optional float resolution = 23;
        optional float power_usage = 24;
    }
    repeated SensorProto sensors = 1;
}


// Proto dump of android::SensorFusion
message SensorFusionProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

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

        optional bool enabled = 1;
        optional int32 num_clients = 2;
        optional float estimated_gyro_rate = 3;
        optional float attitude_x = 4;
        optional float attitude_y = 5;
        optional float attitude_z = 6;
        optional float attitude_w = 7;
        optional float attitude_length = 8;
        optional float bias_x = 9;
        optional float bias_y = 10;
        optional float bias_z = 11;
    }
    optional FusionProto fusion_9axis = 1;
    optional FusionProto fusion_nomag = 2;
    optional FusionProto fusion_nogyro = 3;
}

// Proto dump of android::SensorServiceUtil::RecentEventLogger
message SensorEventsProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

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

        optional float timestamp_sec = 1;
        optional int64 wall_timestamp_ms = 2;
        optional bool masked = 3;
        optional int64 int64_data = 4;
        repeated float float_array = 5;
    }

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

        optional string name = 1;
        optional int32 recent_events_count = 2;
        repeated Event events = 3;
    }
    repeated RecentEventsLog recent_events_logs = 1;
}

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

    optional string name = 1;
    optional int32 handle = 2;
    optional int32 num_connections = 3;
}

// Proto dump of android::SensorService::SensorDirectConnection
message SensorDirectConnectionProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

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

        optional int32 sensor = 1;
        optional int32 rate = 2;
    }

    optional string package_name = 1;
    optional int32 hal_channel_handle = 2;
    optional int32 num_sensor_activated = 3;
    repeated SensorProto sensors = 4;
}

// Proto dump of android::SensorService::SensorEventConnection
message SensorEventConnectionProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

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

        optional string sensor_name = 1;
        optional int32 sensor_handle = 2;
        optional bool first_flush_pending = 3;
        optional int32 pending_flush_events_to_send = 4;
    }

    enum OperatingModeEnum {
        OP_MODE_UNKNOWN = 0;
        OP_MODE_NORMAL = 1;
        OP_MODE_RESTRICTED = 2;
        OP_MODE_DATA_INJECTION = 3;
    }

    optional OperatingModeEnum operating_mode = 1;
    optional string package_name = 2;
    optional int32 wake_lock_ref_count = 3;
    optional int32 uid = 4;
    optional int32 cache_size = 5;
    optional int32 max_cache_size = 6;
    repeated FlushInfoProto flush_infos = 7;
    optional int32 events_received = 8;
    optional int32 events_sent = 9;
    optional int32 events_cache = 10;
    optional int32 events_dropped = 11;
    optional int32 total_acks_needed = 12;
    optional int32 total_acks_received = 13;
}

// Proto dump of android::SensorService::SensorRegistrationInfo
message SensorRegistrationInfoProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    optional int64 timestamp_sec = 1;
    optional int32 sensor_handle = 2;
    optional string package_name = 3;
    optional int32 pid = 4;
    optional int32 uid = 5;
    optional int64 sampling_rate_us = 6;
    optional int64 max_report_latency_us = 7;
    optional bool activated = 8;
}
