summaryrefslogtreecommitdiff
path: root/StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios
diff options
context:
space:
mode:
Diffstat (limited to 'StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios')
-rw-r--r--StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.h82
-rw-r--r--StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.m511
2 files changed, 593 insertions, 0 deletions
diff --git a/StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.h b/StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.h
new file mode 100644
index 00000000..662abbea
--- /dev/null
+++ b/StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.h
@@ -0,0 +1,82 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+#import <Cordova/CDVPlugin.h>
+
+static const int BASE_UI_FONT_TEXT_STYLE_BODY_POINT_SIZE = 16;
+
+@interface CDVMobileAccessibility : CDVPlugin {
+ NSString* callbackId;
+ NSString* commandCallbackId;
+ BOOL boldTextEnabled;
+ BOOL closedCaptioningEnabled;
+ BOOL darkerSystemColorsEnabled;
+ BOOL grayscaleEnabled;
+ BOOL guidedAccessEnabled;
+ BOOL invertColorsEnabled;
+ BOOL monoAudioEnabled;
+ BOOL reduceMotionEnabled;
+ BOOL reduceTransparencyEnabled;
+ BOOL speakScreenEnabled;
+ BOOL speakSelectionEnabled;
+ BOOL switchControlRunning;
+ BOOL voiceOverRunning;
+}
+
+@property (strong) NSString* callbackId;
+@property (strong) NSString* commandCallbackId;
+@property BOOL boldTextEnabled;
+@property BOOL closedCaptioningEnabled;
+@property BOOL darkerSystemColorsEnabled;
+@property BOOL grayscaleEnabled;
+@property BOOL guidedAccessEnabled;
+@property BOOL invertColorsEnabled;
+@property BOOL monoAudioEnabled;
+@property BOOL reduceMotionEnabled;
+@property BOOL reduceTransparencyEnabled;
+@property BOOL speakScreenEnabled;
+@property BOOL speakSelectionEnabled;
+@property BOOL switchControlRunning;
+@property BOOL voiceOverRunning;
+@property double mFontScale;
+
+
+- (void) isBoldTextEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isClosedCaptioningEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isDarkerSystemColorsEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isGrayscaleEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isGuidedAccessEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isInvertColorsEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isMonoAudioEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isReduceMotionEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isReduceTransparencyEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isScreenReaderRunning:(CDVInvokedUrlCommand*)command;
+- (void) isSpeakScreenEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isSpeakSelectionEnabled:(CDVInvokedUrlCommand*)command;
+- (void) isSwitchControlRunning:(CDVInvokedUrlCommand*)command;
+- (void) getTextZoom:(CDVInvokedUrlCommand*)command;
+- (void) setTextZoom:(CDVInvokedUrlCommand*)command;
+- (void) updateTextZoom:(CDVInvokedUrlCommand*)command;
+- (void) postNotification:(CDVInvokedUrlCommand*)command;
+- (void) start:(CDVInvokedUrlCommand*)command;
+- (void) stop:(CDVInvokedUrlCommand*)command;
+
+@end \ No newline at end of file
diff --git a/StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.m b/StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.m
new file mode 100644
index 00000000..ad8da029
--- /dev/null
+++ b/StoneIsland/plugins/phonegap-plugin-mobile-accessibility/src/ios/CDVMobileAccessibility.m
@@ -0,0 +1,511 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+#import "CDVMobileAccessibility.h"
+#import <Cordova/CDVAvailability.h>
+#import <MediaAccessibility/MediaAccessibility.h>
+
+@interface CDVMobileAccessibility ()
+ // add any property overrides
+ -(double) mGetTextZoom;
+ -(void) mSetTextZoom:(double)zoom;
+@end
+
+@implementation CDVMobileAccessibility
+
+@synthesize callbackId;
+@synthesize commandCallbackId;
+@synthesize boldTextEnabled;
+@synthesize closedCaptioningEnabled;
+@synthesize darkerSystemColorsEnabled;
+@synthesize grayscaleEnabled;
+@synthesize guidedAccessEnabled;
+@synthesize invertColorsEnabled;
+@synthesize monoAudioEnabled;
+@synthesize reduceMotionEnabled;
+@synthesize reduceTransparencyEnabled;
+@synthesize speakScreenEnabled;
+@synthesize speakSelectionEnabled;
+@synthesize switchControlRunning;
+@synthesize voiceOverRunning;
+@synthesize mFontScale;
+
+#define iOS7Delta (([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 ) ? 20 : 0 )
+#define iOS8Delta (([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 ) ? 30 : 0 )
+
+// //////////////////////////////////////////////////
+
+- (id)settingForKey:(NSString*)key
+{
+ return [self.commandDelegate.settings objectForKey:[key lowercaseString]];
+}
+
+- (void)pluginInitialize
+{
+ // SETTINGS ////////////////////////
+
+ NSString* setting = nil;
+
+ setting = @"YourConfigXmlSettingHere";
+ if ([self settingForKey:setting]) {
+ // set your setting, other init here
+ }
+
+ mFontScale = 1;
+
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil];
+
+}
+
+// //////////////////////////////////////////////////
+
+- (void)dealloc
+{
+ [self stop:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
+}
+
+- (void)onReset
+{
+ [self stop:nil];
+}
+
+- (void) onPause {
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil];
+}
+
+- (void)onResume
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onApplicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
+}
+
+- (void)onApplicationDidBecomeActive
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
+ [self performSelector:@selector(sendMobileAccessibilityStatusChangedCallback) withObject:nil afterDelay:0.1 ];
+}
+
+// //////////////////////////////////////////////////
+
+#pragma Plugin interface
+
+- (void)isBoldTextEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.boldTextEnabled = UIAccessibilityIsBoldTextEnabled();
+ } else {
+ self.boldTextEnabled = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.boldTextEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isClosedCaptioningEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ self.closedCaptioningEnabled = [self getClosedCaptioningEnabledStatus];
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.closedCaptioningEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isDarkerSystemColorsEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.darkerSystemColorsEnabled = UIAccessibilityDarkerSystemColorsEnabled();
+ } else {
+ self.darkerSystemColorsEnabled = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.darkerSystemColorsEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isGrayscaleEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.grayscaleEnabled = UIAccessibilityIsGrayscaleEnabled();
+ } else {
+ self.grayscaleEnabled = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.grayscaleEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isGuidedAccessEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ self.guidedAccessEnabled = UIAccessibilityIsGuidedAccessEnabled();
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.guidedAccessEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isInvertColorsEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ self.invertColorsEnabled = UIAccessibilityIsInvertColorsEnabled();
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.invertColorsEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isMonoAudioEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ self.monoAudioEnabled = UIAccessibilityIsMonoAudioEnabled();
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.monoAudioEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isReduceMotionEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.reduceMotionEnabled = UIAccessibilityIsReduceMotionEnabled();
+ } else {
+ self.reduceMotionEnabled = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.reduceMotionEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isReduceTransparencyEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.reduceTransparencyEnabled = UIAccessibilityIsReduceTransparencyEnabled();
+ } else {
+ self.reduceTransparencyEnabled = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.reduceTransparencyEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isScreenReaderRunning:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ self.voiceOverRunning = UIAccessibilityIsVoiceOverRunning();
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.voiceOverRunning];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isSpeakScreenEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.speakScreenEnabled = UIAccessibilityIsSpeakScreenEnabled();
+ } else {
+ self.speakScreenEnabled = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.speakScreenEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isSpeakSelectionEnabled:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.speakSelectionEnabled = UIAccessibilityIsSpeakSelectionEnabled();
+ } else {
+ self.speakSelectionEnabled = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.speakSelectionEnabled];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+- (void)isSwitchControlRunning:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ if (iOS8Delta) {
+ self.switchControlRunning = UIAccessibilityIsSwitchControlRunning();
+ } else {
+ self.switchControlRunning = false;
+ }
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:self.switchControlRunning];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+-(double) mGetFontScale
+{
+ double fontScale = 1;
+ if (iOS7Delta) {
+ fontScale = [[UIFont preferredFontForTextStyle:UIFontTextStyleBody] pointSize] / BASE_UI_FONT_TEXT_STYLE_BODY_POINT_SIZE;
+ }
+ return fontScale;
+}
+
+-(double) mGetTextZoom
+{
+ double zoom = round(mFontScale * 100);
+ // NSLog(@"mGetTextZoom %f%%", zoom);
+ return zoom;
+}
+
+- (void) getTextZoom:(CDVInvokedUrlCommand *)command
+{
+ double zoom = [self mGetTextZoom];
+ [self.commandDelegate runInBackground:^{
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble: zoom];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+}
+
+-(void) mSetTextZoom:(double)zoom
+{
+ // NSLog(@"mSetTextZoom %f%%'", zoom);
+ mFontScale = zoom/100;
+ if (iOS7Delta) {
+ NSString *jsString = [[NSString alloc] initWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%f%%'", zoom];
+ [self.commandDelegate evalJs:jsString];
+ }
+}
+
+- (void) setTextZoom:(CDVInvokedUrlCommand *)command
+{
+ if (command != nil && [command.arguments count] > 0) {
+ double zoom = [[command.arguments objectAtIndex:0] doubleValue];
+ [self mSetTextZoom:zoom];
+
+ [self.commandDelegate runInBackground:^{
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:zoom];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+ }
+}
+
+- (void)updateTextZoom:(CDVInvokedUrlCommand *)command
+{
+ float fontScale = [self mGetFontScale];
+ if (fontScale != mFontScale) {
+ mFontScale = fontScale;
+ }
+ double zoom = [self mGetTextZoom];
+ // NSLog(@"updateTextZoom %d%%'", zoom);
+ [self mSetTextZoom:zoom];
+
+ if (command != nil && command.callbackId != nil) {
+ [self.commandDelegate runInBackground:^{
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:zoom];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }];
+ }
+}
+
+- (void)postNotification:(CDVInvokedUrlCommand *)command
+{
+ CDVPluginResult* result = nil;
+ uint32_t notificationType = [[command.arguments objectAtIndex:0] intValue];
+ NSString* notificationString = [command.arguments count] > 1 ? [command.arguments objectAtIndex:1] : @"";
+
+ if (notificationString == nil) {
+ notificationString = @"";
+ }
+ if (UIAccessibilityIsVoiceOverRunning() &&
+ [self isValidNotificationType:notificationType]) {
+ [self.commandDelegate runInBackground:^{
+ if (notificationType == UIAccessibilityAnnouncementNotification) {
+ self.commandCallbackId = command.callbackId;
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityAnnouncementDidFinish:) name:UIAccessibilityAnnouncementDidFinishNotification object:nil];
+ }
+
+ UIAccessibilityPostNotification(notificationType, notificationString);
+
+ if (notificationType != UIAccessibilityAnnouncementNotification) {
+ NSMutableDictionary* data = [NSMutableDictionary dictionaryWithCapacity:2];
+ [data setObject:notificationString forKey:@"stringValue"];
+ [data setObject:@"true" forKey:@"wasSuccessful"];
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:data];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }
+ }];
+ } else {
+ result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
+ [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
+ }
+}
+
+- (BOOL)isValidNotificationType:(uint32_t)notificationType
+{
+ return (notificationType == UIAccessibilityScreenChangedNotification
+ || notificationType == UIAccessibilityLayoutChangedNotification
+ || notificationType == UIAccessibilityAnnouncementNotification
+ || notificationType == UIAccessibilityPageScrolledNotification);
+}
+
+- (void)mobileAccessibilityAnnouncementDidFinish:(NSNotification *)dict
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityAnnouncementDidFinishNotification object:nil];
+
+ NSString* valueSpoken = [[dict userInfo] objectForKey:UIAccessibilityAnnouncementKeyStringValue];
+ NSString* wasSuccessful = [[dict userInfo] objectForKey:UIAccessibilityAnnouncementKeyWasSuccessful];
+
+ NSMutableDictionary* data = [NSMutableDictionary dictionaryWithCapacity:2];
+ [data setObject:valueSpoken forKey:@"stringValue"];
+ [data setObject:wasSuccessful forKey:@"wasSuccessful"];
+
+ if (self.commandCallbackId) {
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:data];
+ [self.commandDelegate sendPluginResult:result callbackId:self.commandCallbackId];
+ self.commandCallbackId = nil;
+ }
+}
+
+- (BOOL)getClosedCaptioningEnabledStatus
+{
+ BOOL status = false;
+ if (&MACaptionAppearanceGetDisplayType) {
+ status = (MACaptionAppearanceGetDisplayType(kMACaptionAppearanceDomainUser) > kMACaptionAppearanceDisplayTypeAutomatic);
+ } else {
+ status = UIAccessibilityIsClosedCaptioningEnabled();
+ }
+ return status;
+}
+
+- (void)mobileAccessibilityStatusChanged:(NSNotification *)notification
+{
+ [self sendMobileAccessibilityStatusChangedCallback];
+}
+
+- (void)sendMobileAccessibilityStatusChangedCallback
+{
+ if (self.callbackId) {
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self getMobileAccessibilityStatus]];
+ [result setKeepCallbackAsBool:YES];
+ [self.commandDelegate sendPluginResult:result callbackId:self.callbackId];
+ }
+}
+
+/* Get the current mobile accessibility status. */
+- (NSDictionary*)getMobileAccessibilityStatus
+{
+ self.boldTextEnabled = UIAccessibilityIsBoldTextEnabled();
+ self.closedCaptioningEnabled = [self getClosedCaptioningEnabledStatus];
+ self.darkerSystemColorsEnabled = UIAccessibilityDarkerSystemColorsEnabled();
+ self.grayscaleEnabled = UIAccessibilityIsGrayscaleEnabled();
+ self.guidedAccessEnabled = UIAccessibilityIsGuidedAccessEnabled();
+ self.invertColorsEnabled = UIAccessibilityIsInvertColorsEnabled();
+ self.monoAudioEnabled = UIAccessibilityIsMonoAudioEnabled();
+ self.reduceMotionEnabled = UIAccessibilityIsReduceMotionEnabled();
+ self.reduceTransparencyEnabled = UIAccessibilityIsReduceTransparencyEnabled();
+ self.speakScreenEnabled = UIAccessibilityIsSpeakScreenEnabled();
+ self.speakSelectionEnabled = UIAccessibilityIsSpeakSelectionEnabled();
+ self.switchControlRunning = UIAccessibilityIsSwitchControlRunning();
+ self.voiceOverRunning = UIAccessibilityIsVoiceOverRunning();
+
+ NSMutableDictionary* mobileAccessibilityData = [NSMutableDictionary dictionaryWithCapacity:5];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.boldTextEnabled] forKey:@"isBoldTextEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.closedCaptioningEnabled] forKey:@"isClosedCaptioningEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.darkerSystemColorsEnabled] forKey:@"isDarkerSystemColorsEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.grayscaleEnabled] forKey:@"isGrayscaleEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.guidedAccessEnabled] forKey:@"isGuidedAccessEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.invertColorsEnabled] forKey:@"isInvertColorsEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.monoAudioEnabled] forKey:@"isMonoAudioEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.reduceMotionEnabled] forKey:@"isReduceMotionEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.reduceTransparencyEnabled] forKey:@"isReduceTransparencyEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.speakScreenEnabled] forKey:@"isSpeakScreenEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.speakSelectionEnabled] forKey:@"isSpeakSelectionEnabled"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.switchControlRunning] forKey:@"isSwitchControlRunning"];
+ [mobileAccessibilityData setObject:[NSNumber numberWithBool:self.voiceOverRunning] forKey:@"isScreenReaderRunning"];
+ return mobileAccessibilityData;
+}
+
+
+/* start MobileAccessibility monitoring */
+- (void)start:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ self.callbackId = command.callbackId;
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityClosedCaptioningStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityGuidedAccessStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityInvertColorsStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityMonoAudioStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityVoiceOverStatusChanged object:nil];
+
+ if (iOS8Delta) {
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityBoldTextStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityDarkerSystemColorsStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityGrayscaleStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityReduceMotionStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilityReduceTransparencyStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilitySpeakScreenStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilitySpeakSelectionStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mobileAccessibilityStatusChanged:) name:UIAccessibilitySwitchControlStatusDidChangeNotification object:nil];
+ }
+
+ // Update the callback on start
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self getMobileAccessibilityStatus]];
+ [result setKeepCallbackAsBool:YES];
+ [self.commandDelegate sendPluginResult:result callbackId:self.callbackId];
+ }];
+}
+
+/* stop MobileAccessibility monitoring */
+- (void)stop:(CDVInvokedUrlCommand*)command
+{
+ [self.commandDelegate runInBackground:^{
+ // callback one last time to clear the callback function on JS side
+ if (self.callbackId)
+ {
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self getMobileAccessibilityStatus]];
+ [result setKeepCallbackAsBool:NO];
+ [self.commandDelegate sendPluginResult:result callbackId:self.callbackId];
+ }
+ self.callbackId = nil;
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityClosedCaptioningStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityGuidedAccessStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityInvertColorsStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityAnnouncementDidFinishNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityMonoAudioStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityVoiceOverStatusChanged object:nil];
+
+ if (iOS8Delta) {
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityBoldTextStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityDarkerSystemColorsStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityGrayscaleStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityReduceMotionStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityReduceTransparencyStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilitySpeakScreenStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilitySpeakSelectionStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilitySwitchControlStatusDidChangeNotification object:nil];
+ }
+ }];
+}
+
+@end