* Support multiple Template tiles on Wear OS
* Add `TemplateTileConfig` data class
* Fix migration
* `Pair` -> `TemplateTileConfig` fixes
* Fix `getAllTemplateTiles` implementation
* Initial work on companion <-> wearable device communication
* More work on phone <-> wear device communication
* Save updated template in phone app
* Get the template to render using the right method
* Fix CI complaints
* Work on Wear UI for multiple template tiles
* Update wear manifest
* Wear migration and navigation fixes
* Fix Template tile IDs in mobile app
* Make adding a new Template tile on Wear device work
* Small cleanups and TODO fixes
* Try to fix template config refresh in settings
* Fix after rebase
* Adopt blocking approach for reacting to tile events, inspired by #3974
* Use `OpenTileSettingsActivity` for template tile
* Adopt Material 3 and other UI-related changes
* Show help text in phone app if no template tiles have been added yet
* Reference the view model variable inside the function
By having the view model variable outside the block, the updated template tile
might not be propagated to the template settings view.
* Reload template tiles when opening the template tiles from settings
* Replace null key with -1 for old template tile
* Lint complaints fixes
* remove TODO
* Store error
* Scrollable list of template tiles
* Move "Configure template tile" to header
* Replace with methods with copy
* Show template as secondary text
* Fix scrolling
* Update app/src/full/java/io/homeassistant/companion/android/settings/wear/views/SettingsWearTemplateTileList.kt
Co-authored-by: Joris Pelgröm <jpelgrom@users.noreply.github.com>
* Remove unused field
* Move padding to "no tiles" text
* Add deep link
---------
Co-authored-by: Joris Pelgröm <jpelgrom@users.noreply.github.com>
* Support for Thread "import credentials" frontend action
- Add support for the frontend action to import Thread credentials, or better said export Thread credentials from the device. This is essentially a very basic sync.
* Rename/reorder reused Matter code
- Change names and order of reused Matter code for Thread importing to prevent potential confusion
* Update minimal implementation
- Addresses the following warning: The option setting 'android.defaults.buildfeatures.buildconfig=true' is deprecated. Each module uses the BuildConfig class so it's added everywhere.
* Add Wear OS TLS client certificate authentication (TLS CCA) support
Wear OS does not currently allow the user to install certificates to the
system-wide KeyChain for TLS CCA support. This commit adds support for
using certificates from the app-specific Android KeyStore with UI for
setting up a certificate during the Wear OS onboarding process.
The manual step in the onboarding process is required since we cannot
transmit certificates of the Android KeyChain because they are not
extractable.
In particular, this commit adds the following changes:
* KeyStoreImpl as an additional KeyChainRepository interface
implementation for loading and storing keys to the application's
KeyStore. TLSHelper uses KeyStoreImpl as a fallback key manager.
* UI for selecting a certificate file with GET_CONTENT intent during
Wear OS onboarding in OnboardingActivity if it is detected that the
Home Assistant may require TLS CCA. The UI includes a password check
for the PKCS12 container.
* During onboarding the app sends the raw PKCS12 data to Wear OS
together with the container password. The connection is assumed to be
encrypted and trusted so that no additional encryption is necessary.
* Move PKCS12 password check to lifecycle scope
* Remove redundant try-catch when loading PKCS12
* Simplify MobileAppIntegrationView layout code
* mobile_app_notification_cleared for wearos
* Fix imports
* Remove database id extra
* Fix whitespace
* Reformatted imports and added the receiver to the manifest
* Move `handleDeleteIntent` to common
* Added a sensor to detect if the hotspot is enabled.
* Validate if we aren't running a watch before showing hotspot sensor.
* Fixed code style issues with the linter.
* Fix instant update for hotspot-sensor.
* Update hotspot icon to access-point instead of wifi.
- Shows the server name instead of a generic "Home Assistant" to prevent confusion when the app cannot connect in the WebViewActivity, when using multiserver.
* Always send device class during registration
- Always send the device class for a sensor during registration to overwrite any existing invalid values
* Only send sensor registrations with null properties to core 2023.2+
Update tiles logged out state to prevent cut off overflow
- Limit length of logged out state string to prevent text cut off and shorten strings to help with translations
- Fix inconsistent shortcuts tile name
* Add first draft for NFC sensor
* Rename NfcSensorManager.nfcSensor to nfcStateSensor
* Move NfcSensorManager to the common module
* Add BroadcastReceiver subscription to NfcAdapter.ACTION_ADAPTER_STATE_CHANGED in both the app and wear modules
* Remove TODO comments
* Change updateType to INTENT
* Convert simple methods to expression body
* Change mdi:nfc to mdi:nfc-variant
* Fix docs URL
* Reword NFC sensor manager according to the PR suggestions
* Update icon
- Replace old icon with the new icon
- Update app primary color to new blue tint
- Deduplicate resources
* Update feature graphic
* Decouple app icon color from main color
* Add location history (location, trigger, result)
- Initial setup saving data, no UI, cleanup or preferences yet
* On/off setting, limit history size and basic UI
- Add a on/off setting for location history (default on)
- Limit the history size to 48 hours, any older entries will be deleted during regular sensor updates
- Add a basic UI for location history based on paging considering the possible data size with multiserver/high accuracy. The list looks good and shows status at a glance, detail view still needs work.
* Finish expanded UI
- Make the expanded UI nicer and show relevant data, buttons for opening the location in a maps app and sharing log data
- Add empty states for location history
* Filter by state, improve list speed
- Add option to filter by state
- Simplify Room configuration and sort by indexed ID to improve list loading speed
* Remove duplicate source
* Fix minimal
* Split sent into sent and failed to send
* [WIP] Prepare camera snapshot tile
* Deduplicate refresh views
* Get/save tile config in the database
* Deduplicate haptic click, add to camera refresh
* [WIP] Camera tile settings UI
- Create UI to set camera tile settings
- Reuse shortcut tile settings activity as a general tile settings activity
* Rename camera snapshot tile to camera tile
* Cleanup: camera entities selection, empty state, preview image
- On initial load also create a list of camera entities to make it possible to select them without showing up elsewhere in the app
- Add text to empty state instructing the user to set a camera
- Update tile preview images
* Fix logged out state on missing tile config
* Force tile update on login
* Scale bitmap to fit inside screen size
- Scale the received image to a bitmap that does not exceed the screen size to ensure timely refreshes and prevent parcels that are too big
* Prepare controls panel activity for Android 14
* Allow controls panel to work while locked
* UI to enable/disable controls panel
- Disable panel by default
- Add area to controls settings on Android 14 to enable/disable panel
* Panel server/path settings
- Add setting to choose which server and path to use for the panel
* Remove transition animation for panel
* experience -> mode
* Add/update/delete Thread credentials by border agent ID
* Multiserver: only keep one HA credential, handle credentials for deleted servers
- Make sure the app only stores one HA credential that matches the preferred credential for the server executing the sync.
- Create an 'orphaned Thread credentials' system to be able to delete credentials for servers that have been previously deleted.
* Fix minimal
- Update to Kotlin 1.9
- Update to Compose 1.5 and Compose Wear 1.2, both depend on and are required for Kotlin 1.9. Compose Wear includes lazy classes moving to a different package so updated imports.
- Update to AGP 8.1.1 to remove compatibility warning
- Update Navigation Compose to 2.7.1 as it uses Compose 1.5 internally
- Update Accompanist to 0.32 as it uses Compose 1.5 internally
- Switch Room to KSP instead of kapt because this (latest stable) release doesn't work with Kotlin 1.9 otherwise. As a result, we no longer need to specifically enable incremental compilation.
* Android Auto: Set icon color when entity is considered in an active state
* Add link to frontend code for determing active state
* Add lawn_mower domain and a check on supported colored domains
* Split up isActive and state colored domains
* Update map screen
* [WIP] Widget tap action: toggle entity
* Add feedback on press and failure
* Share code for pressing on entities
* Align cover press action
- Toggle will stop if possible when opening/closing if supported so prefer toggle instead of open/close
* Toggle by default if supported
- Set the default tap action for supported entities to toggle instead of refresh
* Update widget description
* Add support for alarm control panels in android auto
* Check for domain when checking if there is a code
* Check that armed_away is a supported state
* Review comments
* Add some missing strings, match state casing with HA core
Assist last used: remember STT and record before connected
- For the last used pipeline for Assist, remember whether or not it supports STT input, and if it does start recording proactively/as soon as possible to avoid missing voice input while doing network checks.
- Fix potential wrong server while sending voice data.
- Fix voice input remaining active after getting an error response.
* Initial work on migrating plugins to catalogs.
* Remove Enterprise Build profiling since we really don't use it.
* Use a common Java Version and sdk versions.
* ktlint
* Review comments.
* Extract JSONArray -> List<String> conversion to extension fun
* Refactor navigation around Shortcuts Tile settings
* Add ShortcutsTileId enum class
* Introduce multiple ShortcutTile subclasses and modify settings UI and storage to support multiple Tiles
* Check if correct ShortcutsTileId is passed as parameter to BaseShortcutTile
* Update TileUpdateRequester usages to account for multiple Tiles
* Add entity count to Shortcut Tile list in Settings
* Fix ktlint errors
* Fix more ktlint errors
* Extract string resource
* Add MULTI_INSTANCES_SUPPORTED to ShortcutsTile to be able to use any number of Tiles
* Refresh the list of Shortcut Tiles in the Settings without needing to restart the app
* Remove test logs
* Update androidx.wear.tiles:tiles to the latest version which doesn't yet require API 34 compileSdk version
* Fix crash when the preference's value is "{}"
* Fix crash when key String is "null" and converting to Int
* Rename placeholder variable name
* Add a comment explaining why to save the tiles in a getter
* Return emptyList() directly for clarity
* Remove icons from "Shortcut tile #n" entries in Settings
* Pass emptyList instead of using the non-null assertion operator to prevent NPEs in edge cases
* Refactor getTileShortcuts and getAllTileShortcuts in WearPrefsRepositoryImpl.
Make the code more readable and understandable, and reduce code duplication.
* Make it explicit that intKey is only intended to be null if stringKey == "null"
* Rename getTileShortcuts to getTileShortcutsAndSaveTileId and make it save the tileId not only when there's a null key in the map, but also when the tileId is not yet in the map. This way, actual Tiles and the tileId keys will be more in sync.
* Handle adding Shortcuts Tile immediately after updating the app to a new version which introduces support for multiple Shortcuts Tiles.
* Show message in the Settings when there are no Shortcuts tiles added yet.
* Refine message in the Settings when there are no Shortcuts tiles added yet
* WIP: ConfigShortcutsTile action
* Update comments about Wear OS versions
* Finalize ConfigShortcutsTile feature by applying @jpelgrom's suggestion to OpenShortcutTileSettingsActivity
* Only wrap the code in runCatching which is expected to throw an Exception under normal circumstances, when the pref value needs to be migrated from the old format.
* Call getTileShortcutsAndSaveTileId in OpenShortcutTileSettingsActivity
* Remove unnecessary stuff
* First Steps into making Gradle Catalogs
* Rename a couple dependencies.
* Downgrade compose compiler since it'll take more to bump the kotlin version apparently.
* Code review comments.
* Refactoring these are painful.
* Now I know my ABC, next time wont you sing with me....
* Android auto: default to favorites if defined
* Fix changing servers
* Fix empty favorites list
* Review comments
* Account for extra grid items when showing favorites
* Switch to grid view for home screen, show all domains when there are no favorites for the server
* Review comments
* Clean up and move some methods to util
* Collect favorites with allEntities
* Review comments
* Move native mode logic back
* Check distraction again in domain screen
* Use base class to get distraction optimized variable
* Send blank template if user is not logged in
* Mark variables as private
* Fix icon resolution for grid items
* Show measurement unit in Wear OS complication
* Extend existing `friendlyState` method
* Make showing unit configurable (defaulting to false)
* Feedback fixes