| @@ -418,6 +418,7 @@ constexpr NameAndRole accessibilityRoles[] | |||||
| { "Ignored", AccessibilityRole::ignored }, | { "Ignored", AccessibilityRole::ignored }, | ||||
| { "Unspecified", AccessibilityRole::unspecified }, | { "Unspecified", AccessibilityRole::unspecified }, | ||||
| { "Button", AccessibilityRole::button }, | { "Button", AccessibilityRole::button }, | ||||
| { "Toggle", AccessibilityRole::toggleButton }, | |||||
| { "ComboBox", AccessibilityRole::comboBox }, | { "ComboBox", AccessibilityRole::comboBox }, | ||||
| { "Slider", AccessibilityRole::slider }, | { "Slider", AccessibilityRole::slider }, | ||||
| { "Static Text", AccessibilityRole::staticText }, | { "Static Text", AccessibilityRole::staticText }, | ||||
| @@ -354,7 +354,8 @@ public: | |||||
| isSelected ? ACTION_CLEAR_SELECTION : ACTION_SELECT); | isSelected ? ACTION_CLEAR_SELECTION : ACTION_SELECT); | ||||
| } | } | ||||
| if (accessibilityHandler.getActions().contains (AccessibilityActionType::press)) | |||||
| if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().contains (AccessibilityActionType::toggle)) | |||||
| || accessibilityHandler.getActions().contains (AccessibilityActionType::press)) | |||||
| { | { | ||||
| env->CallVoidMethod (info, | env->CallVoidMethod (info, | ||||
| AndroidAccessibilityNodeInfo.setClickable, | AndroidAccessibilityNodeInfo.setClickable, | ||||
| @@ -480,7 +481,8 @@ public: | |||||
| case ACTION_CLICK: | case ACTION_CLICK: | ||||
| { | { | ||||
| if (accessibilityHandler.getActions().invoke (AccessibilityActionType::press)) | |||||
| if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().invoke (AccessibilityActionType::toggle)) | |||||
| || accessibilityHandler.getActions().invoke (AccessibilityActionType::press)) | |||||
| { | { | ||||
| sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0); | sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0); | ||||
| return true; | return true; | ||||
| @@ -403,7 +403,7 @@ private: | |||||
| // which element it thinks has focus and forward the event on to that element if it differs | // which element it thinks has focus and forward the event on to that element if it differs | ||||
| id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier); | id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier); | ||||
| if (! [(id) handler->getNativeImplementation() isEqual: focusedElement]) | |||||
| if (focusedElement != nullptr && ! [(id) handler->getNativeImplementation() isEqual: focusedElement]) | |||||
| return [focusedElement accessibilityActivate]; | return [focusedElement accessibilityActivate]; | ||||
| if (handler->hasFocus (false)) | if (handler->hasFocus (false)) | ||||
| @@ -797,7 +797,8 @@ private: | |||||
| continue; | continue; | ||||
| if (selector == @selector (accessibilityPerformPress)) | if (selector == @selector (accessibilityPerformPress)) | ||||
| return handler->getActions().contains (AccessibilityActionType::press); | |||||
| return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle)) | |||||
| || handler->getActions().contains (AccessibilityActionType::press); | |||||
| if (selector == @selector (accessibilityPerformShowMenu)) | if (selector == @selector (accessibilityPerformShowMenu)) | ||||
| return handler->getActions().contains (AccessibilityActionType::showMenu); | return handler->getActions().contains (AccessibilityActionType::showMenu); | ||||
| @@ -126,6 +126,10 @@ protected: | |||||
| static BOOL accessibilityPerformPress (id self, SEL) | static BOOL accessibilityPerformPress (id self, SEL) | ||||
| { | { | ||||
| if (auto* handler = getHandler (self)) | |||||
| if (handler->getCurrentState().isCheckable() && handler->getActions().invoke (AccessibilityActionType::toggle)) | |||||
| return YES; | |||||
| return performActionIfSupported (self, AccessibilityActionType::press); | return performActionIfSupported (self, AccessibilityActionType::press); | ||||
| } | } | ||||
| @@ -189,8 +189,9 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn | |||||
| } | } | ||||
| case UIA_TogglePatternId: | case UIA_TogglePatternId: | ||||
| { | { | ||||
| if (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle) | |||||
| && accessibilityHandler.getCurrentState().isCheckable()) | |||||
| if (accessibilityHandler.getCurrentState().isCheckable() | |||||
| && (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle) | |||||
| || accessibilityHandler.getActions().contains (AccessibilityActionType::press))) | |||||
| { | { | ||||
| return new UIAToggleProvider (this); | return new UIAToggleProvider (this); | ||||
| } | } | ||||
| @@ -44,7 +44,8 @@ public: | |||||
| const auto& handler = getHandler(); | const auto& handler = getHandler(); | ||||
| if (handler.getActions().invoke (AccessibilityActionType::toggle)) | |||||
| if (handler.getActions().invoke (AccessibilityActionType::toggle) | |||||
| || handler.getActions().invoke (AccessibilityActionType::press)) | |||||
| { | { | ||||
| VARIANT newValue; | VARIANT newValue; | ||||
| VariantHelpers::setInt (getCurrentToggleState(), &newValue); | VariantHelpers::setInt (getCurrentToggleState(), &newValue); | ||||