Module: Accessibility

Defined in:
lib/project/inspector.rb,
lib/project/constants.rb,
lib/project/motion-accessibility-console/tree.rb,
lib/project/motion-accessibility-console/touch.rb,
lib/project/motion-accessibility-console/browser.rb

Overview

Accessibility Inspector

Defined Under Namespace

Modules: Console

Constant Summary collapse

Data =
{}
Attributes =
{
:accessibility_label => :accessibilityLabel,
:accessibility_label= =>  :setAccessibilityLabel,
:accessibility_hint => :accessibilityHint,
:accessibility_hint= => :setAccessibilityHint,
:accessibility_traits => :accessibilityTraits,
:accessibility_traits= => :setAccessibilityTraits,
:accessibility_value => :accessibilityValue,
:accessibility_value= => :setAccessibilityValue,
:accessibility_language => :accessibilityLanguage,
:accessibility_language= => :setAccessibilityLanguage,
:accessibility_frame => :accessibilityFrame,
:accessibility_frame= => :setAccessibilityFrame,
:accessibility_activation_point => :accessibilityActivationPoint,
:accessibility_activation_point= => :setAccessibilityActivationPoint,
:accessibility_path => :accessibilityPath,
:accessibility_path= => :setAccessibilityPath,
:accessibility_view_is_modal => :accessibilityViewIsModal,
:accessibility_view_is_modal= => :setAccessibilityViewIsModal,
:accessibility_modal_view? => :accessibilityViewIsModal,
:should_group_accessibility_children => :shouldGroupAccessibilityChildren,
:group_accessibility_children? => :shouldGroupAccessibilityChildren,
:should_group_accessibility_children= => :setShouldGroupAccessibilityChildren,
:accessibility_elements => :accessibilityElements,
:accessibility_elements= => :setAccessibilityElements,
:accessibility_elements_hidden => :accessibilityElementsHidden,
:accessibility_elements_hidden? => :accessibilityElementsHidden,
:accessibility_elements_hidden= => :setAccessibilityElementsHidden,
:accessibility_element_did_become_focused => :accessibilityElementDidBecomeFocused,
:accessibility_element_did_lose_focus => :accessibilityElementDidLoseFocus,
:accessibility_element_is_focused => :accessibilityElementIsFocused,
:accessibility_element_focused? => :accessibilityElementIsFocused,
:accessibility_element? => :isAccessibilityElement,
:is_accessibility_element => :isAccessibilityElement,
:is_accessibility_element= => :setIsAccessibilityElement,
:accessibility_custom_actions => :accessibilityCustomActions,
:accessibility_custom_actions= => :setAccessibilityCustomActions,
:accessibility_identifier => :accessibilityIdentifier,
:accessibility_identifier= => :setAccessibilityIdentifier
}
Element_Attributes =
{
:container => :accessibilityContainer,
:container= => :setAccessibilityContainer,
:label => :accessibilityLabel,
:label= => :setAccessibilityLabel,
:hint => :accessibilityHint,
:hint= => :setAccessibilityHint,
:traits => :accessibilityTraits,
:value => :accessibilityValue,
:value= => :setAccessibilityValue,
:frame => :accessibilityFrame,
:frame= => :setAccessibilityFrame,
:did_become_focused => :accessibilityElementDidBecomeFocused,
:did_lose_focus => :accessibilityElementDidLoseFocus,
:is_focused => :accessibilityElementIsFocused,
:focused? => :accessibilityElementIsFocused
}
Watch_Attributes =
{
:accessibility_label= => :setAccessibilityLabel,
:accessibility_hint= => :setAccessibilityHint,
:accessibility_value= => :setAccessibilityValue,
:is_accessibility_element= => :setIsAccessibilityElement,
:accessibility_image_regions => :setAccessibilityImageRegions
}
Traits =
{
none: UIAccessibilityTraitNone,
button: UIAccessibilityTraitButton,
link: UIAccessibilityTraitLink,
search_field: UIAccessibilityTraitSearchField,
image: UIAccessibilityTraitImage,
selected: UIAccessibilityTraitSelected,
keyboard_key: UIAccessibilityTraitKeyboardKey,
static_text: UIAccessibilityTraitStaticText,
header: UIAccessibilityTraitHeader,
summary_element: UIAccessibilityTraitSummaryElement,
plays_sound: UIAccessibilityTraitPlaysSound,
starts_media_session: UIAccessibilityTraitStartsMediaSession,
updates_frequently: UIAccessibilityTraitUpdatesFrequently,
adjustable: UIAccessibilityTraitAdjustable,
allows_direct_interaction: UIAccessibilityTraitAllowsDirectInteraction,
causes_page_turn: UIAccessibilityTraitCausesPageTurn,
not_enabled: UIAccessibilityTraitNotEnabled
}
Speech_Attributes =
{}
PickerView_Attributes =
{
:accessibility_label_for_component => :accessibilityLabelForComponent,
:accessibility_abel_for_component= => :setAccessibilityLabelForComponent,
:accessibility_hint_for_component => :accessibilityHintForComponent,
:accessibility_hint_for_component= => :setAccessibilityHintForComponent
}
Container_Attributes =
{
:accessibility_element_count => :accessibilityElementCount,
:accessibility_element_at_index => :accessibilityElementAtIndex,
:index_of_accessibility_element => :indexOfAccessibilityElement
}
Reading_Content =
{
accessibility_content_for_line_number: :accessibilityContentForLineNumber,
accessibility_frame_for_line_number: :accessibilityFrameForLineNumber,
accessibility_line_number_for_point: :accessibilityLineNumberForPoint,
accessibility_page_content: :accessibilityPageContent
}
Actions =
{
:accessibility_decrement => :accessibilityDecrement,
:accessibility_increment => :accessibilityIncrement,
:accessibility_perform_escape => :accessibilityPerformEscape,
:accessibility_perform_magic_tap => :accessibilityPerformMagicTap,
:accessibility_scroll => :accessibilityScroll,
:accessibility_activate => :accessibilityActivate
}
All_Attributes =
Attributes.merge(Container_Attributes).merge(Reading_Content).merge(Actions)
Notifications =
{
:layout_changed => UIAccessibilityLayoutChangedNotification,
:screen_changed => UIAccessibilityScreenChangedNotification,
:page_scrolled => UIAccessibilityPageScrolledNotification,
:announcement => UIAccessibilityAnnouncementNotification,
:announcement_did_finish => UIAccessibilityAnnouncementDidFinishNotification,
:closed_captioning => UIAccessibilityClosedCaptioningStatusDidChangeNotification,
:guided_access => UIAccessibilityGuidedAccessStatusDidChangeNotification,
:invert_colors => UIAccessibilityInvertColorsStatusDidChangeNotification,
:mono_audio => UIAccessibilityMonoAudioStatusDidChangeNotification,
:voiceover => UIAccessibilityVoiceOverStatusChanged
}
IOS8_Notifications =
{
	:bold_text => UIAccessibilityBoldTextStatusDidChangeNotification,
	:darker_colors => UIAccessibilityDarkerSystemColorsStatusDidChangeNotification,
	:grayscale => UIAccessibilityGrayscaleStatusDidChangeNotification,
	:reduce_motion => UIAccessibilityReduceMotionStatusDidChangeNotification,
	:reduce_transparency => UIAccessibilityReduceTransparencyStatusDidChangeNotification,
	:speak_screen => UIAccessibilitySpeakScreenStatusDidChangeNotification,
	:speak_selection => UIAccessibilitySpeakSelectionStatusDidChangeNotification,
:switch_control => UIAccessibilitySwitchControlStatusDidChangeNotification,
:switch_control_identifier => UIAccessibilityNotificationSwitchControlIdentifier,
:pause_assistive_technology => UIAccessibilityPauseAssistiveTechnologyNotification,
:resume_assistive_technology => UIAccessibilityResumeAssistiveTechnologyNotification
}
Scroll_Directions =
{
:right => UIAccessibilityScrollDirectionRight,
:left => UIAccessibilityScrollDirectionLeft,
:up => UIAccessibilityScrollDirectionUp,
:down => UIAccessibilityScrollDirectionDown,
:next => UIAccessibilityScrollDirectionNext,
:previous => UIAccessibilityScrollDirectionPrevious
}
Zoom =
{
:announcement_key_string_value => UIAccessibilityAnnouncementKeyStringValue,
:announcement_key_was_successful => UIAccessibilityAnnouncementKeyWasSuccessful
}
Attribute_Types =
{
:accessibilityIdentifier =>:string,
:accessibilityLabel => :string,
:accessibilityHint => :string,
:accessibilityTraits => :fixnum,
:accessibilityValue=>:string,
:accessibilityLanguage=>:string,
:accessibilityFrame=>:cgrect,
:accessibilityActivationPoint=>:cgpoint,
:accessibilityPath => :uibezierpath,
:accessibilityViewIsModal=>:boolean,
:shouldGroupAccessibilityChildren=>:boolean,
:accessibilityElementsHidden=>:boolean,
:isAccessibilityElement=>:boolean,
:accessibilityElements => :accessibility_elements,
:accessibilityCustomActions => :accessibility_custom_actions
}
Default_Type_Values =
{
:string => "Testing",
:boolean => true,
:fixnum => 23,
:cgrect=>CGRectMake(0,0,100,100),
:cgpoint=>CGPointMake(100,100),
:accessibility_elements => [UIView.new],
:accessibility_custom_actions => [UIAccessibilityCustomAction.alloc.initWithName("Test", target: self, selector: 'test')]
}
Defined_Attributes =
Hash.new
Touchable_Types =
["UITextField", "UIButton", "UIPickerView", "UIDatePicker",
"UISegmentedControl", "UISlider", "UIStepper", "UISwitch",
"UITableViewCell", "UITableViewCellAccessibilityElement", "UITabBarButton","UINavigationItemButtonView"]
Ignored_Views =
["UILayoutContainerView", "UITransitionView", "UINavigationTransitionView", "UIViewControllerWrapperView", "UITableViewCellContentView", "UINavigationItemView", "UITableViewWrapperView"]
Ignored_ImageViews =
["UINavigationBar", "UITabBar", "UITableView"]
Reverse_Views =
["UINavigationBar", "UITabBar"]
View_Names =
{"UINavigationItemButtonView" => "Back Button"}
Custom_Action =
UIAccessibilityCustomAction

