diff --git a/homeassistant/components/androidtv/__init__.py b/homeassistant/components/androidtv/__init__.py index 4ffa0e24777..a5637053e4a 100644 --- a/homeassistant/components/androidtv/__init__.py +++ b/homeassistant/components/androidtv/__init__.py @@ -33,9 +33,11 @@ from homeassistant.const import ( ) from homeassistant.core import Event, HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady +from homeassistant.helpers import config_validation as cv from homeassistant.helpers.device_registry import format_mac from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.storage import STORAGE_DIR +from homeassistant.helpers.typing import ConfigType from .const import ( CONF_ADB_SERVER_IP, @@ -46,10 +48,12 @@ from .const import ( DEFAULT_ADB_SERVER_PORT, DEVICE_ANDROIDTV, DEVICE_FIRETV, + DOMAIN, PROP_ETHMAC, PROP_WIFIMAC, SIGNAL_CONFIG_ENTITY, ) +from .services import async_setup_services ADB_PYTHON_EXCEPTIONS: tuple = ( AdbTimeoutError, @@ -63,6 +67,8 @@ ADB_PYTHON_EXCEPTIONS: tuple = ( ) ADB_TCP_EXCEPTIONS: tuple = (ConnectionResetError, RuntimeError) +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) + PLATFORMS = [Platform.MEDIA_PLAYER, Platform.REMOTE] RELOAD_OPTIONS = [CONF_STATE_DETECTION_RULES] @@ -188,6 +194,12 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return True +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: + """Set up the Android TV / Fire TV integration.""" + async_setup_services(hass) + return True + + async def async_setup_entry(hass: HomeAssistant, entry: AndroidTVConfigEntry) -> bool: """Set up Android Debug Bridge platform.""" diff --git a/homeassistant/components/androidtv/media_player.py b/homeassistant/components/androidtv/media_player.py index 6a60d84e39e..9621282208e 100644 --- a/homeassistant/components/androidtv/media_player.py +++ b/homeassistant/components/androidtv/media_player.py @@ -8,7 +8,6 @@ import logging from androidtv.constants import APPS, KEYS from androidtv.setup_async import AndroidTVAsync, FireTVAsync -import voluptuous as vol from homeassistant.components import persistent_notification from homeassistant.components.media_player import ( @@ -17,9 +16,7 @@ from homeassistant.components.media_player import ( MediaPlayerEntityFeature, MediaPlayerState, ) -from homeassistant.const import ATTR_COMMAND from homeassistant.core import HomeAssistant -from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.util.dt import utcnow @@ -39,19 +36,10 @@ from .const import ( SIGNAL_CONFIG_ENTITY, ) from .entity import AndroidTVEntity, adb_decorator +from .services import ATTR_ADB_RESPONSE, ATTR_HDMI_INPUT, SERVICE_LEARN_SENDEVENT _LOGGER = logging.getLogger(__name__) -ATTR_ADB_RESPONSE = "adb_response" -ATTR_DEVICE_PATH = "device_path" -ATTR_HDMI_INPUT = "hdmi_input" -ATTR_LOCAL_PATH = "local_path" - -SERVICE_ADB_COMMAND = "adb_command" -SERVICE_DOWNLOAD = "download" -SERVICE_LEARN_SENDEVENT = "learn_sendevent" -SERVICE_UPLOAD = "upload" - # Translate from `AndroidTV` / `FireTV` reported state to HA state. ANDROIDTV_STATES = { "off": MediaPlayerState.OFF, @@ -77,32 +65,6 @@ async def async_setup_entry( ] ) - platform = entity_platform.async_get_current_platform() - platform.async_register_entity_service( - SERVICE_ADB_COMMAND, - {vol.Required(ATTR_COMMAND): cv.string}, - "adb_command", - ) - platform.async_register_entity_service( - SERVICE_LEARN_SENDEVENT, None, "learn_sendevent" - ) - platform.async_register_entity_service( - SERVICE_DOWNLOAD, - { - vol.Required(ATTR_DEVICE_PATH): cv.string, - vol.Required(ATTR_LOCAL_PATH): cv.string, - }, - "service_download", - ) - platform.async_register_entity_service( - SERVICE_UPLOAD, - { - vol.Required(ATTR_DEVICE_PATH): cv.string, - vol.Required(ATTR_LOCAL_PATH): cv.string, - }, - "service_upload", - ) - class ADBDevice(AndroidTVEntity, MediaPlayerEntity): """Representation of an Android or Fire TV device.""" diff --git a/homeassistant/components/androidtv/services.py b/homeassistant/components/androidtv/services.py new file mode 100644 index 00000000000..8a44399b727 --- /dev/null +++ b/homeassistant/components/androidtv/services.py @@ -0,0 +1,66 @@ +"""Services for Android/Fire TV devices.""" + +from __future__ import annotations + +import voluptuous as vol + +from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN +from homeassistant.const import ATTR_COMMAND +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers import config_validation as cv, service + +from .const import DOMAIN + +ATTR_ADB_RESPONSE = "adb_response" +ATTR_DEVICE_PATH = "device_path" +ATTR_HDMI_INPUT = "hdmi_input" +ATTR_LOCAL_PATH = "local_path" + +SERVICE_ADB_COMMAND = "adb_command" +SERVICE_DOWNLOAD = "download" +SERVICE_LEARN_SENDEVENT = "learn_sendevent" +SERVICE_UPLOAD = "upload" + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Register the Android TV / Fire TV services.""" + + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_ADB_COMMAND, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema={vol.Required(ATTR_COMMAND): cv.string}, + func="adb_command", + ) + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_LEARN_SENDEVENT, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema=None, + func="learn_sendevent", + ) + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_DOWNLOAD, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema={ + vol.Required(ATTR_DEVICE_PATH): cv.string, + vol.Required(ATTR_LOCAL_PATH): cv.string, + }, + func="service_download", + ) + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_UPLOAD, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema={ + vol.Required(ATTR_DEVICE_PATH): cv.string, + vol.Required(ATTR_LOCAL_PATH): cv.string, + }, + func="service_upload", + ) diff --git a/tests/components/androidtv/test_media_player.py b/tests/components/androidtv/test_media_player.py index efc05772a9a..2588f61177f 100644 --- a/tests/components/androidtv/test_media_player.py +++ b/tests/components/androidtv/test_media_player.py @@ -21,7 +21,7 @@ from homeassistant.components.androidtv.const import ( DEFAULT_PORT, DOMAIN, ) -from homeassistant.components.androidtv.media_player import ( +from homeassistant.components.androidtv.services import ( ATTR_DEVICE_PATH, ATTR_LOCAL_PATH, SERVICE_ADB_COMMAND,