androidtvremote2 0.1.2__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. {androidtvremote2-0.1.2/src/androidtvremote2.egg-info → androidtvremote2-0.2.0}/PKG-INFO +3 -3
  2. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/README.md +1 -1
  3. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/pyproject.toml +5 -4
  4. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/androidtv_remote.py +12 -0
  5. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/polo_pb2.py +14 -4
  6. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/polo_pb2.pyi +37 -30
  7. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/remote.py +39 -2
  8. androidtvremote2-0.2.0/src/androidtvremote2/remotemessage_pb2.py +86 -0
  9. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/remotemessage_pb2.pyi +76 -48
  10. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0/src/androidtvremote2.egg-info}/PKG-INFO +3 -3
  11. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/demo.py +5 -2
  12. androidtvremote2-0.1.2/src/androidtvremote2/remotemessage_pb2.py +0 -74
  13. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/LICENSE +0 -0
  14. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/setup.cfg +0 -0
  15. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/__init__.py +0 -0
  16. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/base.py +0 -0
  17. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/certificate_generator.py +0 -0
  18. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/const.py +0 -0
  19. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/exceptions.py +0 -0
  20. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2/pairing.py +0 -0
  21. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2.egg-info/SOURCES.txt +0 -0
  22. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2.egg-info/dependency_links.txt +0 -0
  23. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2.egg-info/requires.txt +0 -0
  24. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/src/androidtvremote2.egg-info/top_level.txt +0 -0
  25. {androidtvremote2-0.1.2 → androidtvremote2-0.2.0}/tests/test_androidtv_remote.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: androidtvremote2
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: A Python library for interacting with Android TV using the Android TV Remote protocol v2
5
5
  Author-email: tronikos <tronikos@gmail.com>
6
6
  License: Apache-2.0
@@ -57,7 +57,7 @@ pre-commit run --all-files
57
57
 
58
58
  # Alternative: run formatter, lint, and type checking
59
59
  python -m pip install isort black flake8 ruff mypy
60
- isort . ; black . ; flake8 . ; ruff . --fix ; mypy --install-types .
60
+ isort . ; black . ; flake8 . ; ruff check . --fix ; mypy --install-types .
61
61
 
62
62
  # Run tests
63
63
  python -m pip install pytest
@@ -42,7 +42,7 @@ pre-commit run --all-files
42
42
 
43
43
  # Alternative: run formatter, lint, and type checking
44
44
  python -m pip install isort black flake8 ruff mypy
45
- isort . ; black . ; flake8 . ; ruff . --fix ; mypy --install-types .
45
+ isort . ; black . ; flake8 . ; ruff check . --fix ; mypy --install-types .
46
46
 
47
47
  # Run tests
48
48
  python -m pip install pytest
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "androidtvremote2"
3
- version = "0.1.2"
3
+ version = "0.2.0"
4
4
  license = {text = "Apache-2.0"}
5
5
  authors = [
6
6
  { name="tronikos", email="tronikos@gmail.com" },
@@ -36,6 +36,7 @@ target-version = "py311"
36
36
  exclude = ["*_pb2.py", "*_pb2_grpc.py", "*.pyi"]
37
37
  line-length = 127
38
38
 
39
+ [tool.ruff.lint]
39
40
  select = [
40
41
  "B007", # Loop control variable {name} not used within loop body
41
42
  "B014", # Exception handler with duplicate exception
@@ -68,12 +69,12 @@ ignore = [
68
69
  'UP007', # Non PEP604 annotations
69
70
  ]
70
71
 
71
- [tool.ruff.flake8-pytest-style]
72
+ [tool.ruff.lint.flake8-pytest-style]
72
73
  fixture-parentheses = false
73
74
 
74
- [tool.ruff.per-file-ignores]
75
+ [tool.ruff.lint.per-file-ignores]
75
76
  # Allow for demo script to write to stdout
76
77
  "demo.py" = ["T201"]
77
78
 
78
- [tool.ruff.mccabe]
79
+ [tool.ruff.lint.mccabe]
79
80
  max-complexity = 25
@@ -394,6 +394,18 @@ class AndroidTVRemote:
394
394
  raise ConnectionClosed("Called send_key_command after disconnect")
395
395
  self._remote_message_protocol.send_key_command(key_code, direction)
396
396
 
397
+ def send_text(self, text: str) -> None:
398
+ """Send text to Android TV.
399
+
400
+ :param text: text to be sent.
401
+ :raises ConnectionClosed: if client is disconnected.
402
+ :may not work as expected if virtual keyboard is present on the Android TV screen
403
+ """
404
+ if not self._remote_message_protocol:
405
+ LOGGER.debug("Called send_text after disconnect")
406
+ raise ConnectionClosed("Called send_text after disconnect")
407
+ self._remote_message_protocol.send_text(text)
408
+
397
409
  def send_launch_app_command(self, app_link_or_app_id: str) -> None:
398
410
  """Launch an app on Android TV.
399
411
 
@@ -1,11 +1,22 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
3
4
  # source: polo.proto
5
+ # Protobuf Python Version: 5.29.0
4
6
  """Generated protocol buffer code."""
5
7
  from google.protobuf import descriptor as _descriptor
6
8
  from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
7
10
  from google.protobuf import symbol_database as _symbol_database
8
11
  from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 29,
16
+ 0,
17
+ '',
18
+ 'polo.proto'
19
+ )
9
20
  # @@protoc_insertion_point(imports)
10
21
 
11
22
  _sym_db = _symbol_database.Default()
@@ -18,10 +29,9 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\npolo.proto\x12\x
18
29
  _globals = globals()
19
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
20
31
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'polo_pb2', _globals)
21
- if _descriptor._USE_C_DESCRIPTORS == False:
22
-
23
- DESCRIPTOR._options = None
24
- DESCRIPTOR._serialized_options = b'\n\035com.google.polo.wire.protobufB\tPoloProtoH\003'
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ _globals['DESCRIPTOR']._loaded_options = None
34
+ _globals['DESCRIPTOR']._serialized_options = b'\n\035com.google.polo.wire.protobufB\tPoloProtoH\003'
25
35
  _globals['_OUTERMESSAGE']._serialized_start=35
26
36
  _globals['_OUTERMESSAGE']._serialized_end=628
27
37
  _globals['_OUTERMESSAGE_STATUS']._serialized_start=530
@@ -2,6 +2,7 @@
2
2
  @generated by mypy-protobuf. Do not edit manually!
3
3
  isort:skip_file
4
4
  Copyright 2009 Google Inc. All Rights Reserved."""
5
+
5
6
  import builtins
6
7
  import collections.abc
7
8
  import google.protobuf.descriptor
@@ -18,7 +19,7 @@ else:
18
19
 
19
20
  DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
20
21
 
21
- @typing_extensions.final
22
+ @typing.final
22
23
  class OuterMessage(google.protobuf.message.Message):
23
24
  """OuterMessage - base outer message type used in the protocol."""
24
25
 
@@ -58,11 +59,13 @@ class OuterMessage(google.protobuf.message.Message):
58
59
  @property
59
60
  def pairing_request(self) -> global___PairingRequest:
60
61
  """Initialization phase"""
62
+
61
63
  @property
62
64
  def pairing_request_ack(self) -> global___PairingRequestAck: ...
63
65
  @property
64
66
  def options(self) -> global___Options:
65
67
  """Configuration phase"""
68
+
66
69
  @property
67
70
  def configuration(self) -> global___Configuration: ...
68
71
  @property
@@ -70,6 +73,7 @@ class OuterMessage(google.protobuf.message.Message):
70
73
  @property
71
74
  def secret(self) -> global___Secret:
72
75
  """Pairing phase"""
76
+
73
77
  @property
74
78
  def secret_ack(self) -> global___SecretAck: ...
75
79
  def __init__(
@@ -85,12 +89,12 @@ class OuterMessage(google.protobuf.message.Message):
85
89
  secret: global___Secret | None = ...,
86
90
  secret_ack: global___SecretAck | None = ...,
87
91
  ) -> None: ...
88
- def HasField(self, field_name: typing_extensions.Literal["configuration", b"configuration", "configuration_ack", b"configuration_ack", "options", b"options", "pairing_request", b"pairing_request", "pairing_request_ack", b"pairing_request_ack", "protocol_version", b"protocol_version", "secret", b"secret", "secret_ack", b"secret_ack", "status", b"status"]) -> builtins.bool: ...
89
- def ClearField(self, field_name: typing_extensions.Literal["configuration", b"configuration", "configuration_ack", b"configuration_ack", "options", b"options", "pairing_request", b"pairing_request", "pairing_request_ack", b"pairing_request_ack", "protocol_version", b"protocol_version", "secret", b"secret", "secret_ack", b"secret_ack", "status", b"status"]) -> None: ...
92
+ def HasField(self, field_name: typing.Literal["configuration", b"configuration", "configuration_ack", b"configuration_ack", "options", b"options", "pairing_request", b"pairing_request", "pairing_request_ack", b"pairing_request_ack", "protocol_version", b"protocol_version", "secret", b"secret", "secret_ack", b"secret_ack", "status", b"status"]) -> builtins.bool: ...
93
+ def ClearField(self, field_name: typing.Literal["configuration", b"configuration", "configuration_ack", b"configuration_ack", "options", b"options", "pairing_request", b"pairing_request", "pairing_request_ack", b"pairing_request_ack", "protocol_version", b"protocol_version", "secret", b"secret", "secret_ack", b"secret_ack", "status", b"status"]) -> None: ...
90
94
 
91
95
  global___OuterMessage = OuterMessage
92
96
 
93
- @typing_extensions.final
97
+ @typing.final
94
98
  class PairingRequest(google.protobuf.message.Message):
95
99
  """
96
100
  Initialization messages
@@ -112,12 +116,12 @@ class PairingRequest(google.protobuf.message.Message):
112
116
  service_name: builtins.str | None = ...,
113
117
  client_name: builtins.str | None = ...,
114
118
  ) -> None: ...
115
- def HasField(self, field_name: typing_extensions.Literal["client_name", b"client_name", "service_name", b"service_name"]) -> builtins.bool: ...
116
- def ClearField(self, field_name: typing_extensions.Literal["client_name", b"client_name", "service_name", b"service_name"]) -> None: ...
119
+ def HasField(self, field_name: typing.Literal["client_name", b"client_name", "service_name", b"service_name"]) -> builtins.bool: ...
120
+ def ClearField(self, field_name: typing.Literal["client_name", b"client_name", "service_name", b"service_name"]) -> None: ...
117
121
 
118
122
  global___PairingRequest = PairingRequest
119
123
 
120
- @typing_extensions.final
124
+ @typing.final
121
125
  class PairingRequestAck(google.protobuf.message.Message):
122
126
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
123
127
 
@@ -129,12 +133,12 @@ class PairingRequestAck(google.protobuf.message.Message):
129
133
  *,
130
134
  server_name: builtins.str | None = ...,
131
135
  ) -> None: ...
132
- def HasField(self, field_name: typing_extensions.Literal["server_name", b"server_name"]) -> builtins.bool: ...
133
- def ClearField(self, field_name: typing_extensions.Literal["server_name", b"server_name"]) -> None: ...
136
+ def HasField(self, field_name: typing.Literal["server_name", b"server_name"]) -> builtins.bool: ...
137
+ def ClearField(self, field_name: typing.Literal["server_name", b"server_name"]) -> None: ...
134
138
 
135
139
  global___PairingRequestAck = PairingRequestAck
136
140
 
137
- @typing_extensions.final
141
+ @typing.final
138
142
  class Options(google.protobuf.message.Message):
139
143
  """
140
144
  Configuration messages
@@ -157,7 +161,7 @@ class Options(google.protobuf.message.Message):
157
161
  ROLE_TYPE_INPUT: Options.RoleType.ValueType # 1
158
162
  ROLE_TYPE_OUTPUT: Options.RoleType.ValueType # 2
159
163
 
160
- @typing_extensions.final
164
+ @typing.final
161
165
  class Encoding(google.protobuf.message.Message):
162
166
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
163
167
 
@@ -190,20 +194,22 @@ class Options(google.protobuf.message.Message):
190
194
  type: global___Options.Encoding.EncodingType.ValueType | None = ...,
191
195
  symbol_length: builtins.int | None = ...,
192
196
  ) -> None: ...
193
- def HasField(self, field_name: typing_extensions.Literal["symbol_length", b"symbol_length", "type", b"type"]) -> builtins.bool: ...
194
- def ClearField(self, field_name: typing_extensions.Literal["symbol_length", b"symbol_length", "type", b"type"]) -> None: ...
197
+ def HasField(self, field_name: typing.Literal["symbol_length", b"symbol_length", "type", b"type"]) -> builtins.bool: ...
198
+ def ClearField(self, field_name: typing.Literal["symbol_length", b"symbol_length", "type", b"type"]) -> None: ...
195
199
 
196
200
  INPUT_ENCODINGS_FIELD_NUMBER: builtins.int
197
201
  OUTPUT_ENCODINGS_FIELD_NUMBER: builtins.int
198
202
  PREFERRED_ROLE_FIELD_NUMBER: builtins.int
203
+ preferred_role: global___Options.RoleType.ValueType
204
+ """Preferred role, if any."""
199
205
  @property
200
206
  def input_encodings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Options.Encoding]:
201
207
  """List of encodings this endpoint accepts when serving as an input device."""
208
+
202
209
  @property
203
210
  def output_encodings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Options.Encoding]:
204
211
  """List of encodings this endpoint can generate as an output device."""
205
- preferred_role: global___Options.RoleType.ValueType
206
- """Preferred role, if any."""
212
+
207
213
  def __init__(
208
214
  self,
209
215
  *,
@@ -211,36 +217,37 @@ class Options(google.protobuf.message.Message):
211
217
  output_encodings: collections.abc.Iterable[global___Options.Encoding] | None = ...,
212
218
  preferred_role: global___Options.RoleType.ValueType | None = ...,
213
219
  ) -> None: ...
214
- def HasField(self, field_name: typing_extensions.Literal["preferred_role", b"preferred_role"]) -> builtins.bool: ...
215
- def ClearField(self, field_name: typing_extensions.Literal["input_encodings", b"input_encodings", "output_encodings", b"output_encodings", "preferred_role", b"preferred_role"]) -> None: ...
220
+ def HasField(self, field_name: typing.Literal["preferred_role", b"preferred_role"]) -> builtins.bool: ...
221
+ def ClearField(self, field_name: typing.Literal["input_encodings", b"input_encodings", "output_encodings", b"output_encodings", "preferred_role", b"preferred_role"]) -> None: ...
216
222
 
217
223
  global___Options = Options
218
224
 
219
- @typing_extensions.final
225
+ @typing.final
220
226
  class Configuration(google.protobuf.message.Message):
221
227
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
222
228
 
223
229
  ENCODING_FIELD_NUMBER: builtins.int
224
230
  CLIENT_ROLE_FIELD_NUMBER: builtins.int
225
- @property
226
- def encoding(self) -> global___Options.Encoding:
227
- """The encoding to be used in this session."""
228
231
  client_role: global___Options.RoleType.ValueType
