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
* Bump com.android.tools.build:gradle from 7.4.2 to 8.0.0
Bumps com.android.tools.build:gradle from 7.4.2 to 8.0.0.
---
updated-dependencies:
- dependency-name: com.android.tools.build:gradle
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
* Bump Gradle version
* Build default values changes
- Remove items that match new defaults
- Add item to keep old default to allow for those changes to happen in another PR
* Align target Kotlin version with target Java version
* Use JDK 17
* Remove one more item that now matches default
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Joris Pelgröm <joris.pelgrom@gmail.com>
* Add ComplicationType.LONG_TEXT support, friendly state
- Makes it possible for watch faces to request a long text complication
- Use the friendly state to support translated states and dates
* Add show title option
- Allows hiding the title of a complication in case it doesn't look right
* Implement/fix reading state from database
- When a entity ID is provided in the configuration request, load data for that complication from the database to allow easy reconfiguration
- Provide more appropriate error messages when complication isn't configured / the entity doesn't exist
* ktlint
- Exchange server information between the Wear app and phone app, and create a temporary server on the phone that holds the Wear server information, to ensure that the same server is used on both devices
* Get and cache user information
- Add function to get information about the current user
- Cache user information alongside server in database
* Replace/prevent admin only calls
* Push Wear users to install app on phone
- Push Wear OS users to install the app on their phone if they don't already have it, as the sign in experience is a lot better and less sensitive to errors
- Allow using 'Advanced' if the user cannot or doesn't want to install the app on their phone
* Fix import
* Add time
* Update play store listing for wear OS
* Update description and add screenshots for tiles
* Update phone screenshots to be consistent and showcase some widgets
* Fix small size
* Use single screenshot to show widgets and meet requirements
* Update home screen images
* Show all widgets
* Update camera widget image, oops
* Fix screenshots
* Bump org.jlleitschuh.gradle.ktlint from 11.1.0 to 11.2.0
Bumps org.jlleitschuh.gradle.ktlint from 11.1.0 to 11.2.0.
---
updated-dependencies:
- dependency-name: org.jlleitschuh.gradle.ktlint
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
* gradlew ktlintFormat
* Rename packages with underscores
> Task :app:ktlintMainSourceSetFormat FAILED
home-assistant-android\app\src\main\java\io\homeassistant\companion\android\widgets\media_player_controls\MediaPlayerControlsWidget.kt:1:1 Package name must not contain underscore (cannot be auto-corrected)
home-assistant-android\app\src\main\java\io\homeassistant\companion\android\widgets\media_player_controls\MediaPlayerControlsWidgetConfigureActivity.kt:1:1 Package name must not contain underscore (cannot be auto-corrected)
Rename: media_player_controls to mediaplayer
> Task :wear:ktlintMainSourceSetFormat FAILED
home-assistant-android\wear\src\main\java\io\homeassistant\companion\android\onboarding\manual_setup\ManualSetupActivity.kt:1:1 Package name must not contain underscore (cannot be auto-corrected)
home-assistant-android\wear\src\main\java\io\homeassistant\companion\android\onboarding\manual_setup\ManualSetupModule.kt:1:1 Package name must not contain underscore (cannot be auto-corrected)
home-assistant-android\wear\src\main\java\io\homeassistant\companion\android\onboarding\manual_setup\ManualSetupPresenter.kt:1:1 Package name must not contain underscore (cannot be auto-corrected)
home-assistant-android\wear\src\main\java\io\homeassistant\companion\android\onboarding\manual_setup\ManualSetupPresenterImpl.kt:1:1 Package name must not contain underscore (cannot be auto-corrected)
home-assistant-android\wear\src\main\java\io\homeassistant\companion\android\onboarding\manual_setup\ManualSetupView.kt:1:1 Package name must not contain underscore (cannot be auto-corrected)
Rename: manual_setup to manual
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Joris Pelgröm <joris.pelgrom@gmail.com>
* Multiserver foundation
- A foundation to build multiserver support on. Not ready for general use.
* Update new vehicle support
* Rebase fixes
* Multiserver settings
- Show settings for the correct server when editing server settings from the settings
* Bind session to device/install
- Save an install id with the app install to make sure that it isn't re-used on another device causing issues
* Add migration
- Migrate server info from shared preferences to the database after database migration and clean up
- Remove unused url shared preferences
- Read/save server version from/to database
* Fix auth error when session is refreshed
* Show server name instead of URL
- Read the server name when getting the config, and save it to the database
- Allow the user to override the server name in the app's settings
* Multiserver notifications
- Make notifications aware of which server sent the notification
- Show server name in notification if more than 1 server is added to the app
- Use the server-specific repositories when calling webhooks/authenticating/etc
* Handle multiserver in websocket worker
- Copy the settings database row to the new server ID to allow for server-level settings (websocket) while keeping the original for app-level settings (sensor update frequency), and handle this in onboarding
- Make the websocket worker check in on all servers and open/close connections where required
- Add the webhook_id to websocket notifications to link them to servers
- Update ServerManager servers to defaultServers because I'm using the same filter everywhere
* Migrate shared preferences
- Move server-specific device name to Server and secret key to ServerConnectionInfo
- Add a server ID key to the remaining shared preferences and migrate existing values
* Add option to delete server from settings
- Allow deleting servers directly from the app's settings, because you might not be able to do so from the frontend.
* WebView switching and active server management
- Allow switching which server is considered 'active' and used for the webview when loading
- On auth errors remove the server instead of removing the URLs (?)
- When getting external auth consider that the server might just have been removed (possible race condition from frontend which frequently causes 1 unauthorized connection when logging out)
- Fetch config after adding a new server to fill in name and version before first use
* Sync registrations and blocking load
- When starting the app, sync all registrations
- Remove Wear state with server but new registration required
- When receiving a new push token, update all registrations
- Do a blocking load for getting the servers because otherwise the app might think it's not registered when running in the background
* Use StateFlow for the server list
- Don't manually refresh but use a StateFlow to get updates pushed when the list of servers changes
- Make settings use unique server keys to prevent constant remove/re-add
* Sensor updates and sync with multiple servers
- Send sensor updates to all servers and sync changes to the app. Sensors are shared across all servers the app is connected to so changing enabled state on one server will update it for all servers.
- Don't update sensor enabled state for location tracking directly from onboarding, this should be done in the result.
- Remove unused SensorWithSettings class
* Send NFC tag scans to all servers
* QS tiles server selection
- Listen to updates for a specific server
- Allow selecting server if there is more than one
* Shortcuts server selection
- Allow selecting server if there is more than one
- Extract OutlinedButton with DropdownMenu for server selection to a standalone Composable
- Update QS tiles to not automatically reset server ID when server no longer exists, align with shortcuts
* Fix revoked sessions + crashing app
- When a session is revoked update the session object to reflect it
- Fix app crashes on revoked sessions because of race conditions with the AlertDialog causing window active/inactive at the same time as finishing it
* Extra server onboarding tweaks
- Skip welcome and location
- Save/fix notification preference for minimal version
* Fix sensor state type conversion errors for new servers
- If the state is removed but the type isn't, this can result in unwanted conversions throwing errors so remove the state type as well when copying a sensor
* Matter multiserver
- Request specific server ID in Matter functions
- Add server selection to shared Matter device flow
* Android Auto multiserver
- Allow switching server in Android Auto. Defaults to active server, note that it doesn't change the default but only changes it in AA.
* Widgets server selection
- Add server selection to all widgets and update handling to use the selected server
* Clean up TODOs out of scope
* Device controls multiserver
- Subscribe to updates for each server that controls are added for
- Allow managing lock screen enabled controls for each server
* Don't try to register sensors when finishing
- Don't try to do a sensor update when finishing, as this may cause unintended use of resources we're trying to clean up (when deleting a server)
* Server-level zones and location tracking
- Keep track of which server a zone belongs to for location tracking, and send updates only to that server
- Add server name to zone selection setting
* Merge fix
* Show 'Activate Server' any time there are multiple servers
- If the user is looking for the option to go to their server why hide it if it is already used, making them go back twice?
* More consistent strings
* Improve add server feedback in settings
- Preserve the activate server before adding a new one to prevent unexpected active server changes
- Show a Snackbar when another server is added indicating success with a button to activate it, or failure
* Remove unused ServerManager
* Fix tag import
- Allow the Wear support libraries to specify the redirect URI to use for OAuth login
- Catch any exceptions that might be thrown when building an OAuth request
* Move server settings to a server settings screen
- Move server-specific settings to a new screen to be accessed from the main settings only containing server specific settings in preparation for multiserver
- Sensors is currently not server-specific even though one setting is stored by server ID, to be fixed later
* Store app preferences in another shared preferences file
- Store app preferences not in the integration shared preferences file, but in the shared preferences file for general prefs (it is named themes but there are already other app-level prefs in it)
- Move Wear specific preferences to it's own repository + shared preferences file
* Improve server row with local data
- While we don't have a server name or user name, show the registration name when available to improve the server row layout
* Simplify location permission request code
- Remove the flexible permission requests as it isn't used in the current settings structure, only expect location permissions
- Switch from the deprecated functions to the new flow using activity result contracts
* Remove unused string
* Update conversation UI with speech bubble
* Clean up design, vibrate when displaying response, close activity if screen turns off
* Review comments
* Switch response side to better match frontend
* Design tweaks
* Use row padding instead of spacer
* Initial commit of wear OS notifications
* Update to allow message and title
* Move constants to object to reduce imports
* Split up logic to match phone app
* Update readme and set websocket to false for wear OS
* Bump firebase BOM
* Add a tile to interact with conversation integration
* Check HA core version and that conversation is enabled
* Rename search to conversation
* Add some TODOs, review comments for more clean up
* Review comment
* Add back private set
* Only subscribe to favorite entities on Wear OS homescreen
* Switch to subscribing to all supported domains
* Update entity states when app is resumed and entities are loaded to keep things in sync
* Only update domains when needed
* Update all registeries when we resume
* Move UI update to view model
* Review comment
* Clear values before updates
* Process review comments