Class Method Summary collapse

Class Method Details

.attribute_type(attribute) ⇒ Object



216
217
218
# File 'lib/project/constants.rb', line 216

def self.attribute_type(attribute)
Attribute_Types[attribute]||nil
end

.defined_attribute(class_name, attribute) ⇒ Object



222
223
224
225
# File 'lib/project/constants.rb', line 222

def self.defined_attribute(class_name, attribute)
Defined_Attributes[class_name]||=Array.new
Defined_Attributes[class_name]<<attribute
end

.defined_attribute?(class_name, attribute) ⇒ Boolean

Returns:

  • (Boolean)


227
228
229
230
231
# File 'lib/project/constants.rb', line 227

def self.defined_attribute?(class_name, attribute)
attributes=Defined_Attributes[class_name]
return false if attributes.nil?
attributes.member?(attribute)
end

.inspect(obj) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/project/inspector.rb', line 5

def self.inspect(obj)
	return self.inspect(obj.get) if obj.is_a?(RubyMotionQuery::RMQ)
displayed=[]
if obj.class==Accessibility::Element
attributes=A11y::Element_Attributes.dup
else
attributes=Accessibility::All_Attributes.dup
attributes.merge(Accessibility::PickerView_Attributes) if obj.class==UIPickerView
end
puts obj.inspect
attributes.each do |ruby,ios|
next if ios=~/^set/
next if displayed.member?(ios)
self.inspect_accessibility_attribute(obj,ios)
displayed<<ios
end
puts "Accessibility test: #{obj.accessibility_test}" if obj.accessibility_test
puts "Accessibility container: #{obj.accessibility_element_count} elements" if obj.accessibility_element_container?
puts "Accessible: #{obj.accessible?}"
A11y.doctor
end

