From 576f8c4a641ef58935e40bc3b1915272d36a7171 Mon Sep 17 00:00:00 2001 From: Vincent Elger Zwanenburg Date: Sat, 12 Jul 2025 16:52:38 +0100 Subject: [PATCH] HomeAssistantConfirmationDelegate and HomeAssistantPinConfirmationDelegate undo toggles on timeout and reject --- source/HomeAssistantConfirmation.mc | 27 ++++++++++++++-- source/HomeAssistantPinConfirmation.mc | 38 ++++++++++++++--------- source/HomeAssistantTapMenuItem.mc | 12 +++++-- source/HomeAssistantToggleMenuItem.mc | 14 +++++++-- source/WifiLteExecutionConfirmDelegate.mc | 12 +++---- 5 files changed, 76 insertions(+), 27 deletions(-) diff --git a/source/HomeAssistantConfirmation.mc b/source/HomeAssistantConfirmation.mc index 9b48714..a59829f 100644 --- a/source/HomeAssistantConfirmation.mc +++ b/source/HomeAssistantConfirmation.mc @@ -38,13 +38,25 @@ class HomeAssistantConfirmationDelegate extends WatchUi.ConfirmationDelegate { private var mConfirmMethod as Method(state as Lang.Boolean) as Void; private var mTimer as Timer.Timer or Null; private var mState as Lang.Boolean; + private var mToggleMethod as Method(state as Lang.Boolean) as Void or Null; //! Class Constructor + //! + //! @param options A dictionary describing the following options: + //! - callback Method to call on confirmation. + //! - state Wanted state of a toggle button. + //! - toggle Optional setEnabled method to untoggle ToggleItem. // - function initialize(callback as Method(state as Lang.Boolean) as Void, state as Lang.Boolean) { + function initialize(options as { + :callback as Method(state as Lang.Boolean) as Void, + :state as Lang.Boolean, + :toggleMethod as Method(state as Lang.Boolean) or Null, + }) { WatchUi.ConfirmationDelegate.initialize(); - mConfirmMethod = callback; - mState = state; + mConfirmMethod = options[:callback]; + mState = options[:state]; + mToggleMethod = options[:toggleMethod]; + var timeout = Settings.getConfirmTimeout(); // ms if (timeout > 0) { mTimer = new Timer.Timer(); @@ -64,6 +76,11 @@ class HomeAssistantConfirmationDelegate extends WatchUi.ConfirmationDelegate { } if (response == WatchUi.CONFIRM_YES) { mConfirmMethod.invoke(mState); + } else { + // Undo the toggle, if we have one + if (mToggleMethod != null) { + mToggleMethod.invoke(!mState); + } } return true; } @@ -71,6 +88,10 @@ class HomeAssistantConfirmationDelegate extends WatchUi.ConfirmationDelegate { //! Function supplied to a timer in order to limit the time for which the confirmation can be provided. function onTimeout() as Void { mTimer.stop(); + // Undo the toggle, if we have one + if (mToggleMethod != null) { + mToggleMethod.invoke(!mState); + } WatchUi.popView(WatchUi.SLIDE_RIGHT); } } diff --git a/source/HomeAssistantPinConfirmation.mc b/source/HomeAssistantPinConfirmation.mc index 0a01b99..2cb7501 100644 --- a/source/HomeAssistantPinConfirmation.mc +++ b/source/HomeAssistantPinConfirmation.mc @@ -185,21 +185,25 @@ class HomeAssistantPinConfirmationDelegate extends WatchUi.BehaviorDelegate { private var mTimer as Timer.Timer or Null; private var mState as Lang.Boolean; private var mFailures as PinFailures; + private var mToggleMethod as Method(state as Lang.Boolean) as Void or Null; private var mView as HomeAssistantPinConfirmationView; //! Class Constructor //! - //! @param callback Method to call on confirmation. - //! @param state Current state of a toggle button. - //! @param pin PIN to be matched. - //! @param view PIN confirmation view. + //! @param options A dictionary describing the following options: + //! - callback Method to call on confirmation. + //! - pin PIN to be matched. + //! - state Wanted state of a toggle button. + //! - toggle Optional setEnabled method to untoggle ToggleItem. + //! - view PIN confirmation view. // - function initialize( - callback as Method(state as Lang.Boolean) as Void, - state as Lang.Boolean, - pin as Lang.String, - view as HomeAssistantPinConfirmationView - ) { + function initialize(options as { + :callback as Method(state as Lang.Boolean) as Void, + :pin as Lang.String, + :state as Lang.Boolean, + :view as HomeAssistantPinConfirmationView, + :toggleMethod as (Method(state as Lang.Boolean) as Void) or Null, + }) { BehaviorDelegate.initialize(); mFailures = new PinFailures(); if (mFailures.isLocked()) { @@ -208,11 +212,13 @@ class HomeAssistantPinConfirmationDelegate extends WatchUi.BehaviorDelegate { WatchUi.loadResource($.Rez.Strings.Seconds); WatchUi.showToast(msg, {}); } - mPin = pin; + mPin = options[:pin]; mEnteredPin = ""; - mConfirmMethod = callback; - mState = state; - mView = view; + mConfirmMethod = options[:callback]; + mState = options[:state]; + mToggleMethod = options[:toggleMethod]; + mView = options[:view]; + resetTimer(); } @@ -279,6 +285,10 @@ class HomeAssistantPinConfirmationDelegate extends WatchUi.BehaviorDelegate { if (mTimer != null) { mTimer.stop(); } + // Undo the toggle, if we have one + if (mToggleMethod != null) { + mToggleMethod.invoke(!mState); + } WatchUi.popView(WatchUi.SLIDE_RIGHT); } diff --git a/source/HomeAssistantTapMenuItem.mc b/source/HomeAssistantTapMenuItem.mc index 88aabaa..0b57c25 100644 --- a/source/HomeAssistantTapMenuItem.mc +++ b/source/HomeAssistantTapMenuItem.mc @@ -82,14 +82,22 @@ class HomeAssistantTapMenuItem extends HomeAssistantMenuItem { var pinConfirmationView = new HomeAssistantPinConfirmationView(); WatchUi.pushView( pinConfirmationView, - new HomeAssistantPinConfirmationDelegate(method(:onConfirm), false, pin, pinConfirmationView), + new HomeAssistantPinConfirmationDelegate({ + :callback => method(:onConfirm), + :pin => pin, + :state => false, + :view => pinConfirmationView, + }), WatchUi.SLIDE_IMMEDIATE ); } } else if (mConfirm) { WatchUi.pushView( new HomeAssistantConfirmation(), - new HomeAssistantConfirmationDelegate(method(:onConfirm), false), + new HomeAssistantConfirmationDelegate({ + :callback => method(:onConfirm), + :state => false, + }), WatchUi.SLIDE_IMMEDIATE ); } else { diff --git a/source/HomeAssistantToggleMenuItem.mc b/source/HomeAssistantToggleMenuItem.mc index 6554598..7a41b4d 100644 --- a/source/HomeAssistantToggleMenuItem.mc +++ b/source/HomeAssistantToggleMenuItem.mc @@ -316,14 +316,24 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { var pinConfirmationView = new HomeAssistantPinConfirmationView(); WatchUi.pushView( pinConfirmationView, - new HomeAssistantPinConfirmationDelegate(method(:onConfirm), b, pin, pinConfirmationView), + new HomeAssistantPinConfirmationDelegate({ + :callback => method(:onConfirm), + :pin => pin, + :state => b, + :toggleMethod => method(:setEnabled), + :view => pinConfirmationView, + }), WatchUi.SLIDE_IMMEDIATE ); } } else if (mConfirm) { WatchUi.pushView( new HomeAssistantConfirmation(), - new HomeAssistantConfirmationDelegate(method(:onConfirm), b), + new HomeAssistantConfirmationDelegate({ + :callback => method(:onConfirm), + :state => b, + :toggleMethod => method(:setEnabled), + }), WatchUi.SLIDE_IMMEDIATE ); } else { diff --git a/source/WifiLteExecutionConfirmDelegate.mc b/source/WifiLteExecutionConfirmDelegate.mc index fc95304..1901403 100644 --- a/source/WifiLteExecutionConfirmDelegate.mc +++ b/source/WifiLteExecutionConfirmDelegate.mc @@ -43,12 +43,12 @@ class WifiLteExecutionConfirmDelegate extends WatchUi.ConfirmationDelegate { } mCommandData = { - :type => cOptions[:type], - :service => cOptions[:service], - :data => cOptions[:data], - :url => cOptions[:url], - :callback => cOptions[:callback], - :exit => cOptions[:exit] + :type => cOptions[:type], + :service => cOptions[:service], + :data => cOptions[:data], + :url => cOptions[:url], + :callback => cOptions[:callback], + :exit => cOptions[:exit] }; var timeout = Settings.getConfirmTimeout(); // ms