From cadcf541fac1e1b0a652fd5f2fd30de7e0359d4b Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Tue, 2 Jan 2024 10:22:44 +0000 Subject: [PATCH] Revert "Remove support for Android API < 23 in ReactEditText (#39671)" This reverts commit 1904e8036a777e463c5517010a254f0d081ae58c. --- .../react/views/textinput/ReactEditText.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index ecc6165f724..081f2b80160 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -9,6 +9,8 @@ package com.facebook.react.views.textinput; import static com.facebook.react.uimanager.UIManagerHelper.getReactContext; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.graphics.Color; import android.graphics.Paint; @@ -208,7 +210,9 @@ public class ReactEditText extends AppCompatEditText { public void onDestroyActionMode(ActionMode mode) {} }; setCustomSelectionActionModeCallback(customActionModeCallback); - setCustomInsertionActionModeCallback(customActionModeCallback); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + setCustomInsertionActionModeCallback(customActionModeCallback); + } } @Override @@ -304,7 +308,26 @@ public class ReactEditText extends AppCompatEditText { @Override public boolean onTextContextMenuItem(int id) { if (id == android.R.id.paste) { - id = android.R.id.pasteAsPlainText; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + id = android.R.id.pasteAsPlainText; + } else { + ClipboardManager clipboard = + (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData previousClipData = clipboard.getPrimaryClip(); + if (previousClipData != null) { + for (int i = 0; i < previousClipData.getItemCount(); i++) { + final CharSequence text = previousClipData.getItemAt(i).coerceToText(getContext()); + final CharSequence paste = (text instanceof Spanned) ? text.toString() : text; + if (paste != null) { + ClipData clipData = ClipData.newPlainText(null, text); + clipboard.setPrimaryClip(clipData); + } + } + boolean actionPerformed = super.onTextContextMenuItem(id); + clipboard.setPrimaryClip(previousClipData); + return actionPerformed; + } + } } return super.onTextContextMenuItem(id); } @@ -679,8 +702,10 @@ public class ReactEditText extends AppCompatEditText { } mDisableTextDiffing = false; - if (getBreakStrategy() != reactTextUpdate.getTextBreakStrategy()) { - setBreakStrategy(reactTextUpdate.getTextBreakStrategy()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (getBreakStrategy() != reactTextUpdate.getTextBreakStrategy()) { + setBreakStrategy(reactTextUpdate.getTextBreakStrategy()); + } } // Update cached spans (in Fabric only).