.inspect_accessibility_attribute(obj, attribute) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/project/inspector.rb', line 27

def self.inspect_accessibility_attribute(obj,attribute)
name=attribute.gsub(/(.)([A-Z])/,'\1 \2').capitalize
if Accessibility::Attribute_Types.member?(attribute)
begin
case attribute
when :accessibilityTraits then value=self.inspect_accessibility_traits(obj)
else
value=obj.send(attribute)
end
if value
case Accessibility.attribute_type(attribute)
when :boolean 
value=true if value==1
value=false if value==0||value.nil?
when :cgrect then value="x=#{value.origin.x.round(1)} y=#{value.origin.y.round(1)} width=#{value.size.width.round(1)} height=#{value.size.height.round(1)}"
when :cgpoint then value="x=#{value.x.round(1)} y=#{value.y.round(1)}"
when :uibezierpath then value="x=#{value.bounds.origin.x.round(1)} y=#{value.bounds.origin.y.round(1)} width=#{value.bounds.size.width.round(1)} height=#{value.bounds.size.height.round(1)}"
when :accessibility_elements then value=value.map {|v| v.accessibility_label}
when :accessibility_custom_actions then value=value.map {|a| a.name}
end
else
value="nil" if value.nil?
end
rescue
value="Error: #{$!}"
end
puts "#{name}: #{value}"
elsif Accessibility.defined_attribute?(self.class,attribute)
puts "#{name}: Defined"
end
end

.inspect_accessibility_traits(obj) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/project/inspector.rb', line 59

def self.inspect_accessibility_traits(obj)
	return obj.accessibilityTraits if obj.accessibilityTraits>Accessibility::Traits.values.max
traits=[]
Accessibility::Traits.each do |trait, bitmask|
if obj.accessibilityTraits&bitmask>0
name=trait.gsub(/_/,' ').capitalize
traits<<name
end
end
traits=["None"] if traits.empty?
	traits.join(', ')
end

.post_notification(notification, *args) ⇒ Object



163
164
165
166
167
168
169
170
171
172
# File 'lib/project/constants.rb', line 163

def Accessibility.post_notification(notification, *args)
if(notification.kind_of?(Fixnum))
UIAccessibilityPostNotification(notification, *args)
elsif(notification.kind_of?(Symbol))
raise "You cannot post #{notification} as an accessibility notification" unless Notifications[notification].kind_of?(Fixnum)
UIAccessibilityPostNotification(Notifications[notification], *args)
else
raise "Unknown accessibility notification #{notification}"
end
end