From d2698c22a07a62f7715d48c3017a25ce6075aaa2 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Tue, 26 Aug 2025 20:11:52 +0530 Subject: [PATCH 01/11] fix: set focus timeout for isScreenTransitionEnded after interactions completed --- src/hooks/useAutoFocusInput.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hooks/useAutoFocusInput.ts b/src/hooks/useAutoFocusInput.ts index 3f8a41402863..50a345abfaf2 100644 --- a/src/hooks/useAutoFocusInput.ts +++ b/src/hooks/useAutoFocusInput.ts @@ -48,14 +48,17 @@ export default function useAutoFocusInput(isMultiline = false): UseAutoFocusInpu useFocusEffect( useCallback(() => { - focusTimeoutRef.current = setTimeout(() => { - setIsScreenTransitionEnded(true); - }, CONST.ANIMATED_TRANSITION); + const focusTimeoutTask = InteractionManager.runAfterInteractions(() => { + focusTimeoutRef.current = setTimeout(() => { + setIsScreenTransitionEnded(true); + }, CONST.ANIMATED_TRANSITION); + }); return () => { setIsScreenTransitionEnded(false); if (!focusTimeoutRef.current) { return; } + focusTimeoutTask.cancel(); clearTimeout(focusTimeoutRef.current); }; }, []), From 556bffe18c01f0f7a2259d38c0eda5416c88a97c Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Wed, 27 Aug 2025 21:53:28 +0530 Subject: [PATCH 02/11] Revert "fix: set focus timeout for isScreenTransitionEnded after interactions completed" This reverts commit d2698c22a07a62f7715d48c3017a25ce6075aaa2. --- src/hooks/useAutoFocusInput.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/hooks/useAutoFocusInput.ts b/src/hooks/useAutoFocusInput.ts index 50a345abfaf2..3f8a41402863 100644 --- a/src/hooks/useAutoFocusInput.ts +++ b/src/hooks/useAutoFocusInput.ts @@ -48,17 +48,14 @@ export default function useAutoFocusInput(isMultiline = false): UseAutoFocusInpu useFocusEffect( useCallback(() => { - const focusTimeoutTask = InteractionManager.runAfterInteractions(() => { - focusTimeoutRef.current = setTimeout(() => { - setIsScreenTransitionEnded(true); - }, CONST.ANIMATED_TRANSITION); - }); + focusTimeoutRef.current = setTimeout(() => { + setIsScreenTransitionEnded(true); + }, CONST.ANIMATED_TRANSITION); return () => { setIsScreenTransitionEnded(false); if (!focusTimeoutRef.current) { return; } - focusTimeoutTask.cancel(); clearTimeout(focusTimeoutRef.current); }; }, []), From 2e14a793676a24d0c2dd3645d1880e68d6692d10 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Wed, 27 Aug 2025 21:59:27 +0530 Subject: [PATCH 03/11] fix: set isScreenTransitionEnded after all interactions completed --- src/hooks/useAutoFocusInput.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hooks/useAutoFocusInput.ts b/src/hooks/useAutoFocusInput.ts index 3f8a41402863..21eb6a315365 100644 --- a/src/hooks/useAutoFocusInput.ts +++ b/src/hooks/useAutoFocusInput.ts @@ -69,7 +69,9 @@ export default function useAutoFocusInput(isMultiline = false): UseAutoFocusInpu return; } - Promise.all([ComposerFocusManager.isReadyToFocus(), isWindowReadyToFocus()]).then(() => setIsScreenTransitionEnded(isSidePanelTransitionEnded)); + InteractionManager.runAfterInteractions(() => { + Promise.all([ComposerFocusManager.isReadyToFocus(), isWindowReadyToFocus()]).then(() => setIsScreenTransitionEnded(isSidePanelTransitionEnded)); + }); }, [isSidePanelTransitionEnded, shouldHideSidePanel, prevShouldHideSidePanel]); const inputCallbackRef = (ref: TextInput | null) => { From 9f02e4462697931e3e07fb71c863bc78a88e4cec Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Thu, 28 Aug 2025 23:22:43 +0530 Subject: [PATCH 04/11] fix(react-native): show soft keyboard reliably on Android --- ...79.2+028+show-soft-keyboard-reliably.patch | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch diff --git a/patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch b/patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch new file mode 100644 index 000000000000..6d63b02e6b3a --- /dev/null +++ b/patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch @@ -0,0 +1,22 @@ +diff --git a/ReactEditText.java b/ReactEditText.java +index 095313e..3ebbd6a 100644 +--- a/ReactEditText.java ++++ b/ReactEditText.java +@@ -1164,6 +1164,17 @@ public class ReactEditText extends AppCompatEditText { + mDidAttachToWindow = true; + } + ++ @Override ++ public void onWindowFocusChanged(boolean hasWindowFocus) { ++ if (hasWindowFocus) { ++ requestFocus(); ++ post(() -> { ++ requestFocus(); ++ showSoftKeyboard(); ++ }); ++ } ++ } ++ + @Override + public void onFinishTemporaryDetach() { + super.onFinishTemporaryDetach(); From fb407e90acfc47e950223495dcde9f233264f9e8 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Fri, 29 Aug 2025 01:11:47 +0530 Subject: [PATCH 05/11] Revert "fix(react-native): show soft keyboard reliably on Android" This reverts commit 9f02e4462697931e3e07fb71c863bc78a88e4cec. --- ...79.2+028+show-soft-keyboard-reliably.patch | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch diff --git a/patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch b/patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch deleted file mode 100644 index 6d63b02e6b3a..000000000000 --- a/patches/react-native/react-native+0.79.2+028+show-soft-keyboard-reliably.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/ReactEditText.java b/ReactEditText.java -index 095313e..3ebbd6a 100644 ---- a/ReactEditText.java -+++ b/ReactEditText.java -@@ -1164,6 +1164,17 @@ public class ReactEditText extends AppCompatEditText { - mDidAttachToWindow = true; - } - -+ @Override -+ public void onWindowFocusChanged(boolean hasWindowFocus) { -+ if (hasWindowFocus) { -+ requestFocus(); -+ post(() -> { -+ requestFocus(); -+ showSoftKeyboard(); -+ }); -+ } -+ } -+ - @Override - public void onFinishTemporaryDetach() { - super.onFinishTemporaryDetach(); From 317a6b2a37a0cb19b7897f246ff2dd66540b3e99 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Fri, 29 Aug 2025 01:13:59 +0530 Subject: [PATCH 06/11] fix(react-native): show software keyboard reliably on android --- ...+show-android-soft-keyboard-reliably.patch | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch diff --git a/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch b/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch new file mode 100644 index 000000000000..3dab34c1be86 --- /dev/null +++ b/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch @@ -0,0 +1,32 @@ +diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +index 095313e..5e99f26 100644 +--- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java ++++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +@@ -424,7 +424,9 @@ public class ReactEditText extends AppCompatEditText { + private boolean requestFocusProgramatically() { + boolean focused = super.requestFocus(View.FOCUS_DOWN, null); + if (isInTouchMode() && getShowSoftInputOnFocus()) { +- showSoftKeyboard(); ++ post(() -> { ++ showSoftKeyboard(); ++ }); + } + + return focused; +@@ -1164,6 +1166,16 @@ public class ReactEditText extends AppCompatEditText { + mDidAttachToWindow = true; + } + ++ @Override ++ public void onWindowFocusChanged(boolean hasWindowFocus) { ++ if (hasWindowFocus && mAutoFocus) { ++ requestFocus(); ++ post(() -> { ++ showSoftKeyboard(); ++ }); ++ } ++ } ++ + @Override + public void onFinishTemporaryDetach() { + super.onFinishTemporaryDetach(); From abecd8bc62e8a344bdf209548481192e285969e2 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Fri, 29 Aug 2025 23:56:23 +0530 Subject: [PATCH 07/11] fix: use autoFocus to handle focus for status message text input --- src/pages/settings/Profile/CustomStatus/StatusPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/settings/Profile/CustomStatus/StatusPage.tsx b/src/pages/settings/Profile/CustomStatus/StatusPage.tsx index 022d2df5f67e..6d7901d8b477 100644 --- a/src/pages/settings/Profile/CustomStatus/StatusPage.tsx +++ b/src/pages/settings/Profile/CustomStatus/StatusPage.tsx @@ -219,7 +219,7 @@ function StatusPage() { /> Date: Sat, 30 Aug 2025 13:09:49 +0530 Subject: [PATCH 08/11] Revert "fix: use autoFocus to handle focus for status message text input" This reverts commit abecd8bc62e8a344bdf209548481192e285969e2. --- src/pages/settings/Profile/CustomStatus/StatusPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/settings/Profile/CustomStatus/StatusPage.tsx b/src/pages/settings/Profile/CustomStatus/StatusPage.tsx index 6d7901d8b477..022d2df5f67e 100644 --- a/src/pages/settings/Profile/CustomStatus/StatusPage.tsx +++ b/src/pages/settings/Profile/CustomStatus/StatusPage.tsx @@ -219,7 +219,7 @@ function StatusPage() { /> Date: Sat, 30 Aug 2025 15:12:39 +0530 Subject: [PATCH 09/11] fix(react-native): update patch to show keyboard programmatically --- ...+show-android-soft-keyboard-reliably.patch | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch b/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch index 3dab34c1be86..fc00ff54d718 100644 --- a/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch +++ b/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch @@ -1,29 +1,48 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java -index 095313e..5e99f26 100644 +index 095313e..b152400 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java -@@ -424,7 +424,9 @@ public class ReactEditText extends AppCompatEditText { +@@ -136,6 +136,7 @@ public class ReactEditText extends AppCompatEditText { + private int mFontWeight = ReactConstants.UNSET; + private int mFontStyle = ReactConstants.UNSET; + private boolean mAutoFocus = false; ++ private boolean mShowKeyboardDelayed = false; + private boolean mContextMenuHidden = false; + private boolean mDidAttachToWindow = false; + private boolean mSelectTextOnFocus = false; +@@ -424,7 +425,8 @@ public class ReactEditText extends AppCompatEditText { private boolean requestFocusProgramatically() { boolean focused = super.requestFocus(View.FOCUS_DOWN, null); if (isInTouchMode() && getShowSoftInputOnFocus()) { - showSoftKeyboard(); -+ post(() -> { -+ showSoftKeyboard(); -+ }); ++ mShowKeyboardDelayed = true; ++ showSoftKeyboardReliably(); } return focused; -@@ -1164,6 +1166,16 @@ public class ReactEditText extends AppCompatEditText { +@@ -1164,6 +1166,28 @@ public class ReactEditText extends AppCompatEditText { mDidAttachToWindow = true; } + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { -+ if (hasWindowFocus && mAutoFocus) { -+ requestFocus(); -+ post(() -> { -+ showSoftKeyboard(); -+ }); ++ super.onWindowFocusChanged(hasWindowFocus); ++ ++ if(hasWindowFocus && mAutoFocus) { ++ requestFocusProgramatically(); ++ } else { ++ showSoftKeyboardReliably(); ++ } ++ } ++ ++ private void showSoftKeyboardReliably() { ++ if(hasWindowFocus() && (mShowKeyboardDelayed || mAutoFocus)) { ++ if(isFocused()) { ++ post(() -> { ++ showSoftKeyboard(); ++ }); ++ } ++ mShowKeyboardDelayed = false; + } + } + From 1bc2bec7169cb0c530a42c8987517cb2e38eb1c1 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Fri, 12 Sep 2025 20:51:34 +0530 Subject: [PATCH 10/11] refactor(patches/rn): remove autoFocus handling in onWindowFocus We are already calling requestFocusProgrammatically for autoFocus in onAttachedToWindow , which handles opening keyboard reliably --- ...9.2+028+show-android-soft-keyboard-reliably.patch | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch b/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch index fc00ff54d718..8be127110d4d 100644 --- a/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch +++ b/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java -index 095313e..b152400 100644 +index 095313e..766630a 100644 --- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -136,6 +136,7 @@ public class ReactEditText extends AppCompatEditText { @@ -20,7 +20,7 @@ index 095313e..b152400 100644 } return focused; -@@ -1164,6 +1166,28 @@ public class ReactEditText extends AppCompatEditText { +@@ -1164,6 +1166,24 @@ public class ReactEditText extends AppCompatEditText { mDidAttachToWindow = true; } @@ -28,15 +28,11 @@ index 095313e..b152400 100644 + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + -+ if(hasWindowFocus && mAutoFocus) { -+ requestFocusProgramatically(); -+ } else { -+ showSoftKeyboardReliably(); -+ } ++ showSoftKeyboardReliably(); + } + + private void showSoftKeyboardReliably() { -+ if(hasWindowFocus() && (mShowKeyboardDelayed || mAutoFocus)) { ++ if(hasWindowFocus() && mShowKeyboardDelayed) { + if(isFocused()) { + post(() -> { + showSoftKeyboard(); From 17fbc3abfd6c295b9a04631304bbaabe6e0b890d Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Sat, 13 Sep 2025 19:59:43 +0530 Subject: [PATCH 11/11] chore(patches/rn): add description for latest react-native patch Also, renamed patch file to follow sequence of files. --- patches/react-native/details.md | 7 +++++++ ...e+0.79.2+029+show-android-soft-keyboard-reliably.patch} | 0 2 files changed, 7 insertions(+) rename patches/react-native/{react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch => react-native+0.79.2+029+show-android-soft-keyboard-reliably.patch} (100%) diff --git a/patches/react-native/details.md b/patches/react-native/details.md index 401ac5c2a46d..4ed91548776a 100644 --- a/patches/react-native/details.md +++ b/patches/react-native/details.md @@ -199,3 +199,10 @@ - Upstream PR/issue: 🛑 - E/App issue: [#69005](https://github.com/Expensify/App/issues/69005) - PR introducing patch: [#69004](https://github.com/Expensify/App/pull/69004) + +### [react-native+0.79.2+029+show-android-soft-keyboard-reliably.patch](react-native+0.79.2+029+show-android-soft-keyboard-reliably.patch) + +- Reason: Fixes an Android issue where the soft keyboard often failed to appear because TextInput requested it before its parent View was fully focused. The patch delays the request until focus is ready, ensuring the keyboard shows reliably without extra workarounds. +- Upstream PR/issue: 🛑 +- E/App issue: [#69005](https://github.com/Expensify/App/issues/67201) +- PR introducing patch: [#69004](https://github.com/Expensify/App/pull/69265) diff --git a/patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch b/patches/react-native/react-native+0.79.2+029+show-android-soft-keyboard-reliably.patch similarity index 100% rename from patches/react-native/react-native+0.79.2+028+show-android-soft-keyboard-reliably.patch rename to patches/react-native/react-native+0.79.2+029+show-android-soft-keyboard-reliably.patch