diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 9bb3145b68f208..774ca78dc3c2ed 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -153,6 +153,7 @@ public class com/facebook/react/ReactDelegate { public fun onHostDestroy ()V public fun onHostPause ()V public fun onHostResume ()V + public fun onWindowFocusChanged (Z)V public fun shouldShowDevMenuOrReload (ILandroid/view/KeyEvent;)Z } @@ -203,6 +204,7 @@ public abstract interface class com/facebook/react/ReactHost { public abstract fun onHostPause (Landroid/app/Activity;)V public abstract fun onHostResume (Landroid/app/Activity;)V public abstract fun onHostResume (Landroid/app/Activity;Lcom/facebook/react/modules/core/DefaultHardwareBackBtnHandler;)V + public abstract fun onWindowFocusChange (Z)V public abstract fun reload (Ljava/lang/String;)Lcom/facebook/react/interfaces/TaskInterface; public abstract fun removeBeforeDestroyListener (Lkotlin/jvm/functions/Function0;)V public abstract fun setJsEngineResolutionAlgorithm (Lcom/facebook/react/JSEngineResolutionAlgorithm;)V @@ -3641,6 +3643,7 @@ public class com/facebook/react/runtime/ReactHostImpl : com/facebook/react/React public fun onHostPause (Landroid/app/Activity;)V public fun onHostResume (Landroid/app/Activity;)V public fun onHostResume (Landroid/app/Activity;Lcom/facebook/react/modules/core/DefaultHardwareBackBtnHandler;)V + public fun onWindowFocusChange (Z)V public fun reload (Ljava/lang/String;)Lcom/facebook/react/interfaces/TaskInterface; public fun removeBeforeDestroyListener (Lkotlin/jvm/functions/Function0;)V public fun removeReactInstanceEventListener (Lcom/facebook/react/ReactInstanceEventListener;)V diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java index 229f2d9f630d4c..ca95a2615060f3 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java @@ -195,13 +195,7 @@ public boolean onNewIntent(Intent intent) { } public void onWindowFocusChanged(boolean hasFocus) { - if (ReactFeatureFlags.enableBridgelessArchitecture) { - // TODO T156475655: support onWindowFocusChanged - } else { - if (getReactNativeHost().hasInstance()) { - getReactNativeHost().getReactInstanceManager().onWindowFocusChange(hasFocus); - } - } + mReactDelegate.onWindowFocusChanged(hasFocus); } public void onConfigurationChanged(Configuration newConfig) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java index 7b83e71d5d8c64..bb0cb136e30994 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java @@ -148,6 +148,16 @@ public void onActivityResult( } } + public void onWindowFocusChanged(boolean hasFocus) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + mReactHost.onWindowFocusChange(hasFocus); + } else { + if (getReactNativeHost().hasInstance()) { + getReactNativeHost().getReactInstanceManager().onWindowFocusChange(hasFocus); + } + } + } + public void loadApp() { loadApp(mMainComponentName); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt index 69c9821b004a27..1183e792138518 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt @@ -120,6 +120,9 @@ public interface ReactHost { data: Intent?, ) + /* To be called when focus has changed for the hosting window. */ + public fun onWindowFocusChange(hasFocus: Boolean) + public fun addBeforeDestroyListener(onBeforeDestroy: () -> Unit) public fun removeBeforeDestroyListener(onBeforeDestroy: () -> Unit) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java index c7d852d38507d5..4ca0483914dc49 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java @@ -650,6 +650,23 @@ public void onActivityResult( "Tried to access onActivityResult while context is not ready")); } + /* To be called when focus has changed for the hosting window. */ + @ThreadConfined(UI) + @Override + public void onWindowFocusChange(boolean hasFocus) { + final String method = "onWindowFocusChange(hasFocus = \"" + hasFocus + "\")"; + log(method); + + ReactContext currentContext = getCurrentReactContext(); + if (currentContext != null) { + currentContext.onWindowFocusChange(hasFocus); + } + ReactSoftExceptionLogger.logSoftException( + TAG, + new ReactNoCrashSoftException( + "Tried to access onWindowFocusChange while context is not ready")); + } + @Nullable JavaScriptContextHolder getJavaScriptContextHolder() { final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();