Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion shell/platform/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ action("pom_embedding") {
}

# To build and run:
# testing/run_tests.py [--type=java] [--filter=io.flutter.TestClassName]
# testing/run_tests.py [--type=java] [--java-filter=io.flutter.TestClassName]
action("robolectric_tests") {
script = "//build/android/gyp/javac.py"
depfile = "$target_gen_dir/$target_name.d"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
package io.flutter.plugin.editing;

import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
Expand Down Expand Up @@ -267,13 +269,53 @@ public boolean sendKeyEvent(KeyEvent event) {
}
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) {
int selStart = Selection.getSelectionStart(mEditable);
int newSel = Math.max(selStart - 1, 0);
setSelection(newSel, newSel);
int selEnd = Selection.getSelectionEnd(mEditable);
if (selStart == selEnd && !event.isShiftPressed()) {
int newSel = Math.max(selStart - 1, 0);
setSelection(newSel, newSel);
} else {
int newSelEnd = Math.max(selEnd - 1, 0);
setSelection(selStart, newSelEnd);
}
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {
int selStart = Selection.getSelectionStart(mEditable);
int newSel = Math.min(selStart + 1, mEditable.length());
setSelection(newSel, newSel);
int selEnd = Selection.getSelectionEnd(mEditable);
if (selStart == selEnd && !event.isShiftPressed()) {
int newSel = Math.min(selStart + 1, mEditable.length());
setSelection(newSel, newSel);
} else {
int newSelEnd = Math.min(selEnd + 1, mEditable.length());
setSelection(selStart, newSelEnd);
}
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {
int selStart = Selection.getSelectionStart(mEditable);
int selEnd = Selection.getSelectionEnd(mEditable);
if (selStart == selEnd && !event.isShiftPressed()) {
Selection.moveUp(mEditable, mLayout);
int newSelStart = Selection.getSelectionStart(mEditable);
setSelection(newSelStart, newSelStart);
} else {
Selection.extendUp(mEditable, mLayout);
int newSelStart = Selection.getSelectionStart(mEditable);
int newSelEnd = Selection.getSelectionEnd(mEditable);
setSelection(newSelStart, newSelEnd);
}
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
int selStart = Selection.getSelectionStart(mEditable);
int selEnd = Selection.getSelectionEnd(mEditable);
if (selStart == selEnd && !event.isShiftPressed()) {
Selection.moveDown(mEditable, mLayout);
int newSelStart = Selection.getSelectionStart(mEditable);
setSelection(newSelStart, newSelStart);
} else {
Selection.extendDown(mEditable, mLayout);
int newSelStart = Selection.getSelectionStart(mEditable);
int newSelEnd = Selection.getSelectionEnd(mEditable);
setSelection(newSelStart, newSelEnd);
}
return true;
// When the enter key is pressed on a non-multiline field, consider it a
// submit instead of a newline.
Expand All @@ -288,13 +330,75 @@ public boolean sendKeyEvent(KeyEvent event) {
if (character != 0) {
int selStart = Math.max(0, Selection.getSelectionStart(mEditable));
int selEnd = Math.max(0, Selection.getSelectionEnd(mEditable));
if (selEnd != selStart) mEditable.delete(selStart, selEnd);
mEditable.insert(selStart, String.valueOf((char) character));
setSelection(selStart + 1, selStart + 1);
int selMin = Math.min(selStart, selEnd);
int selMax = Math.max(selStart, selEnd);
if (selMin != selMax) mEditable.delete(selMin, selMax);
mEditable.insert(selMin, String.valueOf((char) character));
setSelection(selMin + 1, selMin + 1);
}
return true;
}
}
if (event.getAction() == KeyEvent.ACTION_UP
&& (event.getKeyCode() == KeyEvent.KEYCODE_SHIFT_LEFT
|| event.getKeyCode() == KeyEvent.KEYCODE_SHIFT_RIGHT)) {
int selEnd = Selection.getSelectionEnd(mEditable);
setSelection(selEnd, selEnd);
return true;
}
return false;
}

@Override
public boolean performContextMenuAction(int id) {
if (id == android.R.id.selectAll) {
setSelection(0, mEditable.length());
return true;
} else if (id == android.R.id.cut) {
int selStart = Selection.getSelectionStart(mEditable);
int selEnd = Selection.getSelectionEnd(mEditable);
if (selStart != selEnd) {
int selMin = Math.min(selStart, selEnd);
int selMax = Math.max(selStart, selEnd);
CharSequence textToCut = mEditable.subSequence(selMin, selMax);
ClipboardManager clipboard =
(ClipboardManager)
mFlutterView.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("text label?", textToCut);
clipboard.setPrimaryClip(clip);
mEditable.delete(selMin, selMax);
setSelection(selMin, selMin);
}
return true;
} else if (id == android.R.id.copy) {
int selStart = Selection.getSelectionStart(mEditable);
int selEnd = Selection.getSelectionEnd(mEditable);
if (selStart != selEnd) {
CharSequence textToCopy =
mEditable.subSequence(Math.min(selStart, selEnd), Math.max(selStart, selEnd));
ClipboardManager clipboard =
(ClipboardManager)
mFlutterView.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setPrimaryClip(ClipData.newPlainText("text label?", textToCopy));
}
return true;
} else if (id == android.R.id.paste) {
ClipboardManager clipboard =
(ClipboardManager) mFlutterView.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = clipboard.getPrimaryClip();
if (clip != null) {
CharSequence textToPaste = clip.getItemAt(0).coerceToText(mFlutterView.getContext());
int selStart = Math.max(0, Selection.getSelectionStart(mEditable));
int selEnd = Math.max(0, Selection.getSelectionEnd(mEditable));
int selMin = Math.min(selStart, selEnd);
int selMax = Math.max(selStart, selEnd);
if (selMin != selMax) mEditable.delete(selMin, selMax);
mEditable.insert(selMin, textToPaste);
int newSelStart = selMin + textToPaste.length();
setSelection(newSelStart, newSelStart);
}
return true;
}
return false;
}

Expand Down
Loading