diff --git a/dev/integration_tests/android_semantics_testing/android/app/src/main/java/com/yourcompany/platforminteraction/MainActivity.java b/dev/integration_tests/android_semantics_testing/android/app/src/main/java/com/yourcompany/platforminteraction/MainActivity.java index e753f4eda6c..e8db455923f 100644 --- a/dev/integration_tests/android_semantics_testing/android/app/src/main/java/com/yourcompany/platforminteraction/MainActivity.java +++ b/dev/integration_tests/android_semantics_testing/android/app/src/main/java/com/yourcompany/platforminteraction/MainActivity.java @@ -15,6 +15,8 @@ import android.os.Build; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.WindowManager; +import android.content.ClipboardManager; +import android.content.ClipData; import android.content.Context; import androidx.annotation.NonNull; @@ -66,6 +68,16 @@ public class MainActivity extends FlutterActivity { result.success(convertSemantics(node, id)); return; } + if (methodCall.method.equals("setClipboard")) { + Map data = methodCall.arguments(); + @SuppressWarnings("unchecked") + String message = (String) data.get("message"); + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("message", message); + clipboard.setPrimaryClip(clip); + result.success(null); + return; + } result.notImplemented(); } diff --git a/dev/integration_tests/android_semantics_testing/lib/main.dart b/dev/integration_tests/android_semantics_testing/lib/main.dart index e721e1ba525..fd0a7d31465 100644 --- a/dev/integration_tests/android_semantics_testing/lib/main.dart +++ b/dev/integration_tests/android_semantics_testing/lib/main.dart @@ -39,6 +39,21 @@ Future dataHandler(String message) async { completeSemantics(); return completer.future; } + if (message.contains('setClipboard')) { + final Completer completer = Completer(); + final String str = message.split('#')[1]; + Future completeSetClipboard([Object _]) async { + await kSemanticsChannel.invokeMethod('setClipboard', { + 'message': str, + }); + completer.complete(''); + } + if (SchedulerBinding.instance.hasScheduledFrame) + SchedulerBinding.instance.addPostFrameCallback(completeSetClipboard); + else + completeSetClipboard(); + return completer.future; + } throw UnimplementedError(); } diff --git a/dev/integration_tests/android_semantics_testing/test_driver/main_test.dart b/dev/integration_tests/android_semantics_testing/test_driver/main_test.dart index 0b6b2615de9..e4faad917f1 100644 --- a/dev/integration_tests/android_semantics_testing/test_driver/main_test.dart +++ b/dev/integration_tests/android_semantics_testing/test_driver/main_test.dart @@ -120,29 +120,7 @@ void main() { // Ideally this should test the case where there is nothing on the // clipboard as well, but there is no reliable way to clear the // clipboard on Android devices. - final SerializableFinder normalTextField = find.descendant( - of: find.byValueKey(normalTextFieldKeyValue), - matching: find.byType('Semantics'), - firstMatchOnly: true, - ); - await driver.tap(normalTextField); - await Future.delayed(const Duration(milliseconds: 500)); - await driver.enterText('hello world'); - await Future.delayed(const Duration(milliseconds: 500)); - await driver.tap(normalTextField); - await Future.delayed(const Duration(milliseconds: 50)); - await driver.tap(normalTextField); - await Future.delayed(const Duration(milliseconds: 500)); - await driver.tap(find.text('Select all')); - await Future.delayed(const Duration(milliseconds: 500)); - await driver.tap(find.text('Copy')); - await Future.delayed(const Duration(milliseconds: 50)); - await driver.enterText(''); - await Future.delayed(const Duration(milliseconds: 500)); - // Go back to previous page and forward again to unfocus the field. - await driver.tap(find.byValueKey(backButtonKeyValue)); - await Future.delayed(const Duration(milliseconds: 500)); - await driver.tap(find.text(textFieldRoute)); + await driver.requestData('setClipboard#Hello World'); await Future.delayed(const Duration(milliseconds: 500)); });