// Copyright 2020 Google LLC
//
// 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 = "proto3";

option java_multiple_files = true;
option java_package = "com.android.emulator.control";
option objc_class_prefix = "AEC";

package android.emulation.control;
import "google/protobuf/empty.proto";

service UiController {
    // PaneEntry specifies which pane will be selected when
    // the extended control is shown. If the extended is visible already,
    // this method will set visibilityChangedto to false.
    rpc showExtendedControls(PaneEntry) returns (ExtendedControlsStatus) {}
    // this method has no effect if the extended controls are hidden.
    // In that case, visibilityChanged will be set to false;
    rpc closeExtendedControls(google.protobuf.Empty)
            returns (ExtendedControlsStatus) {}
    rpc setUiTheme(ThemingStyle) returns (google.protobuf.Empty) {}

    // Returns the user configuration of the running emulator. The user
    // configuration contains information about the user interface.
    rpc getUserConfig(google.protobuf.Empty) returns (UserConfig) {}
}

message UserConfigEntry {
    string key = 1;
    string value = 2;
}

// The user configuration of the running emulator as
// key value pairs. This contains the data you normally find
// in emulator-user.ini
message UserConfig {
    repeated UserConfigEntry entries = 1;
}

message ThemingStyle {
    enum Style {
        LIGHT = 0;
        DARK = 1;
    }
    Style style = 1;
}

message ExtendedControlsStatus {
    bool visibilityChanged = 1;
}

// The pixel coordinates are resolution independent, meaning the coordinates
// are independent from the pixel grid, resulting in a graphical user
// interface that is displayed at a consistent location, regardless of the
// resolution of the screen.
//
// For technical details: https://doc.qt.io/qt-5/highdpi.html
//
// Some things to note:
//
// - You cannot move a window offscreen.
// - There is a padding of around 10px around the frame.
//
// This means that moving to (0, 0) or (10, 10) will have the same result.
// This means that anchoring might not exactly behave as requested.
message WindowPosition {
    // Anchor that is used to determine horizontal window placement.
    enum HorizontalAnchor {
        LEFT = 0;  // The x coordinate will be treated as the left edge of the
                   // window.
        HCENTER = 1;  // The x coordinate will be treated as the middle between
                      // the left and right edges of the window.
        RIGHT = 2;    // The x coordinate will be treated as the right edge of
                      // the window.
    }

    // Anchor that is used to determine vertical window placement.
    enum VerticalAnchor {
        TOP = 0;      // The y coordinate will be treated as the top edge of the
                      // window.
        VCENTER = 1;  // The y coordinate will be treated as the middle between
                      // the top and bottom edges of the window.
        BOTTOM = 3;   // The y coordinate will be treated as the bottom edge of
                      // the window.
    }

    // Corresponds to the x and y coordinate of the window geometry. The window
    // geometry includes the window frame.
    // See: https://doc.qt.io/qt-5/application-windows.html#window-geometry for
    // details and pecularities on linux.
    uint32 x = 1;
    uint32 y = 2;

    HorizontalAnchor horizontalAnchor = 3;
    VerticalAnchor verticalAnchor = 4;
}

message PaneEntry {
    enum PaneIndex {
        // When specified as KEEP_CURRENT, extended controls will display the
        // current pane.
        // If it is the first time for extended controls to be shown, LOCATION
        // will be used.
        KEEP_CURRENT = 0;
        // Referenced from
        // external/qemu/android/android-emu/android/skin/qt/extended-window-styles.h
        LOCATION = 1;
        MULTIDISPLAY = 2;
        CELLULAR = 3;
        BATTERY = 4;
        CAMERA = 5;
        TELEPHONE = 6;
        DPAD = 7;
        TV_REMOTE = 8;
        ROTARY = 9;
        MICROPHONE = 10;
        FINGER = 11;
        VIRT_SENSORS = 12;
        SNAPSHOT = 13;
        BUGREPORT = 14;
        RECORD = 15;
        GOOGLE_PLAY = 16;
        SETTINGS = 17;
        HELP = 18;
        CAR = 19;
        CAR_ROTARY = 20;
        SENSOR_REPLAY = 21;
    };
    PaneIndex index = 1;

    // Set the window position to the specified coordinates if no coordinates are
    // present in the AVD, otherwise this value will be igonred.
    WindowPosition position = 2;
}
