home-assistant/android
57.8
Adequate · 28 September 2026
103.9k
lines of production code
Kotlin
primary language
2
measurements over time
What this system is
This system is the official Android client for Home Assistant, serving as a comprehensive interface for controlling smart home devices across standard Android, Wear OS, and Android Automotive platforms. It provides a modern, Compose-based user experience that integrates directly with the Home Assistant frontend via a secure external bus, enabling real-time control, media playback, and native device management. The application supports a wide range of connectivity and automation features, including Matter and Thread device commissioning, NFC tag interactions, local network server discovery, and on-device voice assistant capabilities with wake word detection. Additionally, it offers robust background services for location tracking and WebSocket connectivity, along with home screen widgets and quick settings tiles for persistent access to home state.
How it got here
2019–2025 — Android app modernization and feature expansion
127 changes.
The project underwent a comprehensive modernization of its Android application, migrating the codebase from Java to Kotlin and replacing legacy XML interfaces with Jetpack Compose. This period saw the introduction of new capabilities including Matter and Thread device support, NFC tag handling, and an expanded suite of home screen widgets, alongside a complete overhaul of the onboarding and settings architectures.
2026 — Frontend migration and Assist integration
84 changes.
The project replaced the legacy WebViewActivity with a new Jetpack Compose-based FrontendScreen, establishing a robust external bus protocol for typed communication with the Home Assistant web interface. This period also introduced comprehensive native Assist voice interaction services with on-device wake word detection, alongside extensive support for Matter, Thread, and Improv device onboarding flows.
Features
Add Android Auto favorites management screen
A new settings screen for managing Android Auto favorites has been added, allowing users to select and reorder specific Home Assistant entities to appear in their vehicle's interface. The implementation includes a new Fragment and ViewModel that integrate with the existing server and entity display managers to load and persist favorite configurations, with the UI title dynamically adjusting based on whether the device is running Android Automotive OS or standard Android Auto.
app/src/main/kotlin/io/homeassistant/companion/android/settings/vehicle, app/src/main/kotlin/io/homeassistant/companion/android/settings/vehicle/views · high confidence
Add Assist settings for wake word configuration
Users can now configure wake word detection directly within the app's Assist settings. This change introduces a new settings screen that allows enabling or disabling wake word detection, selecting from available wake word models, and testing the wake word functionality. The implementation includes a new AssistConfigManager to handle model selection and persistence, a DefaultAssistantManager to manage default assistant status and intents, and a Compose-based UI for managing these preferences.
app/src/main/kotlin/io/homeassistant/companion/android/settings/assist · high confidence
Add Assist shortcut creation widget
Users can now create shortcuts that launch the Assist voice interface directly from the home screen. This change introduces a new AssistShortcutActivity, ViewModel, and Compose UI that allows users to name the shortcut, select a specific Home Assistant server and pipeline, and toggle whether the assistant starts listening immediately upon activation.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/assist · high confidence
Add Compose-based settings UI components
New Compose UI components have been added to the settings views module to support the migration from Java to Kotlin. This includes an EmptyState composable for displaying empty states with icons and text, a SettingsRow composable for clickable list items with optional MDI icons and secondary text, and a SettingsSubheader composable for section headers with configurable padding. These components utilize the new mdi-icons library for icon rendering and follow Material Design guidelines for spacing and typography.
app/src/main/kotlin/io/homeassistant/companion/android/settings/views · high confidence
Add Improv Wi-Fi onboarding for BLE devices in the Android app
The Android app now supports onboarding Improv-compatible Wi-Fi devices via Bluetooth Low Energy (BLE). This change introduces a new onboarding flow within the FrontendScreen that allows users to scan for nearby Improv devices, select one, and submit Wi-Fi credentials to provision it. The implementation includes a repository layer handling BLE scanning and the Improv protocol handshake, a state machine for managing the onboarding UI states (searching, configuring, provisioning, success, error), and integration with the Home Assistant external bus to report device discovery and setup completion. The feature gracefully handles devices without Bluetooth adapters and manages runtime permissions for location and Bluetooth access.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/improv · high confidence
Add Matter commissioning and Thread credential export flows to the frontend
The frontend screen now supports initiating Matter device commissioning and Thread network credential export. A new handler coordinates these flows, managing state during Play Services intent round-trips and displaying appropriate progress indicators or terminal dialogs (such as 'no dataset' or 'not connected') based on the outcome. Users can now commission Matter devices and share Thread credentials directly from the frontend interface, with error feedback routed through snackbar notifications or informational alerts.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/matterthread · high confidence
Add Todo widget to the widget management screen
The ManageWidgetsView now includes support for the new Todo widget. Users can add Todo widgets alongside existing Button, Camera, State, Media, and Template widgets via the 'Add Widget' dialog, and manage them in the main list. The view also imports the mdi-icons library for consistent iconography across the widget types.
app/src/main/kotlin/io/homeassistant/companion/android/settings/widgets/views · high confidence
Add WebsocketSettingView Composable for WebSocket configuration
The WebSocket settings screen now uses a new Compose-based UI component (WebsocketSettingView) to present connection options. This view allows users to select when the WebSocket connection should be active (Never, Home Wi-Fi, Screen On, or Always) and conditionally displays a warning if unrestricted background access is not granted, as well as an informational notification about the persistent notification channel on Android O+ non-television devices.
app/src/main/kotlin/io/homeassistant/companion/android/settings/websocket/views · high confidence
Add location sharing setup screen to onboarding flow
Users are now presented with a dedicated screen during onboarding to enable or disable location sharing. This new UI allows users to grant location permissions and configure battery optimization settings, which triggers the enabling of background, zone, and single-accurate location sensors for the selected server via the new SensorRepository.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/locationsharing · high confidence
Add settings to split device controls into multiple structures for multiple servers
Users can now configure Android device controls to be organized into separate structures when managing multiple Home Assistant servers. This change introduces a new settings fragment and view model that allow enabling this structure-splitting behavior, selecting a default server, and configuring authentication requirements per entity across different servers.
app/src/main/kotlin/io/homeassistant/companion/android/settings/controls · high confidence
Added Material Design Icons ID mapping data
The application now includes a new \mdi\_id\_map.json\ asset file that maps Material Design Icon names to their corresponding numeric IDs. This data resource supports the icon system used throughout the app's user interface.
app/src/main/assets · high confidence
Added WearDnsRequestListener for Wear device DNS resolution
A new WearDnsRequestListener service has been added to the data layer to handle DNS lookup requests originating from Wear OS devices. This component listens for specific Wearable API paths, decodes hostname requests, performs DNS resolution using the system DNS, and returns the results back to the requesting node, enabling proper network connectivity for Wear apps that require domain name resolution.
app/src/full/kotlin/io/homeassistant/companion/android/data · high confidence
Android 14 device controls panel now supports multiple Home Assistant servers
The device controls panel (HaControlsPanelActivity) and the underlying controls provider service now support splitting device controls into multiple structures when multiple Home Assistant servers are configured. This is controlled by a new setting that allows users to organize controls by server name, improving usability in multi-server setups. The implementation introduces a new HaControlInfo data class to carry server context and updates the control creation logic to group controls by server when the setting is enabled.
app/src/main/kotlin/io/homeassistant/companion/android/controls · high confidence
Developer settings now support Thread debugging and WebView cache clearing
The Developer Settings screen has been refactored to include new troubleshooting capabilities for Matter/Thread devices and WebView management. Users can now initiate Thread dataset synchronization between the app and a server, handling permission requests and displaying detailed results for various sync states (e.g., server unsupported, credentials mismatch, or successful update). Additionally, a new option allows users to clear the WebView cache, with the feature automatically hidden on Android versions that do not support the underlying API. The settings UI also now applies bottom safe drawing insets for better visual alignment on edge-to-edge displays.
app/src/main/kotlin/io/homeassistant/companion/android/settings/developer · high confidence
Introduce ThreadManager interface and Hilt binding for Thread credential management
The app now exposes a dedicated \ThreadManager\ interface within the \thread\ package to handle Thread network credential synchronization between the device and Home Assistant server. This interface defines a structured \SyncResult\ hierarchy (including \ExportResult\ and \AllHaveCredentials\ states) to clearly distinguish between export-only operations, full bidirectional syncs, and various support/unavailability scenarios (e.g., unsupported app/server, not connected, no credentials). A corresponding \ThreadModule\ registers this manager via Hilt dependency injection, making the Thread credential management capabilities available to other parts of the application.
app/src/main/kotlin/io/homeassistant/companion/android/thread · high confidence
Introduce new Compose utility components and navigation infrastructure
This change adds a suite of new Compose UI utilities and navigation scaffolding to the app. It introduces reusable components such as ExposedDropdownMenu for selection lists, FavoriteEntityRow for entity management, and various alert/notification dialogs (HaAlert, MdcAlertDialog, InfoNotification). It also establishes the core navigation structure via HAApp and HANavHost, which handle the main app layout, snackbar integration, and routing for onboarding, frontend, and settings screens. Additional utilities include Glance extensions for widget actions, HTML text parsing, location permission handling, and window size calculations.
app/src/main/kotlin/io/homeassistant/companion/android/util/compose · high confidence
Introduce on-device MicroWakeWord engine with hardware-agnostic audio processing
The microwakeword module now includes a native C++ implementation of the wake-word detection engine, built on TFLite Micro and a custom audio frontend that matches the ESPHome microWakeWord component. This change removes the previous hardware limitation, allowing the wake-word detection to run on any Android device without requiring specific hardware constraints. The module includes instrumented tests to validate engine initialization with valid and invalid model buffers, parameter ranges, and buffer types, ensuring robust error handling for edge cases.
microwakeword · high confidence
Introduces KSP-based sensor registration processor
Adds a new Kotlin Symbol Processing (KSP) module that automatically generates a Hilt-compatible module containing all sensors annotated with @ProvidesSensor. The processor scans for these annotations on top-level, object, or companion-object properties of type SensorManager.BasicSensor, validates their referenceability, and outputs a generated object exposing the collected sensors as a Set. This change also includes the necessary KSP provider registration, dependency locking, and a detekt baseline to manage static analysis findings for the new processor code.
provides-sensor-processor · high confidence
Native Improv Wi-Fi onboarding UI
The app now includes a native Compose-based bottom sheet for the Improv Wi-Fi device onboarding flow, replacing the previous implementation. This new UI handles the full lifecycle of device configuration, including a permission rationale screen for Bluetooth and location, a Wi-Fi credential input form, and visual states for searching, provisioning, errors, and success. The overlay is integrated into the FrontendScreen to appear on top of the WebView when an improv/configure\_device flow is triggered, providing a more modern and usable experience for connecting new devices.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/improv/ui · high confidence
New Assist voice interaction services and wake word detection
The app now includes a new set of Android voice interaction services (AssistRecognitionService, AssistVoiceInteractionService, AssistVoiceInteractionSessionService, and AssistVoiceInteractionSession) to handle system-level assistant integration, including lock screen and Bluetooth triggers. Additionally, a new wake word detection system has been implemented using the microWakeWord TFLite engine, allowing users to trigger the assistant via configurable wake words with background listening support.
app/src/main/kotlin/io/homeassistant/companion/android/assist/service · high confidence
New Button Widget with configurable actions and dynamic fields
Users can now add a Button Widget to their home screen that triggers specific Home Assistant actions. The widget configuration activity allows selecting a server, choosing an action, and defining dynamic fields (such as entity IDs) via text inputs. The widget supports optional authentication for sensitive actions, displays dynamic colors when available, and uses the mdi-icons library for icon rendering. It also includes background cleanup logic to remove database entries for widgets no longer present on the home screen.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/button · high confidence
New Camera Widget for live stream previews
Users can now add a Camera widget to their home screen to display live snapshots from Home Assistant camera entities. The widget fetches and displays the current image from the selected camera, handling connection states and server availability, and supports tap actions to either refresh the image or open the entity's detailed view in the app.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera · high confidence
New EntityPicker component with fuzzy search and adaptive UI
The app introduces a new EntityPicker composable that replaces the previous SingleEntityPicker. This component provides a fuzzy search experience with weighted scoring across entity names, device names, area names, and domains, allowing users to quickly find entities. The UI adapts to screen size, presenting a bottom sheet on compact phones and an inline dropdown on tablets. It also integrates with the new EntityDisplayState for resolving display metadata and uses the mdi-icons library for iconography.
app/src/main/kotlin/io/homeassistant/companion/android/util/compose/entity · high confidence
New FrontendScreen replaces WebViewActivity for Home Assistant web interface
The app introduces a new \FrontendScreen\ (and its supporting \FrontendViewModel\ and \FrontendViewState\) to replace the legacy \WebViewActivity\. This new screen is built with Jetpack Compose and integrates a comprehensive set of capabilities for the Home Assistant frontend, including HTTP Basic authentication via \FrontendHttpAuthHandler\, file uploads through \FileChooserManager\, gesture handling via \FrontendGestureManager\, and external bus communication through \FrontendJsBridge\ (supporting both V1 and V2 protocols). It also adds support for barcode scanning, ExoPlayer media playback, screen orientation locking, and improved lifecycle management for the WebView.
app/src/main/kotlin/io/homeassistant/companion/android/frontend · high confidence
New ManageControlsView for device control settings
A new Compose-based UI component, ManageControlsView, has been introduced to handle the configuration of device controls. This view allows users to toggle between standard and panel modes, manage entity selection with select-all/select-none actions, and configure server-specific structures when multiple Home Assistant servers are present. It integrates with the new EntitiesForDisplayManager to retrieve and display entities, replacing previous implementation approaches with a modern, state-driven interface.
app/src/main/kotlin/io/homeassistant/companion/android/settings/controls/views · high confidence
New NFC tag reading and writing capabilities
The app now supports scanning NFC tags to trigger Home Assistant events and writing new NFC tags directly from the interface. A new TagReaderActivity handles incoming NFC intents, allowing users to approve or auto-allow specific tag IDs before they are scanned across registered servers. Additionally, the NfcSetupActivity and NFCUtil provide a workflow for creating and writing NDEF messages to blank or existing tags, including support for simple write modes initiated from the frontend.
app/src/main/kotlin/io/homeassistant/companion/android/nfc · high confidence
New Quick Settings tile infrastructure and configuration UI
The app introduces a new system for Android Quick Settings tiles, adding dedicated service classes for tiles 1 through 40 (Tile1Service through Tile40Service) that extend a common TileExtensions base. This base class handles tile lifecycle, state updates, and icon rendering using the mdi-icons library and Timber for logging. A new TilePreferenceActivity has been added to manage tile configuration, allowing users to long-press a tile to access its settings or entity details via the new FrontendTarget navigation system.
app/src/main/kotlin/io/homeassistant/companion/android/qs · high confidence
New Wear OS mTLS certificate onboarding screen
A new onboarding flow for Wear OS devices has been added to guide users through setting up mutual TLS (mTLS) authentication. This includes a new UI screen (WearMTLSScreen) that allows users to select a PKCS12 certificate file and enter its password, with real-time validation of the certificate's integrity and password correctness. The feature includes a ViewModel (WearMTLSViewModel) to handle the asynchronous loading and verification of the keystore, and navigation support (WearMTLSNavigation) to integrate this screen into the app's onboarding sequence.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/wearmtls · high confidence
New centralized frontend message handler and 'Add To' entity actions
The app introduces a new \FrontendMessageHandler\ in the frontend handler package to centralize communication with the Home Assistant frontend via the external bus, replacing scattered logic with a unified event stream (\FrontendHandlerEvent\). This handler now supports a wider range of frontend requests, including NFC tag writing, barcode scanning, Improv Wi-Fi provisioning, Matter/Thread commissioning, ExoPlayer media control, and haptic feedback. Additionally, a new 'Add To' feature allows users to add Home Assistant entities to Android platform features like widgets, shortcuts, Android Auto favorites, and Wear OS watch favorites, managed by the new \FrontendEntityAddToManager\.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/handler · high confidence
New changelog screen with platform-specific release notes
A new changelog screen has been added to the app, allowing users to view release notes for the current version. The screen displays changes categorized as New, Improved, or Fixed, and filters entries to show only those relevant to the current platform (App, Automotive, or Wear OS). Users can tap on specific entries to take actions such as opening settings, configuring widgets, or launching Assist. The changelog is automatically shown after an app update if the user has enabled the changelog popup, and it can also be accessed manually from the settings.
app/src/main/kotlin/io/homeassistant/companion/android/changelog · high confidence
New debug developer tools and design system catalog
The debug build now includes a Dev Playground activity that provides quick access to testing features like the ExoPlayer demo, NFC tag emulator, and wake word detection, alongside a crash button for testing error handling. Additionally, a new HA Compose Catalog activity has been added to visually preview and test the app's design system components, including buttons, indicators, user input fields, banners, and text styles.
app/src/debug/kotlin · high confidence
New debug tools for NFC tag emulation and development
The debug build now includes a Dev Playground and specific developer utilities, most notably a Debug NFC Tag Emulator. This feature allows developers to simulate a writable NFC Forum Type 4 Tag using Host Card Emulation (HCE), enabling testing of NFC interactions without physical hardware. The emulator is registered in the debug manifest with the necessary NFC permissions and intent filters, and its state is managed in-memory to support reading and writing NDEF records for debugging purposes.
app/src/debug · high confidence
New dedicated invitation screen for onboarding
The onboarding flow now includes a specific screen for handling server invitations. Users receiving an invitation will see a dedicated interface displaying the server URL (which can be tapped to copy to the clipboard) and options to accept or reject the invitation, distinct from the standard welcome screen used for new connections.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/welcome · high confidence
New device naming screen in onboarding flow
The onboarding process now includes a dedicated step where users can name their device before completing the server connection. This new screen allows users to edit the default device name (derived from the device model) and provides a save button that registers the device with the Home Assistant server. If the registration fails, the user is shown an error message and returned to the previous step, ensuring a clean state for retry.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice · high confidence
New download manager for WebView file downloads
The app now includes a dedicated FrontendDownloadManager to handle file downloads initiated within the WebView. This component supports four URI schemes: it delegates HTTP/HTTPS requests to the system DownloadManager with proper authentication headers, saves data URIs directly to the Downloads directory, and handles blob downloads by injecting JavaScript to read the blob and sending the data back via the external bus. Unsupported URI schemes are forwarded to the system for external handling, ensuring a consistent download experience for users.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/download · high confidence
New gesture configuration screen in settings
A new GesturesFragment and associated Compose UI components have been added to the app's settings, allowing users to view and configure actions for supported gestures. The screen displays a list of gestures grouped by direction, and tapping a gesture navigates to a detail view where the user can select a specific action from a categorized list, with changes persisted via the preferences repository.
app/src/main/kotlin/io/homeassistant/companion/android/settings/gestures · high confidence
New gesture handling system for the frontend webview
The app now supports configurable swipe gestures within the frontend webview, allowing users to trigger actions like opening the sidebar, navigating to the default dashboard, opening the quick bar, switching servers, or opening the current page in an external browser. This is implemented via a new FrontendGestureManager that resolves user preferences to specific actions and communicates with the frontend via JavaScript events or internal navigation results.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/gesture · high confidence
New local network server discovery screen with mDNS and Android 17 permission handling
The app now includes a dedicated server discovery screen that uses mDNS (DNS-SD) to automatically find Home Assistant instances on the local network. This feature introduces a new searcher component that resolves service info to extract the server URL and version, and a UI screen that manages the discovery state (Started, NoServerFound, ServerDiscovered, ServersDiscovered). On Android 17 (API 37) and above, the screen explicitly requests the ACCESS\_LOCAL\_NETWORK permission before starting discovery, ensuring network access is granted. The discovery process respects existing server configurations by optionally hiding already-added servers, and handles timeouts if no server is found within 5 seconds.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/serverdiscovery · high confidence
New location history tracking view in developer settings
A new Compose-based UI component, LocationTrackingView, has been added to the developer settings location views. This screen allows users to toggle location history usage and view a paginated list of historical location events, including details on when they were triggered and whether they were successfully sent to the server. The view utilizes the mdi-icons library for its icons and implements an expandable row layout for individual history items.
app/src/main/kotlin/io/homeassistant/companion/android/settings/developer/location/views · high confidence
New location tracking history settings screen
A new settings screen has been added to the Developer options, allowing users to view and filter their device's location tracking history. This feature lets users enable or disable location history logging and inspect past location updates with filters for sent, skipped, or failed transmissions.
app/src/main/kotlin/io/homeassistant/companion/android/settings/developer/location · high confidence
New manual server configuration screen in onboarding
A new screen has been added to the onboarding flow allowing users to manually enter and validate a Home Assistant server URL. The implementation includes a dedicated ViewModel that performs strict validation using both Android's URLUtil and Java's URL class, ensuring the input is a well-formed URI before enabling the connect button. The UI features a text field with autocorrect disabled to prevent keyboard interference with hostnames, a clear button for quick input removal, and uses Material Design Icons for the close icon.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/manualserver · high confidence
New native barcode scanner overlay in the frontend screen
The app now includes a native barcode scanning capability within the FrontendScreen, replacing the previous WebView-based implementation. This change introduces a dedicated UI state model and a handler that bridges the scanner to the frontend via the external bus protocol, allowing the frontend to request scans, receive results (mapped from ZXing formats to wire strings), and manage the scanner lifecycle. The UI component provides a full-screen camera preview with a cutout overlay, flashlight toggle, and permission handling, ensuring a consistent and performant scanning experience without relying on the web view.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/barcode · high confidence
New notification settings screens with Compose and history management
The notification settings area now includes dedicated screens for managing notification channels and viewing notification history. Users can configure notification channels via a new Compose-based interface that allows creating, editing, and deleting channels. A new notification history screen displays recent notifications with support for filtering by count (last 25, 50, or 100) and searching through message content. Tapping a notification in the history opens a detail view where individual notifications can be deleted. These screens replace the previous implementation and provide a more modern UI experience with better integration into the app's navigation.
app/src/main/kotlin/io/homeassistant/companion/android/settings/notification · high confidence
New onboarding screen for configuring connection security levels
Users can now explicitly choose between 'Most Secure' and 'Less Secure' connection settings during the onboarding flow. This new screen allows users to decide whether to allow insecure (plain text) connections to their Home Assistant server, with the app automatically requesting location permissions to enforce the most secure option when possible. The feature includes a dedicated ViewModel for managing the server's connection state and navigation support within the onboarding process.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/locationforsecureconnection · high confidence
New onboarding screen for configuring home network connection details
The app now includes a dedicated step in the onboarding flow where users can specify their home network connection type. This new screen allows users to confirm or override the detected Wi-Fi SSID and explicitly select whether the connection uses Ethernet or a VPN. These settings are saved to the server configuration to help the app manage internal and external connectivity more accurately.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/sethomenetwork · high confidence
New settings navigation helper for deep linking
A new \SettingsNavigation\ utility has been added to the settings navigation package, providing a \navigateToSettings\ function that allows the app to launch the \SettingsActivity\ and optionally deep link to a specific settings screen via a \Deeplink\ parameter.
app/src/main/kotlin/io/homeassistant/companion/android/settings/navigation · high confidence
New static analysis rules enforce code correctness and safety
The project now includes a suite of custom Android Lint rules to catch common issues at compile time. These rules forbid the use of \@Named\ in favor of type-safe qualifiers, require \@ProvidesSensor\ on all \BasicSensor\ definitions to prevent them from disappearing, and enforce that Room DAO functions are suspending or return \Flow\/\PagingSource\. Additionally, the linter now flags direct reads of \Build.VERSION.SDK\_INT\ (requiring \SdkVersion\ instead), demands \@Serializable\ annotations on types passed to KotlinX Serialization, requires opt-in for \WebView.evaluateJavascript\ usage, and prevents mutable properties in Room entities.
lint · high confidence
New testing-unit module with Android test utilities and Wearable fakes
The new testing-unit module provides a collection of utilities for Android unit testing, including fakes for Google Play Services Wearable components (FakeCapabilityClient, FakeNodeClient, FakeTask) to simplify mocking, and helpers for JUnit 4 and JUnit 5 such as MainDispatcherJUnit4Rule and MainDispatcherJUnit5Extension to manage the Kotlin coroutines Main dispatcher. It also includes a TestSharedFlow wrapper to prevent deadlocks during emissions, a FakeClock for time-based tests, and a ConsoleLogPlatformListener that ensures Timber logs are visible on the console during test execution.
testing-unit · high confidence
New utility classes and extensions for edge-to-edge display, location warnings, and WebView handling
The app introduces a suite of new utility components in the \util\ package to improve user experience and stability. Edge-to-edge display support is enhanced via \ActivityExtensions\ and \InsetsUtil\, ensuring proper system bar handling across Android versions. A new \CheckLocationDisabledUseCase\ proactively notifies users when location services are off while features like SSID detection or location sensors are active. WebView interactions are improved with \HAWebChromeClient\ and \HAWebViewClient\, which handle permissions, file uploads, JavaScript confirmations, and map connection errors to user-friendly messages. Additional utilities include \DataUriDownloadManager\ for saving files from the web, \ForegroundServiceLauncher\ for robust service management, and \IgnoreViolationRules\ to suppress known strict-mode warnings on specific device manufacturers.
app/src/main/kotlin/io/homeassistant/companion/android/util · high confidence
New widget configuration and authentication infrastructure
This change introduces a new set of components in the widgets common module to support advanced widget configuration and security. It adds WidgetAuthenticationActivity to handle biometric authentication for widget actions, WidgetDynamicFieldAdapter to provide autocomplete suggestions for dynamic action fields (such as entity IDs), and supporting utilities like SingleItemArrayAdapter and WidgetUtils for managing background color options. These additions enable more secure and flexible widget setup experiences.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/common · high confidence
Support for frontend external bus haptic feedback and message models
The app now supports receiving haptic feedback requests from the Home Assistant frontend via the external bus. This change introduces the \HapticType\ sealed interface to map frontend haptic identifiers (such as success, warning, failure, light, medium, heavy, and selection) to Android haptic feedback, ensuring graceful handling of unknown types for forward compatibility. Additionally, it adds the foundational \IncomingExternalBusMessage\ sealed interface and specific message models (including \HapticMessage\, \ConnectionStatusMessage\, \FrontendLoaded\, \ConfigGetMessage\, \OpenSettingsMessage\, \OpenAssistSettingsMessage\, \ThemeUpdateMessage\, \OpenAssistMessage\, \TagWriteMessage\, \HandleBlobMessage\, and \ExoPlayerPlayHlsMessage\) to parse and handle various incoming external bus commands from the frontend.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/externalbus/incoming · high confidence
Thread network credential synchronization implementation
The app now implements logic to synchronize Thread network credentials between the device and Home Assistant servers. This includes exporting local device credentials to the server, importing preferred datasets from the server to the device, and resolving conflicts when both sources hold credentials by prioritizing the server's preferred dataset or deleting local credentials if they originate from other applications. The implementation uses Google Play Services Thread Network APIs and integrates with the server manager to update border agent IDs.
app/src/full/kotlin/io/homeassistant/companion/android/thread · high confidence
Wear OS onboarding now sends Home Assistant instance details via Wearable API
A new WearOnboardingListener service has been added to the onboarding module to handle communication with Wear OS devices. When a wear device requests the Home Assistant instance information, this listener retrieves the current server's external URL and sends it back via the Wearable Data Layer. This enables the Wear OS companion app to automatically configure the connection to the phone's Home Assistant instance during the onboarding process.
app/src/full/kotlin/io/homeassistant/companion/android/onboarding · high confidence
Removals
Removal of legacy Android app components
The legacy Android application entry points, specifically MainActivity and MessagingService, have been removed from the codebase. This eliminates the previous implementation that displayed the Home Assistant demo site in a WebView and handled Firebase Cloud Messaging notifications via the deprecated FirebaseInstanceId API.
app/src/main/java · high confidence
Architecture
Added Detekt static analysis baselines and Gradle dependency locking
The app module now includes Detekt static analysis baselines for both full and minimal release builds, suppressing known code smells such as complex conditions, cyclomatic complexity, and long methods to allow the linter to pass without blocking development. Additionally, a Gradle dependency lockfile has been introduced to ensure reproducible builds by pinning the exact versions of all resolved dependencies.
app · high confidence
Introduce Android build convention plugins
This change introduces a new set of Gradle convention plugins in the \build-logic/convention\ module to centralize and standardize Android build configurations across application and library modules. The new plugins (\AndroidApplicationConventionPlugin\, \AndroidCommonConventionPlugin\, \AndroidComposeConventionPlugin\, \AndroidApplicationDependenciesConventionPlugin\, and \AndroidFullMinimalFlavorConventionPlugin\) automate the setup of common dependencies, KSP arguments, lint rules, test options (including Robolectric and screenshot testing configurations), and product flavor dimensions (\full\ and \minimal\). This reduces duplication in individual module \build.gradle\ files and ensures consistent build behavior, such as applying specific JVM arguments for tests and configuring signing for release builds.
build-logic/convention · high confidence
Behavioural changes
Android Automotive OS interface rewritten in Kotlin with new error handling and driving-optimized UI
The Android Automotive OS (AAOS) interface has been completely rewritten in Kotlin, replacing the previous Java implementation. This update introduces a dedicated connection error screen that appears when the Home Assistant server is unreachable, ensuring users are informed of connectivity issues. The UI now respects Android's driving-optimized mode restrictions, dynamically adjusting the interface when the vehicle is in motion to minimize distraction. Additionally, the codebase has been modernized by replacing the legacy Iconics library with the \mdi-icons\ library for Material Design icons and switching logging from \android.util.Log\ to Timber for better log management.
app/src/main/kotlin/io/homeassistant/companion/android/vehicle · high confidence
App lock and enhanced launch screen capabilities
The app now supports an app lock feature, requiring biometric or device credential authentication via a new Authenticator component before accessing the dashboard. The launch screen has been modernized with a new Compose-based UI, improved splash screen handling, and better support for Picture-in-Picture mode and fullscreen playback. Users are also warned when installing the full version on devices without Google Mobile Services, and network availability is checked during startup to prevent hangs on LAN-only networks.
app/src/main/kotlin/io/homeassistant/companion/android/launch · high confidence
App lock and settings architecture overhaul
The Settings module has been restructured to support a new App Lock feature and improved navigation. A new SettingsActivity now serves as the central entry point for settings screens, utilizing a sealed interface for deep-linking to specific sections like Gestures, Assist, and Server settings. The app lock logic is implemented via a new SettingsViewModel and Authenticator integration, which blurs the settings screen and prompts for biometric authentication when the app is locked. Additionally, the settings UI now includes a 'Get Help' menu provider, a custom suggestion preference for onboarding tips, and a dedicated fragment for configuring connection security levels.
app/src/main/kotlin/io/homeassistant/companion/android/settings · high confidence
Assist conversation UI and wake word detection reimplementation
The Assist feature has been rewritten to use a new Jetpack Compose-based UI (AssistSheet) and a new audio strategy architecture. This change introduces local wake word detection using microWakeWord models, allowing the app to listen for wake words directly on the device without requiring a server-side pipeline for the initial trigger. The conversation interface now supports continuous interaction while the microphone is active, automatically hides input placeholders during recording, and includes an auto-close timer for inactivity. Additionally, the audio recording logic has been refactored to use Kotlin Channels to prevent race conditions, and logging has been switched from android.util.Log to Timber.
app/src/main/kotlin/io/homeassistant/companion/android/assist · high confidence
Assist conversation UI updated to Material 3 with new icon library
The Assist conversation modal bottom sheet has been rewritten using Material 3 components, providing a modernized visual style and layout for the chat interface. Additionally, the UI now uses the mdi-icons library for its icons instead of the previous Material icons, ensuring consistent iconography across the application.
app/src/main/kotlin/io/homeassistant/companion/android/assist/ui · high confidence
Automated Google Play and Amazon Appstore deployment via Fastlane
The Android release process now uses Fastlane to automate publishing to Google Play and Amazon Appstore. This change introduces lanes to deploy internal builds for the main, Wear OS, and Automotive tracks to Google Play, promote them to beta and production tracks, and prepare/submit APKs to the Amazon Appstore, while also adding standard store metadata such as the app title, short description, and full description.
fastlane · high confidence
Automated loading of Android testing skills during code edits
The AI assistant now automatically loads the 'ha-android-testing' skill whenever a Write or Edit tool is used on files within test directories (matching the pattern \\\test\/\\). This is configured via new hooks in .claude/settings.json, which trigger a command to load the skill context before the tool executes, ensuring relevant testing guidelines are available during test-related changes. The skills directory itself is now a symlink to ../.agents/skills.
.claude · high confidence
Centralized URL resolution and security handling for the frontend
The app now uses a dedicated FrontendUrlManager to handle server URL resolution, replacing previous ad-hoc logic. This change introduces a unified flow for loading frontend URLs that automatically appends the external authentication parameter, manages deep-link targets, and enforces security checks. Users will now see a specific configuration screen if their server uses a plain-text HTTP URL and a security preference has not yet been set, and the app will block insecure connections based on user settings. Additionally, the manager handles compatibility for the 'more-info' dialog by using a URL query parameter for Home Assistant 2025.6+ and falling back to JavaScript injection for older server versions.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/url · high confidence
Centralized night mode management via new NightModeManager
A new NightModeManager class has been introduced to centralize the logic for retrieving, saving, and applying the application's night mode theme. This component interacts with the PrefsRepository to persist user selections and ensures that the UI theme (Light, Dark, System, or Android) is correctly applied using AppCompatDelegate. It also handles defaulting to System mode on Android P+ or Light mode on older versions if no preference is set, ensuring consistent theme behavior across the app.
app/src/main/kotlin/io/homeassistant/companion/android/themes · high confidence
Custom test runner ensures FailFast exceptions surface as test failures
The instrumentation test suite now uses a custom JUnit runner (HAAndroidJUnitRunner) that installs a FailFast handler before the application starts. This ensures that any FailFast exceptions triggered during application startup are caught and reported as standard test failures (AssertionError) rather than crashing the test process, and also pre-loads the timezone database to prevent StrictMode violations from Espresso's idle loop.
app/src/androidTest/kotlin/io/homeassistant/companion/android/util · high confidence
Entity widget configuration migrated to Compose
The configuration screen for the Home Assistant entity widget has been rewritten using Jetpack Compose, replacing the previous XML-based implementation. This change introduces a modern UI for selecting entities, servers, and display options (such as text size, labels, and tap actions) while also integrating dynamic color theming support for devices that support it. The underlying widget provider logic has been updated to respect these new configuration states, including handling dynamic backgrounds and improved error states when entity data is unavailable.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/entity · high confidence
Firebase Cloud Messaging service migrated to Kotlin
The Firebase Cloud Messaging service implementation has been moved from Java to Kotlin. This change includes replacing the standard Android logging with Timber for consistent log output and updating the token refresh logic to use Kotlin coroutines for asynchronous registration updates across all connected servers.
app/src/full/kotlin/io/homeassistant/companion/android/notifications · high confidence
Improved WebView back navigation and lifecycle management
The WebView component now handles the device back button more intelligently: it attempts to go back in the web history if the previous page is from the same origin, or navigates to the root URL if the previous page is cross-origin and the current page has a non-root path; otherwise, it delegates to the app's navigation stack. Additionally, the WebView's lifecycle is managed via reference counting to ensure that global timers are only paused when no WebView screens are visible, preventing interruptions when switching between multiple WebView instances.
app/src/main/kotlin/io/homeassistant/companion/android/util/compose/webview · high confidence
Improved debugging support for Android debug builds
Debug builds on physical Android devices now include a wrapper script for the arm64-v8a architecture that automatically configures JDWP debugging options based on the Android SDK version and enables Hardware Address Sanitizer (HWASan) on Android 14 and later to detect memory errors.
app/src/debug/resources · high confidence
Introduces strongly-typed outgoing message models for the External Bus
The app now uses a new set of Kotlin classes to structure messages sent to the Home Assistant frontend via the external bus. This change replaces ad-hoc JSON construction with a typed model for command messages (such as navigation, sidebar toggling, barcode scan results, and Improv/Matter status updates) and result messages (including configuration capabilities and entity add-to actions). For users, this ensures more reliable communication with the frontend, enabling features like barcode scanning, Matter commissioning status reporting, and NFC/Improv capability discovery to function with greater consistency.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/externalbus/outgoing · high confidence
Legacy shortcuts settings UI migrated to Compose with new icon library
The Manage Shortcuts settings screen has been rewritten using Jetpack Compose, replacing the previous implementation. This change introduces the \mdi-icons\ library for icon rendering and integrates the \EntityDisplayState\ for entity selection, while also adding validation to prevent crashes when reserved string IDs are used for pinned shortcuts.
app/src/main/kotlin/io/homeassistant/companion/android/settings/shortcuts/legacy · high confidence
Log viewer now supports crash log viewing and sharing
The Log settings screen has been rewritten in Kotlin and now includes a dedicated tab for viewing the latest fatal crash logs alongside standard process logs. Users can now share these logs via a new menu option, which generates a timestamped file and uses a FileProvider to share the content securely. The implementation also replaces the previous logging mechanism with Timber for internal debugging and adds a help menu link for troubleshooting.
app/src/main/kotlin/io/homeassistant/companion/android/settings/log · high confidence
Matter commissioning support removed in minimal flavor
The minimal build flavor no longer supports Matter device commissioning. The new \MatterManager\ interface and its \MatterModule\ DI binding are present, but the \MatterManagerImpl\ for the minimal source set explicitly disables all commissioning capabilities: \appSupportsCommissioning()\ and \coreSupportsCommissioning()\ return false, and \prepareMatterDeviceCommissioning()\ immediately returns an error stating that Matter is unsupported in this flavor. Users on the minimal build will no longer be able to add or commission Matter devices through the app.
app/src/main/kotlin/io/homeassistant/companion/android/matter, app/src/minimal/kotlin/io/homeassistant/companion/android/matter · high confidence
Matter device commissioning now uses a dedicated background service
The Matter commissioning flow has been refactored to delegate the actual device pairing to a new \MatterCommissioningService\. This service handles the Google Play Services commissioning requests and reports the result back to the app, allowing the commissioning process to run more reliably in the background. The UI activity (\MatterCommissioningActivity\) now acts primarily as a launcher and status display, using a new \MatterCommissioningScreen\ Compose UI to guide the user through steps like server selection and confirmation, while the heavy lifting is offloaded to the service layer.
app/src/full/kotlin/io/homeassistant/companion/android/matter · high confidence
Media Player Controls widget rewritten in Compose with new configuration options
The Media Player Controls widget and its configuration screen have been completely rewritten using Jetpack Compose and Material 3. This change introduces a modern UI for configuring the widget, allowing users to select multiple media player entities, customize the display label, and toggle visibility for volume controls, skip/seek buttons, and source information. The widget now supports dynamic color theming when available and uses the mdi-icons library for its icons. The configuration activity has been migrated from XML layouts to Compose, improving consistency with the rest of the app.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer · high confidence
Migrate Home Network settings to Kotlin and Compose
The Home Network (SSID) settings screen has been rewritten in Kotlin and migrated to Jetpack Compose, replacing the previous Java/XML implementation. This change introduces a new \SsidFragment\ and \SsidViewModel\ that manage the list of trusted Wi-Fi SSIDs, Ethernet, and VPN connection preferences. The UI now uses Compose for rendering, and the underlying logic has been updated to use \SdkVersion\ for API level checks and Timber for logging, ensuring consistent behavior across Android versions.
app/src/main/kotlin/io/homeassistant/companion/android/settings/ssid · high confidence
Migrate sensor managers to Kotlin and modernize location handling
Sensor manager implementations in the app have been moved from Java to Kotlin, bringing consistent language usage across the codebase. The LocationSensorManager has been refactored to use \timber.log.Timber\ for logging instead of \android.util.Log\, and it now utilizes \sensorWorkerScope\ for coroutine execution rather than \runBlocking\, improving responsiveness and avoiding potential main-thread blocks. Additionally, the location logic now strictly enforces the use of the \SdkVersion\ utility for API level checks instead of direct \Build.VERSION.SDK\_INT\ access, ensuring consistent version detection across the application.
app/src/full/kotlin/io/homeassistant/companion/android/sensors · high confidence
Minimal build variant disables crash reporting and push notifications
The minimal application variant now provides no-op implementations for crash reporting and messaging token services. Crash handling is effectively disabled, and the messaging token provider returns an empty string, ensuring that push notification features do not attempt to function in this stripped-down build.
app/src/minimal/kotlin/io/homeassistant/companion/android · high confidence
Minimal flavor location service now uses AOSP APIs with no-op geocoding
In the minimal build flavor, location tracking now relies on standard AOSP Location APIs (Fused Provider on Android S+, GPS Provider on older versions) instead of Google Play Services. The \HighAccuracyLocationService\ is implemented as a no-op for address updates, meaning geocoding features are disabled in this variant, while \LocationProvider\ handles location retrieval using the native \LocationManager\.
app/src/minimal/kotlin/io/homeassistant/companion/android/location · high confidence
Minimal flavor sensor managers become no-ops
In the minimal build variant, the Activity, Android Auto, and Location sensor managers now provide empty sensor lists and perform no operations (no-ops) when triggered. This ensures that location and activity sensing features are effectively disabled for users of the minimal flavor, while the underlying manager classes remain in place to satisfy dependency injection and interface contracts.
app/src/minimal/kotlin/io/homeassistant/companion/android/sensors · high confidence
NFC tag interaction UI migrated to Compose with improved approval flow
The NFC tag reading and editing interfaces have been rewritten in Jetpack Compose, introducing a new bottom-sheet-based approval flow for tag reads and a dedicated edit view for managing tag identifiers and trigger examples. Users will now see a modal bottom sheet when a tag is detected, offering explicit 'Allow Once' or 'Allow Always' options to improve security and clarity, while the tag editing screen provides easier access to duplicate tags, fire events, and share YAML trigger configurations.
app/src/main/kotlin/io/homeassistant/companion/android/nfc/views · high confidence
Native ExoPlayer support for Home Assistant frontend video streams
The app now uses ExoPlayer to handle HLS video streams requested by the Home Assistant frontend, replacing previous playback methods. A new manager handles play, stop, and resize commands from the frontend, automatically calculating the video overlay size based on the native aspect ratio when the frontend does not provide a specific height. This change improves video playback performance and ensures the player overlay is correctly sized and positioned within the WebView.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/exoplayer · high confidence
Native dialog support for HTTP authentication and Matter/Thread flows in the frontend WebView
The app now handles specific frontend WebView interactions via native Android dialogs instead of relying on the browser's built-in prompts. This includes a new HTTP Basic Auth dialog that allows users to enter credentials with an option to remember them, and dedicated dialogs for Matter/Thread setup progress and terminal states. Additionally, standard confirmation and informational dialogs are now rendered natively, ensuring consistent UI and behavior for these user prompts within the embedded web content.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/dialog · high confidence
New Compose-based external URL configuration screen
The external URL settings screen has been rewritten using Jetpack Compose, replacing the previous implementation. Users will now see a UI built with \ExternalUrlView\ that allows them to toggle the use of Home Assistant Cloud and save their external URL. The underlying logic in \ExternalUrlViewModel\ handles loading the current server connection state and updating the server configuration, including validation of the URL format via \UrlUtil\ and logging errors with Timber.
app/src/main/kotlin/io/homeassistant/companion/android/settings/url · high confidence
New Compose-based notification settings views
The notification settings UI has been replaced with new Compose-based screens. The channel management view now lists notification channels with options to edit or delete them, including an undo snackbar for deletions, and uses Material Design Icons for actions. The notification detail view displays received time, source, message (rendered as HTML), and data (pretty-printed JSON), with proper bottom padding for edge-to-edge support.
app/src/main/kotlin/io/homeassistant/companion/android/settings/notification/views · high confidence
New Material 3-based Manage Tiles screen
The Manage Tiles screen in Quick Settings has been rewritten using Jetpack Compose and Material 3 components (Scaffold, SnackbarHost, HAFilledButton, etc.), replacing the previous implementation. This new UI provides a scrollable layout for configuring tile labels, server selection, entity selection, and icon settings, while integrating with the existing ManageTilesViewModel to handle state and user interactions.
app/src/main/kotlin/io/homeassistant/companion/android/settings/qs/ui · high confidence
New animated loading screen with brand integration
The app now displays a new loading screen that replaces the previous loader with an animated Home Assistant icon featuring pulsing dots, designed to visually align with the system splash screen. This screen also introduces a fade-in effect for branding elements, including the 'Open Home Foundation' logo and associated text, which are positioned with adjusted padding to ensure proper fit and visibility across different screen sizes and API levels.
app/src/main/kotlin/io/homeassistant/companion/android/loading · high confidence
New application entry point and base activity with edge-to-edge support
The app now uses a new \HomeAssistantApplication\ class for initialization, which sets up core dependencies like logging, network clients, and sensor receivers. A new \BaseActivity\ serves as the foundation for all activities, enabling edge-to-edge display support and handling automotive-specific UX restrictions. Additionally, a new \ShareActivity\ has been added to handle incoming share intents from other apps, forwarding them to Home Assistant.
app/src/main/kotlin/io/homeassistant/companion/android · high confidence
New dedicated link handling activity for deep links and invitations
The app now uses a new LinkActivity to handle incoming deep links (homeassistant://) and universal links (my.home-assistant.io). This activity resolves the link destination and, if multiple servers are registered, presents a ServerChooser UI for the user to select the target server before navigating to the frontend or starting an invitation flow.
app/src/main/kotlin/io/homeassistant/companion/android/launch/link · high confidence
New navigation infrastructure for the Frontend screen
The app introduces a new navigation layer for the Frontend screen, replacing the previous WebViewActivity with a Compose-based FrontendScreen. This change adds structured navigation targets (FrontendTarget) for dashboards, paths, and entity more-info dialogs, and implements a centralized event system (FrontendEvent) to handle user actions like opening external links, launching apps, NFC tag writing, Matter/Thread setup, and widget configuration. It also includes a new WidgetType enum to manage configuration intents for various home screen widgets.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/navigation · high confidence
New onboarding connection screen with connectivity checks and error handling
The onboarding flow now uses a dedicated ConnectionScreen that displays a WebView for the Home Assistant login, backed by a ConnectionViewModel that manages navigation events and runs background connectivity checks (DNS, port, TLS, server, and Home Assistant verification) via a new ConnectivityChecksSection. A ConnectionErrorScreen provides a user-friendly error state with a close action, while the navigation layer handles authentication callbacks and external link opening. This replaces the previous connection handling with a more robust, check-driven approach that improves troubleshooting visibility during setup.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding/connection · high confidence
New permission prompt UI and centralized permission management for frontend features
The app introduces a new, centralized permission management system in the frontend permissions module to handle runtime permission requests with improved user experience. This includes new bottom-sheet prompts for notification permissions (Android 13+) and Improv Wi-Fi onboarding (Bluetooth and Location), which can display a rationale screen before the system dialog. The system also adds support for requesting local network access (Android 17+) and storage permissions for downloads, while refactoring how WebView permissions (camera, microphone) are handled. These changes ensure that permission requests are queued and managed consistently, providing clearer feedback and better control over when and how permissions are requested for various app features.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/permissions · high confidence
New session management layer for authentication and credential safety
The app introduces a new ServerSessionManager in the session package to centralize authentication logic, replacing ad-hoc handling with structured result types (ExternalAuthResult, RevokeAuthResult) for JavaScript callbacks. This change improves how the frontend handles session state checks, external auth retrieval, and session revocation, while also adding a new canSafelySendCredentials check to ensure credentials are only sent to secure or trusted URLs.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/session · high confidence
Notification actions now require authentication when configured
The notification handling logic has been updated to enforce authentication for notification actions when the corresponding flag is set. This change ensures that sensitive actions triggered from notifications are properly authenticated before execution, improving security for users interacting with Home Assistant via notification buttons.
app/src/main/kotlin/io/homeassistant/companion/android/notifications · medium confidence
Onboarding flow restructured with dedicated invitation screen and Wear OS support
The onboarding experience has been reorganized into a new navigation graph that introduces a dedicated WelcomeInvitation screen for users joining via invite links, distinct from the standard welcome flow. The system now supports Wear OS devices, allowing a paired phone to act as a proxy for the watch's server registration and device naming. Additionally, the server discovery process has been enhanced with specific modes to hide or show existing registered servers, and the navigation logic now safely handles URI launches to prevent crashes.
app/src/main/kotlin/io/homeassistant/companion/android/onboarding · high confidence
Quick Settings tile management rewritten in Compose
The Quick Settings tile management interface has been migrated from the legacy Android View system to Jetpack Compose. This change introduces a new \ManageTilesFragment\ and \ManageTilesViewModel\ that render the tile configuration UI using \ManageTilesScreen\, replacing the previous implementation. Users will see the same tile management functionality (selecting entities, configuring labels, icons, and server associations) but built on the modern Compose framework, which improves consistency with the rest of the app's UI and enables better state management for the tile setup flow.
app/src/main/kotlin/io/homeassistant/companion/android/settings/qs · high confidence
Redesigned URL configuration screen with cloud toggle and validation
The URL settings interface has been rebuilt using Jetpack Compose, introducing a toggle to switch between Home Assistant Cloud and a custom external URL. When Cloud is unavailable or disabled, users can manually enter a URL in a new input field that validates the address in real-time, displaying an error icon and message for invalid entries. The view also respects safe bottom padding for edge-to-edge display compatibility.
app/src/main/kotlin/io/homeassistant/companion/android/settings/url/views · high confidence
Redesigned sensor settings interface with search and filtering
The sensor settings experience has been rebuilt using Jetpack Compose, introducing a new list view that supports searching and filtering sensors by enabled or disabled status. The detailed sensor view now displays a privacy hint for Health Connect permissions and handles permission requests for background location and Health Connect more robustly. Additionally, a dedicated screen allows users to configure the global sensor update frequency.
app/src/main/kotlin/io/homeassistant/companion/android/settings/sensor · high confidence
Redesigned sensor settings interface with search and multi-select capabilities
The sensor settings screens have been rewritten in Kotlin using Jetpack Compose, introducing a modern UI for managing sensors. Key improvements include a new sensor list view with sticky headers for sensor groups, a dedicated update frequency configuration screen, and enhanced detail views. Users can now search and filter entries within multi-select setting dialogs (such as apps, zones, or beacons) via a new bottom sheet component, and the interface supports edge-to-edge display for better visual integration on modern Android versions.
app/src/main/kotlin/io/homeassistant/companion/android/settings/sensor/views · high confidence
Redesigned server selection and enhanced server settings
The server selection interface has been replaced with a new Compose-based bottom sheet that displays server names alongside user profile avatars and initials, providing a clearer visual distinction between multiple servers. In the server settings, the app lock feature is now configurable per server, allowing users to enable biometric authentication, set session timeouts, and define home network bypass rules for specific connections. Additionally, the server invite share URL format has been corrected to ensure the URL parameter is properly included.
app/src/main/kotlin/io/homeassistant/companion/android/settings/server · high confidence
Refactor Android Auto vehicle UI utilities into Kotlin
The vehicle UI utility layer has been rewritten in Kotlin, introducing new helper files for domain checks, entity actions, native mode launching, and settings navigation. This change adds a dedicated action to open the Settings view from the Automotive main screen, implements a unified mechanism to fire the \android.navigation\_started\ event when navigation begins, and fixes a crash when launching native mode on Android 14+ by correctly handling display launch options. Additionally, icons are now sourced from the \mdi-icons\ library, and template components for headers and domain lists have been updated to support the new entity display structures.
app/src/main/kotlin/io/homeassistant/companion/android/util/vehicle · high confidence
Refactor widget infrastructure to support Glance and Compose configuration
The widget subsystem has been refactored to introduce a new base class for Glance-based widgets (BaseGlanceEntityWidgetReceiver) alongside the legacy AppWidgetProvider base (BaseWidgetProvider), enabling the migration of specific widgets like the To-Do widget to the modern Glance framework. Widget configuration screens have been migrated to use Jetpack Compose, introducing shared UI components for selecting background types (dynamic color, day/night, transparent) and text colors. The underlying data layer now uses Kotlin coroutines and Flow for asynchronous state observation, replacing previous blocking or callback-based patterns, and logging has been standardized to Timber.
app/src/main/kotlin/io/homeassistant/companion/android/widgets · high confidence
Refactored high-accuracy location service to use Kotlin and async execution
The high-accuracy location components (receiver, service, and provider) have been rewritten in Kotlin and migrated to use asynchronous execution via coroutines. This change ensures that location updates and service management no longer block the main thread, improving app responsiveness and stability during background location tracking.
app/src/full/kotlin/io/homeassistant/companion/android/location · high confidence
Restrict Sentry user data and add Google Play Services availability check
Crash reporting via Sentry now excludes common network-related exceptions (such as connection timeouts and SSL errors) from reports and strips user identifiers to retain only the user ID, reducing sensitive data exposure. Additionally, the app now provides a mechanism to check for Google Play Services availability, which supports warning users when installing the full version on devices without GMS.
app/src/full/kotlin/io/homeassistant/companion/android · high confidence
SSIDs are now compared case-insensitively when determining active connections
The SsidView logic for identifying which saved network is currently active has been updated to perform case-insensitive comparisons. Previously, an SSID like 'MyNetwork' might not have been recognized as connected if the system reported it as 'mynetwork'. This change ensures that SSID and BSSID matching is robust against case differences, preventing the UI from incorrectly showing a network as disconnected or failing to highlight the active connection.
app/src/main/kotlin/io/homeassistant/companion/android/settings/ssid/views · high confidence
Sensors refactored into injectable managers with Hilt multibindings
The sensor implementation in the app module has been restructured to use dependency injection. Sensor logic is now encapsulated in injectable \SensorManager\ classes (such as \CarSensorManager\, \HealthConnectSensorManager\, and \NotificationListenerSensorManager\), which are registered into a \Set\<SensorManager\>\ via \AppSensorModule\. This replaces the previous pattern where sensors were created on read, allowing for a centralized, declarative sensor catalog and cleaner separation of concerns between the framework callbacks (receivers/services) and the sensor logic.
app/src/main/kotlin/io/homeassistant/companion/android/sensors · high confidence
Shortcuts now launch via deep links and legacy shortcuts are automatically migrated
Shortcuts created in the app now launch through a stable deep link (\homeassistant://navigate\) handled by \LinkActivity\ instead of launching \WebViewActivity\ directly. To ensure existing shortcuts continue to work, the app automatically detects and migrates any legacy shortcuts to the new deep-link format on startup. The settings UI for managing shortcuts has been updated to use Compose, and the underlying implementation now uses the \mdi-icons\ library for icon rendering.
app/src/main/kotlin/io/homeassistant/companion/android/settings/shortcuts · high confidence
Standardized development environment with code style and linting configuration
The project now enforces consistent code formatting and style through new configuration files. An .editorconfig defines 4-space indentation for general files, 2-space for YAML, and Kotlin-specific rules including a 120-character line limit and trailing comma allowance. A .yamllint file enforces strict YAML formatting standards. Additionally, a .git-blame-ignore-revs file is introduced to ignore specific commits (such as trailing comma additions and linter updates) in git blame output, and .gitattributes ensures consistent line endings across different file types and operating systems.
(repo-wide) · high confidence
Structured error handling and recovery for connection failures
The app now uses a structured, type-safe approach to handle Home Assistant connection errors, replacing ad-hoc logic with a dedicated error model and action system. Users will see specific, actionable recovery options tailored to the exact failure mode—such as installing missing TLS certificates, clearing expired credentials, updating the system WebView if it fails to initialize, or waiting for the external-bus handshake to complete—rather than generic retry prompts. This change also introduces a new Compose-based error screen that displays precise error details and context-specific buttons, improving the ability to resolve connectivity issues without needing to manually navigate to settings.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/error · high confidence
Template widget configuration migrated to Compose and Material3
The template widget configuration screen has been rewritten using Jetpack Compose and Material3, replacing the previous XML-based implementation. This change introduces a modern UI with dynamic color support, improved server selection, and a live template preview feature. The underlying widget provider logic has also been updated to use Kotlin coroutines for asynchronous database operations and template rendering, ensuring smoother performance and better handling of background updates.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/template · high confidence
Thread support disabled in minimal flavor
The minimal build flavor now explicitly disables Thread functionality. The new ThreadManagerImpl returns false for support checks and throws an error if dataset export is attempted, ensuring that Thread features are not available in this variant due to their dependency on Google Play Services.
app/src/minimal/kotlin/io/homeassistant/companion/android/thread · high confidence
Todo widget now uses the Glance framework for a modern, responsive interface
The Android home screen Todo list widget has been rebuilt using the Glance framework, replacing the previous implementation. This change provides a more responsive and visually consistent user experience, featuring dynamic color support, improved layout handling for edge-to-edge displays, and a streamlined configuration screen. Users can now manage their tasks directly from the widget with toggling and refreshing actions that are more robust, and the widget better handles scenarios where the associated Home Assistant server is removed or unavailable.
app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo · high confidence
Type-safe external bus communication for the frontend
The app now uses a new FrontendExternalBusRepository to handle communication with the Home Assistant frontend via the external bus. This change replaces previous mechanisms with a strongly typed approach using kotlinx.serialization, ensuring that messages are serialized and deserialized with correct camelCase naming conventions. The repository manages incoming and outgoing message flows, allowing the frontend to send typed commands and receive responses while gracefully handling unknown message types for forward compatibility. This improves reliability and maintainability of the bridge between the Android app and the web frontend.
app/src/main/kotlin/io/homeassistant/companion/android/frontend/externalbus · high confidence
Wear OS onboarding settings screen rewritten in Jetpack Compose
The Wear OS onboarding settings screen has been migrated from a legacy XML-based implementation to Jetpack Compose. This change introduces a new \SettingsWearActivity\ that uses Compose UI components (\SettingsWearOnboardingView\) and enables edge-to-edge display. The underlying architecture has been updated to use a new \SettingsWearRepository\ for transient server operations during onboarding, \SettingsWearViewModel\ for state management, and \SettingsWearDetection\ for device discovery, replacing the previous logic. Logging has also been standardized to use Timber.
app/src/full/kotlin/io/homeassistant/companion/android/settings/wear · high confidence
Wear OS settings screens rewritten in Jetpack Compose
The Wear OS settings interface has been migrated from legacy Android Views to Jetpack Compose, introducing a modern UI for managing device favorites, template tiles, and onboarding. This change updates the visual design to use Material 3 components and improves navigation flow within the settings app, allowing users to configure favorite entities and template tiles with a more responsive and consistent interface.
app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views · high confidence
Wear OS settings stubs added to minimal app variant
The minimal app variant now includes stub implementations for Wear OS settings components (SettingsWearActivity, SettingsWearMainView, and SettingsWearDetection). These files ensure the app compiles by providing placeholder classes and a detection function that explicitly returns false, indicating that Wear OS support is not available in this build variant.
app/src/minimal/kotlin/io/homeassistant/companion/android/settings · high confidence
WebSocket connection management moved to background WorkManager
The WebSocket connection logic has been refactored to run as a periodic background WorkManager job instead of a foreground service or direct broadcast receiver execution. This change ensures the app maintains a persistent connection to Home Assistant servers even when the app is in the background, while also improving battery efficiency and reliability by handling connection drops and retries within a managed worker lifecycle. Users will experience more reliable real-time updates and notifications without needing to keep the app open.
app/src/main/kotlin/io/homeassistant/companion/android/websocket · high confidence
WebViewActivity is deprecated and redirects legacy shortcuts to FrontendScreen
WebViewActivity has been removed as a functional UI component and is now deprecated with an error-level deprecation. It no longer renders a WebView; instead, it serves solely as a redirector for legacy shortcuts that still launch via the old intent extras (path and server). When such a shortcut is detected, the activity immediately redirects the user to the new FrontendScreen via a deep link and finishes itself. This ensures backward compatibility for existing shortcuts while enforcing the migration to the new Compose-based FrontendScreen architecture.
app/src/main/kotlin/io/homeassistant/companion/android/webview · high confidence
Websocket settings screen rewritten in Compose
The Websocket settings screen has been migrated from the legacy XML-based view system to Jetpack Compose. This change updates the user interface implementation to use modern Android UI tooling, ensuring the settings fragment renders via a ComposeView while preserving existing functionality for managing websocket configurations and background access permissions.
app/src/main/kotlin/io/homeassistant/companion/android/settings/websocket · high confidence
Test coverage
Add screenshot tests for the HA Compose Catalog screens; Added instrumentation test for LaunchActivity with leak detection; Added navigation tests for Location Sharing and Name Your Device onboarding screens; Added navigation tests for the Location For Secure Connection onboarding screen; Added navigation tests for the Manual Server onboarding screen; Added navigation tests for the onboarding flow; Added screenshot tests for Assist settings screen; Added screenshot tests for Compose UI components; Added screenshot tests for FrontendConnectionErrorScreen; Added screenshot tests for FrontendScreen states and Improv onboarding flow; Added screenshot tests for HAMediaPlayer; Added screenshot tests for LinkActivity UI states; Added screenshot tests for Matter commissioning screen; Added screenshot tests for SettingsRow and SettingsSubheader components; Added screenshot tests for TagReaderScreen states; Added screenshot tests for Wear settings onboarding UI; Added screenshot tests for gesture settings UI components; Added screenshot tests for onboarding screens; Added screenshot tests for the EntityPicker component; Added screenshot tests for the Licenses screen; Added screenshot tests for the Manage Tiles UI; Added screenshot tests for widget configuration screens; Added test for ThreadManagerImpl in minimal flavor; Added tests for FrontendDialogManager and dialog UI components; Added tests for MicroWakeWord model loading and audio processing; Added tests for SSID view suggestion logic; Added tests for WebView timer management and back-navigation logic; Added tests for application module dependency injection; Added tests for the Assist Sheet UI component; Added tests for the Barcode Scanner UI and handler logic; Added tests for the BlockInsecureScreen UI and interactions; Added tests for the changelog feature; Added tests for the entity widget configuration and display logic; Added tests for the new Compose-based Media Player widget configuration; Added tests for the sensor allow-list search and selection UI; Added tests for the template widget configuration screen and view model; Added tests for vehicle navigation event handling; Added unit and UI tests for NFC tag reading and approval flow; Added unit and UI tests for the Quick Settings tile management feature; Added unit tests for App Lock state management and Settings ViewModel; Added unit tests for Assist audio strategies and view model; Added unit tests for Assist service components; Added unit tests for Assist wake word configuration and settings; Added unit tests for Compose UI components and utilities; Added unit tests for EntityPicker fuzzy search and UI behavior; Added unit tests for FrontendDownloadManager; Added unit tests for FrontendEventHandler and FrontendTarget; Added unit tests for FrontendExternalBusRepository; Added unit tests for FrontendJsBridge WebView attachment logic; Added unit tests for FrontendMessageHandler; Added unit tests for FrontendUrlManager; Added unit tests for Glance widget receiver logic; Added unit tests for HapticFeedbackPerformer; Added unit tests for Improv onboarding components; Added unit tests for LaunchActivity and LaunchViewModel; Added unit tests for Local First onboarding screen and navigation; Added unit tests for LocationTrackingViewModel; Added unit tests for ManageControlsViewModel; Added unit tests for PermissionManager; Added unit tests for ServerSessionManager; Added unit tests for WakeWordListener; Added unit tests for Wear MTLS onboarding screen and view model; Added unit tests for Wear, Matter, Thread, and Location sensor components; Added unit tests for WebsocketManager background worker logic; Added unit tests for entity add-to actions and manager; Added unit tests for frontend error handling and UI; Added unit tests for incoming external bus message parsing; Added unit tests for outgoing external bus command and result message serialization; Added unit tests for sensor managers and repository; Added unit tests for server chooser logic; Added unit tests for server discovery components; Added unit tests for shortcut management and migration logic; Added unit tests for the Debug NFC Tag Emulator Service; Added unit tests for the Frontend Matter/Thread handler; Added unit tests for the Location Sharing onboarding screen and view model; Added unit tests for the Location for Secure Connection onboarding flow; Added unit tests for the Name Your Device onboarding screen; Added unit tests for the Set Home Network onboarding screen; Added unit tests for the link handling flow; Added unit tests for the manual server onboarding screen and view model; Added unit tests for the new Frontend screen and its components; Added unit tests for the new Glance-based Todo widget; Added unit tests for the onboarding connection flow; Added unit tests for the onboarding welcome screens and navigation; Added unit tests for utility classes and test infrastructure; Register TestStateResetPlatformListener for JUnit Platform; Removal of default example test files.
Dependencies
Automotive module adds Gradle dependency locking
The automotive module now includes a generated gradle.lockfile to enforce deterministic builds by locking dependency versions across all build variants and configurations, ensuring that the exact versions recorded in the lockfile are used during compilation and runtime.
automotive · high confidence
Initial project scaffolding with Gradle and Fastlane
The repository has been initialized with the core build infrastructure. A Gemfile and Gemfile.lock are added to manage Ruby dependencies, specifically pinning Fastlane to version 2.240.1 and the Amazon App Submission plugin to 0.4.0 for release automation. The Android application modules (app and automotive) are configured using Kotlin DSL build scripts that leverage version catalogs (libs.plugins) for plugin management and define specific build types, lint rules, and dependency aliases.
(dependencies) · high confidence
Upgrade Gradle wrapper to v9.8.0 and configure JVM toolchain
The Gradle wrapper has been upgraded from version 4.10.1 to 9.8.0, introducing distribution integrity validation via SHA-256 checksums and network timeout/retry settings. Additionally, a new \gradle-daemon-jvm.properties\ file has been added to configure the build environment to use Adoptium JDK 21 across supported operating systems, ensuring consistent JVM toolchain selection for the daemon.
gradle · high confidence
Housekeeping
Added Detekt baseline and Gradle dependency lockfile for the common module
The common module now includes a \detekt-baseline-release.xml\ file to suppress existing static analysis warnings (such as complex conditions, magic numbers, and long methods) and a \gradle.lockfile\ to enforce deterministic dependency resolution. These changes improve build stability and code quality enforcement without altering user-facing functionality.
common · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 57 → 58 (+1.3)
- Rubric changed (rubric-2026.09.8 → rubric-2026.09.16) — scores are not directly comparable.
Lenses
- Code Health 85 → 85 (+0.0)
- Architecture 98 → 90 (-7.7)
- Maturity 63 → 63 (+0.0)
- Readiness 62 → 62 (+0.0)
- Security 59 → 66 (+7.2)
- Domain Modelling 48 → 48 (+0.0)
- Performance 85 (new)
Resolved (15)
- Change coupling: CameraWidget.kt ↔ MediaPlayerControlsWidget.kt (app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidget.kt)
- Critical CVE: [GHSA redacted] (app/gradle.lockfile)
- Duplicated block (12–13 lines × 2) (app/src/main/kotlin/io/homeassistant/companion/android/assist/AssistViewModel.kt)
- Hotspot: app/src/main/kotlin/io/homeassistant/companion/android/frontend/gesture/FrontendGestureManager.kt (app/src/main/kotlin/io/homeassistant/companion/android/frontend/gesture/FrontendGestureManager.kt)
- Hotspot: app/src/main/kotlin/io/homeassistant/companion/android/frontend/matterthread/FrontendMatterThreadHandler.kt (app/src/main/kotlin/io/homeassistant/companion/android/frontend/matterthread/FrontendMatterThreadHandler.kt)
- Hotspot: app/src/main/kotlin/io/homeassistant/companion/android/sensors/CarSensorManager.kt (app/src/main/kotlin/io/homeassistant/companion/android/sensors/CarSensorManager.kt)
- Hotspot: common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/FriendlyState.kt (common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/FriendlyState.kt)
- Hotspot: common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/impl/IntegrationRepositoryImpl.kt (common/src/main/kotlin/io/homeassistant/companion/android/common/data/integration/impl/IntegrationRepositoryImpl.kt)
- Hotspot: common/src/main/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/WebSocketCoreImpl.kt (common/src/main/kotlin/io/homeassistant/companion/android/common/data/websocket/impl/WebSocketCoreImpl.kt)
- Medium CVE: [GHSA redacted] (app/gradle.lockfile)
- Medium CVE: [GHSA redacted] (app/gradle.lockfile)
- Members sharing a duplicated core (4 members, 50+ identical tokens) (app/src/main/kotlin/io/homeassistant/companion/android/frontend/FrontendScreen.kt)
- Near-duplicate member pair (38 shared lines) (app/src/main/kotlin/io/homeassistant/companion/android/assist/AssistViewModel.kt)
- Off-boarding risk: anonymized user #1
- SensorDetailViewKt.SensorDetailSettingDialog (cognitive 24) (app/src/main/kotlin/io/homeassistant/companion/android/settings/sensor/views/SensorDetailView.kt)
New (54)
- Critical CVE: [GHSA redacted] (app/gradle.lockfile)
- Duplicated block (12–13 lines × 2) (app/src/main/kotlin/io/homeassistant/companion/android/assist/AssistViewModel.kt)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- …and 34 more
Changes since last survey
- 64 commits — 59 feature/other, 5 fixes
By area
- app/src — 19 commits
- .github/workflows — 12 commits
- app/gradle.lockfile — 12 commits
- (root) — 7 commits
- common/src — 6 commits
- .github/actions — 4 commits
- .agents/skills — 1 commit
- .github/aw — 1 commit
- gradle/libs.versions.toml — 1 commit
- wear/src — 1 commit
Notable commits
- fix: Fix bitmap encoding config for Shortcut tiles (#7490)
- fix: Fix blur logic (#7530)
- fix: Fix unavailable SSID comparisons (#7444)
- fix: Manually fix version of logback for ktlint (#7479)
- fix: Regenerate some ConnectivityChecksSection screenshots to fix CI (#7458)
- change: Add "Open page in browser" gesture (#7485)
- change: Add error screen no connection on Automotive (#6857)
- change: Add screenshot tests for Compose-based HTML -> annotated strings (#7441)
- change: Add search filter to sensor setting allow list dialog (#6567)
- change: Adjust brand bottom padding (#7481)
- change: Apply zizmor suggestion regarding how to access repo actions (#7484)
- change: Avoid AI using validate screenshot when not needed (#7451)
- change: Build x86 APK again for instrumentation tests (#7514)
- change: Check legacy changelog off the main thread (#7507)
- change: Clean up Detekt clarity findings (#7469)
- change: Clean up Detekt exception idioms (#7498)
- change: Control statusBar and navBar theme based on container color (#7480)
- change: Drop x86 for emulator wtf and update to 1.2.0 (#7482)
- change: Expose entity subtitle separator (#7486)
- change: Forbid usage of org.json in favor of Kotlinx.serialization (#7473)
- …and 44 more
Architecture
- Containers 0 added · 0 removed · contexts 3 added · 0 removed · edges 4 added · 0 removed
Added bounded contexts (3)
- app
- common
- testing-unit
Added dependency edges (4)
- app → common
- app → testing-unit
- wear → app
- wear → common
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
home-assistant/android was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 28 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit b3db6a862c78263b72c8759209d0f24da7185407 — the exact code this score is about.
- Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-2d9048c36d26.