* Manage app language using AndroidX, integrate with Android 13
- Manage the app language using AndroidX to fix the setting not being applied and to be able to easily integrate with Android 13's system setting
* Move locales_config.xml to common
* Generate locales_config.xml when downloading translations
* Fix multiple variants for languages being collapsed into one
* Fix language codes with region variants
* Don't split languages when using app bundles
* Rename
* Add daily floors sensor for Wear OS3 devices
* Do a compatibility check for sensor availability in health services
* Print more logs and attempt to send latest data, update more getAvailableSensor methods
* Process review comments
* Process more review comments, use actual time in millis
* Clear out available sensors when updating with new list
* Log the capabilities in case we need to troubleshoot later
* Review comment
* Missed one additional review comment
* Return immediately instead of storing a list
- If no Wear app is installed on a device, checking for nodes will throw an exception that the API is unavailable. This is an expected error, don't log it to not confuse users.
* Update change log for week of 10/21
* Add data roaming breaking change fix
* Update per recent merges
* Mention breaking change for command_bluetooth on android 13+ devices
* Support zone name only location tracking
* Update strings to match iOS
* Only add Sent location setting on supported versions
* String updates
* Simplify code as the setting is always on
* Save cloud URL separately and add pref
- Save the cloud / remote UI url that is received during registration separately, and add a preference to use the cloud url instead of the external url
- Save the cloud / remote UI url and cloudhook url received during webhook config updates, to be able to support using cloud after the app was set up
- Clean up cloudhook url when logging out
* Add UI for "Use Home Assistant Cloud" url
* Cleanup
* Fix function order
- Update onBackPressed functions which have been deprecated to use the new OnBackPressedDispatcher and OnBackPressedCallback
- Indicate support for the predictive back gesture
* Use compressed entity changes for device controls
- Add support for the subscribe_entities websocket subscription which delivers initial state + changes in a compressed format to reduce data usage
- Use the new subscribe_entities format in device controls on supported Home Assistant versions
* Less duplicate code
* Add notify command for app-lock
* Add null check for optional parameters
* Only allow enabling app_lock by notify command if previously enabled by user
* Use constants for app lock command parameters
* Add BiometricManager check before turning on app_lock
* Remove 'hasLockEverBeenEnabled' in favor of only biometricmanager check.
* Improved value checking for app lock command.
Made setAppLock function suspending i.s.o. sepearate runBlocking calls.
* Show notification if no parameters were updated.
* improved parameter value checking
* Don't make changes when invalid data is provided
* Early check on argument validity for app lock commands
* Cleanup app lock command parameter validation
* Request notification permission during onboarding
- When using Android 13 or the minimal version, add a screen to onboarding to request to enable notifications on the device. This screen is based on iOS onboarding. When tapping Continue, on Android 13 this requests the system permission and/or on the minimal version this changes the websocket setting.
- Compile with and target SDK 33 (targeting required to be able to request notification system permission on demand)
* Add notification settings link in settings when off
- Show a new setting in settings for the user to enable notifications for the Home Assistant app, either because the permission was denied (Android 13) or the user manually turned off all notifications (Android 8-12).
- This new setting replaces the notification channels setting when everything is off; in this case there is no point managing individual channels. If at least one channel is on, the existing notification channels setting is shown instead.
* Compose tweaks
- Remove redundant content description for icon
- Change to a simpler scroll modifier
* Fix skipping notifications on minimal version
- Ensure that the value is actually saved to the database
* Post Bluetooth on/off commands as if invalid
- When using Android 13, post notification commands to control Bluetooth on/off as a normal notification as if they were invalid, as the function has been deprecated for the app
* Remove type that can be inferred
- Update Gradle to latest version (7.5.1)
- Update Android Gradle plugin to latest version (7.3.0)
- Move package property out of manifest into gradle build files namespace as recommended
* Merge Follow Home Assistant/Follow System Settings theme
- As these two themes behave the same now, don't present two options but instead just one. The default setting has been renamed back to "Follow System Settings" to best match expectations. Internally the "android" setting still works, settings will show "Not set".
* Remove useless webview force dark
- The WebView force dark settings are no longer required (and will no longer be supported when targeting Android 13), as the latest appcompat/webview/HA frontend already respect the app's theme setting and allow overriding it
* Add support for showing custom icons in device controls
* Clean up and set color based on state
* Set icon size and adjust colors based on domain
* Move color values to resources and add more color options from source
* Review comments
* Only set the icon if it exists in the library
* Add commands to control screen brightness and a sensor to get the value
* Minor file clean up
* Review comments
* Rename Device Settings to Display Sensors
* Add support for intent scheme URI in clickAction and actionable notifications
* Add a new prefix for app links in actions
* Rename app link to deep link to be more precise
* Use correct intent prefix
* Take user to the play store if the app is not installed
* Fix taking user to the market if app is missing, remove ability for deep links since we can't get the package name
* Only open the play store if we have an actual package to open to
* Add support for using BSSIDs for internal connection
- Add support for entering BSSIDs to use for detecting when the internal connection URL should be used. These are saved like any regular SSID, but contain the prefix "BSSID:".
* Add link to documentation
* Fix full screen mode for all devices
* Hide system UI when we regain focus and a video is still full screen
* Revert theme changes
* Remove unneeded line break
- Set the thumbnail template for the camera control to active as long as the camera isn't unavailable and the app was able to download an image, to show the camera image more often and better match the frontend.
- Instead of receiving all state changes when the device controls are open, only receive state changes for entities that were added as controls. This potentially reduces the amount of data used while controls are open.
* Improve adding quick settings tiles
- Use the new option available on Android 13 to prompt the user to add a tile to the quick settings panel, if a tile wasn't already added
- Switch Toast to Snackbar
- Move some logic from the manage tiles view to viewmodel
* Only show subtitle field when supported
- Setting a tile subtitle is only supported on Android Q+, so don't show the field on versions before that!
* Deeplink into app for tiles that aren't setup
- Instead of disabling a tile if it isn't setup, if the user is logged in set it up as inactive with the default icon/label and deeplink into the app settings with a notice that it needs to be setup first. This provides a better first use experience, as the user can simply tap it to setup instead of requiring them to manually go to the settings.
* Always do Wear onboarding on phone
- Switch the Wear onboarding to always use the sign in flow on the paired phone, instead of offering the option to sign in completely on the watch.
- When opening the companion app using the Wear app, immediately link the user to the list of instances or sign in screen.
- Use standard OAuth flow for devices without companion app installed.
- Fix type casting of location preference in Wear onboarding result.
* Fix ListenableFuture await import
* Add BLE Beacon Monitoring Sensor
* Fix on/off toggle
* Add on/off commands
* Fix commands
* Add all beacons to attributtes
* Add Kalman Filter
* Improve performance
* More settings
* cleanup
* Fix linter errors
* Update description
* Show monitoring state in sensor
* Add missing permissions
* Fix permissions
* Fix Bluetooth state of Android 12
* Use instance instead of singelton
* Use runBlocking for updateLastSendState
* Use own scope for beacon manager
* Use new notification commands
* fix rebase
* use null instead of empty string
* return if sensor is disabled
Implement subscribe_trigger and use it in widgets
- Implement support for subscribing using subscribe_trigger, currently used to get state changes only for specific entities
- Change the entity state and media player widgets to use this new subscription instead of subscribing to all state changes, based on the template widget
- Removed some placeholder code from media player widget
* Add setting to bypass app lock on home network
* Debug loging to check logic
* Fix logic. Cleanup logging.
* Disable home lock bypass when no home networks are configured.
* Only check for WiFi SSID, not internal URL when evaluating isLockEnabled.
* Fix build error
- Adding a media player widget from settings didn't work because the list used to check that entities have been selected isn't updated immediately, but only on load or in a callback after pinning the widget. To work around this, manually check it before pinning the widget.
* Add some more attributes to geocoded sensor and check that device supports it
* Remove language attribute as it does not supply the expected data
* Combine latitude and longitude into the location attribute again
* Update WebSocketRepository for multiple subscriptions of same type
- Change the structure of how the websocket repository tracks individual subscriptions to allow subscribing multiple times with the same type, but different data
* Update TemplateWidget to use template subscriptions
- Instead of depending on entity state changes and refreshing any time there is a change, use the render_template subscription for the template widget to limit the amount of data and power used. To make this possible without too much abstractions, the TemplateWidget no longer implements BaseWidgetProvider.
- Fix hardcoded "Loading" string
* Handle potential null subscription ID
- Implements #2795 for changes to tracked subscription ID
* Handle failed subscribing similar to other failures (null)
- When subscribing fails, return null and don't store an active subscription instead of continuing and returning a flow (which would never emit messages)
* Update manifest
* Handle foreground service restrictions for persistent connection
- When trying to start the WebsocketManager as a foreground service, catch exceptions due to restrictions and show the user a notification to fix it
* Update logging in WebsocketManager
- Change to the OkHttpClient used elsewhere by the app to download notification videos to resolve problems related to cookies and mTLS authentication. As a result, storing and deleting the file is now handled by the app instead of by the system.
* Modify Notification GIF Framerate
Modoify VIDEO_INCREMENT_MICROSECONDS to have notification GIFs generate a frame every 0.5 seconds for a video instead of the current every 2 seconds. This should result in smoother notification animations thus improving the UX
* Increase processingFrames.size
Increase processingFrames.size as increasing the framerate results in the animation ending too soon
* Scale video to a max width of 480 while maintaining video ratio
Notification video width scaled to 480. (1920 / 4) Height will scale accordingly while maintaining video aspect ratio. e.g. 1920x2560 will be scaled to 480x640
Frames are set to every 1 seconds with 5 frames resulting in a 5 second GIF
* Update MessagingManager.kt
Based on research and rapid prototyping under another fork, I've decided that scaling the image to a fixed width and a ratioed height is not going to work. There are issues that need to be resolved which result in the image being cut off and stretched in the notification.
End result is the only overall change is changing the frame generation from once every 2 seconds to once every 1 second. This has improved the fluidity of notifications but I understand is my own subjective opinion.
This means there is still a potential case where 4K cameras will exceed the size limits of notifications.
* Typo fix
* Re-Implement Scaling to a Constant Width
* Update MessagingManager.kt
* Add logic to not scale videos smaller than specified width and Increase GIF speed (ViewFlipper)
* Tune processing times
Tune processing time to have one frame generated every 0.75s, then frames are played back at 3x speed. This results in 9 seconds of activity being played in 3 seconds.
* Implement Dynamic Frame Count
Dynamic number of frames up to a specified size limit (currently 2.5MB)
* Review Before Merge
* Actually update geocoded sensor on location updates we send to HA
* Ensure sensor is updated before checking if we should send the update
* Move update logic to sensor receiver, ensure last sent attributes are updated
* Restart location updates if we detect too much time passed since last update
* Switch to last location received for proper evaluation
* Code review: move variable logic to be inside the condition
* Fix websocket stays subscribed after widget edit due to multiple instances
- When a widget is edited, the system will send a broadcast to _a new instance_ of the widget class. Because there is a websocket connection to keep widgets updated, the new instance of the class should also receive events to unsubscribe.
* Use companion object to prevent unnecessary updates
- Only actually start listening for updates in one of the instances in order to prevent unnecessary duplicate widget updates
* Actually check the paired state instead of assuming it
* Ensure the attributes have no duplicates by making the lists distinct
* Actually check for duplicate devices to remove them
* Apply code suggestion
* Revert some changes and remove allowDuplicates per comment
* Add support for lock domain in QS tiles, change tile not setup message to be more precise
* Update dispatcher
* Review comments: Remove not setup from string, only get state if domain is lock when tile is clicked
* Remove duplicate strings
* Remove error message on null template
- Null is a valid value for a template so the app should reflect that instead of suggesting there is an error, which may cause users to start looking in the wrong place.
* Log.e instead of Log.i
* Add logging in authentication fragment to print errors
* Expand error messages to contain more useful data
* Add error content to pop-up to provide more data to the user
* Show more descriptive onReceivedError message
* Ensure the correct messages are used
* Add changes from @jpelgrom to only show the error on the expected URL
* Add condition to onReceivedErrror as well
Automatically delete stale widgets from database
- Automatically removes widgets that are no longer bound to the widget provider but that are still in the database -> 'stale'/old widgets will no longer cause unnecessary updates
- Removes the external storage permission for logs for devices on Android 6+, because the external cache dir is usable without this permission and it will no longer work when targeting Android 13 on Android 13 devices. It should work on Android 4.4 and above but this bug suggests it might not on Android 5, but it is auto-granted and needed for downloads anyway: https://issuetracker.google.com/issues/37013142.
- Set the maximum version for the external storage permission to Android 9; starting with Android 10 the download manager will use MediaStore.Downloads which doesn't require any additional permissions.
* Implement styling on the template tyle
* Also process preview in phone settings
* Small cleanup
* Improve template null handling
* Update template rendering error
* Update help text to indicate new line and markup options
* Also support newline
* More extensive replacement for <br>
* Add camera device control
- Adds a camera device control on supported devices (12+)
- Update content description for camera widget
* Improve Icon if downloading thumbnail fails
- Show a blank grey thumbnail like an empty tile if downloading the camera thumbnail fails, because the system will stretch the provided image so a 'proper' icon can end up looking weird
* Improve error handling
* Migrate SSID dialog to Compose, move + rename prioritize internal
- Replaces the SSID dialog with a new screen built with Compose (same functionality as before)
- Move the prioritize internal setting to the new SSID screen where it makes more sense, and rename it + style it as a dropdown to prevent unnecessary changes
* Remove unused Spacer
* Fix button widget field data overwrite on text change
- The text changed listener might be called while the button widget fields were being setup if a value exists. If other fields are bound at the same time this might overwrite their values and cause problems, so make sure to use the adapter position for the viewholder instead.
- If setting a value fails set the text input to empty instead of showing the previous value
* Fix incorrect input in button widget fields
- Properly set the hint for the button widget fields to null if no hint is available to prevent an old hint from being visible
- Properly set the autocomplete functionality to null if no autocomplete functionality is expected to prevent unwanted autocompletion
* Fix services list if service was previously selected
- Always load the full services list, even if a service was previously selected, and apply a filter on the list after setting it to prevent the dropdown from showing incorrect values
- Add specific error if the app encounters a HTTP 404 response during onboarding registration, because that means the mobile_app integration is missing
- After an error, clean up the session data to make sure a new registration attempt is made
* Show entity state on entity chip in Wear OS app
- Shows the color and position of an entity state on the entity's chip in the Wear OS app by using a custom background class that accepts more than a single Color
* Use horizontal instead of diagonal gradients
- The default BrushPainter actually isn't the correct one, the ToggleChip class uses its own but that is marked as internal and we cannot override the default BrushPainter so another copied class it is
* RTL entity position support
- When using an RTL language, the entity chip should fill in the position value from the right side
* Support cover position
- Show cover position as entity chip's background
- Adjust background color code to also work when a chip isn't checked for covers that are currently closing
* Cleanup EntityUi
* Cleanup duplicate code in device controls
* Naming conventions
- Should've used a lowercase letter to start
- Fix class
* Fix build
- Updates because ToggleChipColors has changed
- Add workaround for implementing Compose interface because kotlin-gradle-plugin is linked to stable Compose and we cannot update yet
* Update gradient values to match rc02
- Wear Compose 1.0.0-rc02 changed the default values for the gradients in ToggleChips, so update the values used when using a custom background to match
* Rebasing First TLS Client (MTLS) implemention onto upstream's master
* Removed commented code
* First Client TLS implementation rebased with upstream's masster
* Removed redundant semicolon
* Added try/catch to key import, added import feedback to enduser
* ktlint fixes
* Rely on the device Credential store
* Tweaked and cleaned the strings related to the TLS Client Auth message
* Removed commented code
* Attempt to remember the key alias and load it as soon as the app starts
* Cleaned rebase and tidying up code
* Added handler for HTTP error (when a certificate is not provided)
* When no certificate is availble, do the request to get an HTTP error back (for error handling)
* Pleased the linter
* Pleased the linter
* Switched to constructor injection
* Attempt to load the key in a non-blocking fashion.
* Do not loop around the blocking code
* onReceivedClientCertRequest now runs non blocking and the KCAC callback is used instead of polling.
* Wait until the executor task actually completes.
* Cleaned the code
* Removed unused import
* Wait for the executor to finishes executing its task
* During onboarding, if TLS Client Auth is enabled but no certificate is available, correctly report to the user
* Use a safe call on errorResponse
* Do not block anymore
* Removed unused return types
* Removed unused return types and the executor
* Removed unused imports
* Code cleanup
* Improved synchronization
* Added a string for certificate expiration
* Added a function to clear the alias and removed blocking code
* Added a function to clear the alias
* Display an error message if the user certificate is not valid plus minor refactoring
* Check the validity of the selected certificate
* Added an error message if the client certificate is not valid
* Resolved warnings and linting issues
* Fixed broken branch when testing for error condition
* Removed unused imports
Co-authored-by: Mirco Boschi <mircoboschi@gmail.com>
* Fix storage sensors to update continuously and do some refactoring in StorageSensorManager
* Fix size unit formatter logic.
So now it can not only output 0GB for smaller values (<1GB) but also 345MB or 640KB for example
* Use String.format(...) for adding thousands separator and replace StringBuilder usage with template
* Speed up loading device controls by running network async
- Speed up loading the device controls menu and initial controls by launching all requests in an async block, which allows the server to respond out of order
- For individual controls, only start listening for changes once we have provided initial controls
* Speed up Wear OS cold boot by running network async
- Speed up a cold boot of the Wear OS app by launching all network requests in an async block, which allows the server to respond out of order
* The webview activities now handle keyboard|keyboardHidden|navigation
configuration changes by keyboard connection changes, to avoid the
activity restart which leads to frontend reload.
* Don't include devices twice in Bluetooth list
- Don't include Bluetooth devices twice in the devices list when using it for location-related functions. Do allow duplicates for the BT sensor for backwards compatibility.
* Switch high accuracy mode BT constraint to device address
- Change the Bluetooth device constraint for high accuracy mode for location updates to use the Bluetooth device address instead of the device name to ensure uniqueness + fix crash in sensor settings screen
- Set padding in Scaffold because lint doesn't seem to like ignoring it
* Migrate high accuracy mode BT constraint names to addresses
- When enabling the high accuracy mode, make sure that all data for the Bluetooth device constraint is a Bluetooth device address and if not try to match it to a device.
- Because the database can contain devices that are not currently paired/connected, without changing to a new setting this check always must be executed, which is why it is placed in the function for enabling the high accuracy mode.
* Also show user-friendly labels in sensor settings detail screen
- Update the sensor settings detail screen to also show a user-friendly label for list settings on the main screen, before opening a dialog. This will use the same function as when the dialog info is populated, which simplifies code.
- Merge SensorSettingType.LIST with other list types rows in sensor settings detail screen, remove getSettingTranslatedEntry in viewmodel which is no longer necessary.
* Fix empty Bluetooth list setting value when off
* Bump reorderable and fix breaking changes
* Only include reorderable with full version
* Improve "Wear Favorite Entities" screen design
- Fix too small touch targets for dragging
- Fix no background resulting in overlapping text when dragging
- Update design to standard Material design
- Re-use Composable for selected and unselected favorite entities
* Add dagger module for daos
* Update classes in common to inject daos
* Update app view models to use inject
* Use inject with widgets
* Update app activities and fragments to use inject
* Clean up imports
* Make TileExtensions use coroutines
- Instead of silently failing, inform the user that a sensor cannot be enabled due to missing permissions and provide a link to change the setting. If possible, name the specific permission that is required.
* Sync sensor enabled state from app to core
- Change sensor 'registered' to indicate not registered, registered as disabled or registered as enabled
- When a sensor is disabled, set it's status as such on core 2022.6 servers
- In the sensor registration, use the basic sensor details in case there is no info in the database that can be used
* Clean up version check
- Now that there is a standard function to get the version, re-use it
* Improve which sensors are synced to core
- Update database migration to reset registration state on db upgrade to make sure the information is correct for all sensors
- Only sync sensors that are actually available on the device
- Fix registering all sensors on core <2022.6 on app/core version change
- Fix unnecessary sensor updates due to location sensors which are never registered always triggering update on core >=2022.6
* Sync sensor enabled state from core to app
- After pushing app enabled changes to core, if on core 2022.6 check if the enabled state for any of the sensors is different from what is registered in the app and try to update the sensors. This is done by reading the entire config, because otherwise we wouldn't know about sensors that have been enabled and the app already updates all sensors at the same time so no need for tracking individual updates in the sensor update response.
- Restore getting config using webhooks, because only the webhook config contains information about entity enabled state
- Add support for opening a specific sensor's settings page, used for the notification when trying to enable a sensor that requires granting (additional) permissions
* Update Media Player Widget Preview
* Add support for multiple media players. optionally show media source label
* fix crop of media player widget preview image. avoid unnecessary api call's when finding active media player. add db migrations. add text color to media source label. set default value of showsource to false.
* remove placeholder source for source icon to fix widget preview
- Use unique tags to allow identifying which function receives an error
- Actually use the onReceivedSslError callback error
- Also show SSL errors in the external auth callback
* Provide Compose preview for Play Store listing screens
* Update previews for onboarding
- Set theme correctly and show system UI
- Add variant for dark mode
* Update Wear OS listing image
* Remove specific icon, we can use domain default
* Improve time zone sensor string
- Update string to reflect if the time zone is using summer/daylight savings time or not
- Use the user's language settings instead of always using English
* Keep using English for sensor state
- Catch any exceptions thrown during app registration (after webview login) instead of crashing. There should only be a few errors possible here that are not encountered in the webview.
- Set dialog theme to fix background on API <31
- Set the width of the LazyColumn, which provides the scrollable container for this screen, to the full width of the screen to also allow scrolling the screen when touching on the right of narrow buttons
* Check if device supports BLE transmitter
* Always send a state instead of blank string
* Add attribute if transmitter is supported instead of sensor availability
* Add transparent widgets
- Add options to the service, entity and template widgets to have a transparent background
- Register configuration change intent filter for widgets in order to be able to respond to day/night changes (no longer fully automatic due to setting color with int)
* Support Material You dynamic color in widgets
- In widgets that support theming (day/night or transparent), add an option to use Material You dynamic colors
- Dynamic colors is now the default widget style for new widgets on devices that support them
* Tweak dynamic color theming
- Update dynamic color values to better match other themed widgets such as those from Google
- Remove configuration changed intent receiver for widgets because it is no longer required to get colors
* Add dynamic color theming to media player widget
- Make the media player widget themeable and add an option to use dynamic colors (transparent doesn't make sense for this layout)
* Fix camera widget background if data cannot be loaded
* Add text size option to template widgets
- Added an option to set the text size to template widgets to better align with other widget options
* Additional Android 12 widget updates
- When using the dynamic color theme, also use the new Android 12 widget corner radius
- Update placeholder values in widgets to match images, and refer to dynamic color XML to provide a better preview on Android 12. Reset values when providing template to match existing behaviour when no widget is found in the database.
- Update entity state and template widget target size to 2x1 to match preview image
- Make sure media player album art doesn't extend past corner radius if possible
* Change theme selection to dropdown, text color alignment
- Change theme selection to use a dropdown menu (Spinner) instead of right-aligned radio buttons on multiple lines
- Change text color selection to left-align radio buttons
* Notification sensors: convert extra bundle arrays to lists
- If the notification extras contain any arrays, convert them to lists because when stringified, this will create a human readable text like "[Message 1, Message 2]" instead of something like "[Ljava.lang.String;@5d099f62"
* Convert BaseBundle arrays to lists as well
- Include array types that are in the superclass BaseBundle as well when converting values to a list
- Moved to another function to limit duplicated code
* Map bundles within a notification's bundle as well
- Also map any bundles we find inside a bundle, or if there is an array of bundles, to make this information readable as well
* Breaking change: send sensor list attributes as list to server
- Send a sensor attribute that is managed by the app as a list, to the server as a list as well instead of a stringified version of a list.
* Fallback to string for lists that include separator
- To prevent issues where we can't distinguish the list items separator from a value that includes the separator, don't try to convert a value to a list if that is the case but instead use string
* Improve string fallback for lists that include separator
- Instead of only falling back when a list includes a String with the separator, just use toString() to also support other objects which might include ", " when stringified, such as nested lists
* Store list data as JSON
- To remove any confusion when sending individual list items, store data as JSON to escape characters if necessary
- Map Any data in a list that is not any of the specific types to string, for consistency with the same types when not in a list and to prevent JSON serialization issues
* Ensure current mode is also supported for climate entities
* Don't crash when creating control fails
- Handle failures while creating a control gracefully: skip controls when showing all available controls, and show an error tile similar to network errors for existing controls
- Fix the Wear OS settings activity (seemingly) endlessly loading if there are no connected devices, by showing a proper error message for this situation
- Set title for Toolbar
- Show a chip suggesting the user to add the SSID of the currently connected network, if not already added to the list of home SSIDs, in the home SSID dialog
- Change icon for listed SSIDs in home SSID dialog to DKGRAY by default, and only show currently connected SSID icon in accent color
- Add missing contentDescription for ImageButtons
- Use correct tint namespace
- Update deprecated code