Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface RCTInitialAccessibilityValuesProxy : NSObject

+ (instancetype)sharedInstance;

@property (readonly, nonatomic) BOOL isBoldTextEnabled;
@property (readonly, nonatomic) BOOL isGrayscaleEnabled;
@property (readonly, nonatomic) BOOL isInvertColorsEnabled;
@property (readonly, nonatomic) BOOL isReduceMotionEnabled;
@property (readonly, nonatomic) BOOL isDarkerSystemColorsEnabled;
@property (readonly, nonatomic) BOOL prefersCrossFadeTransitions;
@property (readonly, nonatomic) BOOL isReduceTransparencyEnabled;
@property (readonly, nonatomic) BOOL isVoiceOverEnabled;
@property (readonly, nonatomic) UIContentSizeCategory preferredContentSizeCategory;

- (void)recordAccessibilityValues;

@end

NS_ASSUME_NONNULL_END
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

#import "RCTInitialAccessibilityValuesProxy.h"
#import <React/RCTUtils.h>
#import <mutex>

@implementation RCTInitialAccessibilityValuesProxy {
BOOL _hasRecordedInitialAccessibilityValues;
BOOL _isBoldTextEnabled;
BOOL _isGrayscaleEnabled;
BOOL _isInvertColorsEnabled;
BOOL _isReduceMotionEnabled;
BOOL _isDarkerSystemColorsEnabled;
BOOL _isReduceTransparencyEnabled;
BOOL _isVoiceOverEnabled;
UIContentSizeCategory _preferredContentSizeCategory;
std::mutex _mutex;
}

+ (instancetype)sharedInstance
{
static RCTInitialAccessibilityValuesProxy *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [RCTInitialAccessibilityValuesProxy new];
});
return sharedInstance;
}

- (BOOL)isBoldTextEnabled
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _isBoldTextEnabled;
}
}

__block BOOL isBoldTextEnabled;
RCTUnsafeExecuteOnMainQueueSync(^{
isBoldTextEnabled = UIAccessibilityIsBoldTextEnabled();
});

return isBoldTextEnabled;
}

- (BOOL)isGrayscaleEnabled
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _isGrayscaleEnabled;
}
}

__block BOOL isGrayscaleEnabled;
RCTUnsafeExecuteOnMainQueueSync(^{
isGrayscaleEnabled = UIAccessibilityIsGrayscaleEnabled();
});

return isGrayscaleEnabled;
}

- (BOOL)isInvertColorsEnabled
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _isInvertColorsEnabled;
}
}

__block BOOL isInvertColorsEnabled;
RCTUnsafeExecuteOnMainQueueSync(^{
isInvertColorsEnabled = UIAccessibilityIsInvertColorsEnabled();
});

return isInvertColorsEnabled;
}

- (BOOL)isReduceMotionEnabled
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _isReduceMotionEnabled;
}
}

__block BOOL isReduceMotionEnabled;
RCTUnsafeExecuteOnMainQueueSync(^{
isReduceMotionEnabled = UIAccessibilityIsReduceMotionEnabled();
});

return isReduceMotionEnabled;
}

- (BOOL)isDarkerSystemColorsEnabled
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _isDarkerSystemColorsEnabled;
}
}

__block BOOL isDarkerSystemColorsEnabled;
RCTUnsafeExecuteOnMainQueueSync(^{
isDarkerSystemColorsEnabled = UIAccessibilityDarkerSystemColorsEnabled();
});

return isDarkerSystemColorsEnabled;
}

- (BOOL)isReduceTransparencyEnabled
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _isReduceTransparencyEnabled;
}
}

__block BOOL isReduceTransparencyEnabled;
RCTUnsafeExecuteOnMainQueueSync(^{
isReduceTransparencyEnabled = UIAccessibilityIsReduceTransparencyEnabled();
});

return isReduceTransparencyEnabled;
}

- (BOOL)isVoiceOverEnabled
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _isVoiceOverEnabled;
}
}

__block BOOL isVoiceOverEnabled;
RCTUnsafeExecuteOnMainQueueSync(^{
isVoiceOverEnabled = UIAccessibilityIsVoiceOverRunning();
});

return isVoiceOverEnabled;
}

- (UIContentSizeCategory)preferredContentSizeCategory
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (_hasRecordedInitialAccessibilityValues) {
return _preferredContentSizeCategory;
}
}

