|
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