Support onConfigurationChanged in Bridgeless (#43463)

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

Implement `onConfigurationChanged` in Bridgeless by adding it to ReactHostImpl

Changelog:
[Android][Breaking] Implement onConfigurationChanged in Bridgeless

Reviewed By: cortinico, RSNara

Differential Revision: D54792399

fbshipit-source-id: 6851daca815f486f4d839e128a1d740d3fec1996
This commit is contained in:
Arushi Kesarwani
2024-03-13 15:08:55 -07:00
committed by Facebook GitHub Bot
parent 5807ada292
commit b2e1db0fbf
5 changed files with 33 additions and 7 deletions
@@ -150,6 +150,7 @@ public class com/facebook/react/ReactDelegate {
public fun loadApp (Ljava/lang/String;)V
public fun onActivityResult (IILandroid/content/Intent;Z)V
public fun onBackPressed ()Z
public fun onConfigurationChanged (Landroid/content/res/Configuration;)V
public fun onHostDestroy ()V
public fun onHostPause ()V
public fun onHostResume ()V
@@ -199,6 +200,7 @@ public abstract interface class com/facebook/react/ReactHost {
public abstract fun getReactQueueConfiguration ()Lcom/facebook/react/bridge/queue/ReactQueueConfiguration;
public abstract fun onActivityResult (Landroid/app/Activity;IILandroid/content/Intent;)V
public abstract fun onBackPressed ()Z
public abstract fun onConfigurationChanged (Landroid/content/Context;)V
public abstract fun onHostDestroy ()V
public abstract fun onHostDestroy (Landroid/app/Activity;)V
public abstract fun onHostPause ()V
@@ -3639,6 +3641,7 @@ public class com/facebook/react/runtime/ReactHostImpl : com/facebook/react/React
public fun getReactQueueConfiguration ()Lcom/facebook/react/bridge/queue/ReactQueueConfiguration;
public fun onActivityResult (Landroid/app/Activity;IILandroid/content/Intent;)V
public fun onBackPressed ()Z
public fun onConfigurationChanged (Landroid/content/Context;)V
public fun onHostDestroy ()V
public fun onHostDestroy (Landroid/app/Activity;)V
public fun onHostPause ()V
@@ -191,13 +191,7 @@ public class ReactActivityDelegate {
}
public void onConfigurationChanged(Configuration newConfig) {
if (ReactFeatureFlags.enableBridgelessArchitecture) {
// TODO T156475655: support onConfigurationChanged
} else {
if (getReactNativeHost().hasInstance()) {
getReactInstanceManager().onConfigurationChanged(getContext(), newConfig);
}
}
mReactDelegate.onConfigurationChanged(newConfig);
}
public void requestPermissions(
@@ -9,6 +9,7 @@ package com.facebook.react;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.KeyEvent;
import androidx.annotation.Nullable;
@@ -172,6 +173,17 @@ public class ReactDelegate {
}
}
public void onConfigurationChanged(Configuration newConfig) {
if (ReactFeatureFlags.enableBridgelessArchitecture) {
mReactHost.onConfigurationChanged(Assertions.assertNotNull(mActivity));
} else {
if (getReactNativeHost().hasInstance()) {
getReactInstanceManager()
.onConfigurationChanged(Assertions.assertNotNull(mActivity), newConfig);
}
}
}
public void loadApp() {
loadApp(mMainComponentName);
}
@@ -126,6 +126,8 @@ public interface ReactHost {
/* This method will give JS the opportunity to receive intents via Linking. */
public fun onNewIntent(intent: Intent)
public fun onConfigurationChanged(context: Context)
public fun addBeforeDestroyListener(onBeforeDestroy: () -> Unit)
public fun removeBeforeDestroyListener(onBeforeDestroy: () -> Unit)
@@ -58,6 +58,7 @@ import com.facebook.react.fabric.FabricUIManager;
import com.facebook.react.interfaces.TaskInterface;
import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler;
import com.facebook.react.interfaces.fabric.ReactSurface;
import com.facebook.react.modules.appearance.AppearanceModule;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.runtime.internal.bolts.Continuation;
@@ -699,6 +700,20 @@ public class ReactHostImpl implements ReactHost {
new ReactNoCrashSoftException("Tried to access onNewIntent while context is not ready"));
}
@ThreadConfined(UI)
@Override
public void onConfigurationChanged(Context updatedContext) {
ReactContext currentReactContext = getCurrentReactContext();
if (currentReactContext != null) {
AppearanceModule appearanceModule =
currentReactContext.getNativeModule(AppearanceModule.class);
if (appearanceModule != null) {
appearanceModule.onConfigurationChanged(updatedContext);
}
}
}
@Nullable
JavaScriptContextHolder getJavaScriptContextHolder() {
final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();