diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java index 8384d767007..295f45c19ce 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java @@ -9,8 +9,12 @@ package com.facebook.react.uimanager; import static com.facebook.react.uimanager.common.UIManagerType.FABRIC; import static com.facebook.react.uimanager.common.ViewUtil.getUIManagerType; -import com.facebook.react.bridge.CatalystInstance; + +import android.content.Context; +import android.content.ContextWrapper; +import android.view.View; import androidx.annotation.Nullable; +import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.JSIModuleType; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactSoftException; @@ -65,4 +69,20 @@ public class UIManagerHelper { UIManager uiManager = getUIManager(context, uiManagerType); return uiManager == null ? null : (EventDispatcher) uiManager.getEventDispatcher(); } + + /** + * @return The {@link ReactContext} associated to the {@link View} received as a parameter. + *

We can't rely that the method View.getContext() will return the same context that was + * passed as a parameter during the construction of the View. + *

For example the AppCompatEditText class wraps the context received as a parameter in the + * constructor of the View into a TintContextWrapper object. See: + * https://android.googlesource.com/platform/frameworks/support/+/dd55716/v7/appcompat/src/android/support/v7/widget/AppCompatEditText.java#55 + */ + public static ReactContext getReactContext(View view) { + Context context = view.getContext(); + if (!(context instanceof ReactContext) && context instanceof ContextWrapper) { + context = ((ContextWrapper) context).getBaseContext(); + } + return (ReactContext) context; + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index 81b8cb87da9..67b4c1aa702 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -7,6 +7,8 @@ package com.facebook.react.views.textinput; +import static com.facebook.react.uimanager.UIManagerHelper.getReactContext; + import android.content.Context; import android.graphics.Rect; import android.graphics.Typeface; @@ -114,7 +116,7 @@ public class ReactEditText extends AppCompatEditText { mReactBackgroundManager = new ReactViewBackgroundManager(this); mInputMethodManager = (InputMethodManager) - Assertions.assertNotNull(getContext().getSystemService(Context.INPUT_METHOD_SERVICE)); + Assertions.assertNotNull(context.getSystemService(Context.INPUT_METHOD_SERVICE)); mDefaultGravityHorizontal = getGravity() & (Gravity.HORIZONTAL_GRAVITY_MASK | Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK); mDefaultGravityVertical = getGravity() & Gravity.VERTICAL_GRAVITY_MASK; @@ -219,7 +221,7 @@ public class ReactEditText extends AppCompatEditText { @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - ReactContext reactContext = (ReactContext) getContext(); + ReactContext reactContext = getReactContext(this); InputConnection inputConnection = super.onCreateInputConnection(outAttrs); if (inputConnection != null && mOnKeyPress) { inputConnection = @@ -601,7 +603,7 @@ public class ReactEditText extends AppCompatEditText { // Since the LocalData object is constructed by getting values from the underlying EditText // view, we don't need to construct one or apply it at all - it provides no use in Fabric. if (mStateWrapper == null) { - ReactContext reactContext = (ReactContext) getContext(); + ReactContext reactContext = getReactContext(this); final ReactTextInputLocalData localData = new ReactTextInputLocalData(this); UIManagerModule uiManager = reactContext.getNativeModule(UIManagerModule.class); uiManager.setViewLocalData(getId(), localData); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java index d614989a3e7..ba055c292aa 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java @@ -7,6 +7,8 @@ package com.facebook.react.views.textinput; +import static com.facebook.react.uimanager.UIManagerHelper.getReactContext; + import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Build; @@ -1056,7 +1058,7 @@ public class ReactTextInputManager extends BaseViewManager