|
9 | 9 |
|
10 | 10 | import static com.facebook.react.uimanager.UIManagerHelper.getReactContext; |
11 | 11 |
|
| 12 | +import android.content.ClipData; |
| 13 | +import android.content.ClipboardManager; |
12 | 14 | import android.content.Context; |
13 | 15 | import android.graphics.Color; |
14 | 16 | import android.graphics.Paint; |
@@ -208,7 +210,9 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { |
208 | 210 | public void onDestroyActionMode(ActionMode mode) {} |
209 | 211 | }; |
210 | 212 | setCustomSelectionActionModeCallback(customActionModeCallback); |
211 | | - setCustomInsertionActionModeCallback(customActionModeCallback); |
| 213 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 214 | + setCustomInsertionActionModeCallback(customActionModeCallback); |
| 215 | + } |
212 | 216 | } |
213 | 217 |
|
214 | 218 | @Override |
@@ -304,7 +308,26 @@ public InputConnection onCreateInputConnection(EditorInfo outAttrs) { |
304 | 308 | @Override |
305 | 309 | public boolean onTextContextMenuItem(int id) { |
306 | 310 | if (id == android.R.id.paste) { |
307 | | - id = android.R.id.pasteAsPlainText; |
| 311 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 312 | + id = android.R.id.pasteAsPlainText; |
| 313 | + } else { |
| 314 | + ClipboardManager clipboard = |
| 315 | + (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); |
| 316 | + ClipData previousClipData = clipboard.getPrimaryClip(); |
| 317 | + if (previousClipData != null) { |
| 318 | + for (int i = 0; i < previousClipData.getItemCount(); i++) { |
| 319 | + final CharSequence text = previousClipData.getItemAt(i).coerceToText(getContext()); |
| 320 | + final CharSequence paste = (text instanceof Spanned) ? text.toString() : text; |
| 321 | + if (paste != null) { |
| 322 | + ClipData clipData = ClipData.newPlainText(null, text); |
| 323 | + clipboard.setPrimaryClip(clipData); |
| 324 | + } |
| 325 | + } |
| 326 | + boolean actionPerformed = super.onTextContextMenuItem(id); |
| 327 | + clipboard.setPrimaryClip(previousClipData); |
| 328 | + return actionPerformed; |
| 329 | + } |
| 330 | + } |
308 | 331 | } |
309 | 332 | return super.onTextContextMenuItem(id); |
310 | 333 | } |
@@ -679,8 +702,10 @@ public void maybeSetText(ReactTextUpdate reactTextUpdate) { |
679 | 702 | } |
680 | 703 | mDisableTextDiffing = false; |
681 | 704 |
|
682 | | - if (getBreakStrategy() != reactTextUpdate.getTextBreakStrategy()) { |
683 | | - setBreakStrategy(reactTextUpdate.getTextBreakStrategy()); |
| 705 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 706 | + if (getBreakStrategy() != reactTextUpdate.getTextBreakStrategy()) { |
| 707 | + setBreakStrategy(reactTextUpdate.getTextBreakStrategy()); |
| 708 | + } |
684 | 709 | } |
685 | 710 |
|
686 | 711 | // Update cached spans (in Fabric only). |
|
0 commit comments