Fallback to the first foregroundInactive window when there are no foregroundActive windows in RCTKeyWindow (#44167)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/44167

We received an issue for OSS where, when the main window is inactive and the system tries to present a dialog, the dialog is not presented in the right position on the screen.

This change introduce a fallback to the first inactive window (which is still visible on screen) and it fixes the issues.

[iOS][Changed] - Fallback to the first `foregroundInactive` window when there are no `foregroundActive` windows in RCTKeyWindow

Reviewed By: dmytrorykun

Differential Revision: D56354741

fbshipit-source-id: fa23131ecd40f6d91c705879a72890506ee21486
This commit is contained in:
Riccardo Cipolleschi
2024-04-25 03:28:22 -07:00
committed by Riccardo Cipolleschi
parent 7a841dbcd1
commit eaaf865449
+28 -8
View File
@@ -562,17 +562,37 @@ UIWindow *__nullable RCTKeyWindow(void)
return nil;
}
for (UIScene *scene in RCTSharedApplication().connectedScenes) {
if (scene.activationState != UISceneActivationStateForegroundActive ||
![scene isKindOfClass:[UIWindowScene class]]) {
NSSet<UIScene *> *connectedScenes = RCTSharedApplication().connectedScenes;
UIScene *foregroundActiveScene;
UIScene *foregroundInactiveScene;
for (UIScene *scene in connectedScenes) {
if (![scene isKindOfClass:[UIWindowScene class]]) {
continue;
}
UIWindowScene *windowScene = (UIWindowScene *)scene;
for (UIWindow *window in windowScene.windows) {
if (window.isKeyWindow) {
return window;
}
if (scene.activationState == UISceneActivationStateForegroundActive) {
foregroundActiveScene = scene;
break;
}
if (!foregroundInactiveScene && scene.activationState == UISceneActivationStateForegroundInactive) {
foregroundInactiveScene = scene;
// no break, we can have the active scene later in the set.
}
}
UIScene *sceneToUse = foregroundActiveScene ? foregroundActiveScene : foregroundInactiveScene;
UIWindowScene *windowScene = (UIWindowScene *)sceneToUse;
if (@available(iOS 15.0, *)) {
return windowScene.keyWindow;
}
for (UIWindow *window in windowScene.windows) {
if (window.isKeyWindow) {
return window;
}
}