1263 lines
47 KiB
Protocol Buffer
1263 lines
47 KiB
Protocol Buffer
![]() |
// Copyright (C) 2018 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.
|
||
|
|
||
|
// Note that if you add/remove methods in this file you must update
|
||
|
// the metrics sql as well ./android/scripts/gen-grpc-sql.py
|
||
|
//
|
||
|
// Please group deleted methods in a block including the date (MM/DD/YY)
|
||
|
// it was removed. This enables us to easily keep metrics around after removal
|
||
|
//
|
||
|
// List of deleted methods
|
||
|
// rpc iWasDeleted (03/12/12)
|
||
|
// ...
|
||
|
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";
|
||
|
|
||
|
// An EmulatorController service lets you control the emulator.
|
||
|
// Note that this is currently an experimental feature, and that the
|
||
|
// service definition might change without notice. Use at your own risk!
|
||
|
//
|
||
|
// We use the following rough conventions:
|
||
|
//
|
||
|
// streamXXX --> streams values XXX (usually for emulator lifetime). Values
|
||
|
// are updated as soon as they become available.
|
||
|
// getXXX --> gets a single value XXX
|
||
|
// setXXX --> sets a single value XXX, does not returning state, these
|
||
|
// usually have an observable lasting side effect.
|
||
|
// sendXXX --> send a single event XXX, possibly returning state information.
|
||
|
// android usually responds to these events.
|
||
|
service EmulatorController {
|
||
|
// set/get/stream the sensor data
|
||
|
rpc streamSensor(SensorValue) returns (stream SensorValue) {}
|
||
|
rpc getSensor(SensorValue) returns (SensorValue) {}
|
||
|
rpc setSensor(SensorValue) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// set/get/stream the physical model, this is likely the one you are
|
||
|
// looking for when you wish to modify the device state.
|
||
|
rpc setPhysicalModel(PhysicalModelValue) returns (google.protobuf.Empty) {}
|
||
|
rpc getPhysicalModel(PhysicalModelValue) returns (PhysicalModelValue) {}
|
||
|
rpc streamPhysicalModel(PhysicalModelValue)
|
||
|
returns (stream PhysicalModelValue) {}
|
||
|
|
||
|
// Atomically set/get the current primary clipboard data.
|
||
|
rpc setClipboard(ClipData) returns (google.protobuf.Empty) {}
|
||
|
rpc getClipboard(google.protobuf.Empty) returns (ClipData) {}
|
||
|
|
||
|
// Streams the current data on the clipboard. This will immediately produce
|
||
|
// a result with the current state of the clipboard after which the stream
|
||
|
// will block and wait until a new clip event is available from the guest.
|
||
|
// Calling the setClipboard method above will not result in generating a
|
||
|
// clip event. It is possible to lose clipboard events if the clipboard
|
||
|
// updates very rapidly.
|
||
|
rpc streamClipboard(google.protobuf.Empty) returns (stream ClipData) {}
|
||
|
|
||
|
// Set/get the battery to the given state.
|
||
|
rpc setBattery(BatteryState) returns (google.protobuf.Empty) {}
|
||
|
rpc getBattery(google.protobuf.Empty) returns (BatteryState) {}
|
||
|
|
||
|
// Set the state of the gps.
|
||
|
// Note: Setting the gps position will not be reflected in the user interface.
|
||
|
// Keep in mind that android usually only samples the gps at 1 hz.
|
||
|
rpc setGps(GpsState) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Gets the latest gps state as delivered by the setGps call, or location ui
|
||
|
// if active.
|
||
|
//
|
||
|
// Note: this is not necessarily the actual gps coordinate visible at the
|
||
|
// time, due to gps sample frequency (usually 1hz).
|
||
|
rpc getGps(google.protobuf.Empty) returns (GpsState) {}
|
||
|
|
||
|
// Simulate a touch event on the finger print sensor.
|
||
|
rpc sendFingerprint(Fingerprint) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Send a keyboard event. Translating the event.
|
||
|
rpc sendKey(KeyboardEvent) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Send touch/mouse events. Note that mouse events can be simulated
|
||
|
// by touch events.
|
||
|
rpc sendTouch(TouchEvent) returns (google.protobuf.Empty) {}
|
||
|
rpc sendMouse(MouseEvent) returns (google.protobuf.Empty) {}
|
||
|
rpc injectWheel(stream WheelEvent) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Make a phone call.
|
||
|
rpc sendPhone(PhoneCall) returns (PhoneResponse) {}
|
||
|
|
||
|
// Sends an sms message to the emulator.
|
||
|
rpc sendSms(SmsMessage) returns (PhoneResponse) {}
|
||
|
|
||
|
// Retrieve the status of the emulator. This will contain general
|
||
|
// hardware information, and whether the device has booted or not.
|
||
|
rpc getStatus(google.protobuf.Empty) returns (EmulatorStatus) {}
|
||
|
|
||
|
// Gets an individual screenshot in the desired format.
|
||
|
//
|
||
|
// The image will be scaled to the desired ImageFormat, while maintaining
|
||
|
// the aspect ratio. The returned image will never exceed resolution of the
|
||
|
// device display. Not setting the width or height (i.e. they are 0) will
|
||
|
// result in using the display width and height.
|
||
|
//
|
||
|
// The resulting image will be properly oriented and can be displayed
|
||
|
// directly without post processing. For example, if the device has a
|
||
|
// 1080x1920 screen and is in landscape mode and called with no width or
|
||
|
// height parameter, it will return a 1920x1080 image.
|
||
|
//
|
||
|
// The dimensions of the returned image will never exceed the corresponding
|
||
|
// display dimensions. For example, this method will return a 1920x1080
|
||
|
// screenshot, if the display resolution is 1080x1920 and a screenshot of
|
||
|
// 2048x2048 is requested when the device is in landscape mode.
|
||
|
//
|
||
|
// This method will return an empty image if the display is not visible.
|
||
|
rpc getScreenshot(ImageFormat) returns (Image) {}
|
||
|
|
||
|
// Streams a series of screenshots in the desired format.
|
||
|
//
|
||
|
// A new frame will be delivered whenever the device produces a new frame.
|
||
|
// Beware that this can produce a significant amount of data and that
|
||
|
// certain translations can be very costly. For example, streaming a series
|
||
|
// of png images is very cpu intensive.
|
||
|
//
|
||
|
// Images are produced according to the getScreenshot API described above.
|
||
|
//
|
||
|
// If the display is inactive, or becomes inactive, an empty image will be
|
||
|
// delivered. Images will be delived again if the display becomes active and
|
||
|
// new frames are produced.
|
||
|
rpc streamScreenshot(ImageFormat) returns (stream Image) {}
|
||
|
|
||
|
// Streams a series of audio packets in the desired format.
|
||
|
// A new frame will be delivered whenever the emulated device
|
||
|
// produces a new audio frame. You can expect packets to be
|
||
|
// delivered in intervals of 20-30ms.
|
||
|
//
|
||
|
// Be aware that this can block when the emulator does not
|
||
|
// produce any audio whatsoever!
|
||
|
rpc streamAudio(AudioFormat) returns (stream AudioPacket) {}
|
||
|
|
||
|
// Injects a series of audio packets to the android microphone.
|
||
|
// A new frame will be delivered whenever the emulated device
|
||
|
// requests a new audio frame. Audio is usually delivered at a rate
|
||
|
// that the emulator is requesting frames. Audio will be stored in a
|
||
|
// temporary buffer that can hold 300ms of audio.
|
||
|
//
|
||
|
// Notes:
|
||
|
// - Only the first audio format packet that is delivered will be
|
||
|
// honored. There is no need to send the audio format multiple times.
|
||
|
// - Real time audio currently immediately overrides the buffer. This
|
||
|
// means you must provide a constant rate of audio packets. The real
|
||
|
// time mode is experimental. Timestamps of audio packets might be
|
||
|
// used in the future to improve synchronization.
|
||
|
//
|
||
|
// - INVALID_ARGUMENT (code 3) The sampling rate was too high/low
|
||
|
// - INVALID_ARGUMENT (code 3) The audio packet was too large to handle.
|
||
|
// - FAILED_PRECONDITION (code 9) If there was a microphone registered
|
||
|
// already.
|
||
|
rpc injectAudio(stream AudioPacket) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Returns the last 128Kb of logcat output from the emulator
|
||
|
// Note that parsed logcat messages are only available after L (Api >23).
|
||
|
// it is possible that the logcat buffer gets overwritten, or falls behind.
|
||
|
rpc getLogcat(LogMessage) returns (LogMessage) {}
|
||
|
|
||
|
// Streams the logcat output from the emulator. The first call
|
||
|
// can retrieve up to 128Kb. This call will not return.
|
||
|
// Note that parsed logcat messages are only available after L (Api >23)
|
||
|
// it is possible that the logcat buffer gets overwritten, or falls behind.
|
||
|
rpc streamLogcat(LogMessage) returns (stream LogMessage) {}
|
||
|
|
||
|
// Transition the virtual machine to the desired state. Note that
|
||
|
// some states are only observable. For example you cannot transition
|
||
|
// to the error state.
|
||
|
rpc setVmState(VmRunState) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Gets the state of the virtual machine.
|
||
|
rpc getVmState(google.protobuf.Empty) returns (VmRunState) {}
|
||
|
|
||
|
// Atomically changes the current multi-display configuration.
|
||
|
// After this call the given display configurations will be activated. You
|
||
|
// can only update secondary displays. Displays with id 0 will be ignored.
|
||
|
//
|
||
|
// This call can result in the removal or addition of secondary displays,
|
||
|
// the final display state can be observed by the returned configuration.
|
||
|
//
|
||
|
// The following gRPC error codes can be returned:
|
||
|
// - FAILED_PRECONDITION (code 9) if the AVD does not support a
|
||
|
// configurable
|
||
|
// secondary display.
|
||
|
// - INVALID_ARGUMENT (code 3) if:
|
||
|
// - The same display id is defined multiple times.
|
||
|
// - The display configurations are outside valid ranges.
|
||
|
// See DisplayConfiguration for details on valid ranges.
|
||
|
// - INTERNAL (code 13) if there was an internal emulator failure.
|
||
|
rpc setDisplayConfigurations(DisplayConfigurations)
|
||
|
returns (DisplayConfigurations) {}
|
||
|
|
||
|
// Returns all currently valid logical displays.
|
||
|
//
|
||
|
// The gRPC error code FAILED_PRECONDITION (code 9) is returned if the AVD
|
||
|
// does not support a configurable secondary display.
|
||
|
rpc getDisplayConfigurations(google.protobuf.Empty)
|
||
|
returns (DisplayConfigurations) {}
|
||
|
|
||
|
// Notifies client of the following changes:
|
||
|
//
|
||
|
// - Virtual scene camera status change.
|
||
|
// - Display configuration changes from extended ui. This will only be fired
|
||
|
// if the user makes modifications the extended displays through the
|
||
|
// extended control tab.
|
||
|
//
|
||
|
// Note that this method will send the initial virtual scene state
|
||
|
// immediately.
|
||
|
rpc streamNotification(google.protobuf.Empty)
|
||
|
returns (stream Notification) {}
|
||
|
|
||
|
// RotationRadian is relative to the camera's current orientation.
|
||
|
rpc rotateVirtualSceneCamera(RotationRadian)
|
||
|
returns (google.protobuf.Empty) {}
|
||
|
// Velocity is absolute
|
||
|
rpc setVirtualSceneCameraVelocity(Velocity)
|
||
|
returns (google.protobuf.Empty) {}
|
||
|
// Set foldable posture
|
||
|
rpc setPosture(Posture) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Get the backlight brightness.
|
||
|
// The following gRPC error codes can be returned:
|
||
|
// - FAILED_PRECONDITION (code 9) if the AVD does not support hw-control.
|
||
|
rpc getBrightness(BrightnessValue) returns (BrightnessValue) {}
|
||
|
|
||
|
// Set the backlight brightness.
|
||
|
// The following gRPC error codes can be returned:
|
||
|
// - FAILED_PRECONDITION (code 9) if the AVD does not support hw-control.
|
||
|
// - INVALID_ARGUMENT (code 3) The brightness exceeds the valid range.
|
||
|
rpc setBrightness(BrightnessValue) returns (google.protobuf.Empty) {}
|
||
|
|
||
|
// Returns the current mode of the primary display of a resizable AVD.
|
||
|
// The following gRPC error codes can be returned:
|
||
|
// - FAILED_PRECONDITION (code 9) if the AVD is not resizable.
|
||
|
rpc getDisplayMode(google.protobuf.Empty) returns (DisplayMode) {}
|
||
|
|
||
|
// Sets the size of the primary display of a resizable AVD. Fails if the AVD
|
||
|
// is not resizable. The following gRPC error codes can be returned:
|
||
|
// - FAILED_PRECONDITION (code 9) if the AVD is not resizable.
|
||
|
rpc setDisplayMode(DisplayMode) returns (google.protobuf.Empty) {}
|
||
|
}
|
||
|
|
||
|
// A Run State that describes the state of the Virtual Machine.
|
||
|
message VmRunState {
|
||
|
enum RunState {
|
||
|
// The emulator is in an unknown state. You cannot transition to this
|
||
|
// state.
|
||
|
UNKNOWN = 0;
|
||
|
// Guest is actively running. You can transition to this state from the
|
||
|
// paused state.
|
||
|
RUNNING = 1;
|
||
|
// Guest is paused to load a snapshot. You cannot transition to this
|
||
|
// state.
|
||
|
RESTORE_VM = 2;
|
||
|
// Guest has been paused. Transitioning to this state will pause the
|
||
|
// emulator the guest will not be consuming any cpu cycles.
|
||
|
PAUSED = 3;
|
||
|
// Guest is paused to take or export a snapshot. You cannot
|
||
|
// transition to this state.
|
||
|
SAVE_VM = 4;
|
||
|
// System shutdown, note that it is similar to power off. It tries to
|
||
|
// set the system status and notify guest. The system is likely going to
|
||
|
// disappear soon and do proper cleanup of resources, possibly taking
|
||
|
// a snapshot. This is the same behavior as closing the emulator by
|
||
|
// clicking the X (close) in the user interface.
|
||
|
SHUTDOWN = 5;
|
||
|
// Immediately terminate the emulator. No resource cleanup will take
|
||
|
// place. There is a good change to corrupt the system.
|
||
|
TERMINATE = 7;
|
||
|
// Will cause the emulator to reset. This is not a state you can
|
||
|
// observe.
|
||
|
RESET = 9;
|
||
|
// Guest experienced some error state, you cannot transition to this
|
||
|
// state.
|
||
|
INTERNAL_ERROR = 10;
|
||
|
}
|
||
|
|
||
|
RunState state = 1;
|
||
|
}
|
||
|
|
||
|
message ParameterValue {
|
||
|
repeated float data = 1 [packed = true];
|
||
|
}
|
||
|
|
||
|
message PhysicalModelValue {
|
||
|
enum State {
|
||
|
OK = 0;
|
||
|
NO_SERVICE = -3; // qemud service is not available/initiated.
|
||
|
DISABLED = -2; // Sensor is disabled.
|
||
|
UNKNOWN = -1; // Unknown sensor (should not happen)
|
||
|
}
|
||
|
|
||
|
// Details on the sensors documentation can be found here:
|
||
|
// https://developer.android.com/reference/android/hardware/Sensor.html#TYPE_
|
||
|
// The types must follow the order defined in
|
||
|
// "external/qemu/android/hw-sensors.h"
|
||
|
enum PhysicalType {
|
||
|
POSITION = 0;
|
||
|
|
||
|
// All values are angles in degrees.
|
||
|
// values = [x,y,z]
|
||
|
ROTATION = 1;
|
||
|
|
||
|
MAGNETIC_FIELD = 2;
|
||
|
|
||
|
// Temperature in °C
|
||
|
TEMPERATURE = 3;
|
||
|
|
||
|
// Proximity sensor distance measured in centimeters
|
||
|
PROXIMITY = 4;
|
||
|
|
||
|
// Ambient light level in SI lux units
|
||
|
LIGHT = 5;
|
||
|
|
||
|
// Atmospheric pressure in hPa (millibar)
|
||
|
PRESSURE = 6;
|
||
|
|
||
|
// Relative ambient air humidity in percent
|
||
|
HUMIDITY = 7;
|
||
|
|
||
|
VELOCITY = 8;
|
||
|
AMBIENT_MOTION = 9;
|
||
|
|
||
|
// Describing a hinge angle sensor in degrees.
|
||
|
HINGE_ANGLE0 = 10;
|
||
|
HINGE_ANGLE1 = 11;
|
||
|
HINGE_ANGLE2 = 12;
|
||
|
|
||
|
ROLLABLE0 = 13;
|
||
|
ROLLABLE1 = 14;
|
||
|
ROLLABLE2 = 15;
|
||
|
|
||
|
// Describing the device posture; the value should be an enum defined
|
||
|
// in Posture::PostureValue.
|
||
|
POSTURE = 16;
|
||
|
|
||
|
// Heart rate in bpm
|
||
|
HEART_RATE = 17;
|
||
|
|
||
|
// Ambient RGBC light intensity. Values are in order (Red, Green, Blue,
|
||
|
// Clear).
|
||
|
RGBC_LIGHT = 18;
|
||
|
|
||
|
// Wrist tilt gesture (1 = gaze, 0 = ungaze)
|
||
|
WRIST_TILT = 19;
|
||
|
}
|
||
|
PhysicalType target = 1;
|
||
|
|
||
|
// [Output Only]
|
||
|
State status = 2;
|
||
|
|
||
|
// Value interpretation depends on sensor.
|
||
|
ParameterValue value = 3;
|
||
|
}
|
||
|
|
||
|
// A single sensor value.
|
||
|
message SensorValue {
|
||
|
enum State {
|
||
|
OK = 0;
|
||
|
NO_SERVICE = -3; // qemud service is not available/initiated.
|
||
|
DISABLED = -2; // Sensor is disabled.
|
||
|
UNKNOWN = -1; // Unknown sensor (should not happen)
|
||
|
}
|
||
|
|
||
|
// These are the various sensors that can be available in an emulated
|
||
|
// devices.
|
||
|
enum SensorType {
|
||
|
// Measures the acceleration force in m/s2 that is applied to a device
|
||
|
// on all three physical axes (x, y, and z), including the force of
|
||
|
// gravity.
|
||
|
ACCELERATION = 0;
|
||
|
// Measures a device's rate of rotation in rad/s around each of the
|
||
|
// three physical axes (x, y, and z).
|
||
|
GYROSCOPE = 1;
|
||
|
// Measures the ambient geomagnetic field for all three physical axes
|
||
|
// (x, y, z) in μT.
|
||
|
MAGNETIC_FIELD = 2;
|
||
|
// Measures degrees of rotation that a device makes around all three
|
||
|
// physical axes (x, y, z)
|
||
|
ORIENTATION = 3;
|
||
|
// Measures the temperature of the device in degrees Celsius (°C).
|
||
|
TEMPERATURE = 4;
|
||
|
// Measures the proximity of an object in cm relative to the view screen
|
||
|
// of a device. This sensor is typically used to determine whether a
|
||
|
// handset is being held up to a person's ear.
|
||
|
PROXIMITY = 5;
|
||
|
// Measures the ambient light level (illumination) in lx.
|
||
|
LIGHT = 6;
|
||
|
// Measures the ambient air pressure in hPa or mbar.
|
||
|
PRESSURE = 7;
|
||
|
// Measures the relative ambient humidity in percent (%).
|
||
|
HUMIDITY = 8;
|
||
|
MAGNETIC_FIELD_UNCALIBRATED = 9;
|
||
|
GYROSCOPE_UNCALIBRATED = 10;
|
||
|
|
||
|
// HINGE_ANGLE0 (11), HINGE_ANGLE1 (12), HINGE_ANGLE2 (13) are
|
||
|
// skipped; clients should use get/setPhysicalModel() instead for these
|
||
|
// "sensors".
|
||
|
|
||
|
// Measures the heart rate in bpm.
|
||
|
HEART_RATE = 14;
|
||
|
// Measures the ambient RGBC light intensity.
|
||
|
// Values are in order (Red, Green, Blue, Clear).
|
||
|
RGBC_LIGHT = 15;
|
||
|
// WIRST_TILT (16) is skipped; clients should use get/setPhysicalModel()
|
||
|
// instead.
|
||
|
// Measures acceleration force and provides bias data.
|
||
|
ACCELERATION_UNCALIBRATED = 17;
|
||
|
}
|
||
|
|
||
|
// Type of sensor
|
||
|
SensorType target = 1;
|
||
|
|
||
|
// [Output Only]
|
||
|
State status = 2;
|
||
|
|
||
|
// Value interpretation depends on sensor enum.
|
||
|
ParameterValue value = 3;
|
||
|
}
|
||
|
|
||
|
// A single backlight brightness value.
|
||
|
message BrightnessValue {
|
||
|
enum LightType {
|
||
|
// Display backlight. This will affect all displays.
|
||
|
LCD = 0;
|
||
|
KEYBOARD = 1;
|
||
|
BUTTON = 2;
|
||
|
}
|
||
|
|
||
|
// Type of light
|
||
|
LightType target = 1;
|
||
|
|
||
|
// Light intensity, ranges from 0-255.
|
||
|
uint32 value = 2;
|
||
|
}
|
||
|
|
||
|
// in line with android/emulation/resizable_display_config.h
|
||
|
enum DisplayModeValue {
|
||
|
PHONE = 0;
|
||
|
FOLDABLE = 1;
|
||
|
TABLET = 2;
|
||
|
DESKTOP = 3;
|
||
|
}
|
||
|
|
||
|
message DisplayMode {
|
||
|
DisplayModeValue value = 1;
|
||
|
}
|
||
|
|
||
|
message LogMessage {
|
||
|
// [Output Only] The contents of the log output.
|
||
|
string contents = 1;
|
||
|
// The starting byte position of the output that was returned. This
|
||
|
// should match the start parameter sent with the request. If the serial
|
||
|
// console output exceeds the size of the buffer, older output will be
|
||
|
// overwritten by newer content and the start values will be mismatched.
|
||
|
int64 start = 2;
|
||
|
//[Output Only] The position of the next byte of content from the serial
|
||
|
// console output. Use this value in the next request as the start
|
||
|
// parameter.
|
||
|
int64 next = 3;
|
||
|
|
||
|
// Set the sort of response you are interested it in.
|
||
|
// It the type is "Parsed" the entries field will contain the parsed
|
||
|
// results. otherwise the contents field will be set.
|
||
|
LogType sort = 4;
|
||
|
|
||
|
// [Output Only] The parsed logcat entries so far. Only set if sort is
|
||
|
// set to Parsed
|
||
|
repeated LogcatEntry entries = 5;
|
||
|
|
||
|
enum LogType {
|
||
|
Text = 0;
|
||
|
Parsed = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// A parsed logcat entry.
|
||
|
message LogcatEntry {
|
||
|
// The possible log levels.
|
||
|
enum LogLevel {
|
||
|
UNKNOWN = 0;
|
||
|
DEFAULT = 1;
|
||
|
VERBOSE = 2;
|
||
|
DEBUG = 3;
|
||
|
INFO = 4;
|
||
|
WARN = 5;
|
||
|
ERR = 6;
|
||
|
FATAL = 7;
|
||
|
SILENT = 8;
|
||
|
}
|
||
|
|
||
|
// A Unix timestamps in milliseconds (The number of milliseconds that
|
||
|
// have elapsed since January 1, 1970 (midnight UTC/GMT), not counting
|
||
|
// leap seconds)
|
||
|
uint64 timestamp = 1;
|
||
|
|
||
|
// Process id.
|
||
|
uint32 pid = 2;
|
||
|
|
||
|
// Thread id.
|
||
|
uint32 tid = 3;
|
||
|
LogLevel level = 4;
|
||
|
string tag = 5;
|
||
|
string msg = 6;
|
||
|
}
|
||
|
|
||
|
// Information about the hypervisor that is currently in use.
|
||
|
message VmConfiguration {
|
||
|
enum VmHypervisorType {
|
||
|
// An unknown hypervisor
|
||
|
UNKNOWN = 0;
|
||
|
|
||
|
// No hypervisor is in use. This usually means that the guest is
|
||
|
// running on a different CPU than the host, or you are using a
|
||
|
// platform where no hypervisor is available.
|
||
|
NONE = 1;
|
||
|
|
||
|
// The Kernel based Virtual Machine
|
||
|
// (https://www.linux-kvm.org/page/Main_Page)
|
||
|
KVM = 2;
|
||
|
|
||
|
// Intel® Hardware Accelerated Execution Manager (Intel® HAXM)
|
||
|
// https://github.com/intel/haxm
|
||
|
HAXM = 3;
|
||
|
|
||
|
// Hypervisor Framework.
|
||
|
// https://developer.apple.com/documentation/hypervisor
|
||
|
HVF = 4;
|
||
|
|
||
|
// Window Hypervisor Platform
|
||
|
// https://docs.microsoft.com/en-us/virtualization/api/
|
||
|
WHPX = 5;
|
||
|
|
||
|
GVM = 6;
|
||
|
}
|
||
|
|
||
|
VmHypervisorType hypervisorType = 1;
|
||
|
int32 numberOfCpuCores = 2;
|
||
|
int64 ramSizeBytes = 3;
|
||
|
}
|
||
|
|
||
|
// Representation of a clipped data object on the clipboard.
|
||
|
message ClipData {
|
||
|
// UTF-8 Encoded text.
|
||
|
string text = 1;
|
||
|
}
|
||
|
|
||
|
// The Touch interface represents a single contact point on a
|
||
|
// touch-sensitive device. The contact point is commonly a finger or stylus
|
||
|
// and the device may be a touchscreen or trackpad.
|
||
|
message Touch {
|
||
|
// The horizontal coordinate. This is the physical location on the
|
||
|
// screen For example 0 indicates the leftmost coordinate.
|
||
|
int32 x = 1;
|
||
|
|
||
|
// The vertical coordinate. This is the physical location on the screen
|
||
|
// For example 0 indicates the top left coordinate.
|
||
|
int32 y = 2;
|
||
|
|
||
|
// The identifier is an arbitrary non-negative integer that is used to
|
||
|
// identify and track each tool independently when multiple tools are
|
||
|
// active. For example, when multiple fingers are touching the device,
|
||
|
// each finger should be assigned a distinct tracking id that is used as
|
||
|
// long as the finger remains in contact. Tracking ids may be reused
|
||
|
// when their associated tools move out of range.
|
||
|
//
|
||
|
// The emulator currently supports up to 10 concurrent touch events. The
|
||
|
// identifier can be any uninque value and will be mapped to the next
|
||
|
// available internal identifier.
|
||
|
int32 identifier = 3;
|
||
|
|
||
|
// Reports the physical pressure applied to the tip of the tool or the
|
||
|
// signal strength of the touch contact.
|
||
|
//
|
||
|
// The values reported must be non-zero when the tool is touching the
|
||
|
// device and zero otherwise to indicate that the touch event is
|
||
|
// completed.
|
||
|
//
|
||
|
// Make sure to deliver a pressure of 0 for the given identifier when
|
||
|
// the touch event is completed, otherwise the touch identifier will not
|
||
|
// be unregistered!
|
||
|
int32 pressure = 4;
|
||
|
|
||
|
// Optionally reports the cross-sectional area of the touch contact, or
|
||
|
// the length of the longer dimension of the touch contact.
|
||
|
int32 touch_major = 5;
|
||
|
|
||
|
// Optionally reports the length of the shorter dimension of the touch
|
||
|
// contact. This axis will be ignored if touch_major is reporting an
|
||
|
// area measurement greater than 0.
|
||
|
int32 touch_minor = 6;
|
||
|
|
||
|
enum EventExpiration {
|
||
|
// The system will use the default time of 120s to track
|
||
|
// the touch event with the given identifier. If no update happens
|
||
|
// within this timeframe the identifier is considered expired
|
||
|
// and can be made available for re-use. This means that a touch event
|
||
|
// with pressure 0 for this identifier will be send to the emulator.
|
||
|
EVENT_EXPIRATION_UNSPECIFIED = 0;
|
||
|
|
||
|
// Never expire the given slot. You must *ALWAYS* close the identifier
|
||
|
// by sending a touch event with 0 pressure.
|
||
|
NEVER_EXPIRE = 1;
|
||
|
}
|
||
|
|
||
|
EventExpiration expiration = 7;
|
||
|
}
|
||
|
|
||
|
// A TouchEvent contains a list of Touch objects that are in contact with
|
||
|
// the touch surface.
|
||
|
//
|
||
|
// Touch events are delivered in sequence as specified in the touchList.
|
||
|
//
|
||
|
// TouchEvents are delivered to the emulated devices using ["Protocol
|
||
|
// B"](https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt)
|
||
|
message TouchEvent {
|
||
|
// The list of Touch objects, note that these do not need to be unique
|
||
|
repeated Touch touches = 1;
|
||
|
|
||
|
// The display device where the touch event occurred.
|
||
|
// Omitting or using the value 0 indicates the main display.
|
||
|
//
|
||
|
// Touch events cannot be send to displays other than 0, due to
|
||
|
// https://issuetracker.google.com/issues/150699691
|
||
|
int32 display = 2;
|
||
|
}
|
||
|
|
||
|
// The MouseEvent interface represents events that occur due to the user
|
||
|
// interacting with a pointing device (such as a mouse).
|
||
|
message MouseEvent {
|
||
|
// The horizontal coordinate. This is the physical location on the
|
||
|
// screen For example 0 indicates the leftmost coordinate.
|
||
|
int32 x = 1;
|
||
|
|
||
|
// The vertical coordinate. This is the physical location on the screen
|
||
|
// For example 0 indicates the top left coordinate.
|
||
|
int32 y = 2;
|
||
|
|
||
|
// Indicates which buttons are pressed.
|
||
|
// 0: No button was pressed
|
||
|
// 1: Primary button (left)
|
||
|
// 2: Secondary button (right)
|
||
|
int32 buttons = 3;
|
||
|
|
||
|
// The display device where the mouse event occurred.
|
||
|
// Omitting or using the value 0 indicates the main display.
|
||
|
int32 display = 4;
|
||
|
}
|
||
|
|
||
|
message WheelEvent {
|
||
|
// The value indicating how much the mouse wheel is rotated. Scaled so that
|
||
|
// 120 equals to 1 wheel click. (120 is chosen as a multiplier often used to
|
||
|
// represent wheel movements less than 1 wheel click. e.g.
|
||
|
// https://doc.qt.io/qt-5/qwheelevent.html#angleDelta) Positive delta value
|
||
|
// is assigned to dx when the top of wheel is moved to left. Similarly
|
||
|
// positive delta value is assigned to dy when the top of wheel is moved
|
||
|
// away from the user.
|
||
|
int32 dx = 1;
|
||
|
int32 dy = 2;
|
||
|
|
||
|
// The display device where the mouse event occurred.
|
||
|
// Omitting or using the value 0 indicates the main display.
|
||
|
int32 display = 3;
|
||
|
}
|
||
|
|
||
|
// KeyboardEvent objects describe a user interaction with the keyboard; each
|
||
|
// event describes a single interaction between the user and a key (or
|
||
|
// combination of a key with modifier keys) on the keyboard.
|
||
|
// This follows the pattern as set by
|
||
|
// (javascript)[https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent]
|
||
|
//
|
||
|
// Note: that only keyCode, key, or text can be set and that the semantics
|
||
|
// will slightly vary.
|
||
|
message KeyboardEvent {
|
||
|
// Code types that the emulator can receive. Note that the emulator
|
||
|
// will do its best to translate the code to an evdev value that
|
||
|
// will be send to the emulator. This translation is based on
|
||
|
// the chromium translation tables. See
|
||
|
// (this)[https://android.googlesource.com/platform/external/qemu/+/refs/heads/emu-master-dev/android/android-grpc/android/emulation/control/keyboard/keycode_converter_data.inc]
|
||
|
// for details on the translation.
|
||
|
enum KeyCodeType {
|
||
|
Usb = 0;
|
||
|
Evdev = 1;
|
||
|
XKB = 2;
|
||
|
Win = 3;
|
||
|
Mac = 4;
|
||
|
}
|
||
|
|
||
|
enum KeyEventType {
|
||
|
// Indicates that this keyevent should be send to the emulator
|
||
|
// as a key down event. Meaning that the key event will be
|
||
|
// translated to an EvDev event type and bit 11 (0x400) will be
|
||
|
// set before it is sent to the emulator.
|
||
|
keydown = 0;
|
||
|
|
||
|
// Indicates that the keyevent should be send to the emulator
|
||
|
// as a key up event. Meaning that the key event will be
|
||
|
// translated to an EvDev event type and
|
||
|
// sent to the emulator.
|
||
|
keyup = 1;
|
||
|
|
||
|
// Indicates that the keyevent will be send to the emulator
|
||
|
// as e key down event and immediately followed by a keyup event.
|
||
|
keypress = 2;
|
||
|
}
|
||
|
|
||
|
// Type of keycode contained in the keyCode field.
|
||
|
KeyCodeType codeType = 1;
|
||
|
|
||
|
// The type of keyboard event that should be sent to the emulator
|
||
|
KeyEventType eventType = 2;
|
||
|
|
||
|
// This property represents a physical key on the keyboard (as opposed
|
||
|
// to the character generated by pressing the key). In other words, this
|
||
|
// property is a value which isn't altered by keyboard layout or the
|
||
|
// state of the modifier keys. This value will be interpreted by the
|
||
|
// emulator depending on the KeyCodeType. The incoming key code will be
|
||
|
// translated to an evdev code type and send to the emulator.
|
||
|
// The values in key and text will be ignored.
|
||
|
int32 keyCode = 3;
|
||
|
|
||
|
// The value of the key pressed by the user, taking into consideration
|
||
|
// the state of modifier keys such as Shift as well as the keyboard
|
||
|
// locale and layout. This follows the w3c standard used in browsers.
|
||
|
// You can find an accurate description of valid values
|
||
|
// [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values)
|
||
|
//
|
||
|
// Note that some keys can result in multiple evdev events that are
|
||
|
// delivered to the emulator. for example the Key "A" will result in a
|
||
|
// sequence:
|
||
|
// ["Shift", "a"] -> [0x2a, 0x1e] whereas "a" results in ["a"] -> [0x1e].
|
||
|
//
|
||
|
// Not all documented keys are understood by android, and only printable
|
||
|
// ASCII [32-127) characters are properly translated.
|
||
|
//
|
||
|
// Keep in mind that there are a set of key values that result in android
|
||
|
// specific behavior
|
||
|
// [see](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values#Phone_keys):
|
||
|
//
|
||
|
// - "AppSwitch": Behaves as the "Overview" button in android.
|
||
|
// - "GoBack": The Back button.
|
||
|
// - "GoHome": The Home button, which takes the user to the phone's main
|
||
|
// screen (usually an application launcher).
|
||
|
// - "Power": The Power button.
|
||
|
string key = 4;
|
||
|
|
||
|
// Series of utf8 encoded characters to send to the emulator. An attempt
|
||
|
// will be made to translate every character will an EvDev event type and
|
||
|
// send to the emulator as a keypress event. The values in keyCode,
|
||
|
// eventType, codeType and key will be ignored.
|
||
|
//
|
||
|
// Note that most printable ASCII characters (range [32-127) can be send
|
||
|
// individually with the "key" param. Do not expect arbitrary UTF symbols to
|
||
|
// arrive in the emulator (most will be ignored).
|
||
|
//
|
||
|
// Note that it is possible to overrun the keyboard buffer by slamming this
|
||
|
// endpoint with large quantities of text (>1kb). The clipboard api is
|
||
|
// better suited for transferring large quantities of text.
|
||
|
string text = 5;
|
||
|
}
|
||
|
|
||
|
message Fingerprint {
|
||
|
// True when the fingprint is touched.
|
||
|
bool isTouching = 1;
|
||
|
|
||
|
// The identifier of the registered fingerprint.
|
||
|
int32 touchId = 2;
|
||
|
}
|
||
|
|
||
|
message GpsState {
|
||
|
// Setting this to false will disable auto updating from the LocationUI,
|
||
|
// otherwise the location UI will override the location at a frequency of
|
||
|
// 1hz.
|
||
|
//
|
||
|
// - This is unused if the emulator is launched with -no-window, or when he
|
||
|
// location ui is disabled.
|
||
|
// - This will BREAK the location ui experience if it is set to false. For
|
||
|
// example routing will no longer function.
|
||
|
bool passiveUpdate = 1;
|
||
|
|
||
|
// The latitude, in degrees.
|
||
|
double latitude = 2;
|
||
|
|
||
|
// The longitude, in degrees.
|
||
|
double longitude = 3;
|
||
|
|
||
|
// The speed if it is available, in meters/second over ground
|
||
|
double speed = 4;
|
||
|
|
||
|
// gets the horizontal direction of travel of this device, and is not
|
||
|
// related to the device orientation. It is guaranteed to be in the
|
||
|
// range [0.0, 360.0] if the device has a bearing. 0=North, 90=East,
|
||
|
// 180=South, etc..
|
||
|
double bearing = 5;
|
||
|
|
||
|
// The altitude if available, in meters above the WGS 84 reference
|
||
|
// ellipsoid.
|
||
|
double altitude = 6;
|
||
|
|
||
|
// The number of satellites used to derive the fix
|
||
|
int32 satellites = 7;
|
||
|
}
|
||
|
|
||
|
message BatteryState {
|
||
|
enum BatteryStatus {
|
||
|
UNKNOWN = 0;
|
||
|
CHARGING = 1;
|
||
|
DISCHARGING = 2;
|
||
|
NOT_CHARGING = 3;
|
||
|
FULL = 4;
|
||
|
}
|
||
|
|
||
|
enum BatteryCharger {
|
||
|
NONE = 0;
|
||
|
AC = 1;
|
||
|
USB = 2;
|
||
|
WIRELESS = 3;
|
||
|
}
|
||
|
|
||
|
enum BatteryHealth {
|
||
|
GOOD = 0;
|
||
|
FAILED = 1;
|
||
|
DEAD = 2;
|
||
|
OVERVOLTAGE = 3;
|
||
|
OVERHEATED = 4;
|
||
|
}
|
||
|
|
||
|
bool hasBattery = 1;
|
||
|
bool isPresent = 2;
|
||
|
BatteryCharger charger = 3;
|
||
|
int32 chargeLevel = 4;
|
||
|
BatteryHealth health = 5;
|
||
|
BatteryStatus status = 6;
|
||
|
}
|
||
|
|
||
|
// An ImageTransport allows for specifying a side channel for
|
||
|
// delivering image frames versus using the standard bytes array that is
|
||
|
// returned with the gRPC request.
|
||
|
message ImageTransport {
|
||
|
enum TransportChannel {
|
||
|
// Return full frames over the gRPC transport
|
||
|
TRANSPORT_CHANNEL_UNSPECIFIED = 0;
|
||
|
|
||
|
// Write images to the a file/shared memory handle.
|
||
|
MMAP = 1;
|
||
|
}
|
||
|
|
||
|
// The desired transport channel used for delivering image frames. Only
|
||
|
// relevant when streaming screenshots.
|
||
|
TransportChannel channel = 1;
|
||
|
|
||
|
// Handle used for writing image frames if transport is mmap. The client
|
||
|
// sets and owns this handle. It can be either a shm region, or a mmap. A
|
||
|
// mmap should be a url that starts with `file:///` Note: the mmap can
|
||
|
// result in tearing.
|
||
|
string handle = 2;
|
||
|
}
|
||
|
|
||
|
// The aspect ratio (width/height) will be different from the one
|
||
|
// where the device is unfolded.
|
||
|
message FoldedDisplay {
|
||
|
uint32 width = 1;
|
||
|
uint32 height = 2;
|
||
|
// It is possible for the screen to be folded in different ways depending
|
||
|
// on which surface is shown to the user. So xOffset and yOffset indicate
|
||
|
// the top left corner of the folded screen within the original unfolded
|
||
|
// screen.
|
||
|
uint32 xOffset = 3;
|
||
|
uint32 yOffset = 4;
|
||
|
}
|
||
|
|
||
|
message ImageFormat {
|
||
|
enum ImgFormat {
|
||
|
// Portable Network Graphics format
|
||
|
// (https://en.wikipedia.org/wiki/Portable_Network_Graphics)
|
||
|
PNG = 0;
|
||
|
|
||
|
// Three-channel RGB color model supplemented with a fourth alpha
|
||
|
// channel. https://en.wikipedia.org/wiki/RGBA_color_model
|
||
|
// Each pixel consists of 4 bytes.
|
||
|
RGBA8888 = 1;
|
||
|
|
||
|
// Three-channel RGB color model, each pixel consists of 3 bytes
|
||
|
RGB888 = 2;
|
||
|
}
|
||
|
|
||
|
// The (desired) format of the resulting bytes.
|
||
|
ImgFormat format = 1;
|
||
|
|
||
|
// [Output Only] The rotation of the image. The image will be rotated
|
||
|
// based upon the coarse grained orientation of the device.
|
||
|
Rotation rotation = 2;
|
||
|
|
||
|
// The (desired) width of the image. When passed as input
|
||
|
// the image will be scaled to match the given
|
||
|
// width, while maintaining the aspect ratio of the device.
|
||
|
// The returned image will never exceed the given width, but can be less.
|
||
|
// Omitting this value (or passing in 0) will result in no scaling,
|
||
|
// and the width of the actual device will be used.
|
||
|
uint32 width = 3;
|
||
|
|
||
|
// The (desired) height of the image. When passed as input
|
||
|
// the image will be scaled to match the given
|
||
|
// height, while maintaining the aspect ratio of the device.
|
||
|
// The returned image will never exceed the given height, but can be less.
|
||
|
// Omitting this value (or passing in 0) will result in no scaling,
|
||
|
// and the height of the actual device will be used.
|
||
|
uint32 height = 4;
|
||
|
|
||
|
// The (desired) display id of the device. Setting this to 0 (or omitting)
|
||
|
// indicates the main display.
|
||
|
uint32 display = 5;
|
||
|
|
||
|
// Set this if you wish to use a different transport channel to deliver
|
||
|
// image frames.
|
||
|
ImageTransport transport = 6;
|
||
|
|
||
|
// [Output Only] Display configuration when screen is folded. The value is
|
||
|
// the original configuration before scaling.
|
||
|
FoldedDisplay foldedDisplay = 7;
|
||
|
|
||
|
// [Output Only] Display mode when AVD is resizable.
|
||
|
DisplayModeValue displayMode = 8;
|
||
|
}
|
||
|
|
||
|
message Image {
|
||
|
ImageFormat format = 1;
|
||
|
|
||
|
uint32 width = 2 [deprecated = true]; // width is contained in format.
|
||
|
uint32 height = 3 [deprecated = true]; // height is contained in format.
|
||
|
|
||
|
// The organization of the pixels in the image buffer is from left to
|
||
|
// right and bottom up. This will be empty if an alternative image transport
|
||
|
// is requested in the image format. In that case the side channel should
|
||
|
// be used to obtain the image data.
|
||
|
bytes image = 4;
|
||
|
|
||
|
// [Output Only] Monotonically increasing sequence number in a stream of
|
||
|
// screenshots. The first screenshot will have a sequence of 0. A single
|
||
|
// screenshot will always have a sequence number of 0. The sequence is not
|
||
|
// necessarily contiguous, and can be used to detect how many frames were
|
||
|
// dropped. An example sequence could be: [0, 3, 5, 7, 9, 11].
|
||
|
uint32 seq = 5;
|
||
|
|
||
|
// [Output Only] Unix timestamp in microseconds when the emulator estimates
|
||
|
// the frame was generated. The timestamp is before the actual frame is
|
||
|
// copied and transformed. This can be used to calculate variance between
|
||
|
// frame production time, and frame depiction time.
|
||
|
uint64 timestampUs = 6;
|
||
|
}
|
||
|
|
||
|
message Rotation {
|
||
|
enum SkinRotation {
|
||
|
PORTRAIT = 0; // 0 degrees
|
||
|
LANDSCAPE = 1; // 90 degrees
|
||
|
REVERSE_PORTRAIT = 2; // -180 degrees
|
||
|
REVERSE_LANDSCAPE = 3; // -90 degrees
|
||
|
}
|
||
|
|
||
|
// The rotation of the device, derived from the sensor state
|
||
|
// of the emulator. The derivation reflects how android observes
|
||
|
// the rotation state.
|
||
|
SkinRotation rotation = 1;
|
||
|
|
||
|
// Specifies the angle of rotation, in degrees [-180, 180]
|
||
|
double xAxis = 2;
|
||
|
double yAxis = 3;
|
||
|
double zAxis = 4;
|
||
|
}
|
||
|
|
||
|
message PhoneCall {
|
||
|
enum Operation {
|
||
|
InitCall = 0;
|
||
|
AcceptCall = 1;
|
||
|
RejectCallExplicit = 2;
|
||
|
RejectCallBusy = 3;
|
||
|
DisconnectCall = 4;
|
||
|
PlaceCallOnHold = 5;
|
||
|
TakeCallOffHold = 6;
|
||
|
}
|
||
|
Operation operation = 1;
|
||
|
string number = 2;
|
||
|
}
|
||
|
|
||
|
message PhoneResponse {
|
||
|
enum Response {
|
||
|
OK = 0;
|
||
|
BadOperation = 1; // Enum out of range
|
||
|
BadNumber = 2; // Mal-formed telephone number
|
||
|
InvalidAction = 3; // E.g., disconnect when no call is in progress
|
||
|
ActionFailed = 4; // Internal error
|
||
|
RadioOff = 5; // Radio power off
|
||
|
}
|
||
|
Response response = 1;
|
||
|
}
|
||
|
|
||
|
message Entry {
|
||
|
string key = 1;
|
||
|
string value = 2;
|
||
|
}
|
||
|
|
||
|
message EntryList {
|
||
|
repeated Entry entry = 1;
|
||
|
}
|
||
|
|
||
|
message EmulatorStatus {
|
||
|
// The emulator version string.
|
||
|
string version = 1;
|
||
|
|
||
|
// The time the emulator has been active in .ms
|
||
|
uint64 uptime = 2;
|
||
|
|
||
|
// True if the device has completed booting.
|
||
|
// For P and later this information will accurate,
|
||
|
// for older images we rely on adb.
|
||
|
bool booted = 3;
|
||
|
|
||
|
// The current vm configuration
|
||
|
VmConfiguration vmConfig = 4;
|
||
|
|
||
|
// The hardware configuration of the running emulator as
|
||
|
// key valure pairs.
|
||
|
EntryList hardwareConfig = 5;
|
||
|
}
|
||
|
|
||
|
message AudioFormat {
|
||
|
enum SampleFormat {
|
||
|
AUD_FMT_U8 = 0; // Unsigned 8 bit
|
||
|
AUD_FMT_S16 = 1; // Signed 16 bit (little endian)
|
||
|
}
|
||
|
|
||
|
enum Channels {
|
||
|
Mono = 0;
|
||
|
Stereo = 1;
|
||
|
}
|
||
|
|
||
|
enum DeliveryMode {
|
||
|
// The audio queue will block and wait until the emulator requests
|
||
|
// packets. The client does not have to throttle and can push packets at
|
||
|
// will. This can result in the client falling behind.
|
||
|
MODE_UNSPECIFIED = 0;
|
||
|
// Audio packets will be delivered in real time (when possible). The
|
||
|
// audio queue will be overwritten with incoming data if data is made
|
||
|
// available. This means the client needs to control timing properly, or
|
||
|
// packets will get overwritten.
|
||
|
MODE_REAL_TIME = 1; //
|
||
|
}
|
||
|
// Sampling rate to use, defaulting to 44100 if this is not set.
|
||
|
// Note, that android devices typically will not use a sampling
|
||
|
// rate higher than 48kHz. See
|
||
|
// https://developer.android.com/ndk/guides/audio.
|
||
|
uint64 samplingRate = 1;
|
||
|
Channels channels = 2;
|
||
|
SampleFormat format = 3;
|
||
|
|
||
|
// [Input Only]
|
||
|
// The mode used when delivering audio packets.
|
||
|
DeliveryMode mode = 4;
|
||
|
}
|
||
|
|
||
|
message AudioPacket {
|
||
|
AudioFormat format = 1;
|
||
|
|
||
|
// Unix epoch in us when this frame was captured.
|
||
|
uint64 timestamp = 2;
|
||
|
|
||
|
// Contains a sample in the given audio format.
|
||
|
bytes audio = 3;
|
||
|
}
|
||
|
|
||
|
message SmsMessage {
|
||
|
// The source address where this message came from.
|
||
|
//
|
||
|
// The address should be a valid GSM-formatted address as specified by
|
||
|
// 3GPP 23.040 Sec 9.1.2.5.
|
||
|
//
|
||
|
// For example: +3106225412 or (650) 555-1221
|
||
|
string srcAddress = 1;
|
||
|
|
||
|
// A utf8 encoded text message that should be delivered.
|
||
|
string text = 2;
|
||
|
}
|
||
|
|
||
|
// A DisplayConfiguration describes a primary or secondary
|
||
|
// display available to the emulator. The screen aspect ratio
|
||
|
// cannot be longer (or wider) than 21:9 (or 9:21). Screen sizes
|
||
|
// larger than 4k will be rejected.
|
||
|
//
|
||
|
// Common configurations (w x h) are:
|
||
|
// - 480p (480x720) 142 dpi
|
||
|
// - 720p (720x1280) 213 dpi
|
||
|
// - 1080p (1080x1920) 320 dpi
|
||
|
// - 4K (2160x3840) 320 dpi
|
||
|
// - 4K (2160x3840) 640 dpi (upscaled)
|
||
|
//
|
||
|
// The behavior of the virtual display depends on the flags that are provided to
|
||
|
// this method. By default, virtual displays are created to be private,
|
||
|
// non-presentation and unsecure.
|
||
|
message DisplayConfiguration {
|
||
|
// These are the set of known android flags and their respective values.
|
||
|
// you can combine the int values to (de)construct the flags field below.
|
||
|
enum DisplayFlags {
|
||
|
DISPLAYFLAGS_UNSPECIFIED = 0;
|
||
|
|
||
|
// When this flag is set, the virtual display is public.
|
||
|
// A public virtual display behaves just like most any other display
|
||
|
// that is connected to the system such as an external or wireless
|
||
|
// display. Applications can open windows on the display and the system
|
||
|
// may mirror the contents of other displays onto it. see:
|
||
|
// https://developer.android.com/reference/android/hardware/display/DisplayManager#VIRTUAL_DISPLAY_FLAG_PUBLIC
|
||
|
VIRTUAL_DISPLAY_FLAG_PUBLIC = 1;
|
||
|
|
||
|
// When this flag is set, the virtual display is registered as a
|
||
|
// presentation display in the presentation display category.
|
||
|
// Applications may automatically project their content to presentation
|
||
|
// displays to provide richer second screen experiences.
|
||
|
// https://developer.android.com/reference/android/hardware/display/DisplayManager#VIRTUAL_DISPLAY_FLAG_PRESENTATION
|
||
|
VIRTUAL_DISPLAY_FLAG_PRESENTATION = 2;
|
||
|
|
||
|
// When this flag is set, the virtual display is considered secure as
|
||
|
// defined by the Display#FLAG_SECURE display flag. The caller promises
|
||
|
// to take reasonable measures, such as over-the-air encryption, to
|
||
|
// prevent the contents of the display from being intercepted or
|
||
|
// recorded on a persistent medium.
|
||
|
// see:
|
||
|
// https://developer.android.com/reference/android/hardware/display/DisplayManager#VIRTUAL_DISPLAY_FLAG_SECURE
|
||
|
VIRTUAL_DISPLAY_FLAG_SECURE = 4;
|
||
|
|
||
|
// This flag is used in conjunction with VIRTUAL_DISPLAY_FLAG_PUBLIC.
|
||
|
// Ordinarily public virtual displays will automatically mirror the
|
||
|
// content of the default display if they have no windows of their own.
|
||
|
// When this flag is specified, the virtual display will only ever show
|
||
|
// its own content and will be blanked instead if it has no windows. See
|
||
|
// https://developer.android.com/reference/android/hardware/display/DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
|
||
|
VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY = 8;
|
||
|
|
||
|
// Allows content to be mirrored on private displays when no content is
|
||
|
// being shown.
|
||
|
// This flag is mutually exclusive with
|
||
|
// VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY. If both flags are specified
|
||
|
// then the own-content only behavior will be applied.
|
||
|
// see:
|
||
|
// https://developer.android.com/reference/android/hardware/display/DisplayManager#VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR)
|
||
|
VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR = 16;
|
||
|
}
|
||
|
|
||
|
// The width of the display, restricted to:
|
||
|
// 320 * (dpi / 160) <= width
|
||
|
uint32 width = 1;
|
||
|
|
||
|
// The heigh of the display, restricted to:
|
||
|
// * 320 * (dpi / 160) <= height
|
||
|
uint32 height = 2;
|
||
|
|
||
|
// The pixel density (dpi).
|
||
|
// See https://developer.android.com/training/multiscreen/screendensities
|
||
|
// for details. This value should be in the range [120, ..., 640]
|
||
|
uint32 dpi = 3;
|
||
|
|
||
|
// A combination of virtual display flags. These flags can be constructed
|
||
|
// by combining the DisplayFlags enum described above.
|
||
|
//
|
||
|
// The behavior of the virtual display depends on the flags. By default
|
||
|
// virtual displays are created to be private, non-presentation and
|
||
|
// unsecure.
|
||
|
uint32 flags = 4;
|
||
|
|
||
|
// The id of the display.
|
||
|
// The primary (default) display has the display ID of 0.
|
||
|
// A secondary display has a display ID not 0.
|
||
|
//
|
||
|
// A display with the id in the range [1, userConfigurable]
|
||
|
// can be modified. See DisplayConfigurations below for details.
|
||
|
//
|
||
|
// The id can be used to get or stream a screenshot.
|
||
|
uint32 display = 5;
|
||
|
}
|
||
|
// Provides information about all the displays that can be attached
|
||
|
// to the emulator. The emulator will always have at least one display.
|
||
|
//
|
||
|
// The emulator usually has the following display configurations:
|
||
|
// 0: The default display.
|
||
|
// 1 - 3: User configurable displays. These can be added/removed.
|
||
|
// For example the standalone emulator allows you to modify these
|
||
|
// in the extended controls.
|
||
|
// 6 - 11: Fixed external displays. For example Android Auto uses fixed
|
||
|
// displays in this range.
|
||
|
message DisplayConfigurations {
|
||
|
repeated DisplayConfiguration displays = 1;
|
||
|
|
||
|
// Display configurations with id [1, userConfigurable] are
|
||
|
// user configurable, that is they can be added, removed or
|
||
|
// updated.
|
||
|
uint32 userConfigurable = 2;
|
||
|
|
||
|
// The maximum number of attached displays this emulator supports.
|
||
|
// This is the total number of displays that can be attached to
|
||
|
// the emulator.
|
||
|
//
|
||
|
// Note: A display with an id that is larger than userConfigurable cannot
|
||
|
// be modified.
|
||
|
uint32 maxDisplays = 3;
|
||
|
}
|
||
|
|
||
|
message Notification {
|
||
|
enum EventType {
|
||
|
VIRTUAL_SCENE_CAMERA_INACTIVE = 0;
|
||
|
VIRTUAL_SCENE_CAMERA_ACTIVE = 1;
|
||
|
|
||
|
// Fired when an update to a display event has been fired through
|
||
|
// the extended ui. This does not fire events when the display
|
||
|
// is changed through the console or gRPC endpoint.
|
||
|
DISPLAY_CONFIGURATIONS_CHANGED_UI = 2;
|
||
|
// Keep adding more for other event types
|
||
|
}
|
||
|
|
||
|
EventType event = 1;
|
||
|
}
|
||
|
|
||
|
message RotationRadian {
|
||
|
float x = 1; // x axis is horizontal and orthogonal to the view direction.
|
||
|
float y = 2; // y axis points up and is perpendicular to the floor.
|
||
|
float z = 3; // z axis is the view direction and is set to 0.0 in
|
||
|
// rotateVirtualSceneCamera call.
|
||
|
}
|
||
|
|
||
|
message Velocity {
|
||
|
float x = 1; // x axis is horizontal and orthogonal to the view direction.
|
||
|
float y = 2; // y axis points up and is perpendicular to the floor.
|
||
|
float z = 3; // z axis is the view direction
|
||
|
}
|
||
|
|
||
|
// must follow the definition in "external/qemu/android/hw-sensors.h"
|
||
|
message Posture {
|
||
|
enum PostureValue {
|
||
|
POSTURE_UNKNOWN = 0;
|
||
|
POSTURE_CLOSED = 1;
|
||
|
POSTURE_HALF_OPENED = 2;
|
||
|
POSTURE_OPENED = 3;
|
||
|
POSTURE_FLIPPED = 4;
|
||
|
POSTURE_TENT = 5;
|
||
|
POSTURE_MAX = 6;
|
||
|
}
|
||
|
PostureValue value = 3;
|
||
|
}
|