Skip to content

Refactor EntityPicker to use EntityDisplayState#7152

Open
TimoPtr wants to merge 3 commits into
feature/ha_search_fieldfrom
feature/entity_picker_with_use_case
Open

Refactor EntityPicker to use EntityDisplayState#7152
TimoPtr wants to merge 3 commits into
feature/ha_search_fieldfrom
feature/entity_picker_with_use_case

Conversation

@TimoPtr

@TimoPtr TimoPtr commented Jul 9, 2026

Copy link
Copy Markdown
Member

Summary

Updated the EntityPicker to use the use case to pull the data and avoid using the friendly name.

Checklist

  • New or updated tests have been added to cover the changes following the testing guidelines.
  • The code follows the project's code style and best_practices.
  • The changes have been thoroughly tested, and edge cases have been considered.
  • Changes are backward compatible whenever feasible. Any breaking changes are documented in the changelog for users and/or in the code for developers depending on the relevance.

Screenshots

See in the PR

Any other notes

Based on #7151

Copilot AI review requested due to automatic review settings July 9, 2026 14:38
@TimoPtr TimoPtr requested a review from jpelgrom July 9, 2026 14:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds websocket support for Home Assistant’s floor registry and the bandwidth-efficient entity registry “list_for_display” endpoint, then introduces a GetEntitiesForDisplayUseCase to resolve display-ready entity metadata (name/icon/area/device/floor/etc.) based on server capabilities. It migrates EntityPicker (and several callers) to consume this resolved display model and adds a reusable debounced HASearchField.

Changes:

  • Add websocket repository APIs + DTOs for config/entity_registry/list_for_display and config/floor_registry/list
  • Introduce GetEntitiesForDisplayUseCase + EntityDisplayItem/State to unify entity display resolution across features
  • Update EntityPicker UI/state/search, and migrate Todo widget / QS tiles / shortcuts / vehicle & wear favorites to the new display model (plus add unit + screenshot tests)

Reviewed changes