229
232
  """The role of the client (ie, the one initiating pairing). This implies the
230
233
  peer (server) acts as the complementary role.
231
234
  """
235
+ @property
236
+ def encoding(self) -> global___Options.Encoding:
237
+ """The encoding to be used in this session."""
238
+
232
239
  def __init__(
233
240
  self,
234
241
  *,
235
242
  encoding: global___Options.Encoding | None = ...,
236
243
  client_role: global___Options.RoleType.ValueType | None = ...,
237
244
  ) -> None: ...
238
- def HasField(self, field_name: typing_extensions.Literal["client_role", b"client_role", "encoding", b"encoding"]) -> builtins.bool: ...
239
- def ClearField(self, field_name: typing_extensions.Literal["client_role", b"client_role", "encoding", b"encoding"]) -> None: ...
245
+ def HasField(self, field_name: typing.Literal["client_role", b"client_role", "encoding", b"encoding"]) -> builtins.bool: ...
246
+ def ClearField(self, field_name: typing.Literal["client_role", b"client_role", "encoding", b"encoding"]) -> None: ...
240
247
 
241
248
  global___Configuration = Configuration
242
249
 
243
- @typing_extensions.final
250
+ @typing.final
244
251
  class ConfigurationAck(google.protobuf.message.Message):
245
252
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
246
253
 
@@ -250,7 +257,7 @@ class ConfigurationAck(google.protobuf.message.Message):
250
257
 
251
258
  global___ConfigurationAck = ConfigurationAck
252
259
 
253
- @typing_extensions.final
260
+ @typing.final
254
261
  class Secret(google.protobuf.message.Message):
255
262
  """
256
263
  Pairing messages
@@ -265,12 +272,12 @@ class Secret(google.protobuf.message.Message):
265
272
  *,
266
273
  secret: builtins.bytes | None = ...,
267
274
  ) -> None: ...
268
- def HasField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> builtins.bool: ...
269
- def ClearField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> None: ...
275
+ def HasField(self, field_name: typing.Literal["secret", b"secret"]) -> builtins.bool: ...
276
+ def ClearField(self, field_name: typing.Literal["secret", b"secret"]) -> None: ...
270
277
 
271
278
  global___Secret = Secret
272
279
 
273
- @typing_extensions.final
280
+ @typing.final
274
281
  class SecretAck(google.protobuf.message.Message):
275
282
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
276
283
 
@@ -281,7 +288,7 @@ class SecretAck(google.protobuf.message.Message):
281
288
  *,
282
289
  secret: builtins.bytes | None = ...,
283
290
  ) -> None: ...
284
- def HasField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> builtins.bool: ...
285
- def ClearField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> None: ...
291
+ def HasField(self, field_name: typing.Literal["secret", b"secret"]) -> builtins.bool: ...
292
+ def ClearField(self, field_name: typing.Literal["secret", b"secret"]) -> None: ...
286
293
 
287
294
  global___SecretAck = SecretAck
@@ -15,11 +15,18 @@ from google.protobuf.message import DecodeError
15
15
 
16
16
  from .base import ProtobufProtocol
17
17
  from .const import LOGGER
18
- from .remotemessage_pb2 import RemoteDirection, RemoteKeyCode, RemoteMessage
18
+ from .remotemessage_pb2 import (
19
+ RemoteDirection,
20
+ RemoteEditInfo,
21
+ RemoteImeBatchEdit,
22
+ RemoteImeObject,
23
+ RemoteKeyCode,
24
+ RemoteMessage,
25
+ )
19
26
 
20
27
  LOG_PING_REQUESTS = False
21
28
  ERROR_SUGGESTION_MSG = (
22
- "Try clearing the storage of the Android TV Remove Service system app. "
29
+ "Try clearing the storage of the Android TV Remote Service system app. "
23
30
  "On the Android TV device, go to Settings > Apps > See all apps > Show system apps. "
24
31
  "Then, select Android TV Remote Service > Storage > Clear data/storage."
25
32
  )
@@ -82,6 +89,8 @@ class RemoteProtocol(ProtobufProtocol):
82
89
  self.current_app = ""
83
90
  self.device_info: dict[str, str] = {}
84
91
  self.volume_info: dict[str, str | bool | int] = {}
92
+ self.ime_counter: int = 0
93
+ self.ime_field_counter: int = 0
85
94
  self._loop = loop
86
95
  self._idle_disconnect_task: asyncio.Task | None = None
87
96
  self._reset_idle_disconnect_task()
@@ -110,6 +119,31 @@ class RemoteProtocol(ProtobufProtocol):
110
119
  msg.remote_key_inject.direction = direction # type: ignore[assignment]
111
120
  self._send_message(msg)
112
121
 
122
+ def send_text(self, text: str) -> None:
123
+ """Send a text string to Android TV via the input method.
124
+
125
+ The text length is used for both `start` and `end` in the RemoteImeObject.
126
+ The `ime_counter` and `ime_field_counter` values are taken from self (batch_edit_info response),
127
+ which is populated when a message with a remote_ime_batch_edit field is received.
128
+
129
+ :param text: The text string to be sent.
130
+ """
131
+ if not text:
132
+ raise ValueError("Text cannot be empty")
133
+
134
+ self._reset_idle_disconnect_task()
135
+ msg = RemoteMessage()
136
+ param_value = len(text) - 1
137
+ ime_object = RemoteImeObject(start=param_value, end=param_value, value=text)
138
+ edit_info = RemoteEditInfo(insert=1, text_field_status=ime_object)
139
+ batch_edit = RemoteImeBatchEdit(
140
+ ime_counter=self.ime_counter,
141
+ field_counter=self.ime_field_counter,
142
+ edit_info=[edit_info],
143
+ )
144
+ msg.remote_ime_batch_edit.CopyFrom(batch_edit)
145
+ self._send_message(msg)
146
+
113
147
  def send_launch_app_command(self, app_link: str) -> None:
114
148
  """Launch an app on Android TV.
115
149
 
@@ -165,6 +199,9 @@ class RemoteProtocol(ProtobufProtocol):
165
199
  elif msg.HasField("remote_ime_key_inject"):
166
200
  self.current_app = msg.remote_ime_key_inject.app_info.app_package
167
201
  self._on_current_app_updated(self.current_app)
202
+ elif msg.HasField("remote_ime_batch_edit"):
203
+ self.ime_counter = msg.remote_ime_batch_edit.ime_counter
204
+ self.ime_field_counter = msg.remote_ime_batch_edit.field_counter
168
205
  elif msg.HasField("remote_set_volume_level"):
