/*
 * Copyright (C) 2015 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 systemui;

option java_package = "com.android.systemui.statusbar.phone";
option java_outer_classname = "TouchAnalyticsProto";

message Session {
    message TouchEvent {
        message BoundingBox {
            optional float width = 1;
            optional float height = 2;
        }

        enum Action {
            // Keep in sync with MotionEvent.
            DOWN = 0;
            UP = 1;
            MOVE = 2;
            CANCEL = 3;
            OUTSIDE = 4;
            POINTER_DOWN = 5;
            POINTER_UP = 6;
        }

        message Pointer {
            optional float x = 1;
            optional float y = 2;
            optional float size = 3;
            optional float pressure = 4;
            optional int32 id = 5;
            optional float removed_length = 6;
            optional BoundingBox removed_boundingBox = 7;
        }

        optional uint64 timeOffsetNanos = 1;
        optional Action action = 2;
        optional int32 actionIndex = 3;
        repeated Pointer pointers = 4;
        optional bool removed_redacted = 5;
        optional BoundingBox removed_boundingBox = 6;
    }

    message SensorEvent {
        enum Type {
            ACCELEROMETER = 1;
            GYROSCOPE = 4;
            LIGHT = 5;
            PROXIMITY = 8;
            ROTATION_VECTOR = 11;
        }

        optional Type type = 1;
        optional uint64 timeOffsetNanos = 2;
        repeated float values = 3;
        optional uint64 timestamp = 4;
    }

    message PhoneEvent {
        enum Type {
            ON_SCREEN_ON = 0;
            ON_SCREEN_ON_FROM_TOUCH = 1;
            ON_SCREEN_OFF = 2;
            ON_SUCCESSFUL_UNLOCK = 3;
            ON_BOUNCER_SHOWN = 4;
            ON_BOUNCER_HIDDEN = 5;
            ON_QS_DOWN = 6;
            SET_QS_EXPANDED_TRUE = 7;
            SET_QS_EXPANDED_FALSE = 8;
            ON_TRACKING_STARTED = 9;
            ON_TRACKING_STOPPED = 10;
            ON_NOTIFICATION_ACTIVE = 11;
            ON_NOTIFICATION_INACTIVE = 12;
            ON_NOTIFICATION_DOUBLE_TAP = 13;
            SET_NOTIFICATION_EXPANDED = 14;
            RESET_NOTIFICATION_EXPANDED = 15;
            ON_NOTIFICATION_START_DRAGGING_DOWN = 16;
            ON_NOTIFICATION_STOP_DRAGGING_DOWN = 17;
            ON_NOTIFICATION_DISMISSED = 18;
            ON_NOTIFICATION_START_DISMISSING = 19;
            ON_NOTIFICATION_STOP_DISMISSING = 20;
            ON_RIGHT_AFFORDANCE_SWIPING_STARTED = 21;
            ON_LEFT_AFFORDANCE_SWIPING_STARTED = 22;
            ON_AFFORDANCE_SWIPING_ABORTED = 23;
            ON_CAMERA_ON = 24;
            ON_LEFT_AFFORDANCE_ON = 25;
            ON_UNLOCK_HINT_STARTED = 26;
            ON_CAMERA_HINT_STARTED = 27;
            ON_LEFT_AFFORDANCE_HINT_STARTED = 28;
        }

        optional Type type = 1;
        optional uint64 timeOffsetNanos = 2;
    }

    enum Result {
        FAILURE = 0;
        SUCCESS = 1;
        UNKNOWN = 2;
    }

    enum Type {
        RESERVED_1 = 0;
        RESERVED_2 = 1;
        RANDOM_WAKEUP = 2;
        REAL = 3;
    }

    optional uint64 startTimestampMillis = 1;
    optional uint64 durationMillis = 2;
    optional string build = 3;
    optional Result result = 4;
    repeated TouchEvent touchEvents = 5;
    repeated SensorEvent sensorEvents = 6;

    optional int32 touchAreaWidth = 9;
    optional int32 touchAreaHeight = 10;
    optional Type type = 11;
    repeated PhoneEvent phoneEvents = 12;
}