/*
 * 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";

import "frameworks/base/cmds/statsd/src/stats_events.proto";

package android.stats_log_api_gen;

message IntAtom {
    optional int32 field1 = 1;
}

message AnotherIntAtom {
    optional int32 field1 = 1;
}

message OutOfOrderAtom {
    optional int32 field2 = 2;
    optional int32 field1 = 1;
}

enum AnEnum {
    VALUE0 = 0;
    VALUE1 = 1;
}

message AllTypesAtom {
    optional android.os.statsd.WorkSource attribution = 1;
    optional double double_field = 2;
    optional float float_field = 3;
    optional int64 int64_field = 4;
    optional uint64 uint64_field = 5;
    optional int32 int32_field = 6;
    optional fixed64 fixed64_field = 7;
    optional fixed32 fixed32_field = 8;
    optional bool bool_field = 9;
    optional string string_field = 10;
    optional uint32 uint32_field = 11;
    optional AnEnum enum_field = 12;
    optional sfixed32 sfixed32_field = 13;
    optional sfixed64 sfixed64_field = 14;
    optional sint32 sint32_field = 15;
    optional sint64 sint64_field = 16;
}

message Event {
    oneof event {
        OutOfOrderAtom out_of_order_atom = 2;
        IntAtom int_atom = 1;
        AnotherIntAtom another_int_atom = 3;
        AllTypesAtom all_types_atom = 4;
    }
}

message BadTypesAtom {
    optional IntAtom bad_int_atom = 1;
    optional bytes bad_bytes = 2;
}

message BadTypesEvent {
    oneof event {
        BadTypesAtom bad_types_atom = 1;
    }
}

message BadSkippedFieldSingleAtom {
    optional int32 field2 = 2;
}

message BadSkippedFieldSingle {
    oneof event {
        BadSkippedFieldSingleAtom bad = 1;
    }
}

message BadSkippedFieldMultipleAtom {
    optional int32 field1 = 1;
    optional int32 field3 = 3;
    optional int32 field5 = 5;
}

message BadSkippedFieldMultiple {
    oneof event {
        BadSkippedFieldMultipleAtom bad = 1;
    }
}

message BadWorkSourcePositionAtom {
    optional int32 field1 = 1;
    optional android.os.statsd.WorkSource attribution = 2;
}

message BadWorkSourcePosition {
    oneof event {
        BadWorkSourcePositionAtom bad = 1;
    }
}