__block UIContentSizeCategory preferredContentSizeCategory;
RCTUnsafeExecuteOnMainQueueSync(^{
preferredContentSizeCategory = RCTSharedApplication().preferredContentSizeCategory;
});

return preferredContentSizeCategory;
}

- (void)recordAccessibilityValues
{
std::lock_guard<std::mutex> lock(_mutex);
_hasRecordedInitialAccessibilityValues = YES;
_isBoldTextEnabled = UIAccessibilityIsBoldTextEnabled();
_isGrayscaleEnabled = UIAccessibilityIsGrayscaleEnabled();
_isInvertColorsEnabled = UIAccessibilityIsInvertColorsEnabled();
_isReduceMotionEnabled = UIAccessibilityIsReduceMotionEnabled();
_isDarkerSystemColorsEnabled = UIAccessibilityDarkerSystemColorsEnabled();
_isReduceTransparencyEnabled = UIAccessibilityIsReduceTransparencyEnabled();
_isVoiceOverEnabled = UIAccessibilityIsVoiceOverRunning();
_preferredContentSizeCategory = RCTSharedApplication().preferredContentSizeCategory;
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#import "RCTInitializeUIKitProxies.h"
#import "RCTInitialAccessibilityValuesProxy.h"
#import "RCTInitialAppStateProxy.h"
#import "RCTTraitCollectionProxy.h"
#import "RCTWindowSafeAreaProxy.h"
Expand All @@ -17,5 +18,6 @@ void RCTInitializeUIKitProxies(void)
[[RCTWindowSafeAreaProxy sharedInstance] startObservingSafeArea];
[[RCTTraitCollectionProxy sharedInstance] startObservingTraitCollection];
[[RCTInitialAppStateProxy sharedInstance] recordAppState];
[[RCTInitialAccessibilityValuesProxy sharedInstance] recordAccessibilityValues];
});
}
20 changes: 11 additions & 9 deletions packages/react-native/React/CoreModules/RCTAccessibilityManager.mm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#import <React/RCTBridge.h>
#import <React/RCTConvert.h>
#import <React/RCTEventDispatcherProtocol.h>
#import <React/RCTInitialAccessibilityValuesProxy.h>
#import <React/RCTLog.h>
#import <React/RCTUIManager.h>

Expand All @@ -37,7 +38,7 @@ @implementation RCTAccessibilityManager

+ (BOOL)requiresMainQueueSetup
{
return YES;
return NO;
}

- (instancetype)init
Expand Down Expand Up @@ -91,14 +92,15 @@ - (instancetype)init
name:UIAccessibilityVoiceOverStatusDidChangeNotification
object:nil];

self.contentSizeCategory = RCTSharedApplication().preferredContentSizeCategory;
_isBoldTextEnabled = UIAccessibilityIsBoldTextEnabled();
_isGrayscaleEnabled = UIAccessibilityIsGrayscaleEnabled();
_isInvertColorsEnabled = UIAccessibilityIsInvertColorsEnabled();
_isReduceMotionEnabled = UIAccessibilityIsReduceMotionEnabled();
_isDarkerSystemColorsEnabled = UIAccessibilityDarkerSystemColorsEnabled();
_isReduceTransparencyEnabled = UIAccessibilityIsReduceTransparencyEnabled();
_isVoiceOverEnabled = UIAccessibilityIsVoiceOverRunning();
RCTInitialAccessibilityValuesProxy *initialValuesProxy = [RCTInitialAccessibilityValuesProxy sharedInstance];
self.contentSizeCategory = initialValuesProxy.preferredContentSizeCategory;
_isBoldTextEnabled = initialValuesProxy.isBoldTextEnabled;
_isGrayscaleEnabled = initialValuesProxy.isGrayscaleEnabled;
_isInvertColorsEnabled = initialValuesProxy.isInvertColorsEnabled;
_isReduceMotionEnabled = initialValuesProxy.isReduceMotionEnabled;
_isDarkerSystemColorsEnabled = initialValuesProxy.isDarkerSystemColorsEnabled;
_isReduceTransparencyEnabled = initialValuesProxy.isReduceTransparencyEnabled;
_isVoiceOverEnabled = initialValuesProxy.isVoiceOverEnabled;
}
return self;
}
Expand Down