Skip to content

Commit

Permalink
[BottomNavigation] Support accessibilityLabel, accessibilityHint,…
Browse files Browse the repository at this point in the history
… and `isAccessibilityElement` (#5736)

BottomNavigation tab views were not reflecting some of the UIAccessibility properties of the UITabBarItem objects used to create them. This PR adds support for `accessibilityLabel`, `accessibilityHint`, and `isAccessibilityElement`, including Key-Value Observing (KVO) of changes to the UITabBarItem's properties.
  • Loading branch information
andrewplai authored and andrewoverton committed Nov 19, 2018
1 parent a063cd7 commit 0affb85
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 1 deletion.
28 changes: 27 additions & 1 deletion components/BottomNavigation/src/MDCBottomNavigationBar.m
Expand Up @@ -43,7 +43,9 @@
static NSString *const kMDCBottomNavigationBarNewString = @"new";
static NSString *const kMDCBottomNavigationBarTitleString = @"title";
static NSString *const kMDCBottomNavigationBarAccessibilityIdentifier = @"accessibilityIdentifier";

static NSString *const kMDCBottomNavigationBarAccessibilityLabel = @"accessibilityLabel";
static NSString *const kMDCBottomNavigationBarAccessibilityHint = @"accessibilityHint";
static NSString *const kMDCBottomNavigationBarIsAccessibilityElement = @"isAccessibilityElement";

static NSString *const kMDCBottomNavigationBarOfAnnouncement = @"of";

Expand Down Expand Up @@ -256,6 +258,18 @@ - (void)addObserversToTabBarItems {
forKeyPath:kMDCBottomNavigationBarAccessibilityIdentifier
options:NSKeyValueObservingOptionNew
context:nil];
[item addObserver:self
forKeyPath:kMDCBottomNavigationBarAccessibilityLabel
options:NSKeyValueObservingOptionNew
context:nil];
[item addObserver:self
forKeyPath:kMDCBottomNavigationBarAccessibilityHint
options:NSKeyValueObservingOptionNew
context:nil];
[item addObserver:self
forKeyPath:kMDCBottomNavigationBarIsAccessibilityElement
options:NSKeyValueObservingOptionNew
context:nil];
}
}

Expand All @@ -271,6 +285,9 @@ - (void)removeObserversFromTabBarItems {
forKeyPath:kMDCBottomNavigationBarSelectedImageString];
[item removeObserver:self forKeyPath:kMDCBottomNavigationBarTitleString];
[item removeObserver:self forKeyPath:kMDCBottomNavigationBarAccessibilityIdentifier];
[item removeObserver:self forKeyPath:kMDCBottomNavigationBarAccessibilityLabel];
[item removeObserver:self forKeyPath:kMDCBottomNavigationBarAccessibilityHint];
[item removeObserver:self forKeyPath:kMDCBottomNavigationBarIsAccessibilityElement];
}
@catch (NSException *exception) {
if (exception) {
Expand Down Expand Up @@ -309,6 +326,12 @@ - (void)observeValueForKeyPath:(NSString *)keyPath
itemView.title = change[kMDCBottomNavigationBarNewString];
} else if ([keyPath isEqualToString:kMDCBottomNavigationBarAccessibilityIdentifier]) {
itemView.accessibilityIdentifier = change[kMDCBottomNavigationBarNewString];
} else if ([keyPath isEqualToString:kMDCBottomNavigationBarAccessibilityLabel]) {
itemView.accessibilityLabel = change[kMDCBottomNavigationBarNewString];
} else if ([keyPath isEqualToString:kMDCBottomNavigationBarAccessibilityHint]) {
itemView.accessibilityHint = change[kMDCBottomNavigationBarNewString];
} else if ([keyPath isEqualToString:kMDCBottomNavigationBarIsAccessibilityElement]) {
itemView.isAccessibilityElement = [change[kMDCBottomNavigationBarNewString] boolValue];
}
}
}
Expand Down Expand Up @@ -405,6 +428,9 @@ - (void)setItems:(NSArray<UITabBarItem *> *)items {
itemView.titleBelowIcon = self.titleBelowItem;
itemView.accessibilityValue = item.accessibilityValue;
itemView.accessibilityIdentifier = item.accessibilityIdentifier;
itemView.accessibilityLabel = item.accessibilityLabel;
itemView.accessibilityHint = item.accessibilityHint;
itemView.isAccessibilityElement = item.isAccessibilityElement;
itemView.contentInsets = self.itemsContentInsets;
itemView.contentVerticalMargin = self.itemsContentVerticalMargin;
itemView.contentHorizontalMargin = self.itemsContentHorizontalMargin;
Expand Down
84 changes: 84 additions & 0 deletions components/BottomNavigation/tests/unit/BottomNavigationTests.m
Expand Up @@ -145,6 +145,90 @@ - (void)testAccessibilityIdentifier {
XCTAssert([bar.itemViews.firstObject.accessibilityIdentifier isEqualToString:newIdentifier]);
}

- (void)testAccessibilityLabelInitialValue {
// Given
NSString *initialLabel = @"initialLabel";
UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:nil tag:0];
tabBarItem.accessibilityLabel = initialLabel;
MDCBottomNavigationBar *bar = [[MDCBottomNavigationBar alloc] init];
// When
bar.items = @[ tabBarItem ];

// Then
XCTAssert([bar.itemViews.firstObject.accessibilityLabel isEqualToString:initialLabel]);
}