Copilot reviewed 35 out of 47 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
common/src/main/kotlin/io/homeassistant/companion/android/common/data/websocket/WebSocketRepository.kt Add APIs for entity registry display + floor registry
common/src/main/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/WebSocketRepositoryImpl.kt Implement the new websocket commands
common/src/main/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/entities/EntityRegistryDisplayResponse.kt Add DTOs for list_for_display response (abbreviated keys)
common/src/main/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/entities/FloorRegistryResponse.kt Add DTO for floor registry
common/src/main/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/entities/AreaRegistryResponse.kt Add floorId to areas (server ≥ 2024.3)
common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/display/GetEntitiesForDisplayUseCase.kt New use case to resolve display metadata using registries and server version gates
common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/display/EntityDisplayItem.kt New display model used by picker/favorites, incl. subtitle formatting
common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/display/EntityDisplayState.kt New Loading/Error/Loaded state wrapper for display resolution
common/src/main/kotlin/io/homeassistant/companion/android/common/data/HomeAssistantVersion.kt Add isAtLeast(HomeAssistantVersion) helper
common/src/main/kotlin/io/homeassistant/companion/android/common/compose/composable/HASearchField.kt New reusable debounced search field + state holder
common/src/main/kotlin/io/homeassistant/companion/android/common/compose/composable/HAModalBottomSheet.kt Add consumeSheetScrollFling() helper modifier for bottom sheet content
common/src/main/res/values/strings.xml Add entity picker load-failure string
common/src/test/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/WebSocketRepositoryImplTest.kt Add tests for new websocket commands being sent/decoded
common/src/test/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/entities/EntityRegistryDisplayResponseTest.kt Add decoding tests for display registry response
common/src/test/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/entities/FloorRegistryResponseTest.kt Add decoding tests for floor registry (+ area floor_id)
common/src/test/kotlin/io/homeassistant/companion/android/common/data/integration/display/GetEntitiesForDisplayUseCaseTest.kt Comprehensive tests for version gating, fallbacks, and resolution logic
common/src/test/kotlin/io/homeassistant/companion/android/common/compose/composable/HASearchFieldTest.kt Robolectric Compose tests for debounce/clear behavior
common/src/screenshotTest/kotlin/io/homeassistant/companion/android/compose/composable/HASearchFieldScreenshotTest.kt Screenshot coverage for search field variants
app/src/main/kotlin/io/homeassistant/companion/android/util/compose/entity/EntityPicker.kt Migrate picker to EntityDisplayState, add loading/error UI, use HASearchField, introduce metadata-free fallback builder
app/src/main/kotlin/io/homeassistant/companion/android/util/compose/entity/EntityPickerFilter.kt Update filtering to operate on EntityDisplayItem
app/src/main/kotlin/io/homeassistant/companion/android/util/compose/entity/EntityPickerState.kt New picker UI state holder (expansion + search + dispatcher)
app/src/main/kotlin/io/homeassistant/companion/android/util/compose/FavoriteEntityRow.kt Migrate favorites row to EntityDisplayItem (icon/name/subtitle)
app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureViewModel.kt Use GetEntitiesForDisplayUseCase for Todo list entity selection
app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt Update configure UI to pass EntityDisplayState into picker
app/src/main/kotlin/io/homeassistant/companion/android/settings/qs/views/ManageTilesView.kt Update tile entity selection to use new picker contract
app/src/main/kotlin/io/homeassistant/companion/android/settings/qs/ManageTilesViewModel.kt Resolve tile-eligible entities via GetEntitiesForDisplayUseCase
app/src/main/kotlin/io/homeassistant/companion/android/settings/shortcuts/legacy/views/ManageShortcutsView.kt Update shortcut entity picker usage
app/src/main/kotlin/io/homeassistant/companion/android/settings/shortcuts/legacy/ManageShortcutsViewModel.kt Resolve entities via GetEntitiesForDisplayUseCase
app/src/main/kotlin/io/homeassistant/companion/android/settings/vehicle/views/AndroidAutoFavoritesView.kt Migrate favorites UI + picker to EntityDisplayState/EntityDisplayItem
app/src/main/kotlin/io/homeassistant/companion/android/settings/vehicle/ManageAndroidAutoViewModel.kt Resolve vehicle entities via GetEntitiesForDisplayUseCase
app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearFavoritesView.kt Use metadata-free EntityDisplayItem builder (no websocket access on wear settings path)
app/src/debug/kotlin/io/homeassistant/companion/android/developer/catalog/HAUserInputScreen.kt Update catalog samples for picker + add search field example
app/src/test/kotlin/io/homeassistant/companion/android/util/compose/entity/EntityPickerTest.kt Update picker tests for loading/error states and new API
app/src/test/kotlin/io/homeassistant/companion/android/util/compose/entity/EntityPickerFilterTest.kt Update filter tests for EntityDisplayItem
app/src/screenshotTest/kotlin/io/homeassistant/companion/android/util/compose/entity/EntityPickerScreenshotTest.kt Update/add screenshot previews for loading/loaded picker states

@TimoPtr TimoPtr changed the title Add Floor registry and list for display registry endpoints Refactor EntityPicker to use EntityForDisplay logic Jul 9, 2026
@TimoPtr TimoPtr changed the base branch from main to feature/ha_search_field July 9, 2026 14:49
@TimoPtr TimoPtr changed the title Refactor EntityPicker to use EntityForDisplay logic Refactor EntityPicker to use EntitDisplayState Jul 9, 2026
@jpelgrom jpelgrom changed the title Refactor EntityPicker to use EntitDisplayState Refactor EntityPicker to use EntityDisplayState Jul 9, 2026
@TimoPtr TimoPtr linked an issue Jul 13, 2026 that may be closed by this pull request
@TimoPtr TimoPtr force-pushed the feature/ha_search_field branch from ae1eaca to 048ca8d Compare July 15, 2026 09:48
@TimoPtr TimoPtr force-pushed the feature/entity_picker_with_use_case branch from fd24e5c to c3fe978 Compare July 15, 2026 09:49
@TimoPtr TimoPtr force-pushed the feature/ha_search_field branch from 048ca8d to 8e2d83b Compare July 16, 2026 06:41
@TimoPtr TimoPtr force-pushed the feature/entity_picker_with_use_case branch from c3fe978 to 17c3278 Compare July 16, 2026 06:41
@TimoPtr TimoPtr force-pushed the feature/ha_search_field branch from 8e2d83b to 85fa87a Compare July 16, 2026 08:00
@TimoPtr TimoPtr force-pushed the feature/entity_picker_with_use_case branch from 17c3278 to db73a3e Compare July 16, 2026 08:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Use new entity display within the entity picker

3 participants