diff --git a/dev/benchmarks/complex_layout/android/settings.gradle b/dev/benchmarks/complex_layout/android/settings.gradle
index d3b6a4013d..663db3adba 100644
--- a/dev/benchmarks/complex_layout/android/settings.gradle
+++ b/dev/benchmarks/complex_layout/android/settings.gradle
@@ -3,13 +3,3 @@
// found in the LICENSE file.
include ':app'
-
-def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
-def properties = new Properties()
-
-assert localPropertiesFile.exists()
-localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
-
-def flutterSdkPath = properties.getProperty("flutter.sdk")
-assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
-apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/dev/benchmarks/complex_layout/ios/.gitignore b/dev/benchmarks/complex_layout/ios/.gitignore
deleted file mode 100644
index e96ef602b8..0000000000
--- a/dev/benchmarks/complex_layout/ios/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-*.mode1v3
-*.mode2v3
-*.moved-aside
-*.pbxuser
-*.perspectivev3
-**/*sync/
-.sconsign.dblite
-.tags*
-**/.vagrant/
-**/DerivedData/
-Icon?
-**/Pods/
-**/.symlinks/
-profile
-xcuserdata
-**/.generated/
-Flutter/App.framework
-Flutter/Flutter.framework
-Flutter/Flutter.podspec
-Flutter/Generated.xcconfig
-Flutter/app.flx
-Flutter/app.zip
-Flutter/flutter_assets/
-Flutter/flutter_export_environment.sh
-ServiceDefinitions.json
-Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!default.mode1v3
-!default.mode2v3
-!default.pbxuser
-!default.perspectivev3
diff --git a/dev/benchmarks/complex_layout/ios/Flutter/Debug.xcconfig b/dev/benchmarks/complex_layout/ios/Flutter/Debug.xcconfig
deleted file mode 100644
index e8efba1146..0000000000
--- a/dev/benchmarks/complex_layout/ios/Flutter/Debug.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
-#include "Generated.xcconfig"
diff --git a/dev/benchmarks/complex_layout/ios/Flutter/Release.xcconfig b/dev/benchmarks/complex_layout/ios/Flutter/Release.xcconfig
deleted file mode 100644
index 399e9340e6..0000000000
--- a/dev/benchmarks/complex_layout/ios/Flutter/Release.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
-#include "Generated.xcconfig"
diff --git a/dev/benchmarks/complex_layout/ios/Podfile b/dev/benchmarks/complex_layout/ios/Podfile
deleted file mode 100644
index 1e8c3c90a5..0000000000
--- a/dev/benchmarks/complex_layout/ios/Podfile
+++ /dev/null
@@ -1,41 +0,0 @@
-# Uncomment this line to define a global platform for your project
-# platform :ios, '9.0'
-
-# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
-ENV['COCOAPODS_DISABLE_STATS'] = 'true'
-
-project 'Runner', {
- 'Debug' => :debug,
- 'Profile' => :release,
- 'Release' => :release,
-}
-
-def flutter_root
- generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
- unless File.exist?(generated_xcode_build_settings_path)
- raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
- end
-
- File.foreach(generated_xcode_build_settings_path) do |line|
- matches = line.match(/FLUTTER_ROOT\=(.*)/)
- return matches[1].strip if matches
- end
- raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
-end
-
-require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
-
-flutter_ios_podfile_setup
-
-target 'Runner' do
- use_frameworks!
- use_modular_headers!
-
- flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
-end
-
-post_install do |installer|
- installer.pods_project.targets.each do |target|
- flutter_additional_ios_build_settings(target)
- end
-end
diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644
index f9b0d7c5ea..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- PreviewsEnabled
-
-
-
diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
deleted file mode 100644
index a28140cfdb..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 1d526a16ed..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003d..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644
index f9b0d7c5ea..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- PreviewsEnabled
-
-
-
diff --git a/dev/benchmarks/complex_layout/ios/Runner/AppDelegate.swift b/dev/benchmarks/complex_layout/ios/Runner/AppDelegate.swift
deleted file mode 100644
index d815fed684..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner/AppDelegate.swift
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import UIKit
-import Flutter
-
-@UIApplicationMain
-@objc class AppDelegate: FlutterAppDelegate {
- override func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
- GeneratedPluginRegistrant.register(with: self)
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
-}
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
deleted file mode 100644
index dc9ada4725..0000000000
Binary files a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 28c6bf0301..0000000000
Binary files a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index 2ccbfd967d..0000000000
Binary files a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index f091b6b0bc..0000000000
Binary files a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
deleted file mode 100644
index 0bedcf2fd4..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "LaunchImage.png",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@2x.png",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@3x.png",
- "scale" : "3x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
deleted file mode 100644
index 9da19eacad..0000000000
Binary files a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
deleted file mode 100644
index 9da19eacad..0000000000
Binary files a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
deleted file mode 100644
index 9da19eacad..0000000000
Binary files a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
deleted file mode 100644
index 89c2725b70..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Launch Screen Assets
-
-You can customize the launch screen with your own desired assets by replacing the image files in this directory.
-
-You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/dev/benchmarks/complex_layout/ios/Runner/Runner-Bridging-Header.h b/dev/benchmarks/complex_layout/ios/Runner/Runner-Bridging-Header.h
deleted file mode 100644
index 95b7baf386..0000000000
--- a/dev/benchmarks/complex_layout/ios/Runner/Runner-Bridging-Header.h
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "GeneratedPluginRegistrant.h"
diff --git a/dev/benchmarks/complex_layout/lib/main.dart b/dev/benchmarks/complex_layout/lib/main.dart
index 69d6b133f7..4496bdd56a 100644
--- a/dev/benchmarks/complex_layout/lib/main.dart
+++ b/dev/benchmarks/complex_layout/lib/main.dart
@@ -109,7 +109,6 @@ class ComplexLayoutState extends State {
Expanded(
child: ListView.builder(
key: const Key('complex-scroll'), // this key is used by the driver test
- controller: ScrollController(), // So that the scroll offset can be tracked
itemBuilder: (BuildContext context, int index) {
if (index % 2 == 0)
return FancyImageItem(index, key: PageStorageKey(index));
diff --git a/dev/benchmarks/complex_layout/pubspec.yaml b/dev/benchmarks/complex_layout/pubspec.yaml
index 8d52efdecc..8d204706ea 100644
--- a/dev/benchmarks/complex_layout/pubspec.yaml
+++ b/dev/benchmarks/complex_layout/pubspec.yaml
@@ -3,7 +3,7 @@ description: A benchmark of a relatively complex layout.
environment:
# The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
- sdk: ">=2.2.2 <3.0.0"
+ sdk: ">=2.0.0-dev.68.0 <3.0.0"
dependencies:
flutter:
@@ -46,7 +46,6 @@ dev_dependencies:
flutter_test:
sdk: flutter
test: 1.16.0-nullsafety.1
- e2e: 0.7.0
_fe_analyzer_shared: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
analyzer: 0.39.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -91,4 +90,4 @@ flutter:
- packages/flutter_gallery_assets/people/square/ali.png
- packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png
-# PUBSPEC CHECKSUM: 047d
+# PUBSPEC CHECKSUM: 6832
diff --git a/dev/benchmarks/complex_layout/test/measure_scroll_smoothness.dart b/dev/benchmarks/complex_layout/test/measure_scroll_smoothness.dart
deleted file mode 100644
index 05c5107bfd..0000000000
--- a/dev/benchmarks/complex_layout/test/measure_scroll_smoothness.dart
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This test is a use case of flutter/flutter#60796
-// the test should be run as:
-// flutter drive -t test/using_array.dart --driver test_driver/scrolling_test_e2e_test.dart
-
-import 'dart:ui' as ui;
-
-import 'package:flutter/gestures.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_test/flutter_test.dart';
-import 'package:e2e/e2e.dart';
-
-import 'package:complex_layout/main.dart' as app;
-
-class PointerDataTestBinding extends E2EWidgetsFlutterBinding {
- // PointerData injection would usually be considered device input and therefore
- // blocked by [TestWidgetsFlutterBinding]. Override this behavior
- // to help events go into widget tree.
- @override
- void dispatchEvent(
- PointerEvent event,
- HitTestResult hitTestResult, {
- TestBindingEventSource source = TestBindingEventSource.device,
- }) {
- super.dispatchEvent(event, hitTestResult, source: TestBindingEventSource.test);
- }
-}
-
-/// A union of [ui.PointerDataPacket] and the time it should be sent.
-class PointerDataRecord {
- PointerDataRecord(this.timeStamp, List data)
- : data = ui.PointerDataPacket(data: data);
- final ui.PointerDataPacket data;
- final Duration timeStamp;
-}
-
-/// Generates the [PointerDataRecord] to simulate a drag operation from
-/// `center - totalMove/2` to `center + totalMove/2`.
-Iterable dragInputDatas(
- final Duration epoch,
- final Offset center, {
- final Offset totalMove = const Offset(0, -400),
- final Duration totalTime = const Duration(milliseconds: 2000),
- final double frequency = 90,
-}) sync* {
- final Offset startLocation = (center - totalMove / 2) * ui.window.devicePixelRatio;
- // The issue is about 120Hz input on 90Hz refresh rate device.
- // We test 90Hz input on 60Hz device here, which shows similar pattern.
- final int moveEventCount = totalTime.inMicroseconds * frequency ~/ const Duration(seconds: 1).inMicroseconds;
- final Offset movePerEvent = totalMove / moveEventCount.toDouble() * ui.window.devicePixelRatio;
- yield PointerDataRecord(epoch, [
- ui.PointerData(
- timeStamp: epoch,
- change: ui.PointerChange.add,
- physicalX: startLocation.dx,
- physicalY: startLocation.dy,
- ),
- ui.PointerData(
- timeStamp: epoch,
- change: ui.PointerChange.down,
- physicalX: startLocation.dx,
- physicalY: startLocation.dy,
- pointerIdentifier: 1,
- ),
- ]);
- for (int t = 0; t < moveEventCount + 1; t++) {
- final Offset position = startLocation + movePerEvent * t.toDouble();
- yield PointerDataRecord(
- epoch + totalTime * t ~/ moveEventCount,
- [ui.PointerData(
- timeStamp: epoch + totalTime * t ~/ moveEventCount,
- change: ui.PointerChange.move,
- physicalX: position.dx,
- physicalY: position.dy,
- // Scrolling behavior depends on this delta rather
- // than the position difference.
- physicalDeltaX: movePerEvent.dx,
- physicalDeltaY: movePerEvent.dy,
- pointerIdentifier: 1,
- )],
- );
- }
- final Offset position = startLocation + totalMove;
- yield PointerDataRecord(epoch + totalTime, [ui.PointerData(
- timeStamp: epoch + totalTime,
- change: ui.PointerChange.up,
- physicalX: position.dx,
- physicalY: position.dy,
- pointerIdentifier: 1,
- )]);
-}
-
-enum TestScenario {
- resampleOn90Hz,
- resampleOn59Hz,
- resampleOff90Hz,
- resampleOff59Hz,
-}
-
-class ResampleFlagVariant extends TestVariant {
- ResampleFlagVariant(this.binding);
- final E2EWidgetsFlutterBinding binding;
-
- @override
- final Set values = Set.from(TestScenario.values);
-
- TestScenario currentValue;
- bool get resample {
- switch(currentValue) {
- case TestScenario.resampleOn90Hz:
- case TestScenario.resampleOn59Hz:
- return true;
- case TestScenario.resampleOff90Hz:
- case TestScenario.resampleOff59Hz:
- return false;
- }
- throw ArgumentError;
- }
- double get frequency {
- switch(currentValue) {
- case TestScenario.resampleOn90Hz:
- case TestScenario.resampleOff90Hz:
- return 90.0;
- case TestScenario.resampleOn59Hz:
- case TestScenario.resampleOff59Hz:
- return 59.0;
- }
- throw ArgumentError;
- }
-
- Map result;
-
- @override
- String describeValue(TestScenario value) {
- switch(value) {
- case TestScenario.resampleOn90Hz:
- return 'resample on with 90Hz input';
- case TestScenario.resampleOn59Hz:
- return 'resample on with 59Hz input';
- case TestScenario.resampleOff90Hz:
- return 'resample off with 90Hz input';
- case TestScenario.resampleOff59Hz:
- return 'resample off with 59Hz input';
- }
- throw ArgumentError;
- }
-
- @override
- Future setUp(TestScenario value) async {
- currentValue = value;
- final bool original = binding.resamplingEnabled;
- binding.resamplingEnabled = resample;
- return original;
- }
-
- @override
- Future tearDown(TestScenario value, bool memento) async {
- binding.resamplingEnabled = memento;
- binding.reportData[describeValue(value)] = result;
- }
-}
-
-Future main() async {
- final PointerDataTestBinding binding = PointerDataTestBinding();
- assert(WidgetsBinding.instance == binding);
- binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.benchmarkLive;
- binding.reportData ??= {};
- final ResampleFlagVariant variant = ResampleFlagVariant(binding);
- testWidgets('Smoothness test', (WidgetTester tester) async {
- app.main();
- await tester.pumpAndSettle();
- final Finder scrollerFinder = find.byKey(const ValueKey('complex-scroll'));
- final ListView scroller = tester.widget(scrollerFinder);
- final ScrollController controller = scroller.controller;
- final List frameTimestamp = [];
- final List scrollOffset = [];
- final List delays = [];
- binding.addPersistentFrameCallback((Duration timeStamp) {
- if (controller.hasClients) {
- // This if is necessary because by the end of the test the widget tree
- // is destroyed.
- frameTimestamp.add(timeStamp.inMicroseconds);
- scrollOffset.add(controller.offset);
- }
- });
-
- Duration now() => binding.currentSystemFrameTimeStamp;
- Future scroll() async {
- // Extra 50ms to avoid timeouts.
- final Duration startTime = const Duration(milliseconds: 500) + now();
- for (final PointerDataRecord record in dragInputDatas(
- startTime,
- tester.getCenter(scrollerFinder),
- frequency: variant.frequency,
- )) {
- await tester.binding.delayed(record.timeStamp - now());
- // This now measures how accurate the above delayed is.
- final Duration delay = now() - record.timeStamp;
- if (delays.length < frameTimestamp.length) {
- while (delays.length < frameTimestamp.length - 1) {
- delays.add(Duration.zero);
- }
- delays.add(delay);
- } else if (delays.last < delay) {
- delays.last = delay;
- }
- ui.window.onPointerDataPacket(record.data);
- }
- }
-
- for (int n = 0; n < 5; n++) {
- await scroll();
- }
- variant.result = scrollSummary(scrollOffset, delays, frameTimestamp);
- await tester.pumpAndSettle();
- scrollOffset.clear();
- delays.clear();
- await tester.idle();
- }, semanticsEnabled: false, variant: variant);
-}
-
-/// Calculates the smoothness measure from `scrollOffset` and `delays` list.
-///
-/// Smoothness (`abs_jerk`) is measured by the absolute value of the discrete
-/// 2nd derivative of the scroll offset.
-///
-/// It was experimented that jerk (3rd derivative of the position) is a good
-/// measure the smoothness.
-/// Here we are using 2nd derivative instead because the input is completely
-/// linear and the expected acceleration should be strictly zero.
-/// Observed acceleration is jumping from positive to negative within
-/// adjacent frames, meaning mathematically the discrete 3-rd derivative
-/// (`f[3] - 3*f[2] + 3*f[1] - f[0]`) is not a good approximation of jerk
-/// (continuous 3-rd derivative), while discrete 2nd
-/// derivative (`f[2] - 2*f[1] + f[0]`) on the other hand is a better measure
-/// of how the scrolling deviate away from linear, and given the acceleration
-/// should average to zero within two frames, it's also a good approximation
-/// for jerk in terms of physics.
-/// We use abs rather than square because square (2-norm) amplifies the
-/// effect of the data point that's relatively large, but in this metric
-/// we prefer smaller data point to have similar effect.
-/// This is also why we count the number of data that's larger than a
-/// threshold (and the result is tested not sensitive to this threshold),
-/// which is effectively a 0-norm.
-///
-/// Frames that are too slow to build (longer than 40ms) or with input delay
-/// longer than 16ms (1/60Hz) is filtered out to separate the janky due to slow
-/// response.
-///
-/// The returned map has keys:
-/// `average_abs_jerk`: average for the overall smoothness.
-/// `janky_count`: number of frames with `abs_jerk` larger than 0.5.
-/// `dropped_frame_count`: number of frames that are built longer than 40ms and
-/// are not used for smoothness measurement.
-/// `frame_timestamp`: the list of the timestamp for each frame, in the time
-/// order.
-/// `scroll_offset`: the scroll offset for each frame. Its length is the same as
-/// `frame_timestamp`.
-/// `input_delay`: the list of maximum delay time of the input simulation during
-/// a frame. Its length is the same as `frame_timestamp`
-Map scrollSummary(
- List scrollOffset,
- List delays,
- List frameTimestamp,
-) {
- double jankyCount = 0;
- double absJerkAvg = 0;
- int lostFrame = 0;
- for (int i = 1; i < scrollOffset.length-1; i += 1) {
- if (frameTimestamp[i+1] - frameTimestamp[i-1] > 40E3 ||
- (i >= delays.length || delays[i] > const Duration(milliseconds: 16))) {
- // filter data points from slow frame building or input simulation artifact
- lostFrame += 1;
- continue;
- }
- //
- final double absJerk = (scrollOffset[i-1] + scrollOffset[i+1] - 2*scrollOffset[i]).abs();
- absJerkAvg += absJerk;
- if (absJerk > 0.5)
- jankyCount += 1;
- }
- // expect(lostFrame < 0.1 * frameTimestamp.length, true);
- absJerkAvg /= frameTimestamp.length - lostFrame;
-
- return {
- 'janky_count': jankyCount,
- 'average_abs_jerk': absJerkAvg,
- 'dropped_frame_count': lostFrame,
- 'frame_timestamp': List.from(frameTimestamp),
- 'scroll_offset': List.from(scrollOffset),
- 'input_delay': delays.map((Duration data) => data.inMicroseconds).toList(),
- };
-}
diff --git a/dev/benchmarks/complex_layout/test_driver/measure_scroll_smoothness_test.dart b/dev/benchmarks/complex_layout/test_driver/measure_scroll_smoothness_test.dart
deleted file mode 100644
index fd29ebe6a9..0000000000
--- a/dev/benchmarks/complex_layout/test_driver/measure_scroll_smoothness_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:e2e/e2e_driver.dart' as driver;
-
-Future main() => driver.e2eDriver(
- timeout: const Duration(minutes: 5),
- responseDataCallback: (Map data) async {
- await driver.writeResponseData(
- data,
- testOutputFilename: 'scroll_smoothness_test',
- );
- }
-);
diff --git a/dev/devicelab/bin/tasks/complex_layout_android__scroll_smoothness.dart b/dev/devicelab/bin/tasks/complex_layout_android__scroll_smoothness.dart
deleted file mode 100644
index 960965e2a7..0000000000
--- a/dev/devicelab/bin/tasks/complex_layout_android__scroll_smoothness.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:flutter_devicelab/tasks/perf_tests.dart';
-import 'package:flutter_devicelab/framework/adb.dart';
-import 'package:flutter_devicelab/framework/framework.dart';
-
-Future main() async {
- deviceOperatingSystem = DeviceOperatingSystem.android;
- await task(createsScrollSmoothnessPerfTest());
-}
diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart
index 94193499e1..e26f4e1425 100644
--- a/dev/devicelab/lib/tasks/perf_tests.dart
+++ b/dev/devicelab/lib/tasks/perf_tests.dart
@@ -298,54 +298,6 @@ TaskFunction createsMultiWidgetConstructPerfE2ETest() {
).run;
}
-TaskFunction createsScrollSmoothnessPerfTest() {
- final String testDirectory =
- '${flutterDirectory.path}/dev/benchmarks/complex_layout';
- const String testTarget = 'test/measure_scroll_smoothness.dart';
- return () {
- return inDirectory(testDirectory, () async {
- final Device device = await devices.workingDevice;
- await device.unlock();
- final String deviceId = device.deviceId;
- await flutter('packages', options: ['get']);
-
- await flutter('drive', options: [
- '-v',
- '--verbose-system-logs',
- '--profile',
- '-t', testTarget,
- '-d',
- deviceId,
- ]);
- final Map data = json.decode(
- file('$testDirectory/build/scroll_smoothness_test.json').readAsStringSync(),
- ) as Map;
-
- final Map result = {};
- void addResult(dynamic data, String suffix) {
- assert(data is Map);
- const List metricKeys = [
- 'janky_count',
- 'average_abs_jerk',
- 'dropped_frame_count',
- ];
- for (final String key in metricKeys) {
- result[key+suffix] = data[key];
- }
- }
- addResult(data['resample on with 90Hz input'], '_with_resampler_90Hz');
- addResult(data['resample on with 59Hz input'], '_with_resampler_59Hz');
- addResult(data['resample off with 90Hz input'], '_without_resampler_90Hz');
- addResult(data['resample off with 59Hz input'], '_without_resampler_59Hz');
-
- return TaskResult.success(
- result,
- benchmarkScoreKeys: result.keys.toList(),
- );
- });
- };
-}
-
TaskFunction createFramePolicyIntegrationTest() {
final String testDirectory =
'${flutterDirectory.path}/dev/benchmarks/macrobenchmarks';
diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml
index fe54f5cce7..e045899ce2 100644
--- a/dev/devicelab/manifest.yaml
+++ b/dev/devicelab/manifest.yaml
@@ -114,14 +114,6 @@ tasks:
# Android on-device tests
- complex_layout_android__scroll_smoothness:
- description: >
- Measures the smoothness of scrolling of the Complex Layout sample app on
- Android.
- stage: devicelab
- required_agent_capabilities: ["linux/android"]
- flaky: true
-
complex_layout_scroll_perf__timeline_summary:
description: >
Measures the runtime performance of the Complex Layout sample app on
diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart
index dad55ba775..fe65b2de26 100644
--- a/packages/flutter_test/lib/src/binding.dart
+++ b/packages/flutter_test/lib/src/binding.dart
@@ -1504,6 +1504,7 @@ class LiveTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
renderView._pointers[event.pointer].decay = _kPointerDecay;
_handleViewNeedsPaint();
} else if (event.down) {
+ assert(event is PointerDownEvent);
renderView._pointers[event.pointer] = _LiveTestPointerRecord(
event.pointer,
event.position,