From 0d117a7e1506850d821acd3153cb6871957a8704 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Fri, 10 Mar 2023 15:06:58 -0800 Subject: [PATCH 01/14] Add checks for the right bridge --- .../ios/FRNAppearanceAdditions.m | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index 1b785aac70..f702336041 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -3,6 +3,8 @@ #import #import #import +#import +#import NSString *const FRNAppearanceSizeClassCompact = @"compact"; NSString *const FRNAppearanceSizeClassRegular = @"regular"; @@ -105,23 +107,18 @@ - (dispatch_queue_t)methodQueue - (void)startObserving { _hasListeners = YES; - // Note that [UITraitCollection currentTraitCollection] always returns the same default trait collection, - // presumably because FRNAppearanceAdditions isn't a view, so it never gets updated with the right traitCollection - // (which happens when a view gets added to the view hierachy). In order to get the right trait collection, - // we need to access a view that's been added to the view hierarchy - UIViewController *viewControllerWithInitialTraitCollection = RCTPresentedViewController(); - UITraitCollection *initialTraitCollection; - - if (viewControllerWithInitialTraitCollection != nil) { - initialTraitCollection = [viewControllerWithInitialTraitCollection traitCollection]; - } else { - initialTraitCollection = [UITraitCollection currentTraitCollection]; + for (UIWindow *window in RCTSharedApplication().windows) { + RCTRootView *rootView = (RCTRootView *)[[window rootViewController] view]; + + if ([[rootView bridge] bundleURL] == [[self bridge] bundleURL]) { + UITraitCollection *windowTraitCollection = [window traitCollection]; + + _horizontalSizeClass = RCTHorizontalSizeClassPreference(windowTraitCollection); + _userInterfaceLevel = RCTUserInterfaceLevelPreference(windowTraitCollection); + _accessibilityContrastOption = RCTAccessibilityContrastPreference(windowTraitCollection); + } } - _horizontalSizeClass = RCTHorizontalSizeClassPreference(initialTraitCollection); - _userInterfaceLevel = RCTUserInterfaceLevelPreference(initialTraitCollection); - _accessibilityContrastOption = RCTAccessibilityContrastPreference(initialTraitCollection); - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appearanceChanged:) name:RCTUserInterfaceStyleDidChangeNotification @@ -137,9 +134,17 @@ - (void)stopObserving { - (void)appearanceChanged:(NSNotification *)notification { if (_hasListeners) { + RCTBridge *currentBridge = [self bridge]; + RCTBridge *notificationBridge = [[notification object] bridge]; + + // Don't send the appearanceChanged event if the notification didn't originate from the same react native instance + if ([currentBridge bundleURL] != [notificationBridge bundleURL]) { + return; + } + UITraitCollection *traitCollection = [[notification userInfo] valueForKey:RCTUserInterfaceStyleDidChangeNotificationTraitCollectionKey]; if (![traitCollection isKindOfClass:[UITraitCollection class]]) { - traitCollection = nil; + return; } NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference(traitCollection); From 8702c584603b217c266697308f75ce4e57fd3286 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Fri, 10 Mar 2023 15:26:51 -0800 Subject: [PATCH 02/14] Add checks for the right class --- .../ios/FRNAppearanceAdditions.m | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index f702336041..49d0233c1c 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -110,12 +110,14 @@ - (void)startObserving { for (UIWindow *window in RCTSharedApplication().windows) { RCTRootView *rootView = (RCTRootView *)[[window rootViewController] view]; - if ([[rootView bridge] bundleURL] == [[self bridge] bundleURL]) { - UITraitCollection *windowTraitCollection = [window traitCollection]; - - _horizontalSizeClass = RCTHorizontalSizeClassPreference(windowTraitCollection); - _userInterfaceLevel = RCTUserInterfaceLevelPreference(windowTraitCollection); - _accessibilityContrastOption = RCTAccessibilityContrastPreference(windowTraitCollection); + if ([rootView isKindOfClass:[RCTRootView class]]) { + if ([[rootView bridge] bundleURL] == [[self bridge] bundleURL]) { + UITraitCollection *windowTraitCollection = [window traitCollection]; + + _horizontalSizeClass = RCTHorizontalSizeClassPreference(windowTraitCollection); + _userInterfaceLevel = RCTUserInterfaceLevelPreference(windowTraitCollection); + _accessibilityContrastOption = RCTAccessibilityContrastPreference(windowTraitCollection); + } } } @@ -137,6 +139,10 @@ - (void)appearanceChanged:(NSNotification *)notification { RCTBridge *currentBridge = [self bridge]; RCTBridge *notificationBridge = [[notification object] bridge]; + if (![notificationBridge isKindOfClass:[RCTBridge class]]) { + return; + } + // Don't send the appearanceChanged event if the notification didn't originate from the same react native instance if ([currentBridge bundleURL] != [notificationBridge bundleURL]) { return; From d36eb7eaec4a1f2605276897510d2f254856f8fe Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Mon, 13 Mar 2023 12:31:49 -0700 Subject: [PATCH 03/14] Check bridge instance, not bundleID --- .../AppearanceAdditions/ios/FRNAppearanceAdditions.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index 49d0233c1c..9314925e0c 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -5,6 +5,7 @@ #import #import #import +#import NSString *const FRNAppearanceSizeClassCompact = @"compact"; NSString *const FRNAppearanceSizeClassRegular = @"regular"; @@ -111,7 +112,7 @@ - (void)startObserving { RCTRootView *rootView = (RCTRootView *)[[window rootViewController] view]; if ([rootView isKindOfClass:[RCTRootView class]]) { - if ([[rootView bridge] bundleURL] == [[self bridge] bundleURL]) { + if ([[rootView bridge] isEqual:[[self bridge] parentBridge]]) { UITraitCollection *windowTraitCollection = [window traitCollection]; _horizontalSizeClass = RCTHorizontalSizeClassPreference(windowTraitCollection); @@ -136,15 +137,14 @@ - (void)stopObserving { - (void)appearanceChanged:(NSNotification *)notification { if (_hasListeners) { - RCTBridge *currentBridge = [self bridge]; RCTBridge *notificationBridge = [[notification object] bridge]; - if (![notificationBridge isKindOfClass:[RCTBridge class]]) { return; } // Don't send the appearanceChanged event if the notification didn't originate from the same react native instance - if ([currentBridge bundleURL] != [notificationBridge bundleURL]) { + RCTBridge *currentBridge = [[self bridge] parentBridge]; + if (![currentBridge isEqual:notificationBridge]) { return; } From 2fd2176884c0f54d171f45cd849229baa19f8bc6 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Mon, 13 Mar 2023 12:32:03 -0700 Subject: [PATCH 04/14] Fix opening braces --- .../AppearanceAdditions/ios/FRNAppearanceAdditions.m | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index 9314925e0c..f9c2257bf2 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -79,18 +79,15 @@ + (BOOL)requiresMainQueueSetup { return YES; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass) -{ +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass) { return _horizontalSizeClass; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel) -{ +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel) { return _userInterfaceLevel; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(accessibilityContrastOption) -{ +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(accessibilityContrastOption) { return _accessibilityContrastOption; } @@ -100,8 +97,7 @@ + (BOOL)requiresMainQueueSetup { return @[ @"appearanceChanged" ]; } -- (dispatch_queue_t)methodQueue -{ +- (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); } From 95faf945c5c4c713bd1b24bbddea1bbbbcdbc3ed Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Fri, 31 Mar 2023 12:23:51 -0700 Subject: [PATCH 05/14] Update trait collection getters to pass in a viewtag --- .../ios/FRNAppearanceAdditions.m | 33 +++++++++--------- .../src/NativeAppearanceAdditions.ts | 6 ++-- .../src/NativeAppearanceAdditions.types.ts | 6 ++-- .../src/appearanceAdditions.ios.ts | 34 +++++++++++-------- .../src/appearanceAdditions.ts | 6 +--- .../src/getSizeClass.ios.ts | 8 +++-- .../apple-theme/src/createAppleTheme.ios.ts | 2 +- 7 files changed, 51 insertions(+), 44 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index f9c2257bf2..9b8ce37742 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -1,4 +1,5 @@ #import "FRNAppearanceAdditions.h" +#import "RCTUIManager.h" #import #import @@ -79,11 +80,25 @@ + (BOOL)requiresMainQueueSetup { return YES; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass) { +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass:(id)viewTag) { + RCTExecuteOnMainQueue(^{ + if ([viewTag isKindOfClass:[NSNumber class]]) { + UIView *view = [[[self bridge] uiManager] viewForReactTag:viewTag]; + NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); + self->_horizontalSizeClass = horizontalSizeClass; + } + }); return _horizontalSizeClass; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel) { +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel:(id)viewTag) { + RCTExecuteOnMainQueue(^{ + if ([viewTag isKindOfClass:[NSNumber class]]) { + UIView *view = [[[self bridge] uiManager] viewForReactTag:viewTag]; + NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); + self->_horizontalSizeClass = horizontalSizeClass; + } + }); return _userInterfaceLevel; } @@ -104,20 +119,6 @@ - (dispatch_queue_t)methodQueue { - (void)startObserving { _hasListeners = YES; - for (UIWindow *window in RCTSharedApplication().windows) { - RCTRootView *rootView = (RCTRootView *)[[window rootViewController] view]; - - if ([rootView isKindOfClass:[RCTRootView class]]) { - if ([[rootView bridge] isEqual:[[self bridge] parentBridge]]) { - UITraitCollection *windowTraitCollection = [window traitCollection]; - - _horizontalSizeClass = RCTHorizontalSizeClassPreference(windowTraitCollection); - _userInterfaceLevel = RCTUserInterfaceLevelPreference(windowTraitCollection); - _accessibilityContrastOption = RCTAccessibilityContrastPreference(windowTraitCollection); - } - } - } - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appearanceChanged:) name:RCTUserInterfaceStyleDidChangeNotification diff --git a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts index 53d844c4a8..615595a8ec 100644 --- a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts +++ b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts @@ -1,3 +1,5 @@ +import type { RootTag } from 'react-native'; + import type { AccessibilityContrastOption, SizeClass, UserInterfaceLevel } from './NativeAppearanceAdditions.types'; export const NativeAppearanceAdditions = { @@ -5,11 +7,11 @@ export const NativeAppearanceAdditions = { addListener: (_: string) => {}, // eslint-disable-next-line @typescript-eslint/no-empty-function removeListeners: (_: number) => {}, - horizontalSizeClass: () => { + horizontalSizeClass: (_: RootTag) => { console.warn('NativeAppearanceAdditions is only available on iOS'); return 'regular' as SizeClass; }, - userInterfaceLevel: () => { + userInterfaceLevel: (_: RootTag) => { console.warn('NativeAppearanceAdditions is only available on iOS'); return 'base' as UserInterfaceLevel; }, diff --git a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts index db253c34a6..e914395960 100644 --- a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts +++ b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts @@ -1,7 +1,7 @@ export interface AppearanceAdditions { - readonly horizontalSizeClass: SizeClass; - readonly userInterfaceLevel: UserInterfaceLevel; - readonly accessibilityContrastOption: AccessibilityContrastOption; + horizontalSizeClass(viewTag): SizeClass; + userInterfaceLevel(viewTag): UserInterfaceLevel; + accessibilityContrastOption(viewTag): AccessibilityContrastOption; } export const HorizontalSizeClassKey = 'horizontalSizeClass'; diff --git a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts index 01a17633cc..32132b0a8e 100644 --- a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts +++ b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts @@ -11,21 +11,9 @@ class AppearanceAdditionsImpl implements AppearanceAdditions { _userInterfaceLevel: UserInterfaceLevel; _accessibilityContrastOption: AccessibilityContrastOption; - get horizontalSizeClass(): SizeClass { - return this._horizontalSizeClass; - } - - get userInterfaceLevel(): UserInterfaceLevel { - return this._userInterfaceLevel; - } - - get accessibilityContrastOption(): AccessibilityContrastOption { - return this._accessibilityContrastOption; - } - constructor() { - this._horizontalSizeClass = NativeAppearanceAdditions.horizontalSizeClass(); - this._userInterfaceLevel = NativeAppearanceAdditions.userInterfaceLevel(); + this._horizontalSizeClass = NativeAppearanceAdditions.horizontalSizeClass(null); + this._userInterfaceLevel = NativeAppearanceAdditions.userInterfaceLevel(null); this._accessibilityContrastOption = NativeAppearanceAdditions.accessibilityContrastOption(); const eventEmitter = new NativeEventEmitter(NativeAppearanceAdditions as any); @@ -35,6 +23,24 @@ class AppearanceAdditionsImpl implements AppearanceAdditions { this._accessibilityContrastOption = newValue[AccessibilityContrastOptionKey]; }); } + + horizontalSizeClass(viewTag = null): SizeClass { + if (!viewTag) { + return this._horizontalSizeClass; + } + return NativeAppearanceAdditions.horizontalSizeClass(viewTag); + } + + userInterfaceLevel(viewTag = null): UserInterfaceLevel { + if (!viewTag) { + return this._userInterfaceLevel; + } + return NativeAppearanceAdditions.userInterfaceLevel(viewTag); + } + + accessibilityContrastOption(): AccessibilityContrastOption { + return this._accessibilityContrastOption; + } } function getAppearanceAdditionsWorker() { diff --git a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts index 1731b01fcb..40f6f924a5 100644 --- a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts +++ b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts @@ -4,11 +4,7 @@ import type { AppearanceAdditions } from './NativeAppearanceAdditions.types'; // Default values for non-iOS clients. function getAppearanceAdditionsWorker() { - return { - horizontalSizeClass: 'regular', - userInterfaceLevel: 'base', - accessibilityContrastOption: 'normal', - } as AppearanceAdditions; + return {} as AppearanceAdditions; } export const appearanceAdditions = memoize(getAppearanceAdditionsWorker); diff --git a/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts b/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts index 13c7708ea2..571ab8d9ba 100644 --- a/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts +++ b/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts @@ -1,5 +1,6 @@ +import React from 'react'; import { useMemo } from 'react'; -import { NativeEventEmitter } from 'react-native'; +import { NativeEventEmitter, RootTagContext } from 'react-native'; import { useSubscription } from 'use-subscription'; @@ -10,6 +11,7 @@ import type { SizeClass } from './NativeAppearanceAdditions.types'; const eventEmitter = NativeAppearanceAdditions ? new NativeEventEmitter(NativeAppearanceAdditions as any) : undefined; export function useHorizontalSizeClass(): SizeClass { + const rootTag = React.useContext(RootTagContext); if (!eventEmitter) { return 'regular'; } @@ -18,7 +20,7 @@ export function useHorizontalSizeClass(): SizeClass { // eslint-disable-next-line react-hooks/rules-of-hooks const subscription = useMemo( () => ({ - getCurrentValue: () => appearanceAdditions().horizontalSizeClass, + getCurrentValue: () => appearanceAdditions().horizontalSizeClass(rootTag), subscribe: (callback) => { const appearanceSubscription = eventEmitter.addListener('appearanceChanged', callback); return () => { @@ -26,7 +28,7 @@ export function useHorizontalSizeClass(): SizeClass { }; }, }), - [], + [rootTag], ); // Early return on eventEmitter will either always or never return within a single instance diff --git a/packages/theming/apple-theme/src/createAppleTheme.ios.ts b/packages/theming/apple-theme/src/createAppleTheme.ios.ts index a165986345..0bec556912 100644 --- a/packages/theming/apple-theme/src/createAppleTheme.ios.ts +++ b/packages/theming/apple-theme/src/createAppleTheme.ios.ts @@ -9,7 +9,7 @@ import { getBaseAppleThemeIOS } from './appleTheme.ios'; export function createAppleTheme(): ThemeReference { const appleThemeReference = new ThemeReference({} as Theme, () => { const isLightMode = Appearance.getColorScheme() === 'light'; - const isElevated = NativeAppearanceAdditions.userInterfaceLevel() === 'elevated'; + const isElevated = NativeAppearanceAdditions.userInterfaceLevel(null) === 'elevated'; return getBaseAppleThemeIOS(isLightMode, isElevated); }); From b4ca539ea81bed8fb5856e8ef6fa52574d03a64b Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Fri, 31 Mar 2023 12:24:48 -0700 Subject: [PATCH 06/14] Change files --- ...e-apple-theme-94f6d0fc-ed05-4ddf-9c07-7bb62ee0275c.json | 7 +++++++ ...nce-additions-36f88791-2978-4482-a1a0-c3af49f818cf.json | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 change/@fluentui-react-native-apple-theme-94f6d0fc-ed05-4ddf-9c07-7bb62ee0275c.json create mode 100644 change/@fluentui-react-native-experimental-appearance-additions-36f88791-2978-4482-a1a0-c3af49f818cf.json diff --git a/change/@fluentui-react-native-apple-theme-94f6d0fc-ed05-4ddf-9c07-7bb62ee0275c.json b/change/@fluentui-react-native-apple-theme-94f6d0fc-ed05-4ddf-9c07-7bb62ee0275c.json new file mode 100644 index 0000000000..f20509bf99 --- /dev/null +++ b/change/@fluentui-react-native-apple-theme-94f6d0fc-ed05-4ddf-9c07-7bb62ee0275c.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add trait collection support for multiwindow", + "packageName": "@fluentui-react-native/apple-theme", + "email": "78454019+lyzhan7@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-experimental-appearance-additions-36f88791-2978-4482-a1a0-c3af49f818cf.json b/change/@fluentui-react-native-experimental-appearance-additions-36f88791-2978-4482-a1a0-c3af49f818cf.json new file mode 100644 index 0000000000..2b2fb43c20 --- /dev/null +++ b/change/@fluentui-react-native-experimental-appearance-additions-36f88791-2978-4482-a1a0-c3af49f818cf.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add trait collection support for multiwindow", + "packageName": "@fluentui-react-native/experimental-appearance-additions", + "email": "78454019+lyzhan7@users.noreply.github.com", + "dependentChangeType": "patch" +} From beb19860f4d99cfd159b4c0fe2701af49e7afc50 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:37:34 -0700 Subject: [PATCH 07/14] Replace RCTExecuteOnMainQueue with RCTUnsafeExecuteOnMainQueueSync --- .../AppearanceAdditions/ios/FRNAppearanceAdditions.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index 9b8ce37742..40a26df845 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -81,7 +81,7 @@ + (BOOL)requiresMainQueueSetup { } RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass:(id)viewTag) { - RCTExecuteOnMainQueue(^{ + RCTUnsafeExecuteOnMainQueueSync(^{ if ([viewTag isKindOfClass:[NSNumber class]]) { UIView *view = [[[self bridge] uiManager] viewForReactTag:viewTag]; NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); @@ -92,7 +92,7 @@ + (BOOL)requiresMainQueueSetup { } RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel:(id)viewTag) { - RCTExecuteOnMainQueue(^{ + RCTUnsafeExecuteOnMainQueueSync(^{ if ([viewTag isKindOfClass:[NSNumber class]]) { UIView *view = [[[self bridge] uiManager] viewForReactTag:viewTag]; NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); From 72d53d9a97c51fe2343dacdd2491afb5f715c873 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:57:14 -0700 Subject: [PATCH 08/14] Replace viewTag/rootTag with reactTag --- .../ios/FRNAppearanceAdditions.m | 18 +++++++++--------- .../src/NativeAppearanceAdditions.ts | 6 ++---- .../src/NativeAppearanceAdditions.types.ts | 6 +++--- .../src/appearanceAdditions.ios.ts | 12 ++++++------ 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index 40a26df845..e0dfd38997 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -80,10 +80,10 @@ + (BOOL)requiresMainQueueSetup { return YES; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass:(id)viewTag) { +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass:(id)reactTag) { RCTUnsafeExecuteOnMainQueueSync(^{ - if ([viewTag isKindOfClass:[NSNumber class]]) { - UIView *view = [[[self bridge] uiManager] viewForReactTag:viewTag]; + if ([reactTag isKindOfClass:[NSNumber class]]) { + UIView *view = [[[self bridge] uiManager] viewForReactTag:reactTag]; NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); self->_horizontalSizeClass = horizontalSizeClass; } @@ -91,10 +91,10 @@ + (BOOL)requiresMainQueueSetup { return _horizontalSizeClass; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel:(id)viewTag) { +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel:(id)reactTag) { RCTUnsafeExecuteOnMainQueueSync(^{ - if ([viewTag isKindOfClass:[NSNumber class]]) { - UIView *view = [[[self bridge] uiManager] viewForReactTag:viewTag]; + if ([reactTag isKindOfClass:[NSNumber class]]) { + UIView *view = [[[self bridge] uiManager] viewForReactTag:reactTag]; NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); self->_horizontalSizeClass = horizontalSizeClass; } @@ -118,7 +118,7 @@ - (dispatch_queue_t)methodQueue { - (void)startObserving { _hasListeners = YES; - + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appearanceChanged:) name:RCTUserInterfaceStyleDidChangeNotification @@ -138,13 +138,13 @@ - (void)appearanceChanged:(NSNotification *)notification { if (![notificationBridge isKindOfClass:[RCTBridge class]]) { return; } - + // Don't send the appearanceChanged event if the notification didn't originate from the same react native instance RCTBridge *currentBridge = [[self bridge] parentBridge]; if (![currentBridge isEqual:notificationBridge]) { return; } - + UITraitCollection *traitCollection = [[notification userInfo] valueForKey:RCTUserInterfaceStyleDidChangeNotificationTraitCollectionKey]; if (![traitCollection isKindOfClass:[UITraitCollection class]]) { return; diff --git a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts index 615595a8ec..8d36e49ba0 100644 --- a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts +++ b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts @@ -1,5 +1,3 @@ -import type { RootTag } from 'react-native'; - import type { AccessibilityContrastOption, SizeClass, UserInterfaceLevel } from './NativeAppearanceAdditions.types'; export const NativeAppearanceAdditions = { @@ -7,11 +5,11 @@ export const NativeAppearanceAdditions = { addListener: (_: string) => {}, // eslint-disable-next-line @typescript-eslint/no-empty-function removeListeners: (_: number) => {}, - horizontalSizeClass: (_: RootTag) => { + horizontalSizeClass: (_: number) => { console.warn('NativeAppearanceAdditions is only available on iOS'); return 'regular' as SizeClass; }, - userInterfaceLevel: (_: RootTag) => { + userInterfaceLevel: (_: number) => { console.warn('NativeAppearanceAdditions is only available on iOS'); return 'base' as UserInterfaceLevel; }, diff --git a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts index e914395960..627b9c4f8d 100644 --- a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts +++ b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts @@ -1,7 +1,7 @@ export interface AppearanceAdditions { - horizontalSizeClass(viewTag): SizeClass; - userInterfaceLevel(viewTag): UserInterfaceLevel; - accessibilityContrastOption(viewTag): AccessibilityContrastOption; + horizontalSizeClass(reactTag): SizeClass; + userInterfaceLevel(reactTag): UserInterfaceLevel; + accessibilityContrastOption(reactTag): AccessibilityContrastOption; } export const HorizontalSizeClassKey = 'horizontalSizeClass'; diff --git a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts index 32132b0a8e..94f5311210 100644 --- a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts +++ b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts @@ -24,18 +24,18 @@ class AppearanceAdditionsImpl implements AppearanceAdditions { }); } - horizontalSizeClass(viewTag = null): SizeClass { - if (!viewTag) { + horizontalSizeClass(reactTag = null): SizeClass { + if (!reactTag) { return this._horizontalSizeClass; } - return NativeAppearanceAdditions.horizontalSizeClass(viewTag); + return NativeAppearanceAdditions.horizontalSizeClass(reactTag); } - userInterfaceLevel(viewTag = null): UserInterfaceLevel { - if (!viewTag) { + userInterfaceLevel(reactTag = null): UserInterfaceLevel { + if (!reactTag) { return this._userInterfaceLevel; } - return NativeAppearanceAdditions.userInterfaceLevel(viewTag); + return NativeAppearanceAdditions.userInterfaceLevel(reactTag); } accessibilityContrastOption(): AccessibilityContrastOption { From 989b8cfc9864aa0d3c054937965c266fd4d9c424 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Wed, 5 Apr 2023 09:43:11 -0700 Subject: [PATCH 09/14] Fix typo --- .../AppearanceAdditions/ios/FRNAppearanceAdditions.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index e0dfd38997..b4d6cb6bb4 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -95,8 +95,8 @@ + (BOOL)requiresMainQueueSetup { RCTUnsafeExecuteOnMainQueueSync(^{ if ([reactTag isKindOfClass:[NSNumber class]]) { UIView *view = [[[self bridge] uiManager] viewForReactTag:reactTag]; - NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); - self->_horizontalSizeClass = horizontalSizeClass; + NSString *userInterfaceLevel = RCTUserInterfaceLevelPreference([view traitCollection]); + self->_userInterfaceLevel = userInterfaceLevel; } }); return _userInterfaceLevel; From e103d1f0b961bcff03284b7e5e6d4fad4e62604a Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Wed, 5 Apr 2023 11:14:14 -0700 Subject: [PATCH 10/14] Add attempt to initialize trait collection so that traits returned are never nil --- .../ios/FRNAppearanceAdditions.m | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index b4d6cb6bb4..01af9eb49f 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -118,6 +118,12 @@ - (dispatch_queue_t)methodQueue { - (void)startObserving { _hasListeners = YES; + + UITraitCollection *attemptedInitialTraitCollection = [self attemptTraitCollectionInitialization]; + + _horizontalSizeClass = RCTHorizontalSizeClassPreference(attemptedInitialTraitCollection); + _userInterfaceLevel = RCTUserInterfaceLevelPreference(attemptedInitialTraitCollection); + _accessibilityContrastOption = RCTAccessibilityContrastPreference(attemptedInitialTraitCollection); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appearanceChanged:) @@ -125,6 +131,26 @@ - (void)startObserving { object:nil]; } +/** + When this native module is first initialized, we don't have access to the information necessary to consistently retrieve all the right traits. + We should still attempt to initialize the traits with the right values with the information we do have access to. + + The traits retrieved from RCTPresentedViewController() should be correct for non-multiwindow scenarios. + + The traits retrived from [UITraitCollection currentTraitCollection] will always be the same default trait collection, + presumably because FRNAppearanceAdditions isn't a view, so it never gets updated with the right traitCollection + (which happens when a view gets added to the view hierachy). + */ +-(UITraitCollection *)attemptTraitCollectionInitialization { + UIViewController *presentedViewControllerTraitCollection = RCTPresentedViewController(); + + if (presentedViewControllerTraitCollection != nil) { + return [presentedViewControllerTraitCollection traitCollection]; + } else { + return [UITraitCollection currentTraitCollection]; + } +} + - (void)stopObserving { _hasListeners = NO; [[NSNotificationCenter defaultCenter] removeObserver:self]; From 601c9c5a80d8e20f34533d19cc0a2e0287b7a198 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:58:57 -0700 Subject: [PATCH 11/14] Move initializeTraitCollection code into its own method --- .../ios/FRNAppearanceAdditions.m | 28 ++++++++----- .../src/NativeAppearanceAdditions.ts | 7 +++- .../src/NativeAppearanceAdditions.types.ts | 6 +-- .../src/appearanceAdditions.ios.ts | 42 +++++++++---------- .../src/appearanceAdditions.ts | 8 +++- .../src/getSizeClass.ios.ts | 2 +- .../apple-theme/src/createAppleTheme.ios.ts | 2 +- 7 files changed, 52 insertions(+), 43 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index 01af9eb49f..fc6ede8a96 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -80,25 +80,31 @@ + (BOOL)requiresMainQueueSetup { return YES; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass:(id)reactTag) { +/** + * When initializing this native module, not all the information required to consistently get all correct initial traits is accessible. + * In order to ensure that the correct traits are always be returned the first time they are reuqested, a react tag for a view in that window can + * be provided to the native module. + * + * This initialization step may be needed when accessing traits that can be different in different windows, which include horizontal size class and user interface level. + * This initialization step is not necessary if the only traits that are accessed are system wide traits common to all windows, such as accessibility contrast. + */ +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(initializeTraitCollection:(id)reactTag) { RCTUnsafeExecuteOnMainQueueSync(^{ if ([reactTag isKindOfClass:[NSNumber class]]) { UIView *view = [[[self bridge] uiManager] viewForReactTag:reactTag]; - NSString *horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); - self->_horizontalSizeClass = horizontalSizeClass; + self->_horizontalSizeClass = RCTHorizontalSizeClassPreference([view traitCollection]); + self->_userInterfaceLevel = RCTUserInterfaceLevelPreference([view traitCollection]); + self->_accessibilityContrastOption = RCTAccessibilityContrastPreference([view traitCollection]); } }); + return nil; +} + +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(horizontalSizeClass) { return _horizontalSizeClass; } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel:(id)reactTag) { - RCTUnsafeExecuteOnMainQueueSync(^{ - if ([reactTag isKindOfClass:[NSNumber class]]) { - UIView *view = [[[self bridge] uiManager] viewForReactTag:reactTag]; - NSString *userInterfaceLevel = RCTUserInterfaceLevelPreference([view traitCollection]); - self->_userInterfaceLevel = userInterfaceLevel; - } - }); +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(userInterfaceLevel) { return _userInterfaceLevel; } diff --git a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts index 8d36e49ba0..6d9e3c8356 100644 --- a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts +++ b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.ts @@ -5,11 +5,14 @@ export const NativeAppearanceAdditions = { addListener: (_: string) => {}, // eslint-disable-next-line @typescript-eslint/no-empty-function removeListeners: (_: number) => {}, - horizontalSizeClass: (_: number) => { + initializeTraitCollection: (_: number) => { + console.warn('NativeAppearanceAdditions is only available on iOS'); + }, + horizontalSizeClass: () => { console.warn('NativeAppearanceAdditions is only available on iOS'); return 'regular' as SizeClass; }, - userInterfaceLevel: (_: number) => { + userInterfaceLevel: () => { console.warn('NativeAppearanceAdditions is only available on iOS'); return 'base' as UserInterfaceLevel; }, diff --git a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts index 627b9c4f8d..db253c34a6 100644 --- a/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts +++ b/packages/experimental/AppearanceAdditions/src/NativeAppearanceAdditions.types.ts @@ -1,7 +1,7 @@ export interface AppearanceAdditions { - horizontalSizeClass(reactTag): SizeClass; - userInterfaceLevel(reactTag): UserInterfaceLevel; - accessibilityContrastOption(reactTag): AccessibilityContrastOption; + readonly horizontalSizeClass: SizeClass; + readonly userInterfaceLevel: UserInterfaceLevel; + readonly accessibilityContrastOption: AccessibilityContrastOption; } export const HorizontalSizeClassKey = 'horizontalSizeClass'; diff --git a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts index 94f5311210..9711d0b5e5 100644 --- a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts +++ b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts @@ -11,9 +11,23 @@ class AppearanceAdditionsImpl implements AppearanceAdditions { _userInterfaceLevel: UserInterfaceLevel; _accessibilityContrastOption: AccessibilityContrastOption; - constructor() { - this._horizontalSizeClass = NativeAppearanceAdditions.horizontalSizeClass(null); - this._userInterfaceLevel = NativeAppearanceAdditions.userInterfaceLevel(null); + get horizontalSizeClass(): SizeClass { + return this._horizontalSizeClass; + } + + get userInterfaceLevel(): UserInterfaceLevel { + return this._userInterfaceLevel; + } + + get accessibilityContrastOption(): AccessibilityContrastOption { + return this._accessibilityContrastOption; + } + + constructor(reactTag: number = null) { + NativeAppearanceAdditions.initializeTraitCollection(reactTag); + + this._horizontalSizeClass = NativeAppearanceAdditions.horizontalSizeClass(); + this._userInterfaceLevel = NativeAppearanceAdditions.userInterfaceLevel(); this._accessibilityContrastOption = NativeAppearanceAdditions.accessibilityContrastOption(); const eventEmitter = new NativeEventEmitter(NativeAppearanceAdditions as any); @@ -23,28 +37,10 @@ class AppearanceAdditionsImpl implements AppearanceAdditions { this._accessibilityContrastOption = newValue[AccessibilityContrastOptionKey]; }); } - - horizontalSizeClass(reactTag = null): SizeClass { - if (!reactTag) { - return this._horizontalSizeClass; - } - return NativeAppearanceAdditions.horizontalSizeClass(reactTag); - } - - userInterfaceLevel(reactTag = null): UserInterfaceLevel { - if (!reactTag) { - return this._userInterfaceLevel; - } - return NativeAppearanceAdditions.userInterfaceLevel(reactTag); - } - - accessibilityContrastOption(): AccessibilityContrastOption { - return this._accessibilityContrastOption; - } } -function getAppearanceAdditionsWorker() { - return new AppearanceAdditionsImpl() as AppearanceAdditions; +function getAppearanceAdditionsWorker(reactTag: number) { + return new AppearanceAdditionsImpl(reactTag) as AppearanceAdditions; } export const appearanceAdditions = memoize(getAppearanceAdditionsWorker); diff --git a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts index 40f6f924a5..ecf41c6acb 100644 --- a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts +++ b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ts @@ -3,8 +3,12 @@ import { memoize } from '@fluentui-react-native/framework'; import type { AppearanceAdditions } from './NativeAppearanceAdditions.types'; // Default values for non-iOS clients. -function getAppearanceAdditionsWorker() { - return {} as AppearanceAdditions; +function getAppearanceAdditionsWorker(_reactTag: number) { + return { + horizontalSizeClass: 'regular', + userInterfaceLevel: 'base', + accessibilityContrastOption: 'normal', + } as AppearanceAdditions; } export const appearanceAdditions = memoize(getAppearanceAdditionsWorker); diff --git a/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts b/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts index 571ab8d9ba..967da9d916 100644 --- a/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts +++ b/packages/experimental/AppearanceAdditions/src/getSizeClass.ios.ts @@ -20,7 +20,7 @@ export function useHorizontalSizeClass(): SizeClass { // eslint-disable-next-line react-hooks/rules-of-hooks const subscription = useMemo( () => ({ - getCurrentValue: () => appearanceAdditions().horizontalSizeClass(rootTag), + getCurrentValue: () => appearanceAdditions(rootTag).horizontalSizeClass, subscribe: (callback) => { const appearanceSubscription = eventEmitter.addListener('appearanceChanged', callback); return () => { diff --git a/packages/theming/apple-theme/src/createAppleTheme.ios.ts b/packages/theming/apple-theme/src/createAppleTheme.ios.ts index 0bec556912..a165986345 100644 --- a/packages/theming/apple-theme/src/createAppleTheme.ios.ts +++ b/packages/theming/apple-theme/src/createAppleTheme.ios.ts @@ -9,7 +9,7 @@ import { getBaseAppleThemeIOS } from './appleTheme.ios'; export function createAppleTheme(): ThemeReference { const appleThemeReference = new ThemeReference({} as Theme, () => { const isLightMode = Appearance.getColorScheme() === 'light'; - const isElevated = NativeAppearanceAdditions.userInterfaceLevel(null) === 'elevated'; + const isElevated = NativeAppearanceAdditions.userInterfaceLevel() === 'elevated'; return getBaseAppleThemeIOS(isLightMode, isElevated); }); From 62d46b910fda5aecb7c91732c7714783f268413c Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Wed, 5 Apr 2023 14:01:18 -0700 Subject: [PATCH 12/14] Add null check for new traits in appearanceChanged event handler --- .../AppearanceAdditions/src/appearanceAdditions.ios.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts index 9711d0b5e5..aeffcba10d 100644 --- a/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts +++ b/packages/experimental/AppearanceAdditions/src/appearanceAdditions.ios.ts @@ -32,9 +32,9 @@ class AppearanceAdditionsImpl implements AppearanceAdditions { const eventEmitter = new NativeEventEmitter(NativeAppearanceAdditions as any); eventEmitter.addListener('appearanceChanged', (newValue) => { - this._horizontalSizeClass = newValue[HorizontalSizeClassKey]; - this._userInterfaceLevel = newValue[UserInterfaceLevelKey]; - this._accessibilityContrastOption = newValue[AccessibilityContrastOptionKey]; + this._horizontalSizeClass = newValue[HorizontalSizeClassKey] ?? this._horizontalSizeClass; + this._userInterfaceLevel = newValue[UserInterfaceLevelKey] ?? this._userInterfaceLevel; + this._accessibilityContrastOption = newValue[AccessibilityContrastOptionKey] ?? this._accessibilityContrastOption; }); } } From ea5e09afd119ffc2be0bd469b431bccb87e3a190 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Thu, 6 Apr 2023 15:15:02 -0700 Subject: [PATCH 13/14] Add space --- .../AppearanceAdditions/ios/FRNAppearanceAdditions.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index fc6ede8a96..bd3aa1a14b 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -147,7 +147,7 @@ The traits retrieved from RCTPresentedViewController() should be correct for non presumably because FRNAppearanceAdditions isn't a view, so it never gets updated with the right traitCollection (which happens when a view gets added to the view hierachy). */ --(UITraitCollection *)attemptTraitCollectionInitialization { +- (UITraitCollection *)attemptTraitCollectionInitialization { UIViewController *presentedViewControllerTraitCollection = RCTPresentedViewController(); if (presentedViewControllerTraitCollection != nil) { From 1b13e996dbcfeb1f1dd32287374fbeb9a7687451 Mon Sep 17 00:00:00 2001 From: lyzhan7 <78454019+lyzhan7@users.noreply.github.com> Date: Fri, 7 Apr 2023 11:41:22 -0700 Subject: [PATCH 14/14] Fix typos --- .../AppearanceAdditions/ios/FRNAppearanceAdditions.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m index bd3aa1a14b..9adafc69d3 100644 --- a/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m +++ b/packages/experimental/AppearanceAdditions/ios/FRNAppearanceAdditions.m @@ -86,7 +86,7 @@ + (BOOL)requiresMainQueueSetup { * be provided to the native module. * * This initialization step may be needed when accessing traits that can be different in different windows, which include horizontal size class and user interface level. - * This initialization step is not necessary if the only traits that are accessed are system wide traits common to all windows, such as accessibility contrast. + * This initialization step is not necessary if the only traits that are accessed are system wide traits common to all windows, such as accessibility contrast. */ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(initializeTraitCollection:(id)reactTag) { RCTUnsafeExecuteOnMainQueueSync(^{ @@ -143,7 +143,7 @@ - (void)startObserving { The traits retrieved from RCTPresentedViewController() should be correct for non-multiwindow scenarios. - The traits retrived from [UITraitCollection currentTraitCollection] will always be the same default trait collection, + The traits retrieved from [UITraitCollection currentTraitCollection] will always be the same default trait collection, presumably because FRNAppearanceAdditions isn't a view, so it never gets updated with the right traitCollection (which happens when a view gets added to the view hierachy). */