169
206
  self.volume_info = {
170
207
  "level": msg.remote_set_volume_level.volume_level,
@@ -0,0 +1,86 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: remotemessage.proto
5
+ # Protobuf Python Version: 5.29.0
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 29,
16
+ 0,
17
+ '',
18
+ 'remotemessage.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13remotemessage.proto\x12\x06remote\".\n\x1aRemoteAppLinkLaunchRequest\x12\x10\n\x08\x61pp_link\x18\x01 \x01(\t\"!\n\x1fRemoteResetPreferredAudioDevice\"\x1f\n\x1dRemoteSetPreferredAudioDevice\"\x19\n\x17RemoteAdjustVolumeLevel\"\xb4\x01\n\x14RemoteSetVolumeLevel\x12\x10\n\x08unknown1\x18\x01 \x01(\r\x12\x10\n\x08unknown2\x18\x02 \x01(\r\x12\x14\n\x0cplayer_model\x18\x03 \x01(\t\x12\x10\n\x08unknown4\x18\x04 \x01(\r\x12\x10\n\x08unknown5\x18\x05 \x01(\r\x12\x12\n\nvolume_max\x18\x06 \x01(\r\x12\x14\n\x0cvolume_level\x18\x07 \x01(\r\x12\x14\n\x0cvolume_muted\x18\x08 \x01(\x08\"\x1e\n\x0bRemoteStart\x12\x0f\n\x07started\x18\x01 \x01(\x08\"\x10\n\x0eRemoteVoiceEnd\"\x14\n\x12RemoteVoicePayload\"\x12\n\x10RemoteVoiceBegin\"v\n\x15RemoteTextFieldStatus\x12\x15\n\rcounter_field\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t\x12\r\n\x05start\x18\x03 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x04 \x01(\x05\x12\x0c\n\x04int5\x18\x05 \x01(\x05\x12\r\n\x05label\x18\x06 \x01(\t\"W\n\x14RemoteImeShowRequest\x12?\n\x18remote_text_field_status\x18\x02 \x01(\x0b\x32\x1d.remote.RemoteTextFieldStatus\"T\n\x0eRemoteEditInfo\x12\x0e\n\x06insert\x18\x01 \x01(\x05\x12\x32\n\x11text_field_status\x18\x02 \x01(\x0b\x32\x17.remote.RemoteImeObject\"<\n\x0fRemoteImeObject\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05\x12\r\n\x05value\x18\x03 \x01(\t\"k\n\x12RemoteImeBatchEdit\x12\x13\n\x0bime_counter\x18\x01 \x01(\x05\x12\x15\n\rfield_counter\x18\x02 \x01(\x05\x12)\n\tedit_info\x18\x03 \x03(\x0b\x32\x16.remote.RemoteEditInfo\"\x99\x01\n\rRemoteAppInfo\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x05\x12\x0c\n\x04int2\x18\x02 \x01(\x05\x12\x0c\n\x04int3\x18\x03 \x01(\x05\x12\x0c\n\x04int4\x18\x04 \x01(\t\x12\x0c\n\x04int7\x18\x07 \x01(\x05\x12\x0c\n\x04int8\x18\x08 \x01(\x05\x12\r\n\x05label\x18\n \x01(\t\x12\x13\n\x0b\x61pp_package\x18\x0c \x01(\t\x12\r\n\x05int13\x18\r \x01(\x05\"w\n\x12RemoteImeKeyInject\x12\'\n\x08\x61pp_info\x18\x01 \x01(\x0b\x32\x15.remote.RemoteAppInfo\x12\x38\n\x11text_field_status\x18\x02 \x01(\x0b\x32\x1d.remote.RemoteTextFieldStatus\"f\n\x0fRemoteKeyInject\x12\'\n\x08key_code\x18\x01 \x01(\x0e\x32\x15.remote.RemoteKeyCode\x12*\n\tdirection\x18\x02 \x01(\x0e\x32\x17.remote.RemoteDirection\"\"\n\x12RemotePingResponse\x12\x0c\n\x04val1\x18\x01 \x01(\x05\"/\n\x11RemotePingRequest\x12\x0c\n\x04val1\x18\x01 \x01(\x05\x12\x0c\n\x04val2\x18\x02 \x01(\x05\"!\n\x0fRemoteSetActive\x12\x0e\n\x06\x61\x63tive\x18\x01 \x01(\x05\"\x80\x01\n\x10RemoteDeviceInfo\x12\r\n\x05model\x18\x01 \x01(\t\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x10\n\x08unknown1\x18\x03 \x01(\x05\x12\x10\n\x08unknown2\x18\x04 \x01(\t\x12\x14\n\x0cpackage_name\x18\x05 \x01(\t\x12\x13\n\x0b\x61pp_version\x18\x06 \x01(\t\"O\n\x0fRemoteConfigure\x12\r\n\x05\x63ode1\x18\x01 \x01(\x05\x12-\n\x0b\x64\x65vice_info\x18\x02 \x01(\x0b\x32\x18.remote.RemoteDeviceInfo\"D\n\x0bRemoteError\x12\r\n\x05value\x18\x01 \x01(\x08\x12&\n\x07message\x18\x02 \x01(\x0b\x32\x15.remote.RemoteMessage\"\xc1\x08\n\rRemoteMessage\x12\x31\n\x10remote_configure\x18\x01 \x01(\x0b\x32\x17.remote.RemoteConfigure\x12\x32\n\x11remote_set_active\x18\x02 \x01(\x0b\x32\x17.remote.RemoteSetActive\x12)\n\x0cremote_error\x18\x03 \x01(\x0b\x32\x13.remote.RemoteError\x12\x36\n\x13remote_ping_request\x18\x08 \x01(\x0b\x32\x19.remote.RemotePingRequest\x12\x38\n\x14remote_ping_response\x18\t \x01(\x0b\x32\x1a.remote.RemotePingResponse\x12\x32\n\x11remote_key_inject\x18\n \x01(\x0b\x32\x17.remote.RemoteKeyInject\x12\x39\n\x15remote_ime_key_inject\x18\x14 \x01(\x0b\x32\x1a.remote.RemoteImeKeyInject\x12\x39\n\x15remote_ime_batch_edit\x18\x15 \x01(\x0b\x32\x1a.remote.RemoteImeBatchEdit\x12=\n\x17remote_ime_show_request\x18\x16 \x01(\x0b\x32\x1c.remote.RemoteImeShowRequest\x12\x34\n\x12remote_voice_begin\x18\x1e \x01(\x0b\x32\x18.remote.RemoteVoiceBegin\x12\x38\n\x14remote_voice_payload\x18\x1f \x01(\x0b\x32\x1a.remote.RemoteVoicePayload\x12\x30\n\x10remote_voice_end\x18 \x01(\x0b\x32\x16.remote.RemoteVoiceEnd\x12)\n\x0cremote_start\x18( \x01(\x0b\x32\x13.remote.RemoteStart\x12=\n\x17remote_set_volume_level\x18\x32 \x01(\x0b\x32\x1c.remote.RemoteSetVolumeLevel\x12\x43\n\x1aremote_adjust_volume_level\x18\x33 \x01(\x0b\x32\x1f.remote.RemoteAdjustVolumeLevel\x12P\n!remote_set_preferred_audio_device\x18< \x01(\x0b\x32%.remote.RemoteSetPreferredAudioDevice\x12T\n#remote_reset_preferred_audio_device\x18= \x01(\x0b\x32\'.remote.RemoteResetPreferredAudioDevice\x12J\n\x1eremote_app_link_launch_request\x18Z \x01(\x0b\x32\".remote.RemoteAppLinkLaunchRequest*\xe7\x37\n\rRemoteKeyCode\x12\x13\n\x0fKEYCODE_UNKNOWN\x10\x00\x12\x15\n\x11KEYCODE_SOFT_LEFT\x10\x01\x12\x16\n\x12KEYCODE_SOFT_RIGHT\x10\x02\x12\x10\n\x0cKEYCODE_HOME\x10\x03\x12\x10\n\x0cKEYCODE_BACK\x10\x04\x12\x10\n\x0cKEYCODE_CALL\x10\x05\x12\x13\n\x0fKEYCODE_ENDCALL\x10\x06\x12\r\n\tKEYCODE_0\x10\x07\x12\r\n\tKEYCODE_1\x10\x08\x12\r\n\tKEYCODE_2\x10\t\x12\r\n\tKEYCODE_3\x10\n\x12\r\n\tKEYCODE_4\x10\x0b\x12\r\n\tKEYCODE_5\x10\x0c\x12\r\n\tKEYCODE_6\x10\r\x12\r\n\tKEYCODE_7\x10\x0e\x12\r\n\tKEYCODE_8\x10\x0f\x12\r\n\tKEYCODE_9\x10\x10\x12\x10\n\x0cKEYCODE_STAR\x10\x11\x12\x11\n\rKEYCODE_POUND\x10\x12\x12\x13\n\x0fKEYCODE_DPAD_UP\x10\x13\x12\x15\n\x11KEYCODE_DPAD_DOWN\x10\x14\x12\x15\n\x11KEYCODE_DPAD_LEFT\x10\x15\x12\x16\n\x12KEYCODE_DPAD_RIGHT\x10\x16\x12\x17\n\x13KEYCODE_DPAD_CENTER\x10\x17\x12\x15\n\x11KEYCODE_VOLUME_UP\x10\x18\x12\x17\n\x13KEYCODE_VOLUME_DOWN\x10\x19\x12\x11\n\rKEYCODE_POWER\x10\x1a\x12\x12\n\x0eKEYCODE_CAMERA\x10\x1b\x12\x11\n\rKEYCODE_CLEAR\x10\x1c\x12\r\n\tKEYCODE_A\x10\x1d\x12\r\n\tKEYCODE_B\x10\x1e\x12\r\n\tKEYCODE_C\x10\x1f\x12\r\n\tKEYCODE_D\x10 \x12\r\n\tKEYCODE_E\x10!\x12\r\n\tKEYCODE_F\x10\"\x12\r\n\tKEYCODE_G\x10#\x12\r\n\tKEYCODE_H\x10$\x12\r\n\tKEYCODE_I\x10%\x12\r\n\tKEYCODE_J\x10&\x12\r\n\tKEYCODE_K\x10\'\x12\r\n\tKEYCODE_L\x10(\x12\r\n\tKEYCODE_M\x10)\x12\r\n\tKEYCODE_N\x10*\x12\r\n\tKEYCODE_O\x10+\x12\r\n\tKEYCODE_P\x10,\x12\r\n\tKEYCODE_Q\x10-\x12\r\n\tKEYCODE_R\x10.\x12\r\n\tKEYCODE_S\x10/\x12\r\n\tKEYCODE_T\x10\x30\x12\r\n\tKEYCODE_U\x10\x31\x12\r\n\tKEYCODE_V\x10\x32\x12\r\n\tKEYCODE_W\x10\x33\x12\r\n\tKEYCODE_X\x10\x34\x12\r\n\tKEYCODE_Y\x10\x35\x12\r\n\tKEYCODE_Z\x10\x36\x12\x11\n\rKEYCODE_COMMA\x10\x37\x12\x12\n\x0eKEYCODE_PERIOD\x10\x38\x12\x14\n\x10KEYCODE_ALT_LEFT\x10\x39\x12\x15\n\x11KEYCODE_ALT_RIGHT\x10:\x12\x16\n\x12KEYCODE_SHIFT_LEFT\x10;\x12\x17\n\x13KEYCODE_SHIFT_RIGHT\x10<\x12\x0f\n\x0bKEYCODE_TAB\x10=\x12\x11\n\rKEYCODE_SPACE\x10>\x12\x0f\n\x0bKEYCODE_SYM\x10?\x12\x14\n\x10KEYCODE_EXPLORER\x10@\x12\x14\n\x10KEYCODE_ENVELOPE\x10\x41\x12\x11\n\rKEYCODE_ENTER\x10\x42\x12\x0f\n\x0bKEYCODE_DEL\x10\x43\x12\x11\n\rKEYCODE_GRAVE\x10\x44\x12\x11\n\rKEYCODE_MINUS\x10\x45\x12\x12\n\x0eKEYCODE_EQUALS\x10\x46\x12\x18\n\x14KEYCODE_LEFT_BRACKET\x10G\x12\x19\n\x15KEYCODE_RIGHT_BRACKET\x10H\x12\x15\n\x11KEYCODE_BACKSLASH\x10I\x12\x15\n\x11KEYCODE_SEMICOLON\x10J\x12\x16\n\x12KEYCODE_APOSTROPHE\x10K\x12\x11\n\rKEYCODE_SLASH\x10L\x12\x0e\n\nKEYCODE_AT\x10M\x12\x0f\n\x0bKEYCODE_NUM\x10N\x12\x17\n\x13KEYCODE_HEADSETHOOK\x10O\x12\x11\n\rKEYCODE_FOCUS\x10P\x12\x10\n\x0cKEYCODE_PLUS\x10Q\x12\x10\n\x0cKEYCODE_MENU\x10R\x12\x18\n\x14KEYCODE_NOTIFICATION\x10S\x12\x12\n\x0eKEYCODE_SEARCH\x10T\x12\x1c\n\x18KEYCODE_MEDIA_PLAY_PAUSE\x10U\x12\x16\n\x12KEYCODE_MEDIA_STOP\x10V\x12\x16\n\x12KEYCODE_MEDIA_NEXT\x10W\x12\x1a\n\x16KEYCODE_MEDIA_PREVIOUS\x10X\x12\x18\n\x14KEYCODE_MEDIA_REWIND\x10Y\x12\x1e\n\x1aKEYCODE_MEDIA_FAST_FORWARD\x10Z\x12\x10\n\x0cKEYCODE_MUTE\x10[\x12\x13\n\x0fKEYCODE_PAGE_UP\x10\\\x12\x15\n\x11KEYCODE_PAGE_DOWN\x10]\x12\x17\n\x13KEYCODE_PICTSYMBOLS\x10^\x12\x1a\n\x16KEYCODE_SWITCH_CHARSET\x10_\x12\x14\n\x10KEYCODE_BUTTON_A\x10`\x12\x14\n\x10KEYCODE_BUTTON_B\x10\x61\x12\x14\n\x10KEYCODE_BUTTON_C\x10\x62\x12\x14\n\x10KEYCODE_BUTTON_X\x10\x63\x12\x14\n\x10KEYCODE_BUTTON_Y\x10\x64\x12\x14\n\x10KEYCODE_BUTTON_Z\x10\x65\x12\x15\n\x11KEYCODE_BUTTON_L1\x10\x66\x12\x15\n\x11KEYCODE_BUTTON_R1\x10g\x12\x15\n\x11KEYCODE_BUTTON_L2\x10h\x12\x15\n\x11KEYCODE_BUTTON_R2\x10i\x12\x19\n\x15KEYCODE_BUTTON_THUMBL\x10j\x12\x19\n\x15KEYCODE_BUTTON_THUMBR\x10k\x12\x18\n\x14KEYCODE_BUTTON_START\x10l\x12\x19\n\x15KEYCODE_BUTTON_SELECT\x10m\x12\x17\n\x13KEYCODE_BUTTON_MODE\x10n\x12\x12\n\x0eKEYCODE_ESCAPE\x10o\x12\x17\n\x13KEYCODE_FORWARD_DEL\x10p\x12\x15\n\x11KEYCODE_CTRL_LEFT\x10q\x12\x16\n\x12KEYCODE_CTRL_RIGHT\x10r\x12\x15\n\x11KEYCODE_CAPS_LOCK\x10s\x12\x17\n\x13KEYCODE_SCROLL_LOCK\x10t\x12\x15\n\x11KEYCODE_META_LEFT\x10u\x12\x16\n\x12KEYCODE_META_RIGHT\x10v\x12\x14\n\x10KEYCODE_FUNCTION\x10w\x12\x11\n\rKEYCODE_SYSRQ\x10x\x12\x11\n\rKEYCODE_BREAK\x10y\x12\x15\n\x11KEYCODE_MOVE_HOME\x10z\x12\x14\n\x10KEYCODE_MOVE_END\x10{\x12\x12\n\x0eKEYCODE_INSERT\x10|\x12\x13\n\x0fKEYCODE_FORWARD\x10}\x12\x16\n\x12KEYCODE_MEDIA_PLAY\x10~\x12\x17\n\x13KEYCODE_MEDIA_PAUSE\x10\x7f\x12\x18\n\x13KEYCODE_MEDIA_CLOSE\x10\x80\x01\x12\x18\n\x13KEYCODE_MEDIA_EJECT\x10\x81\x01\x12\x19\n\x14KEYCODE_MEDIA_RECORD\x10\x82\x01\x12\x0f\n\nKEYCODE_F1\x10\x83\x01\x12\x0f\n\nKEYCODE_F2\x10\x84\x01\x12\x0f\n\nKEYCODE_F3\x10\x85\x01\x12\x0f\n\nKEYCODE_F4\x10\x86\x01\x12\x0f\n\nKEYCODE_F5\x10\x87\x01\x12\x0f\n\nKEYCODE_F6\x10\x88\x01\x12\x0f\n\nKEYCODE_F7\x10\x89\x01\x12\x0f\n\nKEYCODE_F8\x10\x8a\x01\x12\x0f\n\nKEYCODE_F9\x10\x8b\x01\x12\x10\n\x0bKEYCODE_F10\x10\x8c\x01\x12\x10\n\x0bKEYCODE_F11\x10\x8d\x01\x12\x10\n\x0bKEYCODE_F12\x10\x8e\x01\x12\x15\n\x10KEYCODE_NUM_LOCK\x10\x8f\x01\x12\x15\n\x10KEYCODE_NUMPAD_0\x10\x90\x01\x12\x15\n\x10KEYCODE_NUMPAD_1\x10\x91\x01\x12\x15\n\x10KEYCODE_NUMPAD_2\x10\x92\x01\x12\x15\n\x10KEYCODE_NUMPAD_3\x10\x93\x01\x12\x15\n\x10KEYCODE_NUMPAD_4\x10\x94\x01\x12\x15\n\x10KEYCODE_NUMPAD_5\x10\x95\x01\x12\x15\n\x10KEYCODE_NUMPAD_6\x10\x96\x01\x12\x15\n\x10KEYCODE_NUMPAD_7\x10\x97\x01\x12\x15\n\x10KEYCODE_NUMPAD_8\x10\x98\x01\x12\x15\n\x10KEYCODE_NUMPAD_9\x10\x99\x01\x12\x1a\n\x15KEYCODE_NUMPAD_DIVIDE\x10\x9a\x01\x12\x1c\n\x17KEYCODE_NUMPAD_MULTIPLY\x10\x9b\x01\x12\x1c\n\x17KEYCODE_NUMPAD_SUBTRACT\x10\x9c\x01\x12\x17\n\x12KEYCODE_NUMPAD_ADD\x10\x9d\x01\x12\x17\n\x12KEYCODE_NUMPAD_DOT\x10\x9e\x01\x12\x19\n\x14KEYCODE_NUMPAD_COMMA\x10\x9f\x01\x12\x19\n\x14KEYCODE_NUMPAD_ENTER\x10\xa0\x01\x12\x1a\n\x15KEYCODE_NUMPAD_EQUALS\x10\xa1\x01\x12\x1e\n\x19KEYCODE_NUMPAD_LEFT_PAREN\x10\xa2\x01\x12\x1f\n\x1aKEYCODE_NUMPAD_RIGHT_PAREN\x10\xa3\x01\x12\x18\n\x13KEYCODE_VOLUME_MUTE\x10\xa4\x01\x12\x11\n\x0cKEYCODE_INFO\x10\xa5\x01\x12\x17\n\x12KEYCODE_CHANNEL_UP\x10\xa6\x01\x12\x19\n\x14KEYCODE_CHANNEL_DOWN\x10\xa7\x01\x12\x14\n\x0fKEYCODE_ZOOM_IN\x10\xa8\x01\x12\x15\n\x10KEYCODE_ZOOM_OUT\x10\xa9\x01\x12\x0f\n\nKEYCODE_TV\x10\xaa\x01\x12\x13\n\x0eKEYCODE_WINDOW\x10\xab\x01\x12\x12\n\rKEYCODE_GUIDE\x10\xac\x01\x12\x10\n\x0bKEYCODE_DVR\x10\xad\x01\x12\x15\n\x10KEYCODE_BOOKMARK\x10\xae\x01\x12\x15\n\x10KEYCODE_CAPTIONS\x10\xaf\x01\x12\x15\n\x10KEYCODE_SETTINGS\x10\xb0\x01\x12\x15\n\x10KEYCODE_TV_POWER\x10\xb1\x01\x12\x15\n\x10KEYCODE_TV_INPUT\x10\xb2\x01\x12\x16\n\x11KEYCODE_STB_POWER\x10\xb3\x01\x12\x16\n\x11KEYCODE_STB_INPUT\x10\xb4\x01\x12\x16\n\x11KEYCODE_AVR_POWER\x10\xb5\x01\x12\x16\n\x11KEYCODE_AVR_INPUT\x10\xb6\x01\x12\x15\n\x10KEYCODE_PROG_RED\x10\xb7\x01\x12\x17\n\x12KEYCODE_PROG_GREEN\x10\xb8\x01\x12\x18\n\x13KEYCODE_PROG_YELLOW\x10\xb9\x01\x12\x16\n\x11KEYCODE_PROG_BLUE\x10\xba\x01\x12\x17\n\x12KEYCODE_APP_SWITCH\x10\xbb\x01\x12\x15\n\x10KEYCODE_BUTTON_1\x10\xbc\x01\x12\x15\n\x10KEYCODE_BUTTON_2\x10\xbd\x01\x12\x15\n\x10KEYCODE_BUTTON_3\x10\xbe\x01\x12\x15\n\x10KEYCODE_BUTTON_4\x10\xbf\x01\x12\x15\n\x10KEYCODE_BUTTON_5\x10\xc0\x01\x12\x15\n\x10KEYCODE_BUTTON_6\x10\xc1\x01\x12\x15\n\x10KEYCODE_BUTTON_7\x10\xc2\x01\x12\x15\n\x10KEYCODE_BUTTON_8\x10\xc3\x01\x12\x15\n\x10KEYCODE_BUTTON_9\x10\xc4\x01\x12\x16\n\x11KEYCODE_BUTTON_10\x10\xc5\x01\x12\x16\n\x11KEYCODE_BUTTON_11\x10\xc6\x01\x12\x16\n\x11KEYCODE_BUTTON_12\x10\xc7\x01\x12\x16\n\x11KEYCODE_BUTTON_13\x10\xc8\x01\x12\x16\n\x11KEYCODE_BUTTON_14\x10\xc9\x01\x12\x16\n\x11KEYCODE_BUTTON_15\x10\xca\x01\x12\x16\n\x11KEYCODE_BUTTON_16\x10\xcb\x01\x12\x1c\n\x17KEYCODE_LANGUAGE_SWITCH\x10\xcc\x01\x12\x18\n\x13KEYCODE_MANNER_MODE\x10\xcd\x01\x12\x14\n\x0fKEYCODE_3D_MODE\x10\xce\x01\x12\x15\n\x10KEYCODE_CONTACTS\x10\xcf\x01\x12\x15\n\x10KEYCODE_CALENDAR\x10\xd0\x01\x12\x12\n\rKEYCODE_MUSIC\x10\xd1\x01\x12\x17\n\x12KEYCODE_CALCULATOR\x10\xd2\x01\x12\x1c\n\x17KEYCODE_ZENKAKU_HANKAKU\x10\xd3\x01\x12\x11\n\x0cKEYCODE_EISU\x10\xd4\x01\x12\x15\n\x10KEYCODE_MUHENKAN\x10\xd5\x01\x12\x13\n\x0eKEYCODE_HENKAN\x10\xd6\x01\x12\x1e\n\x19KEYCODE_KATAKANA_HIRAGANA\x10\xd7\x01\x12\x10\n\x0bKEYCODE_YEN\x10\xd8\x01\x12\x0f\n\nKEYCODE_RO\x10\xd9\x01\x12\x11\n\x0cKEYCODE_KANA\x10\xda\x01\x12\x13\n\x0eKEYCODE_ASSIST\x10\xdb\x01\x12\x1c\n\x17KEYCODE_BRIGHTNESS_DOWN\x10\xdc\x01\x12\x1a\n\x15KEYCODE_BRIGHTNESS_UP\x10\xdd\x01\x12\x1e\n\x19KEYCODE_MEDIA_AUDIO_TRACK\x10\xde\x01\x12\x12\n\rKEYCODE_SLEEP\x10\xdf\x01\x12\x13\n\x0eKEYCODE_WAKEUP\x10\xe0\x01\x12\x14\n\x0fKEYCODE_PAIRING\x10\xe1\x01\x12\x1b\n\x16KEYCODE_MEDIA_TOP_MENU\x10\xe2\x01\x12\x0f\n\nKEYCODE_11\x10\xe3\x01\x12\x0f\n\nKEYCODE_12\x10\xe4\x01\x12\x19\n\x14KEYCODE_LAST_CHANNEL\x10\xe5\x01\x12\x1c\n\x17KEYCODE_TV_DATA_SERVICE\x10\xe6\x01\x12\x19\n\x14KEYCODE_VOICE_ASSIST\x10\xe7\x01\x12\x1d\n\x18KEYCODE_TV_RADIO_SERVICE\x10\xe8\x01\x12\x18\n\x13KEYCODE_TV_TELETEXT\x10\xe9\x01\x12\x1c\n\x17KEYCODE_TV_NUMBER_ENTRY\x10\xea\x01\x12\"\n\x1dKEYCODE_TV_TERRESTRIAL_ANALOG\x10\xeb\x01\x12#\n\x1eKEYCODE_TV_TERRESTRIAL_DIGITAL\x10\xec\x01\x12\x19\n\x14KEYCODE_TV_SATELLITE\x10\xed\x01\x12\x1c\n\x17KEYCODE_TV_SATELLITE_BS\x10\xee\x01\x12\x1c\n\x17KEYCODE_TV_SATELLITE_CS\x10\xef\x01\x12!\n\x1cKEYCODE_TV_SATELLITE_SERVICE\x10\xf0\x01\x12\x17\n\x12KEYCODE_TV_NETWORK\x10\xf1\x01\x12\x1d\n\x18KEYCODE_TV_ANTENNA_CABLE\x10\xf2\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_1\x10\xf3\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_2\x10\xf4\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_3\x10\xf5\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_4\x10\xf6\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPOSITE_1\x10\xf7\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPOSITE_2\x10\xf8\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPONENT_1\x10\xf9\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPONENT_2\x10\xfa\x01\x12\x1b\n\x16KEYCODE_TV_INPUT_VGA_1\x10\xfb\x01\x12!\n\x1cKEYCODE_TV_AUDIO_DESCRIPTION\x10\xfc\x01\x12(\n#KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP\x10\xfd\x01\x12*\n%KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN\x10\xfe\x01\x12\x19\n\x14KEYCODE_TV_ZOOM_MODE\x10\xff\x01\x12\x1d\n\x18KEYCODE_TV_CONTENTS_MENU\x10\x80\x02\x12\"\n\x1dKEYCODE_TV_MEDIA_CONTEXT_MENU\x10\x81\x02\x12!\n\x1cKEYCODE_TV_TIMER_PROGRAMMING\x10\x82\x02\x12\x11\n\x0cKEYCODE_HELP\x10\x83\x02\x12\x1e\n\x19KEYCODE_NAVIGATE_PREVIOUS\x10\x84\x02\x12\x1a\n\x15KEYCODE_NAVIGATE_NEXT\x10\x85\x02\x12\x18\n\x13KEYCODE_NAVIGATE_IN\x10\x86\x02\x12\x19\n\x14KEYCODE_NAVIGATE_OUT\x10\x87\x02\x12\x19\n\x14KEYCODE_STEM_PRIMARY\x10\x88\x02\x12\x13\n\x0eKEYCODE_STEM_1\x10\x89\x02\x12\x13\n\x0eKEYCODE_STEM_2\x10\x8a\x02\x12\x13\n\x0eKEYCODE_STEM_3\x10\x8b\x02\x12\x19\n\x14KEYCODE_DPAD_UP_LEFT\x10\x8c\x02\x12\x1b\n\x16KEYCODE_DPAD_DOWN_LEFT\x10\x8d\x02\x12\x1a\n\x15KEYCODE_DPAD_UP_RIGHT\x10\x8e\x02\x12\x1c\n\x17KEYCODE_DPAD_DOWN_RIGHT\x10\x8f\x02\x12\x1f\n\x1aKEYCODE_MEDIA_SKIP_FORWARD\x10\x90\x02\x12 \n\x1bKEYCODE_MEDIA_SKIP_BACKWARD\x10\x91\x02\x12\x1f\n\x1aKEYCODE_MEDIA_STEP_FORWARD\x10\x92\x02\x12 \n\x1bKEYCODE_MEDIA_STEP_BACKWARD\x10\x93\x02\x12\x17\n\x12KEYCODE_SOFT_SLEEP\x10\x94\x02\x12\x10\n\x0bKEYCODE_CUT\x10\x95\x02\x12\x11\n\x0cKEYCODE_COPY\x10\x96\x02\x12\x12\n\rKEYCODE_PASTE\x10\x97\x02\x12!\n\x1cKEYCODE_SYSTEM_NAVIGATION_UP\x10\x98\x02\x12#\n\x1eKEYCODE_SYSTEM_NAVIGATION_DOWN\x10\x99\x02\x12#\n\x1eKEYCODE_SYSTEM_NAVIGATION_LEFT\x10\x9a\x02\x12$\n\x1fKEYCODE_SYSTEM_NAVIGATION_RIGHT\x10\x9b\x02\x12\x15\n\x10KEYCODE_ALL_APPS\x10\x9c\x02\x12\x14\n\x0fKEYCODE_REFRESH\x10\x9d\x02\x12\x16\n\x11KEYCODE_THUMBS_UP\x10\x9e\x02\x12\x18\n\x13KEYCODE_THUMBS_DOWN\x10\x9f\x02\x12\x1b\n\x16KEYCODE_PROFILE_SWITCH\x10\xa0\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_1\x10\xa1\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_2\x10\xa2\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_3\x10\xa3\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_4\x10\xa4\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_5\x10\xa5\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_6\x10\xa6\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_7\x10\xa7\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_8\x10\xa8\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_1\x10\xa9\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_2\x10\xaa\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_3\x10\xab\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_4\x10\xac\x02\x12\x17\n\x12KEYCODE_DEMO_APP_1\x10\xad\x02\x12\x17\n\x12KEYCODE_DEMO_APP_2\x10\xae\x02\x12\x17\n\x12KEYCODE_DEMO_APP_3\x10\xaf\x02\x12\x17\n\x12KEYCODE_DEMO_APP_4\x10\xb0\x02*Q\n\x0fRemoteDirection\x12\x15\n\x11UNKNOWN_DIRECTION\x10\x00\x12\x0e\n\nSTART_LONG\x10\x01\x12\x0c\n\x08\x45ND_LONG\x10\x02\x12\t\n\x05SHORT\x10\x03\x62\x06proto3')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'remotemessage_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ DESCRIPTOR._loaded_options = None
34
+ _globals['_REMOTEKEYCODE']._serialized_start=2791
35
+ _globals['_REMOTEKEYCODE']._serialized_end=9934
36
+ _globals['_REMOTEDIRECTION']._serialized_start=9936
37
+ _globals['_REMOTEDIRECTION']._serialized_end=10017
38
+ _globals['_REMOTEAPPLINKLAUNCHREQUEST']._serialized_start=31
39
+ _globals['_REMOTEAPPLINKLAUNCHREQUEST']._serialized_end=77
40
+ _globals['_REMOTERESETPREFERREDAUDIODEVICE']._serialized_start=79
41
+ _globals['_REMOTERESETPREFERREDAUDIODEVICE']._serialized_end=112
42
+ _globals['_REMOTESETPREFERREDAUDIODEVICE']._serialized_start=114
43
+ _globals['_REMOTESETPREFERREDAUDIODEVICE']._serialized_end=145
44
+ _globals['_REMOTEADJUSTVOLUMELEVEL']._serialized_start=147
45
+ _globals['_REMOTEADJUSTVOLUMELEVEL']._serialized_end=172
46
+ _globals['_REMOTESETVOLUMELEVEL']._serialized_start=175
47
+ _globals['_REMOTESETVOLUMELEVEL']._serialized_end=355
48
+ _globals['_REMOTESTART']._serialized_start=357
49
+ _globals['_REMOTESTART']._serialized_end=387
50
+ _globals['_REMOTEVOICEEND']._serialized_start=389
51
+ _globals['_REMOTEVOICEEND']._serialized_end=405
52
+ _globals['_REMOTEVOICEPAYLOAD']._serialized_start=407
53
+ _globals['_REMOTEVOICEPAYLOAD']._serialized_end=427
54
+ _globals['_REMOTEVOICEBEGIN']._serialized_start=429
55
+ _globals['_REMOTEVOICEBEGIN']._serialized_end=447
56
+ _globals['_REMOTETEXTFIELDSTATUS']._serialized_start=449
57
+ _globals['_REMOTETEXTFIELDSTATUS']._serialized_end=567
58
+ _globals['_REMOTEIMESHOWREQUEST']._serialized_start=569
59
+ _globals['_REMOTEIMESHOWREQUEST']._serialized_end=656
60
+ _globals['_REMOTEEDITINFO']._serialized_start=658
61
+ _globals['_REMOTEEDITINFO']._serialized_end=742
62
+ _globals['_REMOTEIMEOBJECT']._serialized_start=744
63
+ _globals['_REMOTEIMEOBJECT']._serialized_end=804
64
+ _globals['_REMOTEIMEBATCHEDIT']._serialized_start=806
65
+ _globals['_REMOTEIMEBATCHEDIT']._serialized_end=913
66
+ _globals['_REMOTEAPPINFO']._serialized_start=916
67
+ _globals['_REMOTEAPPINFO']._serialized_end=1069
68
+ _globals['_REMOTEIMEKEYINJECT']._serialized_start=1071
69
+ _globals['_REMOTEIMEKEYINJECT']._serialized_end=1190
70
+ _globals['_REMOTEKEYINJECT']._serialized_start=1192
71
+ _globals['_REMOTEKEYINJECT']._serialized_end=1294
72
+ _globals['_REMOTEPINGRESPONSE']._serialized_start=1296
73
+ _globals['_REMOTEPINGRESPONSE']._serialized_end=1330
74
+ _globals['_REMOTEPINGREQUEST']._serialized_start=1332
75
+ _globals['_REMOTEPINGREQUEST']._serialized_end=1379
76
+ _globals['_REMOTESETACTIVE']._serialized_start=1381
77
+ _globals['_REMOTESETACTIVE']._serialized_end=1414
78
+ _globals['_REMOTEDEVICEINFO']._serialized_start=1417
79
+ _globals['_REMOTEDEVICEINFO']._serialized_end=1545
80
+ _globals['_REMOTECONFIGURE']._serialized_start=1547
81
+ _globals['_REMOTECONFIGURE']._serialized_end=1626
82
+ _globals['_REMOTEERROR']._serialized_start=1628
83
+ _globals['_REMOTEERROR']._serialized_end=1696
84
+ _globals['_REMOTEMESSAGE']._serialized_start=1699
85
+ _globals['_REMOTEMESSAGE']._serialized_end=2788
86
+ # @@protoc_insertion_point(module_scope)
@@ -4,8 +4,11 @@ isort:skip_file
4
4
  Copied from https://github.com/louis49/androidtv-remote/blob/main/src/remote/remotemessage.proto
