James Mackay
73e886dafe
fix(config_flow): F-A/F-A2/F-D — the discovered host and the 5555 port ride the schema KEY defaults (t33)
...
F-A (HIGH): _user_schema_dict re-declared vol.Optional(CONF_ADB_HOST) /
CONF_PROTOCOL_HOST inside `if "host" in defaults:` — a no-op, because
voluptuous keys compare by field name and the first (defaultless) key object
survives. The discovered address therefore never reached the form, and the
user submitted a blank host. The host keys are now declared WITH default=host
(_host_field_key), so a discovery-driven user step arrives pre-filled.
F-A2: a discovery-driven user step says the address is known
("{discovery_note}Discovered Shield at <host> — its address is already filled
in below. ") through description_placeholders, and the no_state_source
re-render keeps the prefill instead of rebuilding a blank schema.
F-D: the ADB port is declared with default=DEFAULT_ADB_PORT (5555), and a YAML
seed's port hint is carried into the form instead of being flattened to 5555.
The seed host now feeds _seed_host (same prefill, no discovery claim).
Reproduce-through-test: tests/voluptuous_mirror.py mirrors the real
voluptuous.Marker key contract (hash/eq by field name, default=UNDEFINED when
omitted), because voluptuous is not installed in either CI variant and the old
bare-key stubs could not tell a schema WITH a default from one without. The
pre-t33 discovery assertion only checked the stored attribute and stayed green
while the form rendered blank; it now reads the schema keys and fails on the
pre-fix code (8 tests reproduced red locally).
Verified: uvx --with pytest-asyncio pytest tests -q → 242 passed, 1 skipped;
uvx ruff check custom_components tests → clean.
2026-10-10 20:50:16 +01:00
James Mackay
c20146b08b
fix(init,config_flow): F4 — seed blocks and the import prefill honor the block's shape: ADB only when the block carries an adb host, protocol-only blocks keep adb_enabled off; TestSeedBlockShapeF4 pins all three paths (t32)
2026-10-09 08:04:41 +01:00
James Mackay
6087566336
fix(config_flow): F2 — MAC-less zeroconf discovery calls the audited _async_handle_discovery_without_unique_id helper and guards against a same-host duplicate prefill, so re-discovery can't stack entries; the import guard reads entries via the base _async_current_entries helper; TestMacLessDiscoveryF2 pins helper call + one-entry outcome (t32)
2026-10-09 08:04:05 +01:00
James Mackay
8f40b6435c
fix(poller): F1 — the poller factory re-reads entry.options at call time (audit-sanctioned option), so the next built poller targets the NEW address after a zeroconf IP change; the stale live-read comment in config_flow points at the actual mechanism; TestIpChangeSelfHealF1 drives an IP change and pins the next poller host (t32)
2026-10-09 08:03:28 +01:00
James Mackay
d004e73d99
fix(tests): drop the speculative config-entries install guard — the scoped-stub teardowns already isolate per file; full suite green both variants (completes t30 G6)
2026-10-09 07:46:53 +01:00
James Mackay
e77bc12d81
test: cross-file stub-scoping repairs — hub ConfigFlow base carries the full plumbing, standalone rebuilds when its holder is gone, test_init scoped hygiene mirrors scoped_stubs (completes t30 G6)
2026-10-09 07:38:24 +01:00
James Mackay
80ddff313a
test(init): tests/test_init.py lands — domain async_setup units + YAML seed parsing/normalization, flow-init seeding records, hostless drop, duplicate guards (UI host + virtual unique_id) and single-visit interactive routing; scoped stub hygiene mirrors scoped_stubs (t30 G6/U1)
2026-10-09 07:34:57 +01:00
James Mackay
2e70587871
feat: standards polish — G7 sensor translation_key naming + entity strings, G10 protocol-push device identity on the registry card, G12 unrecorded poll-driven attributes (media player DAG internals + sensors), G14 async_redact_data with an explicit redaction list behind the marker scan (t30)
2026-10-09 07:22:23 +01:00
James Mackay
194a97ce34
feat(button,media_player): Pair ADB carries entity_category CONFIG (t30 G11) + BrowseMediaSource domain parameter at root and children (t30 G18, 2026-05-20 blog contract); stubs/tests pin both
2026-10-09 07:17:14 +01:00
James Mackay
383ec5ada5
feat(config_flow): commit the G2 + stub wiring lost in the amend cycle — device-MAC unique_id derivation in the flow, device-registry stubs across the flow suites
2026-10-09 07:11:11 +01:00
James Mackay
e1a0fc3039
feat(config_flow): the G2 unique_id fix lands — the androidtv entity_id is never a unique_id; MAC derived from the device registry mac connection (empty placeholders skipped), else no unique_id; rename-stability + absence pinned by test (t29 G2)
2026-10-09 07:11:03 +01:00
James Mackay
086c089cc1
fix: commit G3a wiring lost in the amend cycle — listener removal, update-only host path, reauth via the current API (stub surface includes async_update_reload_and_abort)
2026-10-09 07:03:33 +01:00
James Mackay
bcb8b962e7
fix: the deprecated listener+reload combo is gone — reauth uses async_update_reload_and_abort(_get_reauth_entry()), zeroconf host update is update-only, the __init__ options-reload listener is removed (grep-pinned); host-change tests assert update-without-reload (t29 G3a)
2026-10-09 07:02:21 +01:00
James Mackay
3e0208789a
feat: adb_command is a conforming action — always registered in async_setup (option gates USE), services.yaml with required command/entity, strings services+exceptions, ServiceValidationError on empty/unknown-target/ADB-down; participant registry stays (t29 G8)
2026-10-09 06:59:44 +01:00
James Mackay
9b3142874f
fix(connection,adb_client): the logcat stream survives quiet windows — transport_timeout_s=None (bulk_read blocks quiet gaps; the ladder + async_stop remain recovery/cleanup), 3-line parse buffer for wrapped cmp records, public poller config accessor replaces the private reach-ins (t27 F-NEW1..3)
2026-10-09 06:20:38 +01:00
James Mackay
27715f6932
test(media_player): MAC-collision pre-check migration branches — occupied MAC falls back to the entry id, free MAC taken (t26 F4)
2026-10-09 06:13:06 +01:00
James Mackay
2e63135745
test(media_player): spied sleep proves a non-default digit delay (0.3 s) reaches the channel sequence — option consumed per digit (t26 F3)
2026-10-09 06:11:28 +01:00
James Mackay
67174b8536
test(connection): drain beats before label-fetch asserts; label-less negative cache costs one pm dump ever + shlex-quote shape pinned (t26 F1,F2)
2026-10-09 06:10:27 +01:00
James Mackay
f863496ce5
test(media_session,connection): logcat START parsing (cmp=, wrapped records, null/non-START ignored, u-prefixes), instant stamp + notify, duplicate START suppression, 5-in-10-min auto-disable, OFF = no stream task, stream never touches the poller socket (P5-3)
2026-10-09 06:06:10 +01:00
James Mackay
0ecee66953
test(entity_stublib): ConfigFlow stub accepts the domain= __init_subclass__ kwarg and load_entity_modules drops config_flow (per-file loader ownership preserved) (completes P5-2 test scaffolding)
2026-10-09 06:00:20 +01:00
James Mackay
a3b397920e
test(config_flow,media_player,remote): digit-delay/send-enter options (store + window/error validation), IME-first text entry with ADB fallback tier, icon column parse/prefill/store (P5-2)
2026-10-09 06:00:17 +01:00
James Mackay
c57a2e2ff2
test(ha_adb_common,connection): application-label tolerance (dual quotes, empty multi-label blocks, null, absent) + label cache reuse across cycles — no duplicate pm dump (P5-1)
2026-10-09 05:52:02 +01:00
James Mackay
2e6dfd8981
test(media_player): entity tier serves below map/manifest per the P5-1 resolution ruling (was map-beats-entity contradiction)
2026-10-09 05:49:18 +01:00
James Mackay
f03ef1f531
fix(config_flow): per-host zeroconf updates — blank auto-detect hosts self-heal from the discovery address, a deliberately-different ADB host is never clobbered, same-IP with both hosts current is a no-op (F2)
2026-10-08 11:22:04 +01:00
James Mackay
b37a14b920
fix(media_player): the adb_command participant registry key is computed once at registration and stored on the entity — add/remove always match (F4)
2026-10-08 11:21:09 +01:00
James Mackay
326f02cb59
feat(media_player): BrowseMedia app directory — root lists the options apps map (curated TiviMate/Wholphin/Netflix/YouTube fallback), selection launches via play_media(app) (P4-2c)
2026-10-08 11:12:37 +01:00
James Mackay
f4d750ff92
test(config_flow): zeroconf discovery (pre-fill, no-host abort, IP-change host update, same-IP skip) + apps map editor (store/parse/clear/prefill) + app_name map resolution tiers (P4-1)
2026-10-08 11:03:28 +01:00
James Mackay
ce90f59f8e
fix(config_flow): no_state_source fires only when none of the three sources is present — ADB-only standalone is valid; strings/docs name all three (F2)
2026-10-08 10:52:44 +01:00
James Mackay
3b8e97fe5b
fix(media_player): privacy bare-app identity outranks the channel-title fallback in the foreground tier (F3)
2026-10-08 10:52:24 +01:00
James Mackay
392553ee26
fix(media_player): channel-title fallback gated to the channel app (TIVIMATE_PACKAGE or audio_playback membership) — launcher never shows a channel number (F1)
2026-10-08 10:52:08 +01:00
James Mackay
bc457baae7
feat(media_player): foreground tier in the state ladder with app-source now-playing (last-known → last_channel → audio hint), sensor reads the store's foreground priority chain (P3-3a,c)
2026-10-08 10:45:58 +01:00
James Mackay
1f0a4b2021
feat(running_apps): media_dag_running_apps enrichment — TTL-capped last_known_state/last_known_title for apps without a live session (P3-3b)
2026-10-08 10:42:41 +01:00
James Mackay
bb2f787fcd
test(ha_adb_common): fixture-driven foreground-parser tests — TiviMate capture, R4 launcher, wrap join, topResumed fallback ordering, duplicates tolerated (P3-2a)
2026-10-08 10:39:43 +01:00
James Mackay
8885ddd5b5
feat(connection): ADB foreground fallback on the watchdog cadence when the protocol push is silent (store priority protocol > ADB); audio-playback hint filtered through SYSTEM_MEDIA_PACKAGES (P3-2b,c)
2026-10-08 10:33:38 +01:00
James Mackay
34d09e9f70
feat(media_player): app_id/app_name prefer the androidtv entity, fall back to the protocol current_app push when absent/unavailable; manifest androidtvremote2 floor aligned to >=0.2.0 (P3-1b,c)
2026-10-08 10:28:56 +01:00
James Mackay
d35b61078d
feat(config_flow): standalone setup — androidtv entity optional with no_state_source validation, entry data omits the field for standalone entries, sensor tolerates its absence; migration keeps v1 field / v2 absence valid (P3-1a,d)
2026-10-08 10:28:56 +01:00
James Mackay
5f8c3290cc
fix: flow VERSION=2 for new entries; optional ENTER gains the ADB keyevent-66 fallback; CI installs androidtvremote2 for the real-library tests (F4, F5, F6)
2026-10-08 10:12:12 +01:00
James Mackay
8462ad494c
fix(connection): ADB outage clears only ADB-derived store fields — protocol push truth survives by TTL (F2)
2026-10-08 10:03:27 +01:00
James Mackay
b451638c65
test: command-routing and play_media(channel) orchestration — digit sequence with cancel guard, fallback ordering protocol→ADB→legacy, remote send_command holds/repeats, volume readout, is_on ladder
2026-10-08 09:54:23 +01:00
James Mackay
906126b0da
test(config_flow): protocol cert/PIN pairing, reauth-after-hard-reset, and v1→v2 entry migration (scoped stubs, deterministic PIN/MAC fake client)
2026-10-08 09:36:17 +01:00
James Mackay
e37a3be75f
feat(const): protocol config keys + ports; connection manager generates missing certs before protocol start
2026-10-08 09:30:50 +01:00
James Mackay
9a1e1300dd
test(connection): protocol-transport unit tests — push wiring, InvalidAuth reauth hook, lib-owned keep_reconnecting lifecycle, passive paths, volume normalization
2026-10-08 09:27:38 +01:00
James Mackay
d07820cde8
test: sound backoff-jitter assertions (per-delay band + non-overlapping growth) and scoped import-stub teardown in the pairing regression tests (F5 residual)
2026-10-08 09:19:20 +01:00
James Mackay
9c409b3805
fix(connection): reconnect decision closes the failed socket (health_check's documented role) + symmetric backoff-bound test assertion (F3, F5)
2026-10-08 09:13:51 +01:00
James Mackay
24981d84a8
fix(config_flow): pairing step passes test_connect's declared signature (host, port, key_path) — regression tests cover the adb_pair submit path (F1)
2026-10-08 09:13:51 +01:00
James Mackay
ec2db2ae58
test(connection): manager unit tests with a fake poller — connect/reconnect backoff, TTL expiry, listeners, lifecycle
2026-10-08 08:58:00 +01:00
James Mackay
a72cf57494
test: poll_running_apps parsing against SYNTHETIC activity-recents fixture (A= and I= patterns; real R6 capture still outstanding)
2026-10-08 08:43:23 +01:00
James Mackay
b91a4242ba
feat(adb_client): exact-value mWakefulness= parse (R5), health_check(), optional media-session truncation (B4); wakefulness fixtures + tests
2026-10-08 08:41:21 +01:00
James Mackay
8f27618e3d
feat(media_session): parse PlaybackState position/speed/updated (uptime-ms) + parse_audio_playback section (MVP plan Phase 1, R9/R2)
2026-10-08 08:38:35 +01:00
James Mackay
a2f1948a88
test: add firmware capture fixtures and stdlib-level unit tests for parsers, intents, running apps
2026-10-08 07:37:34 +01:00