diff --git a/HISTORY.md b/HISTORY.md index e844011..c231809 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -59,3 +59,4 @@ | 3.11 |
Better handling of menus larger than the Glance view can handle. As a result the Glance can no longer verify the availability of the JSON menu as fetching it might cause an _"Error: Out Of Memory Error"_. Provide two user supplied HTTP Headers. Bug fix for the numeric picker. | | 3.12 | Amended GPS accuracy values used by the background service. | | 3.13 | Added support for new devices: `d2mach2pro`, `fr170`, `fr170m`, `fr70`. | +| 3.14 | Numeric items now support `tap_action.data` fields so service call options like `transition` are catered for. See the documentation on [Additional Action Data](https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/examples/Numeric.md#additional-action-data). This features has been provided by [@StumblingGamer](https://github.com/StumblingGamer). Now prevent PIN enabled menu items from being enabled on non-touch screen devices. The PIN must be removed for the menu item to function. Fix for initialising numeric pickers with no user defined template. | \ No newline at end of file diff --git a/config.schema.json b/config.schema.json index 01f701c..9c0dc49 100644 --- a/config.schema.json +++ b/config.schema.json @@ -251,7 +251,8 @@ "$ref": "#/$defs/content" }, "tap_action": { - "$ref": "#/$defs/tap_action", + "title": "Tap Action", + "description": "Numeric tap action definition to include the number picker. 'confirm', 'pin' and 'exit' fields are optional.", "properties": { "action": { "$ref": "#/$defs/action" @@ -294,13 +295,24 @@ "max", "step", "data_attribute" - ] + ], + "additionalProperties": false + }, + "confirm": { + "$ref": "#/$defs/confirm" + }, + "pin": { + "$ref": "#/$defs/pin" + }, + "exit": { + "$ref": "#/$defs/exit" } }, "required": [ "action", "picker" - ] + ], + "additionalProperties": false }, "enabled": { "$ref": "#/$defs/enabled" @@ -987,7 +999,7 @@ "tap_action": { "type": "object", "title": "Tap Action", - "description": "'confirm' and 'pin' fields are optional.", + "description": "'confirm', 'pin' and 'exit' fields are optional.", "properties": { "confirm": { "$ref": "#/$defs/confirm" diff --git a/source/HomeAssistantMenuItemFactory.mc b/source/HomeAssistantMenuItemFactory.mc index 5060c5c..e53dcf7 100644 --- a/source/HomeAssistantMenuItemFactory.mc +++ b/source/HomeAssistantMenuItemFactory.mc @@ -112,7 +112,7 @@ class HomeAssistantMenuItemFactory { label as Lang.String or Lang.Symbol, entity_id as Lang.String?, template as Lang.String?, - action as Lang.String?, + action as Lang.String?, data as Lang.Dictionary?, options as { :exit as Lang.Boolean, diff --git a/source/HomeAssistantView.mc b/source/HomeAssistantView.mc index 60c8cff..61dac5d 100644 --- a/source/HomeAssistantView.mc +++ b/source/HomeAssistantView.mc @@ -133,23 +133,39 @@ class HomeAssistantView extends WatchUi.Menu2 { )); } } else if (type.equals("numeric") && action != null) { - if (tap_action != null) { - var picker = tap_action.get("picker") as Lang.Dictionary?; - if (picker != null) { - addItem(HomeAssistantMenuItemFactory.create().numeric( - name, - entity, - content, - action, - data, - picker, - { - :exit => exit, - :confirm => confirm, - :pin => pin - } - )); + if (System.getDeviceSettings().isTouchScreen) { + // Numeric items are only actionable on touch screen devices. + if (tap_action != null) { + var picker = tap_action.get("picker") as Lang.Dictionary?; + if (picker != null) { + addItem(HomeAssistantMenuItemFactory.create().numeric( + name, + entity, + content, + action, + data, + picker, + { + :exit => exit, + :confirm => confirm, + :pin => pin + } + )); + } } + } else { + addItem(HomeAssistantMenuItemFactory.create().tap( + "PIN requires Touchscreen", + null, + null, + null, + data, + { + :exit => false, + :confirm => false, + :pin => false + } + )); } } else if (type.equals("info") && content != null) { // Cannot exit from a non-actionable information only menu item. @@ -193,11 +209,9 @@ class HomeAssistantView extends WatchUi.Menu2 { } fullList.addAll(item.getMenuView().getItemsToUpdate()); } else if (item instanceof HomeAssistantNumericMenuItem) { - // Numeric items can have an optional template to evaluate - var nmi = item as HomeAssistantNumericMenuItem; - if (nmi.hasTemplate()) { - fullList.add(item); - } + // Numeric items can have an optional template to evaluate, but they must always be included in order + // to initialise the numeric picker's value. + fullList.add(item); } else if (item instanceof HomeAssistantToggleMenuItem) { fullList.add(item); } else if (item instanceof HomeAssistantTapMenuItem) {