5
5
  Comments on RemoteKeyCode enum added from https://android.googlesource.com/platform/frameworks/native/+/master/include/android/keycodes.h
6
6
  """
7
+
7
8
  import builtins
9
+ import collections.abc
8
10
  import google.protobuf.descriptor
11
+ import google.protobuf.internal.containers
9
12
  import google.protobuf.internal.enum_type_wrapper
10
13
  import google.protobuf.message
11
14
  import sys
@@ -1760,7 +1763,7 @@ END_LONG: RemoteDirection.ValueType # 2
1760
1763
  SHORT: RemoteDirection.ValueType # 3
1761
1764
  global___RemoteDirection = RemoteDirection
1762
1765
 
1763
- @typing_extensions.final
1766
+ @typing.final
1764
1767
  class RemoteAppLinkLaunchRequest(google.protobuf.message.Message):
1765
1768
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1766
1769
 
@@ -1771,11 +1774,11 @@ class RemoteAppLinkLaunchRequest(google.protobuf.message.Message):
1771
1774
  *,
1772
1775
  app_link: builtins.str = ...,
1773
1776
  ) -> None: ...
1774
- def ClearField(self, field_name: typing_extensions.Literal["app_link", b"app_link"]) -> None: ...
1777
+ def ClearField(self, field_name: typing.Literal["app_link", b"app_link"]) -> None: ...
1775
1778
 
1776
1779
  global___RemoteAppLinkLaunchRequest = RemoteAppLinkLaunchRequest
1777
1780
 
1778
- @typing_extensions.final
1781
+ @typing.final
1779
1782
  class RemoteResetPreferredAudioDevice(google.protobuf.message.Message):
1780
1783
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1781
1784
 
@@ -1785,7 +1788,7 @@ class RemoteResetPreferredAudioDevice(google.protobuf.message.Message):
1785
1788
 
1786
1789
  global___RemoteResetPreferredAudioDevice = RemoteResetPreferredAudioDevice
1787
1790
 
1788
- @typing_extensions.final
1791
+ @typing.final
1789
1792
  class RemoteSetPreferredAudioDevice(google.protobuf.message.Message):
1790
1793
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1791
1794
 
@@ -1795,7 +1798,7 @@ class RemoteSetPreferredAudioDevice(google.protobuf.message.Message):
1795
1798
 
1796
1799
  global___RemoteSetPreferredAudioDevice = RemoteSetPreferredAudioDevice
1797
1800
 
1798
- @typing_extensions.final
1801
+ @typing.final
1799
1802
  class RemoteAdjustVolumeLevel(google.protobuf.message.Message):
1800
1803
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1801
1804
 
@@ -1805,7 +1808,7 @@ class RemoteAdjustVolumeLevel(google.protobuf.message.Message):
1805
1808
 
1806
1809
  global___RemoteAdjustVolumeLevel = RemoteAdjustVolumeLevel
1807
1810
 
1808
- @typing_extensions.final
1811
+ @typing.final
1809
1812
  class RemoteSetVolumeLevel(google.protobuf.message.Message):
1810
1813
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1811
1814
 
@@ -1837,11 +1840,11 @@ class RemoteSetVolumeLevel(google.protobuf.message.Message):
1837
1840
  volume_level: builtins.int = ...,
1838
1841
  volume_muted: builtins.bool = ...,
1839
1842
  ) -> None: ...
1840
- def ClearField(self, field_name: typing_extensions.Literal["player_model", b"player_model", "unknown1", b"unknown1", "unknown2", b"unknown2", "unknown4", b"unknown4", "unknown5", b"unknown5", "volume_level", b"volume_level", "volume_max", b"volume_max", "volume_muted", b"volume_muted"]) -> None: ...
1843
+ def ClearField(self, field_name: typing.Literal["player_model", b"player_model", "unknown1", b"unknown1", "unknown2", b"unknown2", "unknown4", b"unknown4", "unknown5", b"unknown5", "volume_level", b"volume_level", "volume_max", b"volume_max", "volume_muted", b"volume_muted"]) -> None: ...
1841
1844
 
1842
1845
  global___RemoteSetVolumeLevel = RemoteSetVolumeLevel
1843
1846
 
1844
- @typing_extensions.final
1847
+ @typing.final
1845
1848
  class RemoteStart(google.protobuf.message.Message):
1846
1849
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1847
1850
 
@@ -1852,11 +1855,11 @@ class RemoteStart(google.protobuf.message.Message):
1852
1855
  *,
1853
1856
  started: builtins.bool = ...,
1854
1857
  ) -> None: ...
1855
- def ClearField(self, field_name: typing_extensions.Literal["started", b"started"]) -> None: ...
1858
+ def ClearField(self, field_name: typing.Literal["started", b"started"]) -> None: ...
1856
1859
 
1857
1860
  global___RemoteStart = RemoteStart
1858
1861
 
1859
- @typing_extensions.final
1862
+ @typing.final
1860
1863
  class RemoteVoiceEnd(google.protobuf.message.Message):
1861
1864
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1862
1865
 
@@ -1866,7 +1869,7 @@ class RemoteVoiceEnd(google.protobuf.message.Message):
1866
1869
 
1867
1870
  global___RemoteVoiceEnd = RemoteVoiceEnd
1868
1871
 
1869
- @typing_extensions.final
1872
+ @typing.final
1870
1873
  class RemoteVoicePayload(google.protobuf.message.Message):
1871
1874
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1872
1875
 
@@ -1876,7 +1879,7 @@ class RemoteVoicePayload(google.protobuf.message.Message):
1876
1879
 
1877
1880
  global___RemoteVoicePayload = RemoteVoicePayload
1878
1881
 
1879
- @typing_extensions.final
1882
+ @typing.final
1880
1883
  class RemoteVoiceBegin(google.protobuf.message.Message):
1881
1884
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1882
1885
 
@@ -1886,7 +1889,7 @@ class RemoteVoiceBegin(google.protobuf.message.Message):
1886
1889
 
1887
1890
  global___RemoteVoiceBegin = RemoteVoiceBegin
1888
1891
 
1889
- @typing_extensions.final
1892
+ @typing.final
1890
1893
  class RemoteTextFieldStatus(google.protobuf.message.Message):
1891
1894
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1892
1895
 
@@ -1912,11 +1915,11 @@ class RemoteTextFieldStatus(google.protobuf.message.Message):
1912
1915
  int5: builtins.int = ...,
1913
1916
  label: builtins.str = ...,
1914
1917
  ) -> None: ...
1915
- def ClearField(self, field_name: typing_extensions.Literal["counter_field", b"counter_field", "end", b"end", "int5", b"int5", "label", b"label", "start", b"start", "value", b"value"]) -> None: ...
1918
+ def ClearField(self, field_name: typing.Literal["counter_field", b"counter_field", "end", b"end", "int5", b"int5", "label", b"label", "start", b"start", "value", b"value"]) -> None: ...
1916
1919
 
1917
1920
  global___RemoteTextFieldStatus = RemoteTextFieldStatus
1918
1921
 
1919
- @typing_extensions.final
1922
+ @typing.final
1920
1923
  class RemoteImeShowRequest(google.protobuf.message.Message):
1921
1924
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1922
1925
 
@@ -1928,27 +1931,53 @@ class RemoteImeShowRequest(google.protobuf.message.Message):
1928
1931
  *,
1929
1932
  remote_text_field_status: global___RemoteTextFieldStatus | None = ...,
1930
1933
  ) -> None: ...
1931
- def HasField(self, field_name: typing_extensions.Literal["remote_text_field_status", b"remote_text_field_status"]) -> builtins.bool: ...
1932
- def ClearField(self, field_name: typing_extensions.Literal["remote_text_field_status", b"remote_text_field_status"]) -> None: ...
1934
+ def HasField(self, field_name: typing.Literal["remote_text_field_status", b"remote_text_field_status"]) -> builtins.bool: ...
1935
+ def ClearField(self, field_name: typing.Literal["remote_text_field_status", b"remote_text_field_status"]) -> None: ...
1933
1936
 
1934
1937
  global___RemoteImeShowRequest = RemoteImeShowRequest
1935
1938
 
1936
- @typing_extensions.final
1939
+ @typing.final
1937
1940
  class RemoteEditInfo(google.protobuf.message.Message):
1938
1941
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1939
1942
 
1940
1943
  INSERT_FIELD_NUMBER: builtins.int
1944
+ TEXT_FIELD_STATUS_FIELD_NUMBER: builtins.int
1941
1945
  insert: builtins.int
1946
+ @property
1947
+ def text_field_status(self) -> global___RemoteImeObject: ...
1942
1948
  def __init__(
1943
1949
  self,
1944
1950
  *,
1945
1951
  insert: builtins.int = ...,
1952
+ text_field_status: global___RemoteImeObject | None = ...,
1946
1953
  ) -> None: ...
1947
- def ClearField(self, field_name: typing_extensions.Literal["insert", b"insert"]) -> None: ...
1954
+ def HasField(self, field_name: typing.Literal["text_field_status", b"text_field_status"]) -> builtins.bool: ...
1955
+ def ClearField(self, field_name: typing.Literal["insert", b"insert", "text_field_status", b"text_field_status"]) -> None: ...
1948
1956
 
1949
1957
  global___RemoteEditInfo = RemoteEditInfo
1950
1958
 
1951
- @typing_extensions.final
1959
+ @typing.final
1960
+ class RemoteImeObject(google.protobuf.message.Message):
1961
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
1962
+
1963
+ START_FIELD_NUMBER: builtins.int
1964
+ END_FIELD_NUMBER: builtins.int
1965
+ VALUE_FIELD_NUMBER: builtins.int
1966
+ start: builtins.int
1967
+ end: builtins.int
1968
+ value: builtins.str
1969
+ def __init__(
1970
+ self,
1971
+ *,
1972
+ start: builtins.int = ...,
1973
+ end: builtins.int = ...,
1974
+ value: builtins.str = ...,
1975
+ ) -> None: ...
1976
+ def ClearField(self, field_name: typing.Literal["end", b"end", "start", b"start", "value", b"value"]) -> None: ...
1977
+
1978
+ global___RemoteImeObject = RemoteImeObject
1979
+
1980
+ @typing.final
1952
1981
  class RemoteImeBatchEdit(google.protobuf.message.Message):
1953
1982
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1954
1983
 
@@ -1958,20 +1987,19 @@ class RemoteImeBatchEdit(google.protobuf.message.Message):
1958
1987
  ime_counter: builtins.int
1959
1988
  field_counter: builtins.int
1960
1989
  @property
1961
- def edit_info(self) -> global___RemoteEditInfo: ...
1990
+ def edit_info(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___RemoteEditInfo]: ...
1962
1991
  def __init__(
1963
1992
  self,
1964
1993
  *,
1965
1994
  ime_counter: builtins.int = ...,
1966
1995
  field_counter: builtins.int = ...,
1967
- edit_info: global___RemoteEditInfo | None = ...,
1996
+ edit_info: collections.abc.Iterable[global___RemoteEditInfo] | None = ...,
1968
1997
  ) -> None: ...
1969
- def HasField(self, field_name: typing_extensions.Literal["edit_info", b"edit_info"]) -> builtins.bool: ...
1970
- def ClearField(self, field_name: typing_extensions.Literal["edit_info", b"edit_info", "field_counter", b"field_counter", "ime_counter", b"ime_counter"]) -> None: ...
1998
+ def ClearField(self, field_name: typing.Literal["edit_info", b"edit_info", "field_counter", b"field_counter", "ime_counter", b"ime_counter"]) -> None: ...
1971
1999
 
1972
2000
  global___RemoteImeBatchEdit = RemoteImeBatchEdit
1973
2001
 
1974
- @typing_extensions.final
2002
+ @typing.final
1975
2003
  class RemoteAppInfo(google.protobuf.message.Message):
1976
2004
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
1977
2005
 
@@ -2006,11 +2034,11 @@ class RemoteAppInfo(google.protobuf.message.Message):
2006
2034
  app_package: builtins.str = ...,
2007
2035
  int13: builtins.int = ...,
2008
2036
  ) -> None: ...
2009
- def ClearField(self, field_name: typing_extensions.Literal["app_package", b"app_package", "counter", b"counter", "int13", b"int13", "int2", b"int2", "int3", b"int3", "int4", b"int4", "int7", b"int7", "int8", b"int8", "label", b"label"]) -> None: ...
2037
+ def ClearField(self, field_name: typing.Literal["app_package", b"app_package", "counter", b"counter", "int13", b"int13", "int2", b"int2", "int3", b"int3", "int4", b"int4", "int7", b"int7", "int8", b"int8", "label", b"label"]) -> None: ...
2010
2038
 
2011
2039
  global___RemoteAppInfo = RemoteAppInfo
2012
2040
 
2013
- @typing_extensions.final
2041
+ @typing.final
2014
2042
  class RemoteImeKeyInject(google.protobuf.message.Message):
2015
2043
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2016
2044
 
@@ -2026,12 +2054,12 @@ class RemoteImeKeyInject(google.protobuf.message.Message):
2026
2054
  app_info: global___RemoteAppInfo | None = ...,
2027
2055
  text_field_status: global___RemoteTextFieldStatus | None = ...,
2028
2056
  ) -> None: ...
2029
- def HasField(self, field_name: typing_extensions.Literal["app_info", b"app_info", "text_field_status", b"text_field_status"]) -> builtins.bool: ...
2030
- def ClearField(self, field_name: typing_extensions.Literal["app_info", b"app_info", "text_field_status", b"text_field_status"]) -> None: ...
2057
+ def HasField(self, field_name: typing.Literal["app_info", b"app_info", "text_field_status", b"text_field_status"]) -> builtins.bool: ...
2058
+ def ClearField(self, field_name: typing.Literal["app_info", b"app_info", "text_field_status", b"text_field_status"]) -> None: ...
2031
2059
 
2032
2060
  global___RemoteImeKeyInject = RemoteImeKeyInject
2033
2061
 
2034
- @typing_extensions.final
2062
+ @typing.final
2035
2063
  class RemoteKeyInject(google.protobuf.message.Message):
2036
2064
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2037
2065
 
@@ -2045,11 +2073,11 @@ class RemoteKeyInject(google.protobuf.message.Message):
2045
2073
  key_code: global___RemoteKeyCode.ValueType = ...,
2046
2074
  direction: global___RemoteDirection.ValueType = ...,
2047
2075
  ) -> None: ...
2048
- def ClearField(self, field_name: typing_extensions.Literal["direction", b"direction", "key_code", b"key_code"]) -> None: ...
2076
+ def ClearField(self, field_name: typing.Literal["direction", b"direction", "key_code", b"key_code"]) -> None: ...
2049
2077
 
2050
2078
  global___RemoteKeyInject = RemoteKeyInject
2051
2079
 
2052
- @typing_extensions.final
2080
+ @typing.final
2053
2081
  class RemotePingResponse(google.protobuf.message.Message):
2054
2082
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2055
2083
 
@@ -2060,11 +2088,11 @@ class RemotePingResponse(google.protobuf.message.Message):
2060
2088
  *,
2061
2089
  val1: builtins.int = ...,
2062
2090
  ) -> None: ...
2063
- def ClearField(self, field_name: typing_extensions.Literal["val1", b"val1"]) -> None: ...
2091
+ def ClearField(self, field_name: typing.Literal["val1", b"val1"]) -> None: ...
2064
2092
 
2065
2093
  global___RemotePingResponse = RemotePingResponse
2066
2094
 
2067
- @typing_extensions.final
2095
+ @typing.final
2068
2096
  class RemotePingRequest(google.protobuf.message.Message):
2069
2097
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2070
2098
 
@@ -2078,11 +2106,11 @@ class RemotePingRequest(google.protobuf.message.Message):
2078
2106
  val1: builtins.int = ...,
2079
2107
  val2: builtins.int = ...,
2080
2108
  ) -> None: ...
2081
- def ClearField(self, field_name: typing_extensions.Literal["val1", b"val1", "val2", b"val2"]) -> None: ...
2109
+ def ClearField(self, field_name: typing.Literal["val1", b"val1", "val2", b"val2"]) -> None: ...
2082
2110
 
2083
2111
  global___RemotePingRequest = RemotePingRequest
2084
2112
 
2085
- @typing_extensions.final
2113
+ @typing.final
2086
2114
  class RemoteSetActive(google.protobuf.message.Message):
2087
2115
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2088
2116
 
@@ -2093,11 +2121,11 @@ class RemoteSetActive(google.protobuf.message.Message):
2093
2121
  *,
2094
2122
  active: builtins.int = ...,
2095
2123
  ) -> None: ...
2096
- def ClearField(self, field_name: typing_extensions.Literal["active", b"active"]) -> None: ...
2124
+ def ClearField(self, field_name: typing.Literal["active", b"active"]) -> None: ...
2097
2125
 
2098
2126
  global___RemoteSetActive = RemoteSetActive
2099
2127
 
2100
- @typing_extensions.final
2128
+ @typing.final
2101
2129
  class RemoteDeviceInfo(google.protobuf.message.Message):
2102
2130
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2103
2131
 
@@ -2123,11 +2151,11 @@ class RemoteDeviceInfo(google.protobuf.message.Message):
2123
2151
  package_name: builtins.str = ...,
2124
2152
  app_version: builtins.str = ...,
2125
2153
  ) -> None: ...
2126
- def ClearField(self, field_name: typing_extensions.Literal["app_version", b"app_version", "model", b"model", "package_name", b"package_name", "unknown1", b"unknown1", "unknown2", b"unknown2", "vendor", b"vendor"]) -> None: ...
2154
+ def ClearField(self, field_name: typing.Literal["app_version", b"app_version", "model", b"model", "package_name", b"package_name", "unknown1", b"unknown1", "unknown2", b"unknown2", "vendor", b"vendor"]) -> None: ...
2127
2155
 
2128
2156
  global___RemoteDeviceInfo = RemoteDeviceInfo
2129
2157
 
2130
- @typing_extensions.final
2158
+ @typing.final
2131
2159
  class RemoteConfigure(google.protobuf.message.Message):
2132
2160
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2133
2161
 
@@ -2142,12 +2170,12 @@ class RemoteConfigure(google.protobuf.message.Message):
2142
2170
  code1: builtins.int = ...,
2143
2171
  device_info: global___RemoteDeviceInfo | None = ...,
2144
2172
  ) -> None: ...
2145
- def HasField(self, field_name: typing_extensions.Literal["device_info", b"device_info"]) -> builtins.bool: ...
2146
- def ClearField(self, field_name: typing_extensions.Literal["code1", b"code1", "device_info", b"device_info"]) -> None: ...
2173
+ def HasField(self, field_name: typing.Literal["device_info", b"device_info"]) -> builtins.bool: ...
2174
+ def ClearField(self, field_name: typing.Literal["code1", b"code1", "device_info", b"device_info"]) -> None: ...
2147
2175
 
2148
2176
  global___RemoteConfigure = RemoteConfigure
2149
2177
 
2150
- @typing_extensions.final
2178
+ @typing.final
2151
2179
  class RemoteError(google.protobuf.message.Message):
2152
2180
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2153
2181
 
@@ -2162,12 +2190,12 @@ class RemoteError(google.protobuf.message.Message):
2162
2190
  value: builtins.bool = ...,
2163
2191
  message: global___RemoteMessage | None = ...,
2164
2192
  ) -> None: ...
2165
- def HasField(self, field_name: typing_extensions.Literal["message", b"message"]) -> builtins.bool: ...
2166
- def ClearField(self, field_name: typing_extensions.Literal["message", b"message", "value", b"value"]) -> None: ...
2193
+ def HasField(self, field_name: typing.Literal["message", b"message"]) -> builtins.bool: ...
2194
+ def ClearField(self, field_name: typing.Literal["message", b"message", "value", b"value"]) -> None: ...
2167
2195
 
2168
2196
  global___RemoteError = RemoteError
2169
2197
 
2170
- @typing_extensions.final
2198
+ @typing.final
2171
2199
  class RemoteMessage(google.protobuf.message.Message):
2172
2200
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
2173
2201
 
@@ -2247,7 +2275,7 @@ class RemoteMessage(google.protobuf.message.Message):
2247
2275
  remote_reset_preferred_audio_device: global___RemoteResetPreferredAudioDevice | None = ...,
2248
2276
  remote_app_link_launch_request: global___RemoteAppLinkLaunchRequest | None = ...,
2249
2277
  ) -> None: ...
2250
- def HasField(self, field_name: typing_extensions.Literal["remote_adjust_volume_level", b"remote_adjust_volume_level", "remote_app_link_launch_request", b"remote_app_link_launch_request", "remote_configure", b"remote_configure", "remote_error", b"remote_error", "remote_ime_batch_edit", b"remote_ime_batch_edit", "remote_ime_key_inject", b"remote_ime_key_inject", "remote_ime_show_request", b"remote_ime_show_request", "remote_key_inject", b"remote_key_inject", "remote_ping_request", b"remote_ping_request", "remote_ping_response", b"remote_ping_response", "remote_reset_preferred_audio_device", b"remote_reset_preferred_audio_device", "remote_set_active", b"remote_set_active", "remote_set_preferred_audio_device", b"remote_set_preferred_audio_device", "remote_set_volume_level", b"remote_set_volume_level", "remote_start", b"remote_start", "remote_voice_begin", b"remote_voice_begin", "remote_voice_end", b"remote_voice_end", "remote_voice_payload", b"remote_voice_payload"]) -> builtins.bool: ...
2251
- def ClearField(self, field_name: typing_extensions.Literal["remote_adjust_volume_level", b"remote_adjust_volume_level", "remote_app_link_launch_request", b"remote_app_link_launch_request", "remote_configure", b"remote_configure", "remote_error", b"remote_error", "remote_ime_batch_edit", b"remote_ime_batch_edit", "remote_ime_key_inject", b"remote_ime_key_inject", "remote_ime_show_request", b"remote_ime_show_request", "remote_key_inject", b"remote_key_inject", "remote_ping_request", b"remote_ping_request", "remote_ping_response", b"remote_ping_response", "remote_reset_preferred_audio_device", b"remote_reset_preferred_audio_device", "remote_set_active", b"remote_set_active", "remote_set_preferred_audio_device", b"remote_set_preferred_audio_device", "remote_set_volume_level", b"remote_set_volume_level", "remote_start", b"remote_start", "remote_voice_begin", b"remote_voice_begin", "remote_voice_end", b"remote_voice_end", "remote_voice_payload", b"remote_voice_payload"]) -> None: ...
2278
+ def HasField(self, field_name: typing.Literal["remote_adjust_volume_level", b"remote_adjust_volume_level", "remote_app_link_launch_request", b"remote_app_link_launch_request", "remote_configure", b"remote_configure", "remote_error", b"remote_error", "remote_ime_batch_edit", b"remote_ime_batch_edit", "remote_ime_key_inject", b"remote_ime_key_inject", "remote_ime_show_request", b"remote_ime_show_request", "remote_key_inject", b"remote_key_inject", "remote_ping_request", b"remote_ping_request", "remote_ping_response", b"remote_ping_response", "remote_reset_preferred_audio_device", b"remote_reset_preferred_audio_device", "remote_set_active", b"remote_set_active", "remote_set_preferred_audio_device", b"remote_set_preferred_audio_device", "remote_set_volume_level", b"remote_set_volume_level", "remote_start", b"remote_start", "remote_voice_begin", b"remote_voice_begin", "remote_voice_end", b"remote_voice_end", "remote_voice_payload", b"remote_voice_payload"]) -> builtins.bool: ...
2279
+ def ClearField(self, field_name: typing.Literal["remote_adjust_volume_level", b"remote_adjust_volume_level", "remote_app_link_launch_request", b"remote_app_link_launch_request", "remote_configure", b"remote_configure", "remote_error", b"remote_error", "remote_ime_batch_edit", b"remote_ime_batch_edit", "remote_ime_key_inject", b"remote_ime_key_inject", "remote_ime_show_request", b"remote_ime_show_request", "remote_key_inject", b"remote_key_inject", "remote_ping_request", b"remote_ping_request", "remote_ping_response", b"remote_ping_response", "remote_reset_preferred_audio_device", b"remote_reset_preferred_audio_device", "remote_set_active", b"remote_set_active", "remote_set_preferred_audio_device", b"remote_set_preferred_audio_device", "remote_set_volume_level", b"remote_set_volume_level", "remote_start", b"remote_start", "remote_voice_begin", b"remote_voice_begin", "remote_voice_end", b"remote_voice_end", "remote_voice_payload", b"remote_voice_payload"]) -> None: ...
2252
2280
 
2253
2281
  global___RemoteMessage = RemoteMessage
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: androidtvremote2
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: A Python library for interacting with Android TV using the Android TV Remote protocol v2
5
5
  Author-email: tronikos <tronikos@gmail.com>
6
6
  License: Apache-2.0
@@ -57,7 +57,7 @@ pre-commit run --all-files
57
57
 
58
58
  # Alternative: run formatter, lint, and type checking
59
59
  python -m pip install isort black flake8 ruff mypy
60
- isort . ; black . ; flake8 . ; ruff . --fix ; mypy --install-types .
60
+ isort . ; black . ; flake8 . ; ruff check . --fix ; mypy --install-types .
61
61
 
62
62
  # Run tests
63
63
  python -m pip install pytest
@@ -35,7 +35,8 @@ async def _bind_keyboard(remote: AndroidTVRemote) -> None:
35
35
  "\n- 'd': Disney+"
36
36
  "\n- 'a': Amazon Prime Video"
37
37
  "\n- 'k': Kodi"
38
- "\n- 'q': quit\n\n"
38
+ "\n- 'q': quit"
39
+ "\n- 't': send text 'Hello world' to Android TV\n\n"
39
40
  )
40
41
  key_mappings = {
41
42
  keyboard.Key.up: "DPAD_UP",
@@ -85,6 +86,8 @@ async def _bind_keyboard(remote: AndroidTVRemote) -> None:
85
86
  remote.send_launch_app_command("com.amazon.amazonvideo.livingroom")
86
87
  elif key.char == "k":
87
88
  remote.send_launch_app_command("org.xbmc.kodi")
89
+ elif key.char == "t":
90
+ remote.send_text("Hello World!")
88
91
 
89
92
 
90
93
  async def _host_from_zeroconf(timeout: float) -> str:
@@ -107,7 +110,7 @@ async def _host_from_zeroconf(timeout: float) -> str:
107
110
  await info.async_request(zeroconf, 3000)
108
111
  if info:
109
112
  addresses = [
110
- "%s:%d" % (addr, cast(int, info.port))
113
+ f"{addr}:{cast(int, info.port)}"
111
114
  for addr in info.parsed_scoped_addresses()
112
115
  ]
113
116
  print(f" Name: {name}")
@@ -1,74 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # Generated by the protocol buffer compiler. DO NOT EDIT!
3
- # source: remotemessage.proto
4
- """Generated protocol buffer code."""
5
- from google.protobuf import descriptor as _descriptor
6
- from google.protobuf import descriptor_pool as _descriptor_pool
7
- from google.protobuf import symbol_database as _symbol_database
8
- from google.protobuf.internal import builder as _builder
9
- # @@protoc_insertion_point(imports)
10
-
11
- _sym_db = _symbol_database.Default()
12
-
13
-
14
-
15
-
16
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13remotemessage.proto\x12\x06remote\".\n\x1aRemoteAppLinkLaunchRequest\x12\x10\n\x08\x61pp_link\x18\x01 \x01(\t\"!\n\x1fRemoteResetPreferredAudioDevice\"\x1f\n\x1dRemoteSetPreferredAudioDevice\"\x19\n\x17RemoteAdjustVolumeLevel\"\xb4\x01\n\x14RemoteSetVolumeLevel\x12\x10\n\x08unknown1\x18\x01 \x01(\r\x12\x10\n\x08unknown2\x18\x02 \x01(\r\x12\x14\n\x0cplayer_model\x18\x03 \x01(\t\x12\x10\n\x08unknown4\x18\x04 \x01(\r\x12\x10\n\x08unknown5\x18\x05 \x01(\r\x12\x12\n\nvolume_max\x18\x06 \x01(\r\x12\x14\n\x0cvolume_level\x18\x07 \x01(\r\x12\x14\n\x0cvolume_muted\x18\x08 \x01(\x08\"\x1e\n\x0bRemoteStart\x12\x0f\n\x07started\x18\x01 \x01(\x08\"\x10\n\x0eRemoteVoiceEnd\"\x14\n\x12RemoteVoicePayload\"\x12\n\x10RemoteVoiceBegin\"v\n\x15RemoteTextFieldStatus\x12\x15\n\rcounter_field\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t\x12\r\n\x05start\x18\x03 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x04 \x01(\x05\x12\x0c\n\x04int5\x18\x05 \x01(\x05\x12\r\n\x05label\x18\x06 \x01(\t\"W\n\x14RemoteImeShowRequest\x12?\n\x18remote_text_field_status\x18\x02 \x01(\x0b\x32\x1d.remote.RemoteTextFieldStatus\" \n\x0eRemoteEditInfo\x12\x0e\n\x06insert\x18\x02 \x01(\x05\"k\n\x12RemoteImeBatchEdit\x12\x13\n\x0bime_counter\x18\x01 \x01(\x05\x12\x15\n\rfield_counter\x18\x02 \x01(\x05\x12)\n\tedit_info\x18\x03 \x01(\x0b\x32\x16.remote.RemoteEditInfo\"\x99\x01\n\rRemoteAppInfo\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x05\x12\x0c\n\x04int2\x18\x02 \x01(\x05\x12\x0c\n\x04int3\x18\x03 \x01(\x05\x12\x0c\n\x04int4\x18\x04 \x01(\t\x12\x0c\n\x04int7\x18\x07 \x01(\x05\x12\x0c\n\x04int8\x18\x08 \x01(\x05\x12\r\n\x05label\x18\n \x01(\t\x12\x13\n\x0b\x61pp_package\x18\x0c \x01(\t\x12\r\n\x05int13\x18\r \x01(\x05\"w\n\x12RemoteImeKeyInject\x12\'\n\x08\x61pp_info\x18\x01 \x01(\x0b\x32\x15.remote.RemoteAppInfo\x12\x38\n\x11text_field_status\x18\x02 \x01(\x0b\x32\x1d.remote.RemoteTextFieldStatus\"f\n\x0fRemoteKeyInject\x12\'\n\x08key_code\x18\x01 \x01(\x0e\x32\x15.remote.RemoteKeyCode\x12*\n\tdirection\x18\x02 \x01(\x0e\x32\x17.remote.RemoteDirection\"\"\n\x12RemotePingResponse\x12\x0c\n\x04val1\x18\x01 \x01(\x05\"/\n\x11RemotePingRequest\x12\x0c\n\x04val1\x18\x01 \x01(\x05\x12\x0c\n\x04val2\x18\x02 \x01(\x05\"!\n\x0fRemoteSetActive\x12\x0e\n\x06\x61\x63tive\x18\x01 \x01(\x05\"\x80\x01\n\x10RemoteDeviceInfo\x12\r\n\x05model\x18\x01 \x01(\t\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x10\n\x08unknown1\x18\x03 \x01(\x05\x12\x10\n\x08unknown2\x18\x04 \x01(\t\x12\x14\n\x0cpackage_name\x18\x05 \x01(\t\x12\x13\n\x0b\x61pp_version\x18\x06 \x01(\t\"O\n\x0fRemoteConfigure\x12\r\n\x05\x63ode1\x18\x01 \x01(\x05\x12-\n\x0b\x64\x65vice_info\x18\x02 \x01(\x0b\x32\x18.remote.RemoteDeviceInfo\"D\n\x0bRemoteError\x12\r\n\x05value\x18\x01 \x01(\x08\x12&\n\x07message\x18\x02 \x01(\x0b\x32\x15.remote.RemoteMessage\"\xc1\x08\n\rRemoteMessage\x12\x31\n\x10remote_configure\x18\x01 \x01(\x0b\x32\x17.remote.RemoteConfigure\x12\x32\n\x11remote_set_active\x18\x02 \x01(\x0b\x32\x17.remote.RemoteSetActive\x12)\n\x0cremote_error\x18\x03 \x01(\x0b\x32\x13.remote.RemoteError\x12\x36\n\x13remote_ping_request\x18\x08 \x01(\x0b\x32\x19.remote.RemotePingRequest\x12\x38\n\x14remote_ping_response\x18\t \x01(\x0b\x32\x1a.remote.RemotePingResponse\x12\x32\n\x11remote_key_inject\x18\n \x01(\x0b\x32\x17.remote.RemoteKeyInject\x12\x39\n\x15remote_ime_key_inject\x18\x14 \x01(\x0b\x32\x1a.remote.RemoteImeKeyInject\x12\x39\n\x15remote_ime_batch_edit\x18\x15 \x01(\x0b\x32\x1a.remote.RemoteImeBatchEdit\x12=\n\x17remote_ime_show_request\x18\x16 \x01(\x0b\x32\x1c.remote.RemoteImeShowRequest\x12\x34\n\x12remote_voice_begin\x18\x1e \x01(\x0b\x32\x18.remote.RemoteVoiceBegin\x12\x38\n\x14remote_voice_payload\x18\x1f \x01(\x0b\x32\x1a.remote.RemoteVoicePayload\x12\x30\n\x10remote_voice_end\x18 \x01(\x0b\x32\x16.remote.RemoteVoiceEnd\x12)\n\x0cremote_start\x18( \x01(\x0b\x32\x13.remote.RemoteStart\x12=\n\x17remote_set_volume_level\x18\x32 \x01(\x0b\x32\x1c.remote.RemoteSetVolumeLevel\x12\x43\n\x1aremote_adjust_volume_level\x18\x33 \x01(\x0b\x32\x1f.remote.RemoteAdjustVolumeLevel\x12P\n!remote_set_preferred_audio_device\x18< \x01(\x0b\x32%.remote.RemoteSetPreferredAudioDevice\x12T\n#remote_reset_preferred_audio_device\x18= \x01(\x0b\x32\'.remote.RemoteResetPreferredAudioDevice\x12J\n\x1eremote_app_link_launch_request\x18Z \x01(\x0b\x32\".remote.RemoteAppLinkLaunchRequest*\xe7\x37\n\rRemoteKeyCode\x12\x13\n\x0fKEYCODE_UNKNOWN\x10\x00\x12\x15\n\x11KEYCODE_SOFT_LEFT\x10\x01\x12\x16\n\x12KEYCODE_SOFT_RIGHT\x10\x02\x12\x10\n\x0cKEYCODE_HOME\x10\x03\x12\x10\n\x0cKEYCODE_BACK\x10\x04\x12\x10\n\x0cKEYCODE_CALL\x10\x05\x12\x13\n\x0fKEYCODE_ENDCALL\x10\x06\x12\r\n\tKEYCODE_0\x10\x07\x12\r\n\tKEYCODE_1\x10\x08\x12\r\n\tKEYCODE_2\x10\t\x12\r\n\tKEYCODE_3\x10\n\x12\r\n\tKEYCODE_4\x10\x0b\x12\r\n\tKEYCODE_5\x10\x0c\x12\r\n\tKEYCODE_6\x10\r\x12\r\n\tKEYCODE_7\x10\x0e\x12\r\n\tKEYCODE_8\x10\x0f\x12\r\n\tKEYCODE_9\x10\x10\x12\x10\n\x0cKEYCODE_STAR\x10\x11\x12\x11\n\rKEYCODE_POUND\x10\x12\x12\x13\n\x0fKEYCODE_DPAD_UP\x10\x13\x12\x15\n\x11KEYCODE_DPAD_DOWN\x10\x14\x12\x15\n\x11KEYCODE_DPAD_LEFT\x10\x15\x12\x16\n\x12KEYCODE_DPAD_RIGHT\x10\x16\x12\x17\n\x13KEYCODE_DPAD_CENTER\x10\x17\x12\x15\n\x11KEYCODE_VOLUME_UP\x10\x18\x12\x17\n\x13KEYCODE_VOLUME_DOWN\x10\x19\x12\x11\n\rKEYCODE_POWER\x10\x1a\x12\x12\n\x0eKEYCODE_CAMERA\x10\x1b\x12\x11\n\rKEYCODE_CLEAR\x10\x1c\x12\r\n\tKEYCODE_A\x10\x1d\x12\r\n\tKEYCODE_B\x10\x1e\x12\r\n\tKEYCODE_C\x10\x1f\x12\r\n\tKEYCODE_D\x10 \x12\r\n\tKEYCODE_E\x10!\x12\r\n\tKEYCODE_F\x10\"\x12\r\n\tKEYCODE_G\x10#\x12\r\n\tKEYCODE_H\x10$\x12\r\n\tKEYCODE_I\x10%\x12\r\n\tKEYCODE_J\x10&\x12\r\n\tKEYCODE_K\x10\'\x12\r\n\tKEYCODE_L\x10(\x12\r\n\tKEYCODE_M\x10)\x12\r\n\tKEYCODE_N\x10*\x12\r\n\tKEYCODE_O\x10+\x12\r\n\tKEYCODE_P\x10,\x12\r\n\tKEYCODE_Q\x10-\x12\r\n\tKEYCODE_R\x10.\x12\r\n\tKEYCODE_S\x10/\x12\r\n\tKEYCODE_T\x10\x30\x12\r\n\tKEYCODE_U\x10\x31\x12\r\n\tKEYCODE_V\x10\x32\x12\r\n\tKEYCODE_W\x10\x33\x12\r\n\tKEYCODE_X\x10\x34\x12\r\n\tKEYCODE_Y\x10\x35\x12\r\n\tKEYCODE_Z\x10\x36\x12\x11\n\rKEYCODE_COMMA\x10\x37\x12\x12\n\x0eKEYCODE_PERIOD\x10\x38\x12\x14\n\x10KEYCODE_ALT_LEFT\x10\x39\x12\x15\n\x11KEYCODE_ALT_RIGHT\x10:\x12\x16\n\x12KEYCODE_SHIFT_LEFT\x10;\x12\x17\n\x13KEYCODE_SHIFT_RIGHT\x10<\x12\x0f\n\x0bKEYCODE_TAB\x10=\x12\x11\n\rKEYCODE_SPACE\x10>\x12\x0f\n\x0bKEYCODE_SYM\x10?\x12\x14\n\x10KEYCODE_EXPLORER\x10@\x12\x14\n\x10KEYCODE_ENVELOPE\x10\x41\x12\x11\n\rKEYCODE_ENTER\x10\x42\x12\x0f\n\x0bKEYCODE_DEL\x10\x43\x12\x11\n\rKEYCODE_GRAVE\x10\x44\x12\x11\n\rKEYCODE_MINUS\x10\x45\x12\x12\n\x0eKEYCODE_EQUALS\x10\x46\x12\x18\n\x14KEYCODE_LEFT_BRACKET\x10G\x12\x19\n\x15KEYCODE_RIGHT_BRACKET\x10H\x12\x15\n\x11KEYCODE_BACKSLASH\x10I\x12\x15\n\x11KEYCODE_SEMICOLON\x10J\x12\x16\n\x12KEYCODE_APOSTROPHE\x10K\x12\x11\n\rKEYCODE_SLASH\x10L\x12\x0e\n\nKEYCODE_AT\x10M\x12\x0f\n\x0bKEYCODE_NUM\x10N\x12\x17\n\x13KEYCODE_HEADSETHOOK\x10O\x12\x11\n\rKEYCODE_FOCUS\x10P\x12\x10\n\x0cKEYCODE_PLUS\x10Q\x12\x10\n\x0cKEYCODE_MENU\x10R\x12\x18\n\x14KEYCODE_NOTIFICATION\x10S\x12\x12\n\x0eKEYCODE_SEARCH\x10T\x12\x1c\n\x18KEYCODE_MEDIA_PLAY_PAUSE\x10U\x12\x16\n\x12KEYCODE_MEDIA_STOP\x10V\x12\x16\n\x12KEYCODE_MEDIA_NEXT\x10W\x12\x1a\n\x16KEYCODE_MEDIA_PREVIOUS\x10X\x12\x18\n\x14KEYCODE_MEDIA_REWIND\x10Y\x12\x1e\n\x1aKEYCODE_MEDIA_FAST_FORWARD\x10Z\x12\x10\n\x0cKEYCODE_MUTE\x10[\x12\x13\n\x0fKEYCODE_PAGE_UP\x10\\\x12\x15\n\x11KEYCODE_PAGE_DOWN\x10]\x12\x17\n\x13KEYCODE_PICTSYMBOLS\x10^\x12\x1a\n\x16KEYCODE_SWITCH_CHARSET\x10_\x12\x14\n\x10KEYCODE_BUTTON_A\x10`\x12\x14\n\x10KEYCODE_BUTTON_B\x10\x61\x12\x14\n\x10KEYCODE_BUTTON_C\x10\x62\x12\x14\n\x10KEYCODE_BUTTON_X\x10\x63\x12\x14\n\x10KEYCODE_BUTTON_Y\x10\x64\x12\x14\n\x10KEYCODE_BUTTON_Z\x10\x65\x12\x15\n\x11KEYCODE_BUTTON_L1\x10\x66\x12\x15\n\x11KEYCODE_BUTTON_R1\x10g\x12\x15\n\x11KEYCODE_BUTTON_L2\x10h\x12\x15\n\x11KEYCODE_BUTTON_R2\x10i\x12\x19\n\x15KEYCODE_BUTTON_THUMBL\x10j\x12\x19\n\x15KEYCODE_BUTTON_THUMBR\x10k\x12\x18\n\x14KEYCODE_BUTTON_START\x10l\x12\x19\n\x15KEYCODE_BUTTON_SELECT\x10m\x12\x17\n\x13KEYCODE_BUTTON_MODE\x10n\x12\x12\n\x0eKEYCODE_ESCAPE\x10o\x12\x17\n\x13KEYCODE_FORWARD_DEL\x10p\x12\x15\n\x11KEYCODE_CTRL_LEFT\x10q\x12\x16\n\x12KEYCODE_CTRL_RIGHT\x10r\x12\x15\n\x11KEYCODE_CAPS_LOCK\x10s\x12\x17\n\x13KEYCODE_SCROLL_LOCK\x10t\x12\x15\n\x11KEYCODE_META_LEFT\x10u\x12\x16\n\x12KEYCODE_META_RIGHT\x10v\x12\x14\n\x10KEYCODE_FUNCTION\x10w\x12\x11\n\rKEYCODE_SYSRQ\x10x\x12\x11\n\rKEYCODE_BREAK\x10y\x12\x15\n\x11KEYCODE_MOVE_HOME\x10z\x12\x14\n\x10KEYCODE_MOVE_END\x10{\x12\x12\n\x0eKEYCODE_INSERT\x10|\x12\x13\n\x0fKEYCODE_FORWARD\x10}\x12\x16\n\x12KEYCODE_MEDIA_PLAY\x10~\x12\x17\n\x13KEYCODE_MEDIA_PAUSE\x10\x7f\x12\x18\n\x13KEYCODE_MEDIA_CLOSE\x10\x80\x01\x12\x18\n\x13KEYCODE_MEDIA_EJECT\x10\x81\x01\x12\x19\n\x14KEYCODE_MEDIA_RECORD\x10\x82\x01\x12\x0f\n\nKEYCODE_F1\x10\x83\x01\x12\x0f\n\nKEYCODE_F2\x10\x84\x01\x12\x0f\n\nKEYCODE_F3\x10\x85\x01\x12\x0f\n\nKEYCODE_F4\x10\x86\x01\x12\x0f\n\nKEYCODE_F5\x10\x87\x01\x12\x0f\n\nKEYCODE_F6\x10\x88\x01\x12\x0f\n\nKEYCODE_F7\x10\x89\x01\x12\x0f\n\nKEYCODE_F8\x10\x8a\x01\x12\x0f\n\nKEYCODE_F9\x10\x8b\x01\x12\x10\n\x0bKEYCODE_F10\x10\x8c\x01\x12\x10\n\x0bKEYCODE_F11\x10\x8d\x01\x12\x10\n\x0bKEYCODE_F12\x10\x8e\x01\x12\x15\n\x10KEYCODE_NUM_LOCK\x10\x8f\x01\x12\x15\n\x10KEYCODE_NUMPAD_0\x10\x90\x01\x12\x15\n\x10KEYCODE_NUMPAD_1\x10\x91\x01\x12\x15\n\x10KEYCODE_NUMPAD_2\x10\x92\x01\x12\x15\n\x10KEYCODE_NUMPAD_3\x10\x93\x01\x12\x15\n\x10KEYCODE_NUMPAD_4\x10\x94\x01\x12\x15\n\x10KEYCODE_NUMPAD_5\x10\x95\x01\x12\x15\n\x10KEYCODE_NUMPAD_6\x10\x96\x01\x12\x15\n\x10KEYCODE_NUMPAD_7\x10\x97\x01\x12\x15\n\x10KEYCODE_NUMPAD_8\x10\x98\x01\x12\x15\n\x10KEYCODE_NUMPAD_9\x10\x99\x01\x12\x1a\n\x15KEYCODE_NUMPAD_DIVIDE\x10\x9a\x01\x12\x1c\n\x17KEYCODE_NUMPAD_MULTIPLY\x10\x9b\x01\x12\x1c\n\x17KEYCODE_NUMPAD_SUBTRACT\x10\x9c\x01\x12\x17\n\x12KEYCODE_NUMPAD_ADD\x10\x9d\x01\x12\x17\n\x12KEYCODE_NUMPAD_DOT\x10\x9e\x01\x12\x19\n\x14KEYCODE_NUMPAD_COMMA\x10\x9f\x01\x12\x19\n\x14KEYCODE_NUMPAD_ENTER\x10\xa0\x01\x12\x1a\n\x15KEYCODE_NUMPAD_EQUALS\x10\xa1\x01\x12\x1e\n\x19KEYCODE_NUMPAD_LEFT_PAREN\x10\xa2\x01\x12\x1f\n\x1aKEYCODE_NUMPAD_RIGHT_PAREN\x10\xa3\x01\x12\x18\n\x13KEYCODE_VOLUME_MUTE\x10\xa4\x01\x12\x11\n\x0cKEYCODE_INFO\x10\xa5\x01\x12\x17\n\x12KEYCODE_CHANNEL_UP\x10\xa6\x01\x12\x19\n\x14KEYCODE_CHANNEL_DOWN\x10\xa7\x01\x12\x14\n\x0fKEYCODE_ZOOM_IN\x10\xa8\x01\x12\x15\n\x10KEYCODE_ZOOM_OUT\x10\xa9\x01\x12\x0f\n\nKEYCODE_TV\x10\xaa\x01\x12\x13\n\x0eKEYCODE_WINDOW\x10\xab\x01\x12\x12\n\rKEYCODE_GUIDE\x10\xac\x01\x12\x10\n\x0bKEYCODE_DVR\x10\xad\x01\x12\x15\n\x10KEYCODE_BOOKMARK\x10\xae\x01\x12\x15\n\x10KEYCODE_CAPTIONS\x10\xaf\x01\x12\x15\n\x10KEYCODE_SETTINGS\x10\xb0\x01\x12\x15\n\x10KEYCODE_TV_POWER\x10\xb1\x01\x12\x15\n\x10KEYCODE_TV_INPUT\x10\xb2\x01\x12\x16\n\x11KEYCODE_STB_POWER\x10\xb3\x01\x12\x16\n\x11KEYCODE_STB_INPUT\x10\xb4\x01\x12\x16\n\x11KEYCODE_AVR_POWER\x10\xb5\x01\x12\x16\n\x11KEYCODE_AVR_INPUT\x10\xb6\x01\x12\x15\n\x10KEYCODE_PROG_RED\x10\xb7\x01\x12\x17\n\x12KEYCODE_PROG_GREEN\x10\xb8\x01\x12\x18\n\x13KEYCODE_PROG_YELLOW\x10\xb9\x01\x12\x16\n\x11KEYCODE_PROG_BLUE\x10\xba\x01\x12\x17\n\x12KEYCODE_APP_SWITCH\x10\xbb\x01\x12\x15\n\x10KEYCODE_BUTTON_1\x10\xbc\x01\x12\x15\n\x10KEYCODE_BUTTON_2\x10\xbd\x01\x12\x15\n\x10KEYCODE_BUTTON_3\x10\xbe\x01\x12\x15\n\x10KEYCODE_BUTTON_4\x10\xbf\x01\x12\x15\n\x10KEYCODE_BUTTON_5\x10\xc0\x01\x12\x15\n\x10KEYCODE_BUTTON_6\x10\xc1\x01\x12\x15\n\x10KEYCODE_BUTTON_7\x10\xc2\x01\x12\x15\n\x10KEYCODE_BUTTON_8\x10\xc3\x01\x12\x15\n\x10KEYCODE_BUTTON_9\x10\xc4\x01\x12\x16\n\x11KEYCODE_BUTTON_10\x10\xc5\x01\x12\x16\n\x11KEYCODE_BUTTON_11\x10\xc6\x01\x12\x16\n\x11KEYCODE_BUTTON_12\x10\xc7\x01\x12\x16\n\x11KEYCODE_BUTTON_13\x10\xc8\x01\x12\x16\n\x11KEYCODE_BUTTON_14\x10\xc9\x01\x12\x16\n\x11KEYCODE_BUTTON_15\x10\xca\x01\x12\x16\n\x11KEYCODE_BUTTON_16\x10\xcb\x01\x12\x1c\n\x17KEYCODE_LANGUAGE_SWITCH\x10\xcc\x01\x12\x18\n\x13KEYCODE_MANNER_MODE\x10\xcd\x01\x12\x14\n\x0fKEYCODE_3D_MODE\x10\xce\x01\x12\x15\n\x10KEYCODE_CONTACTS\x10\xcf\x01\x12\x15\n\x10KEYCODE_CALENDAR\x10\xd0\x01\x12\x12\n\rKEYCODE_MUSIC\x10\xd1\x01\x12\x17\n\x12KEYCODE_CALCULATOR\x10\xd2\x01\x12\x1c\n\x17KEYCODE_ZENKAKU_HANKAKU\x10\xd3\x01\x12\x11\n\x0cKEYCODE_EISU\x10\xd4\x01\x12\x15\n\x10KEYCODE_MUHENKAN\x10\xd5\x01\x12\x13\n\x0eKEYCODE_HENKAN\x10\xd6\x01\x12\x1e\n\x19KEYCODE_KATAKANA_HIRAGANA\x10\xd7\x01\x12\x10\n\x0bKEYCODE_YEN\x10\xd8\x01\x12\x0f\n\nKEYCODE_RO\x10\xd9\x01\x12\x11\n\x0cKEYCODE_KANA\x10\xda\x01\x12\x13\n\x0eKEYCODE_ASSIST\x10\xdb\x01\x12\x1c\n\x17KEYCODE_BRIGHTNESS_DOWN\x10\xdc\x01\x12\x1a\n\x15KEYCODE_BRIGHTNESS_UP\x10\xdd\x01\x12\x1e\n\x19KEYCODE_MEDIA_AUDIO_TRACK\x10\xde\x01\x12\x12\n\rKEYCODE_SLEEP\x10\xdf\x01\x12\x13\n\x0eKEYCODE_WAKEUP\x10\xe0\x01\x12\x14\n\x0fKEYCODE_PAIRING\x10\xe1\x01\x12\x1b\n\x16KEYCODE_MEDIA_TOP_MENU\x10\xe2\x01\x12\x0f\n\nKEYCODE_11\x10\xe3\x01\x12\x0f\n\nKEYCODE_12\x10\xe4\x01\x12\x19\n\x14KEYCODE_LAST_CHANNEL\x10\xe5\x01\x12\x1c\n\x17KEYCODE_TV_DATA_SERVICE\x10\xe6\x01\x12\x19\n\x14KEYCODE_VOICE_ASSIST\x10\xe7\x01\x12\x1d\n\x18KEYCODE_TV_RADIO_SERVICE\x10\xe8\x01\x12\x18\n\x13KEYCODE_TV_TELETEXT\x10\xe9\x01\x12\x1c\n\x17KEYCODE_TV_NUMBER_ENTRY\x10\xea\x01\x12\"\n\x1dKEYCODE_TV_TERRESTRIAL_ANALOG\x10\xeb\x01\x12#\n\x1eKEYCODE_TV_TERRESTRIAL_DIGITAL\x10\xec\x01\x12\x19\n\x14KEYCODE_TV_SATELLITE\x10\xed\x01\x12\x1c\n\x17KEYCODE_TV_SATELLITE_BS\x10\xee\x01\x12\x1c\n\x17KEYCODE_TV_SATELLITE_CS\x10\xef\x01\x12!\n\x1cKEYCODE_TV_SATELLITE_SERVICE\x10\xf0\x01\x12\x17\n\x12KEYCODE_TV_NETWORK\x10\xf1\x01\x12\x1d\n\x18KEYCODE_TV_ANTENNA_CABLE\x10\xf2\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_1\x10\xf3\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_2\x10\xf4\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_3\x10\xf5\x01\x12\x1c\n\x17KEYCODE_TV_INPUT_HDMI_4\x10\xf6\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPOSITE_1\x10\xf7\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPOSITE_2\x10\xf8\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPONENT_1\x10\xf9\x01\x12!\n\x1cKEYCODE_TV_INPUT_COMPONENT_2\x10\xfa\x01\x12\x1b\n\x16KEYCODE_TV_INPUT_VGA_1\x10\xfb\x01\x12!\n\x1cKEYCODE_TV_AUDIO_DESCRIPTION\x10\xfc\x01\x12(\n#KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP\x10\xfd\x01\x12*\n%KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN\x10\xfe\x01\x12\x19\n\x14KEYCODE_TV_ZOOM_MODE\x10\xff\x01\x12\x1d\n\x18KEYCODE_TV_CONTENTS_MENU\x10\x80\x02\x12\"\n\x1dKEYCODE_TV_MEDIA_CONTEXT_MENU\x10\x81\x02\x12!\n\x1cKEYCODE_TV_TIMER_PROGRAMMING\x10\x82\x02\x12\x11\n\x0cKEYCODE_HELP\x10\x83\x02\x12\x1e\n\x19KEYCODE_NAVIGATE_PREVIOUS\x10\x84\x02\x12\x1a\n\x15KEYCODE_NAVIGATE_NEXT\x10\x85\x02\x12\x18\n\x13KEYCODE_NAVIGATE_IN\x10\x86\x02\x12\x19\n\x14KEYCODE_NAVIGATE_OUT\x10\x87\x02\x12\x19\n\x14KEYCODE_STEM_PRIMARY\x10\x88\x02\x12\x13\n\x0eKEYCODE_STEM_1\x10\x89\x02\x12\x13\n\x0eKEYCODE_STEM_2\x10\x8a\x02\x12\x13\n\x0eKEYCODE_STEM_3\x10\x8b\x02\x12\x19\n\x14KEYCODE_DPAD_UP_LEFT\x10\x8c\x02\x12\x1b\n\x16KEYCODE_DPAD_DOWN_LEFT\x10\x8d\x02\x12\x1a\n\x15KEYCODE_DPAD_UP_RIGHT\x10\x8e\x02\x12\x1c\n\x17KEYCODE_DPAD_DOWN_RIGHT\x10\x8f\x02\x12\x1f\n\x1aKEYCODE_MEDIA_SKIP_FORWARD\x10\x90\x02\x12 \n\x1bKEYCODE_MEDIA_SKIP_BACKWARD\x10\x91\x02\x12\x1f\n\x1aKEYCODE_MEDIA_STEP_FORWARD\x10\x92\x02\x12 \n\x1bKEYCODE_MEDIA_STEP_BACKWARD\x10\x93\x02\x12\x17\n\x12KEYCODE_SOFT_SLEEP\x10\x94\x02\x12\x10\n\x0bKEYCODE_CUT\x10\x95\x02\x12\x11\n\x0cKEYCODE_COPY\x10\x96\x02\x12\x12\n\rKEYCODE_PASTE\x10\x97\x02\x12!\n\x1cKEYCODE_SYSTEM_NAVIGATION_UP\x10\x98\x02\x12#\n\x1eKEYCODE_SYSTEM_NAVIGATION_DOWN\x10\x99\x02\x12#\n\x1eKEYCODE_SYSTEM_NAVIGATION_LEFT\x10\x9a\x02\x12$\n\x1fKEYCODE_SYSTEM_NAVIGATION_RIGHT\x10\x9b\x02\x12\x15\n\x10KEYCODE_ALL_APPS\x10\x9c\x02\x12\x14\n\x0fKEYCODE_REFRESH\x10\x9d\x02\x12\x16\n\x11KEYCODE_THUMBS_UP\x10\x9e\x02\x12\x18\n\x13KEYCODE_THUMBS_DOWN\x10\x9f\x02\x12\x1b\n\x16KEYCODE_PROFILE_SWITCH\x10\xa0\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_1\x10\xa1\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_2\x10\xa2\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_3\x10\xa3\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_4\x10\xa4\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_5\x10\xa5\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_6\x10\xa6\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_7\x10\xa7\x02\x12\x18\n\x13KEYCODE_VIDEO_APP_8\x10\xa8\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_1\x10\xa9\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_2\x10\xaa\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_3\x10\xab\x02\x12\x1b\n\x16KEYCODE_FEATURED_APP_4\x10\xac\x02\x12\x17\n\x12KEYCODE_DEMO_APP_1\x10\xad\x02\x12\x17\n\x12KEYCODE_DEMO_APP_2\x10\xae\x02\x12\x17\n\x12KEYCODE_DEMO_APP_3\x10\xaf\x02\x12\x17\n\x12KEYCODE_DEMO_APP_4\x10\xb0\x02*Q\n\x0fRemoteDirection\x12\x15\n\x11UNKNOWN_DIRECTION\x10\x00\x12\x0e\n\nSTART_LONG\x10\x01\x12\x0c\n\x08\x45ND_LONG\x10\x02\x12\t\n\x05SHORT\x10\x03\x62\x06proto3')
17
-
18
- _globals = globals()
19
- _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
20
- _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'remotemessage_pb2', _globals)
21
- if _descriptor._USE_C_DESCRIPTORS == False:
22
-
23
- DESCRIPTOR._options = None
24
- _globals['_REMOTEKEYCODE']._serialized_start=2677
25
- _globals['_REMOTEKEYCODE']._serialized_end=9820
26
- _globals['_REMOTEDIRECTION']._serialized_start=9822
27
- _globals['_REMOTEDIRECTION']._serialized_end=9903
28
- _globals['_REMOTEAPPLINKLAUNCHREQUEST']._serialized_start=31
29
- _globals['_REMOTEAPPLINKLAUNCHREQUEST']._serialized_end=77
30
- _globals['_REMOTERESETPREFERREDAUDIODEVICE']._serialized_start=79
31
- _globals['_REMOTERESETPREFERREDAUDIODEVICE']._serialized_end=112
32
- _globals['_REMOTESETPREFERREDAUDIODEVICE']._serialized_start=114
33
- _globals['_REMOTESETPREFERREDAUDIODEVICE']._serialized_end=145
34
- _globals['_REMOTEADJUSTVOLUMELEVEL']._serialized_start=147
35
- _globals['_REMOTEADJUSTVOLUMELEVEL']._serialized_end=172
36
- _globals['_REMOTESETVOLUMELEVEL']._serialized_start=175
37
- _globals['_REMOTESETVOLUMELEVEL']._serialized_end=355
38
- _globals['_REMOTESTART']._serialized_start=357
39
- _globals['_REMOTESTART']._serialized_end=387
40
- _globals['_REMOTEVOICEEND']._serialized_start=389
41
- _globals['_REMOTEVOICEEND']._serialized_end=405
42
- _globals['_REMOTEVOICEPAYLOAD']._serialized_start=407
43
- _globals['_REMOTEVOICEPAYLOAD']._serialized_end=427
44
- _globals['_REMOTEVOICEBEGIN']._serialized_start=429
45
- _globals['_REMOTEVOICEBEGIN']._serialized_end=447
46
- _globals['_REMOTETEXTFIELDSTATUS']._serialized_start=449
47
- _globals['_REMOTETEXTFIELDSTATUS']._serialized_end=567
48
- _globals['_REMOTEIMESHOWREQUEST']._serialized_start=569
49
- _globals['_REMOTEIMESHOWREQUEST']._serialized_end=656
50
- _globals['_REMOTEEDITINFO']._serialized_start=658
51
- _globals['_REMOTEEDITINFO']._serialized_end=690
52
- _globals['_REMOTEIMEBATCHEDIT']._serialized_start=692
53
- _globals['_REMOTEIMEBATCHEDIT']._serialized_end=799
54
- _globals['_REMOTEAPPINFO']._serialized_start=802
55
- _globals['_REMOTEAPPINFO']._serialized_end=955
56
- _globals['_REMOTEIMEKEYINJECT']._serialized_start=957
57
- _globals['_REMOTEIMEKEYINJECT']._serialized_end=1076
58
- _globals['_REMOTEKEYINJECT']._serialized_start=1078
59
- _globals['_REMOTEKEYINJECT']._serialized_end=1180
60
- _globals['_REMOTEPINGRESPONSE']._serialized_start=1182
61
- _globals['_REMOTEPINGRESPONSE']._serialized_end=1216
62
- _globals['_REMOTEPINGREQUEST']._serialized_start=1218
63
- _globals['_REMOTEPINGREQUEST']._serialized_end=1265
64
- _globals['_REMOTESETACTIVE']._serialized_start=1267
65
- _globals['_REMOTESETACTIVE']._serialized_end=1300
66
- _globals['_REMOTEDEVICEINFO']._serialized_start=1303
67
- _globals['_REMOTEDEVICEINFO']._serialized_end=1431
68
- _globals['_REMOTECONFIGURE']._serialized_start=1433
69
- _globals['_REMOTECONFIGURE']._serialized_end=1512
70
- _globals['_REMOTEERROR']._serialized_start=1514
71
- _globals['_REMOTEERROR']._serialized_end=1582
72
- _globals['_REMOTEMESSAGE']._serialized_start=1585
73
- _globals['_REMOTEMESSAGE']._serialized_end=2674
74
- # @@protoc_insertion_point(module_scope)