- (void)testAccessibilityLabelValueChanged {
// Given
NSString *oldLabel = @"oldLabel";
NSString *newLabel = @"newLabel";
UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:nil tag:0];
tabBarItem.accessibilityLabel = oldLabel;
MDCBottomNavigationBar *bar = [[MDCBottomNavigationBar alloc] init];
bar.items = @[ tabBarItem ];

// When
tabBarItem.accessibilityLabel = newLabel;

// Then
XCTAssert([bar.itemViews.firstObject.accessibilityLabel isEqualToString:newLabel]);
}

- (void)testAccessibilityHintInitialValue {
// Given
NSString *initialHint = @"initialHint";
UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:nil tag:0];
tabBarItem.accessibilityHint = initialHint;
MDCBottomNavigationBar *bar = [[MDCBottomNavigationBar alloc] init];
// When
bar.items = @[ tabBarItem ];

// Then
XCTAssert([bar.itemViews.firstObject.accessibilityHint isEqualToString:initialHint]);
}

- (void)testAccessibilityHintValueChanged {
// Given
NSString *oldHint = @"oldHint";
NSString *newHint = @"newHint";
UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:nil tag:0];
tabBarItem.accessibilityHint = oldHint;
MDCBottomNavigationBar *bar = [[MDCBottomNavigationBar alloc] init];
bar.items = @[ tabBarItem ];

// When
tabBarItem.accessibilityHint = newHint;

// Then
XCTAssert([bar.itemViews.firstObject.accessibilityHint isEqualToString:newHint]);
}

- (void)testIsAccessibilityElementInitialValue {
// Given
UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:nil tag:0];
tabBarItem.isAccessibilityElement = NO;
MDCBottomNavigationBar *bar = [[MDCBottomNavigationBar alloc] init];
// When
bar.items = @[ tabBarItem ];

// Then
XCTAssert(!bar.itemViews.firstObject.isAccessibilityElement);
}

- (void)testIsAccessibilityElementValueChanged {
// Given
UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:nil tag:0];
tabBarItem.isAccessibilityElement = NO;
MDCBottomNavigationBar *bar = [[MDCBottomNavigationBar alloc] init];
bar.items = @[ tabBarItem ];

// When
tabBarItem.isAccessibilityElement = YES;

// Then
XCTAssert(bar.itemViews.firstObject.isAccessibilityElement);
}

-(void)testTitleVisibility {
UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"1" image:nil tag:0];
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"2" image:nil tag:0];
Expand Down

0 comments on commit 0affb85

Please sign in to comment.