Add support for custom themes to use dark mode (#46532)

pull/51069/head
Philip Allgaier 2021-05-25 13:26:24 +02:00 committed by GitHub
parent fe34f42aa5
commit d8ff52e55b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 3 deletions

View File

@ -36,6 +36,9 @@ mimetypes.add_type("application/javascript", ".js")
DOMAIN = "frontend"
CONF_THEMES = "themes"
CONF_THEMES_MODES = "modes"
CONF_THEMES_LIGHT = "light"
CONF_THEMES_DARK = "dark"
CONF_EXTRA_HTML_URL = "extra_html_url"
CONF_EXTRA_HTML_URL_ES5 = "extra_html_url_es5"
CONF_EXTRA_MODULE_URL = "extra_module_url"
@ -66,14 +69,39 @@ PRIMARY_COLOR = "primary-color"
_LOGGER = logging.getLogger(__name__)
EXTENDED_THEME_SCHEMA = vol.Schema(
{
# Theme variables that apply to all modes
cv.string: cv.string,
# Mode specific theme variables
vol.Optional(CONF_THEMES_MODES): vol.Schema(
{
vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}),
vol.Optional(CONF_THEMES_DARK): vol.Schema({cv.string: cv.string}),
}
),
}
)
THEME_SCHEMA = vol.Schema(
{
cv.string: (
vol.Any(
# Legacy theme scheme
{cv.string: cv.string},
# New extended schema with mode support
EXTENDED_THEME_SCHEMA,
)
)
}
)
CONFIG_SCHEMA = vol.Schema(
{
DOMAIN: vol.Schema(
{
vol.Optional(CONF_FRONTEND_REPO): cv.isdir,
vol.Optional(CONF_THEMES): vol.Schema(
{cv.string: {cv.string: cv.string}}
),
vol.Optional(CONF_THEMES): THEME_SCHEMA,
vol.Optional(CONF_EXTRA_MODULE_URL): vol.All(
cv.ensure_list, [cv.string]
),

View File

@ -26,6 +26,25 @@ from tests.common import async_capture_events, async_fire_time_changed
MOCK_THEMES = {
"happy": {"primary-color": "red", "app-header-background-color": "blue"},
"dark": {"primary-color": "black"},
"light_only": {
"primary-color": "blue",
"modes": {
"light": {"secondary-color": "black"},
},
},
"dark_only": {
"primary-color": "blue",
"modes": {
"dark": {"secondary-color": "white"},
},
},
"light_and_dark": {
"primary-color": "blue",
"modes": {
"light": {"secondary-color": "black"},
"dark": {"secondary-color": "white"},
},
},
}
CONFIG_THEMES = {DOMAIN: {CONF_THEMES: MOCK_THEMES}}
@ -279,6 +298,15 @@ async def test_themes_set_dark_theme(hass, themes_ws_client):
assert msg["result"]["default_dark_theme"] is None
await hass.services.async_call(
DOMAIN, "set_theme", {"name": "light_and_dark", "mode": "dark"}, blocking=True
)
await themes_ws_client.send_json({"id": 8, "type": "frontend/get_themes"})
msg = await themes_ws_client.receive_json()
assert msg["result"]["default_dark_theme"] == "light_and_dark"
async def test_themes_set_dark_theme_wrong_name(hass, frontend, themes_ws_client):
"""Test frontend.set_theme service called with mode dark and wrong name."""