* [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
- 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
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.
Fix: allow selecting unavailable entities for complications/tiles
- It should be possible to choose an unavailable entity for display on a complication or tile, as you can with favorites, and even entities that are available now can become unavailable later
* 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....
* Show measurement unit in Wear OS complication
* Extend existing `friendlyState` method
* Make showing unit configurable (defaulting to false)
* Feedback fixes
* Resume Assist voice input on new intent (as assistant app/brought to front)
* Use constants for android.intent.action.ASSIST
- android.intent.action.VOICE_ASSIST is marked as internal
Add toggle for assistant app intent filter on Wear
- Adds a toggle for enabling/disabling Assist as an assistant app (= intent filter on Assist activity), as users may not be able to change the app used after choosing 'Always' and Wear OS 2 doesn't ask the user which app to use which can result in Assist instead of the Google Assistant being forced.
* Use Assist pipeline STT/TTS on Wear OS
- Update Assist pipeline support on Wear OS to use the pipelines' STT/TTS capabilities, if available and if the app has the required permission
- Move UrlHandler functions (app) to UrlUtil (common)
* Create a base AssistViewModel for sharing code
- Creates AssistViewModelBase in common to share Assist tasks that appear in both the main app and watch app
* Keep screen on during voice input to avoid interruption
* First attempt at a new release model.
* Fix bad syntax
* Bump year and month with another job
* Use the plugin's version in apps.
* Make sure to generate the pre release weekly.
* Review Comments.
- Allow continuing conversation for Assist on watches by adding a mic input button at the bottom of the screen
- Allow changing pipelines for Assist on watches when on a supported core version
- Preparing for pipeline STT and TTS
* Native Assist setup + text input
* Minor (text input) UI tweaks and fixes
- Set a very light window tint to increase contrast on white backgrounds
- Keyboard to outline for consistency
- Text input: keyboard action, keyboard icon to outline for consistency, show keyboard when switching
- Fix reset conversation on recreation
* Voice input
- Add basic voice input support to the native Assist interface
* Voice input bugfixes
- Don't block voice output while sending data via websocket
- Drop voice output data if there is a subscriber and the buffer is full by specifying a buffer + overflow strategy that matches behavior when there are no subscribers
- Properly stop AudioRecord reading when job is cancelled (non-suspending function)
- Stop recorder before stopping output collection
* Voice responses (generated TTS) playback
- Play received tts-end events when using voice input
- Update permission info on resume to catch granted permissions while in the background
* Pipeline switcher
- Allow switching between all different pipelines
- Add icon content descriptions
* Check + show attribution
* Prevent sheet that is too high pushing controls away
* UI feedback: pipelines and attribution
* Update Automotive manifest
* Fix speech bubble size for larger responses
* Update manifest to handle tasks/backstack better
- Set the affinity to a value to make sure Assist is always launched in another task than the main app
- Automatically remove from recents as Assist will be the only thing in it's task, after finishing there's nothing left to (re)start
* App-specific feature checks and error handling
- Check for microphone support on device
- Handle connectivity errors
- Handle argument errors
- Handle errors for pipelines that are no longer visible
* More UI feedback
- Add a title to the sheet to make sure people know this is the Home Assistant app
- Fix TextField alignment
* More header means max height adjustment
* Group incoming messages by subscription to prevent out-of-order delivery
- Messages received on the websocket are processed asynchronously, which is usually fine but can cause issues if messages need to be received in a specific order for a subscription. To fix this, process messages in order for the same subscription.
* Implement Assist pipeline API
- Add basic support for the Assist pipeline API
- Update conversation function to use the Assist pipeline when on the minimum required version
- Update UI to refer to Assist pipeline requirement