From 8f8c0496e8247f5fa07ff43b6f56e43a39c17d99 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Fri, 31 Jan 2020 18:13:00 -0800 Subject: [PATCH] Implement native TextInput autoFocus on Android (#27924) Summary: Follow up to https://github.com/facebook/react-native/issues/27803. To keep consistency between the implementations this also implements autoFocus natively on Android. This will allow removing the JS auto focus logic completely. ## Changelog [Android] [Fixed] - Implement native TextInput autoFocus on Android Pull Request resolved: https://github.com/facebook/react-native/pull/27924 Test Plan: Test using the TextInput example in RN tester. Differential Revision: D19674506 Pulled By: TheSavior fbshipit-source-id: 9cbb517fc69bccd11f5292a1ccb4acea2e3713e9 --- .../react/views/textinput/ReactEditText.java | 14 ++++++++++++++ .../views/textinput/ReactTextInputManager.java | 5 +++++ 2 files changed, 19 insertions(+) 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 639e01ba1ebcb3..da50126bed64fc 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 @@ -100,6 +100,8 @@ public class ReactEditText extends AppCompatEditText { private @Nullable String mFontFamily = null; private int mFontWeight = ReactTypefaceUtils.UNSET; private int mFontStyle = ReactTypefaceUtils.UNSET; + private boolean mAutoFocus = false; + private boolean mDidAttachToWindow = false; private ReactViewBackgroundManager mReactBackgroundManager; @@ -750,6 +752,14 @@ public void onAttachedToWindow() { span.onAttachedToWindow(); } } + + if (mAutoFocus && !mDidAttachToWindow) { + mShouldAllowFocus = true; + requestFocus(); + mShouldAllowFocus = false; + } + + mDidAttachToWindow = true; } @Override @@ -813,6 +823,10 @@ public void setMaxFontSizeMultiplier(float maxFontSizeMultiplier) { } } + public void setAutoFocus(boolean autoFocus) { + mAutoFocus = autoFocus; + } + protected void applyTextAttributes() { // In general, the `getEffective*` functions return `Float.NaN` if the // property hasn't been set. 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 37134e1994e811..6ea31dd7279663 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 @@ -795,6 +795,11 @@ public void showKeyboardOnFocus(ReactEditText view, boolean showKeyboardOnFocus) view.setShowSoftInputOnFocus(showKeyboardOnFocus); } + @ReactProp(name = "autoFocus", defaultBoolean = false) + public void setAutoFocus(ReactEditText view, boolean autoFocus) { + view.setAutoFocus(autoFocus); + } + @ReactPropGroup( names = { ViewProps.BORDER_WIDTH,