summaryrefslogtreecommitdiff
path: root/platform/ios/src/MGLMapAccessibilityElement.m
blob: b0170a850603fd90f389519dfb10274cce0d931e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#import "MGLMapAccessibilityElement.h"
#import "MGLDistanceFormatter.h"
#import "MGLFeature.h"
#import "MGLVectorSource+MGLAdditions.h"

#import "NSBundle+MGLAdditions.h"

@implementation MGLMapAccessibilityElement

- (instancetype)initWithAccessibilityContainer:(id)container {
    if (self = [super initWithAccessibilityContainer:container]) {
        self.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitAdjustable;
    }
    return self;
}

- (void)accessibilityIncrement {
    [self.accessibilityContainer accessibilityIncrement];
}

- (void)accessibilityDecrement {
    [self.accessibilityContainer accessibilityDecrement];
}

@end

@implementation MGLAnnotationAccessibilityElement

- (instancetype)initWithAccessibilityContainer:(id)container tag:(MGLAnnotationTag)tag {
    if (self = [super initWithAccessibilityContainer:container]) {
        _tag = tag;
        self.accessibilityHint = NSLocalizedStringWithDefaultValue(@"ANNOTATION_A11Y_HINT", nil, nil, @"Shows more info", @"Accessibility hint");
    }
    return self;
}

@end

@implementation MGLFeatureAccessibilityElement

- (instancetype)initWithAccessibilityContainer:(id)container feature:(id<MGLFeature>)feature {
    if (self = [super initWithAccessibilityContainer:container]) {
        _feature = feature;
        
        NSDictionary *attributes = feature.attributes;
        NSString *nameAttribute = [NSString stringWithFormat:@"name_%@",
                                   [MGLVectorSource preferredMapboxStreetsLanguage]];
        self.accessibilityLabel = attributes[nameAttribute];
        
        NSMutableArray *facts = [NSMutableArray array];
        
        // Announce the kind of place or POI.
        if (attributes[@"type"]) {
            // FIXME: Unfortunately, these types aren’t a closed set that can be
            // localized, since they’re based on OpenStreetMap tags.
            NSString *type = [attributes[@"type"] stringByReplacingOccurrencesOfString:@"_"
                                                                            withString:@" "];
            [facts addObject:type];
        }
        // Announce the kind of airport, rail station, or mountain based on its
        // Maki image name.
        else if (attributes[@"maki"]) {
            // TODO: Localize Maki image names.
            [facts addObject:attributes[@"maki"]];
        }
        
        NSNumber *elevation = attributes[@"elevation_m"];
        if (elevation) {
            MGLDistanceFormatter *formatter = [[MGLDistanceFormatter alloc] init];
            formatter.unitStyle = NSFormattingUnitStyleLong;
            [facts addObject:[formatter stringFromDistance:elevation.doubleValue]];
        }
        
        if (facts.count) {
            NSString *separator = NSLocalizedStringWithDefaultValue(@"LIST_SEPARATOR", nil, nil, @", ", @"List separator");
            self.accessibilityValue = [facts componentsJoinedByString:separator];
        }
    }
    return self;
}

@end

@implementation MGLMapViewProxyAccessibilityElement

- (instancetype)initWithAccessibilityContainer:(id)container {
    if (self = [super initWithAccessibilityContainer:container]) {
        self.accessibilityTraits = UIAccessibilityTraitButton;
        self.accessibilityLabel = [self.accessibilityContainer accessibilityLabel];
        self.accessibilityHint = NSLocalizedStringWithDefaultValue(@"CLOSE_CALLOUT_A11Y_HINT", nil, nil, @"Returns to the map", @"Accessibility hint for closing the selected annotation’s callout view and returning to the map");
    }
    return self;
}

@end