From 6a64269cc22848bc1814a4872b9bbd329d580e6f Mon Sep 17 00:00:00 2001 From: Neil Guo Date: Thu, 16 Jul 2020 23:01:49 +0800 Subject: [PATCH 01/15] [animations] Adds opaque argument to OpenContainer --- packages/animations/lib/src/open_container.dart | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/animations/lib/src/open_container.dart b/packages/animations/lib/src/open_container.dart index 52743229342d..13af4ee63b84 100644 --- a/packages/animations/lib/src/open_container.dart +++ b/packages/animations/lib/src/open_container.dart @@ -96,6 +96,7 @@ class OpenContainer extends StatefulWidget { this.transitionDuration = const Duration(milliseconds: 300), this.transitionType = ContainerTransitionType.fade, this.useRootNavigator = false, + this.opaque = true, }) : assert(closedColor != null), assert(openColor != null), assert(closedElevation != null), @@ -107,6 +108,7 @@ class OpenContainer extends StatefulWidget { assert(tappable != null), assert(transitionType != null), assert(useRootNavigator != null), + assert(opaque != null), super(key: key); /// Background color of the container while it is closed. @@ -246,6 +248,9 @@ class OpenContainer extends StatefulWidget { /// to the nearest navigator. final bool useRootNavigator; + /// By default, [opaque] is true + final bool opaque; + @override _OpenContainerState createState() => _OpenContainerState(); } @@ -281,6 +286,7 @@ class _OpenContainerState extends State> { transitionDuration: widget.transitionDuration, transitionType: widget.transitionType, useRootNavigator: widget.useRootNavigator, + opaque: widget.opaque, )); if (widget.onClosed != null) { widget.onClosed(data); @@ -394,6 +400,7 @@ class _OpenContainerRoute extends ModalRoute { @required this.transitionDuration, @required this.transitionType, @required this.useRootNavigator, + this.opaque = true, }) : assert(closedColor != null), assert(openColor != null), assert(closedElevation != null), @@ -405,6 +412,7 @@ class _OpenContainerRoute extends ModalRoute { assert(closedBuilderKey != null), assert(transitionType != null), assert(useRootNavigator != null), + assert(opaque != null), _elevationTween = Tween( begin: closedElevation, end: openElevation, @@ -546,6 +554,8 @@ class _OpenContainerRoute extends ModalRoute { @override final Duration transitionDuration; + @override + final bool opaque; final ContainerTransitionType transitionType; final bool useRootNavigator; @@ -848,9 +858,6 @@ class _OpenContainerRoute extends ModalRoute { @override Color get barrierColor => null; - @override - bool get opaque => true; - @override bool get barrierDismissible => false; From 987d1680627592a805d4efeef754347642d22e85 Mon Sep 17 00:00:00 2001 From: MH Johnson Date: Wed, 22 Jul 2020 17:56:45 -0400 Subject: [PATCH 02/15] [animations] Ignore deprecated use of BottomNavigationBarItem.title (#180) * ignore deprecated use of BottomNavigationBarItem.title * empty commit to re run tests --- packages/animations/example/lib/fade_through_transition.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/animations/example/lib/fade_through_transition.dart b/packages/animations/example/lib/fade_through_transition.dart index 941a8ada318f..28903f8eb5fb 100644 --- a/packages/animations/example/lib/fade_through_transition.dart +++ b/packages/animations/example/lib/fade_through_transition.dart @@ -49,14 +49,17 @@ class _FadeThroughTransitionDemoState extends State { items: const [ BottomNavigationBarItem( icon: Icon(Icons.photo_library), + // ignore: deprecated_member_use title: Text('Albums'), ), BottomNavigationBarItem( icon: Icon(Icons.photo), + // ignore: deprecated_member_use title: Text('Photos'), ), BottomNavigationBarItem( icon: Icon(Icons.search), + // ignore: deprecated_member_use title: Text('Search'), ), ], From 837b1a321d3f00034556ef5b385abb93c0843715 Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Mon, 27 Jul 2020 22:40:08 -0700 Subject: [PATCH 03/15] [animations] Remove copy of curves (#182) --- .../lib/src/fade_scale_transition.dart | 6 +- .../lib/src/shared_axis_transition.dart | 29 +++++++- packages/animations/lib/src/utils/curves.dart | 66 ------------------- 3 files changed, 30 insertions(+), 71 deletions(-) delete mode 100644 packages/animations/lib/src/utils/curves.dart diff --git a/packages/animations/lib/src/fade_scale_transition.dart b/packages/animations/lib/src/fade_scale_transition.dart index 63d217c42f15..19d76597ebac 100644 --- a/packages/animations/lib/src/fade_scale_transition.dart +++ b/packages/animations/lib/src/fade_scale_transition.dart @@ -2,13 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' + hide decelerateEasing; // ignore: undefined_hidden_name +// TODO(goderbauer): Remove implementation import when material properly exports the file. +import 'package:flutter/src/material/curves.dart'; // ignore: implementation_imports // TODO(shihaohong): Remove DualTransitionBuilder once flutter/flutter's `stable` // branch contains DualTransitionBuilder. import 'dual_transition_builder.dart' as dual_transition_builder; import 'modal.dart'; -import 'utils/curves.dart'; /// The modal transition configuration for a Material fade transition. /// diff --git a/packages/animations/lib/src/shared_axis_transition.dart b/packages/animations/lib/src/shared_axis_transition.dart index 79404304c46c..503386c2179e 100644 --- a/packages/animations/lib/src/shared_axis_transition.dart +++ b/packages/animations/lib/src/shared_axis_transition.dart @@ -4,13 +4,18 @@ import 'package:flutter/animation.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' + hide + decelerateEasing, // ignore: undefined_hidden_name + standardEasing, // ignore: undefined_hidden_name + accelerateEasing; // ignore: undefined_hidden_name +// TODO(goderbauer): Remove implementation import when material properly exports the file. +import 'package:flutter/src/material/curves.dart'; // ignore: implementation_imports import 'package:flutter/widgets.dart'; // TODO(shihaohong): Remove DualTransitionBuilder once flutter/flutter's `stable` // branch contains DualTransitionBuilder. import 'dual_transition_builder.dart' as dual_transition_builder; -import 'utils/curves.dart'; /// Determines which type of shared axis transition is used. enum SharedAxisTransitionType { @@ -398,7 +403,7 @@ class _ExitTransition extends StatelessWidget { final Color fillColor; final Widget child; - static final Animatable _fadeOutTransition = FlippedCurveTween( + static final Animatable _fadeOutTransition = _FlippedCurveTween( curve: accelerateEasing, ).chain(CurveTween(curve: const Interval(0.0, 0.3))); @@ -478,3 +483,21 @@ class _ExitTransition extends StatelessWidget { return null; // unreachable } } + +/// Enables creating a flipped [CurveTween]. +/// +/// This creates a [CurveTween] that evaluates to a result that flips the +/// tween vertically. +/// +/// This tween sequence assumes that the evaluated result has to be a double +/// between 0.0 and 1.0. +class _FlippedCurveTween extends CurveTween { + /// Creates a vertically flipped [CurveTween]. + _FlippedCurveTween({ + @required Curve curve, + }) : assert(curve != null), + super(curve: curve); + + @override + double transform(double t) => 1.0 - super.transform(t); +} diff --git a/packages/animations/lib/src/utils/curves.dart b/packages/animations/lib/src/utils/curves.dart deleted file mode 100644 index f464679b1cc3..000000000000 --- a/packages/animations/lib/src/utils/curves.dart +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019 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 'package:flutter/animation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; - -// The easing curves of the Material Library -/// The standard easing curve in the Material specification. -/// -/// Elements that begin and end at rest use standard easing. -/// They speed up quickly and slow down gradually, in order -/// to emphasize the end of the transition. -/// -/// See also: -/// * -const Curve standardEasing = Cubic(0.4, 0.0, 0.2, 1); - -/// The accelerate easing curve in the Material specification. -/// -/// Elements exiting a screen use acceleration easing, -/// where they start at rest and end at peak velocity. -/// -/// See also: -/// * -const Curve accelerateEasing = Cubic(0.4, 0.0, 1.0, 1.0); - -/// The decelerate easing curve in the Material specification. -/// -/// Incoming elements are animated using deceleration easing, -/// which starts a transition at peak velocity (the fastest -/// point of an element’s movement) and ends at rest. -/// -/// See also: -/// * -const Curve decelerateEasing = Cubic(0.0, 0.0, 0.2, 1.0); - -// A tween that starts from 1.0 and ends at 0.0. -final Tween _flippedTween = Tween( - begin: 1.0, - end: 0.0, -); - -/// Enables creating a flipped [CurveTween]. -/// -/// This creates a [CurveTween] that evaluates to a result that flips the -/// tween vertically. -/// -/// This tween sequence assumes that the evaluated result has to be a double -/// between 0.0 and 1.0. -class FlippedCurveTween extends CurveTween { - /// Creates a vertically flipped [CurveTween]. - FlippedCurveTween({ - @required Curve curve, - }) : assert(curve != null), - super(curve: curve); - - @override - double transform(double t) => 1.0 - super.transform(t); -} - -/// Flips the incoming passed in [Animation] to start from 1.0 and end at 0.0. -Animation flipTween(Animation animation) { - return _flippedTween.animate(animation); -} From a4c2106d3bb3c88a8905521b82ecd72d7d1385be Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Tue, 28 Jul 2020 12:20:27 -0700 Subject: [PATCH 04/15] Prepare animations for 1.1.2 (#183) --- packages/animations/CHANGELOG.md | 4 ++++ packages/animations/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/animations/CHANGELOG.md b/packages/animations/CHANGELOG.md index 3fe05ccf720a..5625d1a6b703 100644 --- a/packages/animations/CHANGELOG.md +++ b/packages/animations/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## [1.1.2] - July 28, 2020 + +* Fixes for upcoming changes to the flutter framework. + ## [1.1.1] - June 19, 2020 * Hide implementation of `DualTransitionBuilder` as the widget has been implemented in the Flutter framework. diff --git a/packages/animations/pubspec.yaml b/packages/animations/pubspec.yaml index 3635d0f81121..f14256bb50b9 100644 --- a/packages/animations/pubspec.yaml +++ b/packages/animations/pubspec.yaml @@ -1,6 +1,6 @@ name: animations description: Fancy pre-built animations that can easily be integrated into any Flutter application. -version: 1.1.1 +version: 1.1.2 homepage: https://github.com/flutter/packages/tree/master/packages/animations environment: From c9053f1fea56efd5a7d77bd5063994a573743ab2 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Fri, 31 Jul 2020 13:07:04 -0700 Subject: [PATCH 05/15] [Pigeon] Added support for lists and maps in java and objc targets. (#186) --- packages/pigeon/CHANGELOG.md | 4 +++ packages/pigeon/lib/java_generator.dart | 3 ++ packages/pigeon/lib/objc_generator.dart | 4 +++ packages/pigeon/pigeons/list.dart | 15 ++++++++++ packages/pigeon/pubspec.yaml | 2 +- packages/pigeon/run_tests.sh | 2 ++ packages/pigeon/test/java_generator_test.dart | 30 +++++++++++++++++++ packages/pigeon/test/objc_generator_test.dart | 26 ++++++++++++++++ 8 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 packages/pigeon/pigeons/list.dart diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index 403788f838e8..95532173672a 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.3 + +* Added support for List and Map datatypes in Java and Objective-C targets. + ## 0.1.2+1 * Updated the Readme.md. diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart index 176dc2df7d3f..0710bb09edc3 100644 --- a/packages/pigeon/lib/java_generator.dart +++ b/packages/pigeon/lib/java_generator.dart @@ -14,6 +14,8 @@ const Map _javaTypeForDartTypeMap = { 'Int32List': 'int[]', 'Int64List': 'long[]', 'Float64List': 'double[]', + 'List': 'ArrayList', + 'Map': 'HashMap', }; /// Options that control how Java code will be generated. @@ -195,6 +197,7 @@ void generateJava(JavaOptions options, Root root, StringSink sink) { indent.writeln('import io.flutter.plugin.common.BasicMessageChannel;'); indent.writeln('import io.flutter.plugin.common.BinaryMessenger;'); indent.writeln('import io.flutter.plugin.common.StandardMessageCodec;'); + indent.writeln('import java.util.ArrayList;'); indent.writeln('import java.util.HashMap;'); indent.addln(''); diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart index dd8dbb953e5f..fb52f0b9c3a3 100644 --- a/packages/pigeon/lib/objc_generator.dart +++ b/packages/pigeon/lib/objc_generator.dart @@ -41,6 +41,8 @@ const Map _objcTypeForDartTypeMap = { 'Int32List': 'FlutterStandardTypedData *', 'Int64List': 'FlutterStandardTypedData *', 'Float64List': 'FlutterStandardTypedData *', + 'List': 'NSArray *', + 'Map': 'NSDictionary *', }; const Map _propertyTypeForDartTypeMap = { @@ -52,6 +54,8 @@ const Map _propertyTypeForDartTypeMap = { 'Int32List': 'strong', 'Int64List': 'strong', 'Float64List': 'strong', + 'List': 'strong', + 'Map': 'strong', }; String _objcTypeForDartType(String type) { diff --git a/packages/pigeon/pigeons/list.dart b/packages/pigeon/pigeons/list.dart new file mode 100644 index 000000000000..bed4a79227b9 --- /dev/null +++ b/packages/pigeon/pigeons/list.dart @@ -0,0 +1,15 @@ +// Copyright 2020 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 'package:pigeon/pigeon.dart'; + +class TestMessage { + // ignore: always_specify_types + List testList; +} + +@HostApi() +abstract class TestApi { + void test(TestMessage msg); +} diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index 97dbc7247586..616b1a5e5af5 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -1,5 +1,5 @@ name: pigeon -version: 0.1.2+1 +version: 0.1.3 description: Code generator tool to make communication between Flutter and the host platform type-safe and easier. homepage: https://github.com/flutter/packages/tree/master/packages/pigeon dependencies: diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh index 3bfbaf71e083..8058d8055627 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -55,12 +55,14 @@ test_pigeon_android ./pigeons/host2flutter.dart test_pigeon_android ./pigeons/message.dart test_pigeon_android ./pigeons/void_arg_host.dart test_pigeon_android ./pigeons/void_arg_flutter.dart +test_pigeon_android ./pigeons/list.dart test_pigeon_ios ./pigeons/message.dart test_pigeon_ios ./pigeons/host2flutter.dart test_pigeon_ios ./pigeons/voidhost.dart test_pigeon_ios ./pigeons/voidflutter.dart test_pigeon_ios ./pigeons/void_arg_host.dart test_pigeon_ios ./pigeons/void_arg_flutter.dart +test_pigeon_ios ./pigeons/list.dart pushd $PWD pub run pigeon \ diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart index 9113261ad6ea..7174c2b76a3e 100644 --- a/packages/pigeon/test/java_generator_test.dart +++ b/packages/pigeon/test/java_generator_test.dart @@ -199,4 +199,34 @@ void main() { expect(code, contains('doSomething(Reply')); expect(code, contains('channel.send(null')); }); + + test('gen list', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'List')]), + ]); + final StringBuffer sink = StringBuffer(); + final JavaOptions javaOptions = JavaOptions(); + javaOptions.className = 'Messages'; + generateJava(javaOptions, root, sink); + final String code = sink.toString(); + expect(code, contains('public static class Foobar')); + expect(code, contains('private ArrayList field1;')); + }); + + test('gen map', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'Map')]), + ]); + final StringBuffer sink = StringBuffer(); + final JavaOptions javaOptions = JavaOptions(); + javaOptions.className = 'Messages'; + generateJava(javaOptions, root, sink); + final String code = sink.toString(); + expect(code, contains('public static class Foobar')); + expect(code, contains('private HashMap field1;')); + }); } diff --git a/packages/pigeon/test/objc_generator_test.dart b/packages/pigeon/test/objc_generator_test.dart index 939bed1f530a..74ade0fdfe2a 100644 --- a/packages/pigeon/test/objc_generator_test.dart +++ b/packages/pigeon/test/objc_generator_test.dart @@ -405,4 +405,30 @@ void main() { '(void)doSomething:(void(^)(ABCOutput*, NSError*))completion')); expect(code, contains('channel sendMessage:nil')); }); + + test('gen list', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'List')]), + ]); + final StringBuffer sink = StringBuffer(); + generateObjcHeader(ObjcOptions(), root, sink); + final String code = sink.toString(); + expect(code, contains('@interface Foobar')); + expect(code, matches('@property.*NSArray.*field1')); + }); + + test('gen map', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'Map')]), + ]); + final StringBuffer sink = StringBuffer(); + generateObjcHeader(ObjcOptions(), root, sink); + final String code = sink.toString(); + expect(code, contains('@interface Foobar')); + expect(code, matches('@property.*NSDictionary.*field1')); + }); } From b17bacc4f687e35288c0a529751402cbbcd4fa72 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Fri, 31 Jul 2020 15:27:14 -0700 Subject: [PATCH 06/15] [Pigeon] Added an error message if a valid datatype used directly as a return type or argument (#185) --- packages/pigeon/CHANGELOG.md | 2 ++ packages/pigeon/lib/pigeon_lib.dart | 15 +++++++++++++++ packages/pigeon/test/pigeon_lib_test.dart | 22 ++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index 95532173672a..ba7a33836ba6 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,5 +1,7 @@ ## 0.1.3 +* Added error message if supported datatypes are used as arguments or return + types directly, without an enclosing class. * Added support for List and Map datatypes in Java and Objective-C targets. ## 0.1.2+1 diff --git a/packages/pigeon/lib/pigeon_lib.dart b/packages/pigeon/lib/pigeon_lib.dart index 6207757594d8..b04d12d9d143 100644 --- a/packages/pigeon/lib/pigeon_lib.dart +++ b/packages/pigeon/lib/pigeon_lib.dart @@ -317,6 +317,21 @@ options: } } } + for (Api api in root.apis) { + for (Method method in api.methods) { + if (_validTypes.contains(method.argType)) { + result.add(Error( + message: + 'Unsupported argument type: "${method.argType}" in API: "${api.name}" method: "${method.name}')); + } + if (_validTypes.contains(method.returnType)) { + result.add(Error( + message: + 'Unsupported return type: "${method.returnType}" in API: "${api.name}" method: "${method.name}')); + } + } + } + return result; } diff --git a/packages/pigeon/test/pigeon_lib_test.dart b/packages/pigeon/test/pigeon_lib_test.dart index 2d3b44913d00..0059687d3c45 100644 --- a/packages/pigeon/test/pigeon_lib_test.dart +++ b/packages/pigeon/test/pigeon_lib_test.dart @@ -66,6 +66,16 @@ abstract class NestorApi { Nestor getit(); } +@HostApi() +abstract class InvalidArgTypeApi { + void doit(bool value); +} + +@HostApi() +abstract class InvalidReturnTypeApi { + bool doit(); +} + void main() { test('parse args - input', () { final PigeonOptions opts = @@ -215,4 +225,16 @@ void main() { expect(classNames.contains('Nestor'), true); expect(classNames.contains('OnlyVisibleFromNesting'), true); }); + + test('invalid datatype for argument', () { + final Pigeon pigeon = Pigeon.setup(); + final ParseResults results = pigeon.parse([InvalidArgTypeApi]); + expect(results.errors.length, 1); + }); + + test('invalid datatype for argument', () { + final Pigeon pigeon = Pigeon.setup(); + final ParseResults results = pigeon.parse([InvalidReturnTypeApi]); + expect(results.errors.length, 1); + }); } From 7d26c62185a2e36bb912ae54172db1b82c9e2d94 Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Wed, 5 Aug 2020 17:09:10 -0700 Subject: [PATCH 07/15] Add supported Luci builders for packages repo (#184) * add luci try builders * add readme * add code to validate json contents * remove json check dart * use generic name --- dev/README.md | 19 +++++++++++++++++++ dev/try_builders.json | 8 ++++++++ 2 files changed, 27 insertions(+) create mode 100644 dev/README.md create mode 100644 dev/try_builders.json diff --git a/dev/README.md b/dev/README.md new file mode 100644 index 000000000000..4b55a1193c18 --- /dev/null +++ b/dev/README.md @@ -0,0 +1,19 @@ +This directory contains resources that the Flutter team uses during +the development of packages. + +## Luci builder file +`try_builders.json` contains the supported luci try builders +for packages. It follows format: +```json +{ + "builders":[ + { + "name":"xxx", + "repo":"packages" + } + ] +} +``` +This file will be mainly used in [`flutter/cocoon`](https://github.com/flutter/cocoon) +to update luci task statuses of packages pre-submit tests. + diff --git a/dev/try_builders.json b/dev/try_builders.json new file mode 100644 index 000000000000..34ee8571328c --- /dev/null +++ b/dev/try_builders.json @@ -0,0 +1,8 @@ +{ + "builders":[ + { + "name":"fuchsia_ctl", + "repo":"packages" + } + ] +} From cf96cba3c50a410e9b450d0a24ea9d7e1c020c09 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Fri, 7 Aug 2020 16:13:09 -0700 Subject: [PATCH 08/15] pigeon 1.4 (#188) * fixed nullability in objc code for callback errors * fixed nullability of nested types in dart * added test that asserts the version in generated code headers is correct --- packages/pigeon/CHANGELOG.md | 6 ++++ packages/pigeon/lib/dart_generator.dart | 7 ++++- packages/pigeon/lib/generator_tools.dart | 2 +- packages/pigeon/lib/objc_generator.dart | 4 +-- .../mock_handler_tester/test/message.dart | 28 ++++++++++++++++++- .../mock_handler_tester/test/widget_test.dart | 24 +++++++++++++++- packages/pigeon/pigeons/message.dart | 2 +- packages/pigeon/pubspec.yaml | 2 +- packages/pigeon/test/dart_generator_test.dart | 5 +++- packages/pigeon/test/objc_generator_test.dart | 8 +++--- packages/pigeon/test/version_test.dart | 19 +++++++++++++ 11 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 packages/pigeon/test/version_test.dart diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index ba7a33836ba6..f3622b48ab7c 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.1.4 + +* Fixed nullability for NSError's in generated objc code. +* Fixed nullability of nested objects in the Dart generator. +* Added test to make sure the pigeon version is correct in generated code headers. + ## 0.1.3 * Added error message if supported datatypes are used as arguments or return diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart index 989f9d3a9258..baea13ecb367 100644 --- a/packages/pigeon/lib/dart_generator.dart +++ b/packages/pigeon/lib/dart_generator.dart @@ -151,7 +151,8 @@ void generateDart(Root root, StringSink sink) { for (Field field in klass.fields) { indent.write('pigeonMap[\'${field.name}\'] = '); if (customClassNames.contains(field.dataType)) { - indent.addln('${field.name}._toMap();'); + indent.addln( + '${field.name} == null ? null : ${field.name}._toMap();'); } else { indent.addln('${field.name};'); } @@ -162,6 +163,10 @@ void generateDart(Root root, StringSink sink) { indent.write( 'static ${klass.name} _fromMap(Map pigeonMap) '); indent.scoped('{', '}', () { + indent.write('if (pigeonMap == null)'); + indent.scoped('{', '}', () { + indent.writeln('return null;'); + }); indent.writeln('final ${klass.name} result = ${klass.name}();'); for (Field field in klass.fields) { indent.write('result.${field.name} = '); diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart index c65c2f2509dc..db3157c7ff77 100644 --- a/packages/pigeon/lib/generator_tools.dart +++ b/packages/pigeon/lib/generator_tools.dart @@ -8,7 +8,7 @@ import 'dart:mirrors'; import 'ast.dart'; /// The current version of pigeon. -const String pigeonVersion = '0.1.2'; +const String pigeonVersion = '0.1.4'; /// Read all the content from [stdin] to a String. String readStdin() { diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart index fb52f0b9c3a3..e264ef35e291 100644 --- a/packages/pigeon/lib/objc_generator.dart +++ b/packages/pigeon/lib/objc_generator.dart @@ -28,8 +28,8 @@ String _className(String prefix, String className) { String _callbackForType(String dartType, String objcType) { return dartType == 'void' - ? 'void(^)(NSError*)' - : 'void(^)($objcType*, NSError*)'; + ? 'void(^)(NSError* _Nullable)' + : 'void(^)($objcType*, NSError* _Nullable)'; } const Map _objcTypeForDartTypeMap = { diff --git a/packages/pigeon/mock_handler_tester/test/message.dart b/packages/pigeon/mock_handler_tester/test/message.dart index 9f0db48b7eaf..1aa33c6494b3 100644 --- a/packages/pigeon/mock_handler_tester/test/message.dart +++ b/packages/pigeon/mock_handler_tester/test/message.dart @@ -17,6 +17,9 @@ class SearchReply { // ignore: unused_element static SearchReply _fromMap(Map pigeonMap) { + if (pigeonMap == null) { + return null; + } final SearchReply result = SearchReply(); result.result = pigeonMap['result']; result.error = pigeonMap['error']; @@ -39,6 +42,9 @@ class SearchRequest { // ignore: unused_element static SearchRequest _fromMap(Map pigeonMap) { + if (pigeonMap == null) { + return null; + } final SearchRequest result = SearchRequest(); result.query = pigeonMap['query']; result.anInt = pigeonMap['anInt']; @@ -52,12 +58,15 @@ class Nested { // ignore: unused_element Map _toMap() { final Map pigeonMap = {}; - pigeonMap['request'] = request._toMap(); + pigeonMap['request'] = request == null ? null : request._toMap(); return pigeonMap; } // ignore: unused_element static Nested _fromMap(Map pigeonMap) { + if (pigeonMap == null) { + return null; + } final Nested result = Nested(); result.request = SearchRequest._fromMap(pigeonMap['request']); return result; @@ -105,6 +114,23 @@ class NestedApi { } } +abstract class TestNestedApi { + SearchReply search(Nested arg); + static void setup(TestNestedApi api) { + { + const BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.NestedApi.search', StandardMessageCodec()); + channel.setMockMessageHandler((dynamic message) async { + final Map mapMessage = + message as Map; + final Nested input = Nested._fromMap(mapMessage); + final SearchReply output = api.search(input); + return {'result': output._toMap()}; + }); + } + } +} + class Api { Future search(SearchRequest arg) async { final Map requestMap = arg._toMap(); diff --git a/packages/pigeon/mock_handler_tester/test/widget_test.dart b/packages/pigeon/mock_handler_tester/test/widget_test.dart index 82f652a8ef0a..41322b3e9e15 100644 --- a/packages/pigeon/mock_handler_tester/test/widget_test.dart +++ b/packages/pigeon/mock_handler_tester/test/widget_test.dart @@ -14,10 +14,32 @@ class Mock implements TestHostApi { } } +class MockNested implements TestNestedApi { + bool didCall = false; + @override + SearchReply search(Nested arg) { + didCall = true; + if (arg.request == null) { + return SearchReply(); + } else { + return SearchReply()..result = arg.request.query; + } + } +} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); - test('description', () async { + test('simple', () async { + final NestedApi api = NestedApi(); + final MockNested mock = MockNested(); + TestNestedApi.setup(mock); + final SearchReply reply = await api.search(Nested()..request = null); + expect(mock.didCall, true); + expect(reply.result, null); + }); + + test('nested', () async { final Api api = Api(); final Mock mock = Mock(); TestHostApi.setup(mock); diff --git a/packages/pigeon/pigeons/message.dart b/packages/pigeon/pigeons/message.dart index 73dc13843ee0..2dff2f090ead 100644 --- a/packages/pigeon/pigeons/message.dart +++ b/packages/pigeon/pigeons/message.dart @@ -27,7 +27,7 @@ class Nested { SearchRequest request; } -@HostApi() +@HostApi(dartHostTestHandler: 'TestNestedApi') abstract class NestedApi { SearchReply search(Nested nested); } diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index 616b1a5e5af5..8e7b9f036936 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -1,5 +1,5 @@ name: pigeon -version: 0.1.3 +version: 0.1.4 description: Code generator tool to make communication between Flutter and the host platform type-safe and easier. homepage: https://github.com/flutter/packages/tree/master/packages/pigeon dependencies: diff --git a/packages/pigeon/test/dart_generator_test.dart b/packages/pigeon/test/dart_generator_test.dart index 008914588507..296b275c1ccb 100644 --- a/packages/pigeon/test/dart_generator_test.dart +++ b/packages/pigeon/test/dart_generator_test.dart @@ -58,7 +58,10 @@ void main() { final StringBuffer sink = StringBuffer(); generateDart(root, sink); final String code = sink.toString(); - expect(code, contains('pigeonMap[\'nested\'] = nested._toMap()')); + expect( + code, + contains( + 'pigeonMap[\'nested\'] = nested == null ? null : nested._toMap()')); expect(code, contains('result.nested = Input._fromMap(pigeonMap[\'nested\']);')); }); diff --git a/packages/pigeon/test/objc_generator_test.dart b/packages/pigeon/test/objc_generator_test.dart index 74ade0fdfe2a..1acbcc5680fa 100644 --- a/packages/pigeon/test/objc_generator_test.dart +++ b/packages/pigeon/test/objc_generator_test.dart @@ -315,7 +315,7 @@ void main() { final StringBuffer sink = StringBuffer(); generateObjcHeader(ObjcOptions(header: 'foo.h', prefix: 'ABC'), root, sink); final String code = sink.toString(); - expect(code, contains('completion:(void(^)(NSError*))')); + expect(code, contains('completion:(void(^)(NSError* _Nullable))')); }); test('gen flutter void return source', () { @@ -331,7 +331,7 @@ void main() { final StringBuffer sink = StringBuffer(); generateObjcSource(ObjcOptions(header: 'foo.h', prefix: 'ABC'), root, sink); final String code = sink.toString(); - expect(code, contains('completion:(void(^)(NSError*))')); + expect(code, contains('completion:(void(^)(NSError* _Nullable))')); expect(code, contains('completion(nil)')); }); @@ -383,7 +383,7 @@ void main() { expect( code, contains( - '(void)doSomething:(void(^)(ABCOutput*, NSError*))completion')); + '(void)doSomething:(void(^)(ABCOutput*, NSError* _Nullable))completion')); }); test('gen flutter void arg header', () { @@ -402,7 +402,7 @@ void main() { expect( code, contains( - '(void)doSomething:(void(^)(ABCOutput*, NSError*))completion')); + '(void)doSomething:(void(^)(ABCOutput*, NSError* _Nullable))completion')); expect(code, contains('channel sendMessage:nil')); }); diff --git a/packages/pigeon/test/version_test.dart b/packages/pigeon/test/version_test.dart new file mode 100644 index 000000000000..70e4382a1226 --- /dev/null +++ b/packages/pigeon/test/version_test.dart @@ -0,0 +1,19 @@ +// Copyright 2020 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:io'; + +import 'package:pigeon/generator_tools.dart'; +import 'package:test/test.dart'; + +void main() { + test('pigeon version matches pubspec', () { + final String pubspecPath = '${Directory.current.path}/pubspec.yaml'; + final String pubspec = File(pubspecPath).readAsStringSync(); + final RegExp regex = RegExp('version:\s*(.*)'); + final RegExpMatch match = regex.firstMatch(pubspec); + expect(match, isNotNull); + expect(pigeonVersion, match.group(1).trim()); + }); +} From 02e44794fad65392ecc7801563986b5c5e7f5a2b Mon Sep 17 00:00:00 2001 From: Neil Guo Date: Sat, 8 Aug 2020 16:45:11 +0800 Subject: [PATCH 09/15] Document what opaque does. --- packages/animations/lib/src/open_container.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/animations/lib/src/open_container.dart b/packages/animations/lib/src/open_container.dart index 13af4ee63b84..48c7682e7e7d 100644 --- a/packages/animations/lib/src/open_container.dart +++ b/packages/animations/lib/src/open_container.dart @@ -248,7 +248,9 @@ class OpenContainer extends StatefulWidget { /// to the nearest navigator. final bool useRootNavigator; - /// By default, [opaque] is true + /// Whether the route obscures previous routes when the transition is complete. + /// When [opaque] is true, the route obscures previous routes. + /// By default, [opaque] is true. final bool opaque; @override From 39cfb59184147f38f2e7dadf0e51a22f922c1d18 Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Thu, 13 Aug 2020 10:47:12 -0700 Subject: [PATCH 10/15] Add enabled flag for try builders (#189) * add enabled flag * update doc --- dev/README.md | 10 +++++----- dev/try_builders.json | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/dev/README.md b/dev/README.md index 4b55a1193c18..4690b1901905 100644 --- a/dev/README.md +++ b/dev/README.md @@ -8,12 +8,12 @@ for packages. It follows format: { "builders":[ { - "name":"xxx", - "repo":"packages" + "name":"yyy", + "repo":"packages", + "enabled":true } ] } ``` -This file will be mainly used in [`flutter/cocoon`](https://github.com/flutter/cocoon) -to update luci task statuses of packages pre-submit tests. - +This file will be mainly used in [`flutter/cocoon`](https://github.com/flutter/cocoon) +to trigger/update pre-submit luci tasks. diff --git a/dev/try_builders.json b/dev/try_builders.json index 34ee8571328c..6986e9e23dae 100644 --- a/dev/try_builders.json +++ b/dev/try_builders.json @@ -2,7 +2,8 @@ "builders":[ { "name":"fuchsia_ctl", - "repo":"packages" + "repo":"packages", + "enabled":true } ] } From 9072dd205fea57fb288d634f482455718e48ac7a Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Sat, 15 Aug 2020 00:02:00 -0700 Subject: [PATCH 11/15] Added imitation game benchmarks (#181) --- packages/imitation_game/README.md | 93 +++ packages/imitation_game/imitation_game.dart | 170 ++++++ .../imitation_game/tests/smiley/README.md | 11 + .../tests/smiley/flutter/run_ios.sh | 4 + .../tests/smiley/flutter/smiley/.gitignore | 44 ++ .../tests/smiley/flutter/smiley/.metadata | 10 + .../tests/smiley/flutter/smiley/README.md | 16 + .../smiley/flutter/smiley/android/.gitignore | 11 + .../flutter/smiley/android/app/build.gradle | 63 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 47 ++ .../kotlin/com/example/smiley/MainActivity.kt | 6 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../flutter/smiley/android/build.gradle | 31 + .../flutter/smiley/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../flutter/smiley/android/settings.gradle | 11 + .../tests/smiley/flutter/smiley/assets/ip.txt | 1 + .../smiley/flutter/smiley/images/smiley.png | Bin 0 -> 30739 bytes .../smiley/flutter/smiley/ios/.gitignore | 32 + .../smiley/ios/Flutter/AppFrameworkInfo.plist | 26 + .../flutter/smiley/ios/Flutter/Debug.xcconfig | 2 + .../smiley/ios/Flutter/Release.xcconfig | 2 + .../tests/smiley/flutter/smiley/ios/Podfile | 87 +++ .../ios/Runner.xcodeproj/project.pbxproj | 576 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../smiley/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../flutter/smiley/ios/Runner/Info.plist | 45 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../tests/smiley/flutter/smiley/lib/main.dart | 112 ++++ .../tests/smiley/flutter/smiley/pubspec.yaml | 78 +++ .../tests/smiley/uikit/run_ios.sh | 8 + .../smiley/uikit/smiley/exportOptions.plist | 18 + .../smiley/smiley.xcodeproj/project.pbxproj | 350 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../smiley/uikit/smiley/smiley/AppDelegate.h | 11 + .../smiley/uikit/smiley/smiley/AppDelegate.m | 37 ++ .../AppIcon.appiconset/Contents.json | 98 +++ .../smiley/Assets.xcassets/Contents.json | 6 + .../smiley.imageset/Contents.json | 21 + .../smiley.imageset/smiley.png | Bin 0 -> 30739 bytes .../smiley/Base.lproj/LaunchScreen.storyboard | 25 + .../smiley/smiley/Base.lproj/Main.storyboard | 42 ++ .../smiley/uikit/smiley/smiley/Info.plist | 64 ++ .../uikit/smiley/smiley/SceneDelegate.h | 12 + .../uikit/smiley/smiley/SceneDelegate.m | 54 ++ .../uikit/smiley/smiley/ViewController.h | 11 + .../uikit/smiley/smiley/ViewController.m | 123 ++++ .../tests/smiley/uikit/smiley/smiley/ip.txt | 1 + .../tests/smiley/uikit/smiley/smiley/main.m | 15 + 87 files changed, 2810 insertions(+) create mode 100644 packages/imitation_game/README.md create mode 100644 packages/imitation_game/imitation_game.dart create mode 100644 packages/imitation_game/tests/smiley/README.md create mode 100755 packages/imitation_game/tests/smiley/flutter/run_ios.sh create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/.gitignore create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/.metadata create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/README.md create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/.gitignore create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/build.gradle create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/build.gradle create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/gradle.properties create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/android/settings.gradle create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/assets/ip.txt create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/images/smiley.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/.gitignore create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Podfile create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Info.plist create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/lib/main.dart create mode 100644 packages/imitation_game/tests/smiley/flutter/smiley/pubspec.yaml create mode 100755 packages/imitation_game/tests/smiley/uikit/run_ios.sh create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/exportOptions.plist create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.h create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.m create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/Info.plist create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.m create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.h create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.m create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/ip.txt create mode 100644 packages/imitation_game/tests/smiley/uikit/smiley/smiley/main.m diff --git a/packages/imitation_game/README.md b/packages/imitation_game/README.md new file mode 100644 index 000000000000..cbb19a43684d --- /dev/null +++ b/packages/imitation_game/README.md @@ -0,0 +1,93 @@ +# Imitation Game + +## Description + +`imitation_game` is a platform for performing automated tests to compare the +performance of different UI frameworks. For example, how much memory does the +same app written in Flutter and UIKit take? + +## Running all the tests + +You need a mobile device plugged into your computer and setup for development. +The mobile device and the computer need to be on the same network, one that +allows communication between computers since that's how the mobile phone will +report its results to the computer. + +```sh +dart imitation_game.dart +``` + +## Dependencies + +In order to run the tests you will need the union of all the platforms being +tested. As new tests are added please add to this list: + +### iOS + +- Flutter +- Xcode +- [ios_deploy](https://github.com/ios-control/ios-deploy) - used to launch apps + on the attached iOS device. + +## Example File Layout + +```text +./ +├─ imitation_game.dart +└─ tests/ + ├─ smiley/ + │ ├─ README.md + │ ├─ flutter/ + │ │ ├─ run_ios.sh + │ │ └─ + │ └─ uikit/ + │ ├─ run_ios.sh + │ └─ + └─ memory/ + ├─ README.md + ├─ flutter/ + │ ├─ run_ios.sh + │ └─ + └─ uikit/ + ├─ run_ios.sh + └─ +``` + +Here there are 2 different tests with 2 different platform implementations. The +tests are named `smiley` and `memory`, they are both implemented on the +platforms `flutter` and `uikit`. + +### Adding a test + +Tests should comprise of implementations on one or more platform. The directory +for the test should be added to `./tests`. Inside that directory there should +be a directory of implementations and a `README.md` file that explains the test. + +### Adding an implementation to a test + +An implementation has to follow these rules: + +- It needs to perform the same operations as the other implementations and + follow the description in the test's `README.md`. +- It needs to contain a `run_ios.sh` script that will build and launch the test + on the connected device. +- It should contain a file named `ip.txt` which will be overwritten by + `imitation_game.dart` with the ip address and port that should be used to + report results to. +- It needs to report its results to the ip and port in the `ip.txt` via an HTTP + POST of JSON data. + +## Data format for results + +```json +{ + "test": "name_of_test", + "platform": "name_of_platform", + "results": { + "some_result_name": 1.23, + "some_result_name2": 4.56, + } +} +``` + +A single test run can report multiple numbers. diff --git a/packages/imitation_game/imitation_game.dart b/packages/imitation_game/imitation_game.dart new file mode 100644 index 000000000000..3b0804975d5b --- /dev/null +++ b/packages/imitation_game/imitation_game.dart @@ -0,0 +1,170 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +const int _port = 4040; + +Future _findIpAddress() async { + String result; + final List interfaces = await NetworkInterface.list(); + for (NetworkInterface interface in interfaces) { + for (InternetAddress address in interface.addresses) { + if (address.type == InternetAddressType.IPv4) { + // TODO(gaaclarke): Implment having multiple addresses. + assert(result == null); + result = address.address; + } + } + } + return result; +} + +typedef FileFilter = bool Function(FileSystemEntity); +Future> findFiles(Directory dir, {FileFilter where}) { + final List files = []; + final Completer> completer = + Completer>(); + final Stream lister = dir.list(recursive: true); + lister.listen((FileSystemEntity file) { + if (where == null || where(file)) { + files.add(file); + } + }, onDone: () => completer.complete(files)); + return completer.future; +} + +class _Script { + _Script({this.path}); + String path; +} + +class _ScriptRunner { + _ScriptRunner(this._scriptPaths); + + final List _scriptPaths; + Process _currentProcess; + StreamSubscription _stdoutSubscription; + StreamSubscription _stderrSubscription; + + Future<_Script> runNext() async { + if (_currentProcess != null) { + _stdoutSubscription.cancel(); + _stderrSubscription.cancel(); + _currentProcess.kill(); + _currentProcess = null; + } + + if (_scriptPaths.isEmpty) { + return null; + } else { + final String path = _scriptPaths.last; + print('running: $path'); + _scriptPaths.removeLast(); + _currentProcess = await Process.start('sh', [path]); + // TODO(gaaclarke): Implement a timeout. + _stdoutSubscription = + _currentProcess.stdout.transform(utf8.decoder).listen((String data) { + print(data); + }); + _stderrSubscription = + _currentProcess.stderr.transform(utf8.decoder).listen((String data) { + print(data); + }); + return _Script(path: path); + } + } +} + +class _ImitationGame { + final Map results = {}; + _ScriptRunner _scriptRunner; + _Script _currentScript; + + Future start(List iosScripts) { + _scriptRunner = _ScriptRunner(iosScripts); + return _runNext(); + } + + Future handleResult(Map data) { + final String test = data['test']; + final String platform = data['platform']; + if (!results.containsKey(test)) { + results[test] = {}; + } + if (!results[test].containsKey(platform)) { + results[test][platform] = {}; + } + data['results'].forEach((String k, dynamic v) { + results[test][platform][k] = v as double; + }); + return _runNext(); + } + + Future handleTimeout() { + return _runNext(); + } + + Future _runNext() async { + _currentScript = await _scriptRunner.runNext(); + return _currentScript != null; + } +} + +Future main() async { + final HttpServer server = await HttpServer.bind( + InternetAddress.anyIPv4, + _port, + ); + final String ipaddress = await _findIpAddress(); + print('Listening on $ipaddress:${server.port}'); + + for (FileSystemEntity entity in await findFiles(Directory.current, + where: (FileSystemEntity f) => f.path.endsWith('ip.txt'))) { + final File file = File(entity.path); + file.writeAsStringSync('$ipaddress:${server.port}'); + } + + final List iosScripts = (await findFiles(Directory.current, + where: (FileSystemEntity f) => f.path.endsWith('run_ios.sh'))) + .map((FileSystemEntity e) => e.path) + .toList(); + + if (iosScripts.isEmpty) { + return; + } + + final _ImitationGame game = _ImitationGame(); + bool keepRunning = await game.start(iosScripts); + + while (keepRunning) { + try { + final Stream timeoutServer = server.timeout( + const Duration(minutes: 5), onTimeout: (EventSink sink) { + print('TIMEOUT!'); + throw TimeoutException('timeout'); + }); + await for (HttpRequest request in timeoutServer) { + print('got request: ${request.method}'); + if (request.method == 'POST') { + final String content = await utf8.decoder.bind(request).join(); + final Map data = + jsonDecode(content) as Map; + print('$data'); + keepRunning = await game.handleResult(data); + if (!keepRunning) { + break; + } + } else { + request.response.write('use post'); + } + await request.response.close(); + } + } on TimeoutException catch (_) { + keepRunning = await game.handleTimeout(); + } + } + const JsonEncoder encoder = JsonEncoder.withIndent(' '); + final String jsonResults = encoder.convert(game.results); + print('$jsonResults'); + await server.close(force: true); +} diff --git a/packages/imitation_game/tests/smiley/README.md b/packages/imitation_game/tests/smiley/README.md new file mode 100644 index 000000000000..db2321c19f64 --- /dev/null +++ b/packages/imitation_game/tests/smiley/README.md @@ -0,0 +1,11 @@ +# Smiley + +This test is an app that just draws one large image to the screen `smiley.png`, +stretched to fit inside the screen. + +The following things are measured: + +- 'startupTime' - The time between the start of the process and the rendering of + the image to the screen. +- 'memory' - The amount of system memory the app is using after having rendered + the image to the screen. diff --git a/packages/imitation_game/tests/smiley/flutter/run_ios.sh b/packages/imitation_game/tests/smiley/flutter/run_ios.sh new file mode 100755 index 000000000000..decb485de54c --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/run_ios.sh @@ -0,0 +1,4 @@ +#!/bin/sh +cd $( dirname "${BASH_SOURCE[0]}" ) +cd smiley +flutter run --release diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/.gitignore b/packages/imitation_game/tests/smiley/flutter/smiley/.gitignore new file mode 100644 index 000000000000..f3c205341e7d --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/.gitignore @@ -0,0 +1,44 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/.metadata b/packages/imitation_game/tests/smiley/flutter/smiley/.metadata new file mode 100644 index 000000000000..3f3cbf60a08f --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 227990ab308574184e06944710bae000330412d0 + channel: unknown + +project_type: app diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/README.md b/packages/imitation_game/tests/smiley/flutter/smiley/README.md new file mode 100644 index 000000000000..683f68d8b56c --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/README.md @@ -0,0 +1,16 @@ +# smiley + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/.gitignore b/packages/imitation_game/tests/smiley/flutter/smiley/android/.gitignore new file mode 100644 index 000000000000..0a741cb43d66 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/build.gradle b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/build.gradle new file mode 100644 index 000000000000..01823adc6439 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/build.gradle @@ -0,0 +1,63 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.smiley" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000000..81779326ddf4 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..d377ac5221f5 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt new file mode 100644 index 000000000000..ccd14efb0159 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.smiley + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000000..304732f88420 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000000..1f83a33fd4f2 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000000..81779326ddf4 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/build.gradle b/packages/imitation_game/tests/smiley/flutter/smiley/android/build.gradle new file mode 100644 index 000000000000..3100ad2d5553 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle.properties b/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle.properties new file mode 100644 index 000000000000..38c8d4544ff1 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties b/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..296b146b7318 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/settings.gradle b/packages/imitation_game/tests/smiley/flutter/smiley/android/settings.gradle new file mode 100644 index 000000000000..44e62bcf06ae --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/android/settings.gradle @@ -0,0 +1,11 @@ +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/packages/imitation_game/tests/smiley/flutter/smiley/assets/ip.txt b/packages/imitation_game/tests/smiley/flutter/smiley/assets/ip.txt new file mode 100644 index 000000000000..d331e21174a0 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/assets/ip.txt @@ -0,0 +1 @@ +192.168.0.18:4040 \ No newline at end of file diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/images/smiley.png b/packages/imitation_game/tests/smiley/flutter/smiley/images/smiley.png new file mode 100644 index 0000000000000000000000000000000000000000..441b66ae89226d19d2cf9b0a0e2ea0b59d90ec30 GIT binary patch literal 30739 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

cz!U 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 bK2@apewVKbMcECw36Q?-wM+RIt)KoM-mob7 literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/.gitignore b/packages/imitation_game/tests/smiley/flutter/smiley/ios/.gitignore new file mode 100644 index 000000000000..e96ef602b8d1 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/.gitignore @@ -0,0 +1,32 @@ +*.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/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000000..6b4c0f78a785 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000000..e8efba114687 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000000..399e9340e6f6 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Podfile b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Podfile new file mode 100644 index 000000000000..6697f0a539e2 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Podfile @@ -0,0 +1,87 @@ +# 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 parse_KV_file(file, separator='=') + file_abs_path = File.expand_path(file) + if !File.exists? file_abs_path + return []; + end + generated_key_values = {} + skip_line_start_symbols = ["#", "/"] + File.foreach(file_abs_path) do |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + generated_key_values[podname] = podpath + else + puts "Invalid plugin specification: #{line}" + end + end + generated_key_values +end + +target 'Runner' do + use_frameworks! + use_modular_headers! + + # Flutter Pod + + copied_flutter_dir = File.join(__dir__, 'Flutter') + copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') + copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') + unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) + # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. + # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. + # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. + + generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') + unless File.exist?(generated_xcode_build_settings_path) + raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) + cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; + + unless File.exist?(copied_framework_path) + FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) + end + unless File.exist?(copied_podspec_path) + FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) + end + end + + # Keep pod path relative so it can be checked into Podfile.lock. + pod 'Flutter', :path => 'Flutter' + + # Plugin Pods + + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.each do |name, path| + symlink = File.join('.symlinks', 'plugins', name) + File.symlink(path, symlink) + pod name, :path => File.join(symlink, 'ios') + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..24067aa41683 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,576 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + E871A0843F25069A572B8976 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6ED58CA389D243E9D25A3BCF /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1653BF8CF7D70B08243DF6A2 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1A3DE4B0B684E0679C64523E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 6ED58CA389D243E9D25A3BCF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C4C62015C2EE2797ABF091BA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E871A0843F25069A572B8976 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BE839568BFB70043910F5F6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6ED58CA389D243E9D25A3BCF /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8E5CD0CA74B3FF8D250A4283 /* Pods */ = { + isa = PBXGroup; + children = ( + 1A3DE4B0B684E0679C64523E /* Pods-Runner.debug.xcconfig */, + C4C62015C2EE2797ABF091BA /* Pods-Runner.release.xcconfig */, + 1653BF8CF7D70B08243DF6A2 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 8E5CD0CA74B3FF8D250A4283 /* Pods */, + 2BE839568BFB70043910F5F6 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + CAB15821656924BCC3058D97 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + DBD650350FBE96B42D816E77 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + CAB15821656924BCC3058D97 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + DBD650350FBE96B42D816E77 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S8QB4VV633; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.smiley; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S8QB4VV633; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.smiley; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S8QB4VV633; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.smiley; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..1d526a16ed0f --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000000..f9b0d7c5ea15 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000000..a28140cfdb3f --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..21a3cc14c74e --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000000..f9b0d7c5ea15 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000000..70693e4a8c12 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +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/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..d36b1fab2d9d --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000000..89c2725b70f1 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# 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/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000000..f2e259c7c939 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000000..f3c28516fb38 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Info.plist b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Info.plist new file mode 100644 index 000000000000..9907fcda4d9c --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + smiley + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000000..308a2a560b42 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/lib/main.dart b/packages/imitation_game/tests/smiley/flutter/smiley/lib/main.dart new file mode 100644 index 000000000000..546aedb6fe85 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/lib/main.dart @@ -0,0 +1,112 @@ +// Copyright 2020 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:convert' show jsonEncode; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:http/http.dart' as http; +import 'package:poll_ios_stats/poll_ios_stats.dart'; + +String _hostIp; + +Future _getHostIp() async { + return await rootBundle.loadString('assets/ip.txt'); +} + +Future _sendResult(double result) async { + assert(_hostIp != null); + print('sending result $result...'); + final http.Response response = await http.post( + 'http://$_hostIp', + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + body: jsonEncode({ + 'test': 'smiley', + 'platform': 'flutter', + 'results': { + 'startupTime': result + }, + }), + ); + if (response.statusCode != 200) { + print('error when posting results:${response.statusCode}'); + } +} + +void main() { + runApp(MyApp()); + // Hide status bar. + SystemChrome.setEnabledSystemUIOverlays([]); + _getHostIp().then((String ip) async { + _hostIp = ip; + }); +} + +/// Top level Material App. +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: Colors.blue, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + home: const MyHomePage(), + ); + } +} + +/// `Scaffold` that has the image widget. +class MyHomePage extends StatefulWidget { + /// Standard constructor for a StatefulWidget. + const MyHomePage({Key key}) : super(key: key); + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + final AssetImage _image = const AssetImage('images/smiley.png'); + bool _loading = true; + + @override + void initState() { + _image + .resolve(const ImageConfiguration()) + .addListener(ImageStreamListener((_, __) { + if (mounted) { + setState(() { + _loading = false; + // This should get called when the image has actually been drawn to the screen. + WidgetsBinding.instance.addPostFrameCallback((_) async { + final DateTime renderTime = DateTime.now(); + final PollIosStats _poller = PollIosStats(); + final StartupTime startupTime = await _poller.pollStartupTime(); + final Duration diff = renderTime.difference( + DateTime.fromMicrosecondsSinceEpoch(startupTime.startupTime)); + _sendResult(diff.inMicroseconds / 1000000.0); + }); + }); + } + })); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _loading ? Container() : Image(image: _image), + ], + ), + ), + ); + } +} diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/pubspec.yaml b/packages/imitation_game/tests/smiley/flutter/smiley/pubspec.yaml new file mode 100644 index 000000000000..6d8e6cc49748 --- /dev/null +++ b/packages/imitation_game/tests/smiley/flutter/smiley/pubspec.yaml @@ -0,0 +1,78 @@ +name: smiley +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.7.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^0.1.3 + http: ^0.12.2 + poll_ios_stats: ^0.0.1 + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - images/smiley.png + - assets/ip.txt + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/imitation_game/tests/smiley/uikit/run_ios.sh b/packages/imitation_game/tests/smiley/uikit/run_ios.sh new file mode 100755 index 000000000000..794db7247a76 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/run_ios.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# TODO: What about customizing the DEVELOPMENT_TEAM? +set -e +cd $( dirname "${BASH_SOURCE[0]}" ) +cd smiley +xcodebuild -scheme smiley -configuration Release -project smiley.xcodeproj -archivePath ./smiley.xcarchive archive +xcodebuild -exportArchive -archivePath ./smiley.xcarchive/ -exportPath . -exportOptionsPlist exportOptions.plist -allowProvisioningUpdates +ios-deploy --justlaunch --bundle ./smiley.xcarchive/Products/Applications/smiley.app diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/exportOptions.plist b/packages/imitation_game/tests/smiley/uikit/smiley/exportOptions.plist new file mode 100644 index 000000000000..687b403b2208 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/exportOptions.plist @@ -0,0 +1,18 @@ + + + + + compileBitcode + + method + development + signingStyle + automatic + stripSwiftSymbols + + teamID + S8QB4VV633 + thinning + <none> + + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj b/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..aca7bdbfa676 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj @@ -0,0 +1,350 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 0D313B6D24C6613900D7044B /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D313B6C24C6613900D7044B /* AppDelegate.m */; }; + 0D313B7024C6613900D7044B /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D313B6F24C6613900D7044B /* SceneDelegate.m */; }; + 0D313B7324C6613900D7044B /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D313B7224C6613900D7044B /* ViewController.m */; }; + 0D313B7624C6613900D7044B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0D313B7424C6613900D7044B /* Main.storyboard */; }; + 0D313B7824C6613A00D7044B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D313B7724C6613A00D7044B /* Assets.xcassets */; }; + 0D313B7B24C6613A00D7044B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0D313B7924C6613A00D7044B /* LaunchScreen.storyboard */; }; + 0D313B7E24C6613A00D7044B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D313B7D24C6613A00D7044B /* main.m */; }; + 0D313B8524C66AB700D7044B /* ip.txt in Resources */ = {isa = PBXBuildFile; fileRef = 0D313B8424C66AB700D7044B /* ip.txt */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0D313B6824C6613900D7044B /* smiley.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = smiley.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D313B6B24C6613900D7044B /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 0D313B6C24C6613900D7044B /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 0D313B6E24C6613900D7044B /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = ""; }; + 0D313B6F24C6613900D7044B /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = ""; }; + 0D313B7124C6613900D7044B /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 0D313B7224C6613900D7044B /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 0D313B7524C6613900D7044B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 0D313B7724C6613A00D7044B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 0D313B7A24C6613A00D7044B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 0D313B7C24C6613A00D7044B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0D313B7D24C6613A00D7044B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 0D313B8424C66AB700D7044B /* ip.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = ip.txt; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0D313B6524C6613900D7044B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0D313B5F24C6613900D7044B = { + isa = PBXGroup; + children = ( + 0D313B6A24C6613900D7044B /* smiley */, + 0D313B6924C6613900D7044B /* Products */, + ); + sourceTree = ""; + }; + 0D313B6924C6613900D7044B /* Products */ = { + isa = PBXGroup; + children = ( + 0D313B6824C6613900D7044B /* smiley.app */, + ); + name = Products; + sourceTree = ""; + }; + 0D313B6A24C6613900D7044B /* smiley */ = { + isa = PBXGroup; + children = ( + 0D313B6B24C6613900D7044B /* AppDelegate.h */, + 0D313B6C24C6613900D7044B /* AppDelegate.m */, + 0D313B6E24C6613900D7044B /* SceneDelegate.h */, + 0D313B6F24C6613900D7044B /* SceneDelegate.m */, + 0D313B7124C6613900D7044B /* ViewController.h */, + 0D313B7224C6613900D7044B /* ViewController.m */, + 0D313B7424C6613900D7044B /* Main.storyboard */, + 0D313B7724C6613A00D7044B /* Assets.xcassets */, + 0D313B7924C6613A00D7044B /* LaunchScreen.storyboard */, + 0D313B7C24C6613A00D7044B /* Info.plist */, + 0D313B7D24C6613A00D7044B /* main.m */, + 0D313B8424C66AB700D7044B /* ip.txt */, + ); + path = smiley; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 0D313B6724C6613900D7044B /* smiley */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0D313B8124C6613A00D7044B /* Build configuration list for PBXNativeTarget "smiley" */; + buildPhases = ( + 0D313B6424C6613900D7044B /* Sources */, + 0D313B6524C6613900D7044B /* Frameworks */, + 0D313B6624C6613900D7044B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = smiley; + productName = smiley; + productReference = 0D313B6824C6613900D7044B /* smiley.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0D313B6024C6613900D7044B /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1150; + ORGANIZATIONNAME = "Aaron Clarke"; + TargetAttributes = { + 0D313B6724C6613900D7044B = { + CreatedOnToolsVersion = 11.5; + }; + }; + }; + buildConfigurationList = 0D313B6324C6613900D7044B /* Build configuration list for PBXProject "smiley" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 0D313B5F24C6613900D7044B; + productRefGroup = 0D313B6924C6613900D7044B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0D313B6724C6613900D7044B /* smiley */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0D313B6624C6613900D7044B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D313B7B24C6613A00D7044B /* LaunchScreen.storyboard in Resources */, + 0D313B8524C66AB700D7044B /* ip.txt in Resources */, + 0D313B7824C6613A00D7044B /* Assets.xcassets in Resources */, + 0D313B7624C6613900D7044B /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0D313B6424C6613900D7044B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D313B7324C6613900D7044B /* ViewController.m in Sources */, + 0D313B6D24C6613900D7044B /* AppDelegate.m in Sources */, + 0D313B7E24C6613A00D7044B /* main.m in Sources */, + 0D313B7024C6613900D7044B /* SceneDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0D313B7424C6613900D7044B /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 0D313B7524C6613900D7044B /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 0D313B7924C6613A00D7044B /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 0D313B7A24C6613A00D7044B /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0D313B7F24C6613A00D7044B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 0D313B8024C6613A00D7044B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 0D313B8224C6613A00D7044B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = S8QB4VV633; + INFOPLIST_FILE = smiley/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "dev.flutter.imitation-game.smiley"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 0D313B8324C6613A00D7044B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = S8QB4VV633; + INFOPLIST_FILE = smiley/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "dev.flutter.imitation-game.smiley"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0D313B6324C6613900D7044B /* Build configuration list for PBXProject "smiley" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D313B7F24C6613A00D7044B /* Debug */, + 0D313B8024C6613A00D7044B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0D313B8124C6613A00D7044B /* Build configuration list for PBXNativeTarget "smiley" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D313B8224C6613A00D7044B /* Debug */, + 0D313B8324C6613A00D7044B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0D313B6024C6613900D7044B /* Project object */; +} diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..1ba2d6e1c0d4 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.h b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.h new file mode 100644 index 000000000000..545a4e5190ce --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.h @@ -0,0 +1,11 @@ +// Copyright 2020 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 + +@interface AppDelegate : UIResponder + + +@end + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.m b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.m new file mode 100644 index 000000000000..4d7550a2d3bf --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.m @@ -0,0 +1,37 @@ +// Copyright 2020 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 "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + + +#pragma mark - UISceneSession lifecycle + + +- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role]; +} + + +- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. +} + + +@end diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..9221b9bb1a35 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json new file mode 100644 index 000000000000..73c00596a7fc --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json new file mode 100644 index 000000000000..79308c15f26c --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "smiley.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png new file mode 100644 index 0000000000000000000000000000000000000000..441b66ae89226d19d2cf9b0a0e2ea0b59d90ec30 GIT binary patch literal 30739 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

cz!U zI7l#@o$a-N7pB5ee5yq_`?Py7`##q7yv!`oLjA%C;Ie+0sCXks`q|?26cKLyYV)kZ zXVq^=AdKdUVyW1tn*OI6h_3?;boMOsMtww(PQ{K(z%UZg!yx8AwUm&!Kg8HjktNTfyOnNxO=9KuM`NW&1g9JUdjO^Jki5L7*K zeEy;ykx0WOR?q2+V3)E9tdGIWy;{!x7AFoqYnjG5v$46Hzy6fO4#Tcx?T%F^FkFD5 zn9N}%K}N^$+>_AvZHeqK59!u21D3>E zMot=NKs5Ni3PCCdTb5Z>uD#pJU)f>YmXU)FZLHRkkh)u7`Nkiy2P+T6!HC|2RtMZY zYiUURF=54iJfl{ePZ8`fIU9^;#E@(}9iC_E2>%ln#SY_`pif0ixtM|g`r1!;wC@au zU>~JV1(qNxNF4me?=%o^#VLhgzo%2l4_t}zejwh!E9X-LJM8qEecR9>2z9r4akb;o zKCUSA1qB3qL7C!SL2rz;wJH>)`Ojm7p7N_WvcoiFPMy?*NBb!+LvBBdi`D9)@GX|| zU{_PoFVDWih-6iNQyiHWvqs;5A<7sJ4z&l;yRxCwckg;Dbm|dF*Z3zoR7}`m{ol2a z?Cx_DFP#K=A=~m6e1Fb*Yv@4?Coh8C?rQBV-fk1epQKPh$uThYXD)p8iM_}jlPET!dtcaL&AoRH>`T%a zZa|c!e&vBZKDTgrZ6DcTjIFp~L)f$Yea~sPXE0 z9y_{~!X>5c1NhJsixzMDWNi%zXoUjVeZB;M_AzTQ3(SH-(2b|J$_liRnalCE&k-51 zc?gs1%iInL#YBzY@8ggz{&EB*yYK|TUjEATva!>8Ts2YS+I`$NRpZLaSQ8tKTQG!M zFCWN(o>{+w1bSQW6T9mzEM6`T3cl)04@Ad7~OMQpnelD{asOOM}gt(P=8 z-+Dj<)}C2^NgcKwX-fXLvGXeMmN-;(6F!u_-lb+o3Bj&LoN-ir36gz4kN1x7gSiOj zRLuY|7R%XK`2?K*tUp87ZFW)Y`Z6X9HAX8Oz=dYE{P1u77XN@4sO>)~Q;bW}djqSD z8KxD51$~LX1DzP3f2b%2Cq&QtYY28&-bQTiP(=g-JMgMNWsN!knNxj^`rEkRl30Cq z=)~Y$w^Y#h4*-(^4NrFByd>-Vo5d;8i|89W%wQ8q!t5e{Nw#CXz>54gg)TC*5@^4D zrDOy34z-{XWS|pZxhcH+=HP2+1^B=?GBBRB>GU29_;)g`Qdpbe4A+}DJC~zb-m~9EjmEEtWKR)R3CL}5#6Y3!Ov~9 z>=L^pL-T<~bZnCE)C;&wbad$v>Fu|`Z4GNHzfUd@^S}^;Y1;kOv!@mGan-~{@@qqw z0D2v;eZ%*=N2TqSE;rh*7jP(4r79xW7Z*H(72Wa~cp(z}A}V&1k)K`a{!g%@)j6yw z7yeEv(**}n#AHaB$OdiS<_4xwi@QN^&wa#2YyYboXsP?jV1RER?ag`_kUEN%lFs-Z z=tL_SiGl5QoBr16NTiq3VDI-eG!w8bmwX|c106R@yu5z2|bZ#7n+RgTP?bG{A0|>yD14R*9Iv7SDTmf`UwN8xJ!<7&a97CIdKm2||{MD$A zC*XBx8X(@+abIYk^zQx~3W2Q+{Q)4bTn>deB9gD_YJ8KDCKr=mJs^x#fv>MRPq!=I zNPP;DY@RvNnXLP7z#=l&mwycJDhj>~Mts~3HlCm30v0)}OVrQQ^^r(16_hg;e-S`i zr}k|RtXm<{iu}Al1LmC+kG^O?Hc;(A3lVSq2O_<`#e9GOSwcf7$Sn}bTj+llb&uq_ zGV=_-_ZNWNUs^M)%#ivVBt56r^rA2jPAoMWpLE3$UB2mIH9ud7kF2QzP&*DOR_=7J z1aXoD-(4B+b3fM+yi091__BI}x*QcGN{9kvR8g7-iVxAGDqs=VT!e`wfIM-%IxSi; z(V|R%@r(aeX1uBJSoeDi(Rt*3GXP^Wga6b0bh1Cqb0GhqWt;xKJ_q(JVM zK1msHW``#9z_!>6`hErvVSEG~f^~2QD2ezRD$6?`h%hV?HVzH06w0={`vMP=uW-~Y^mxl0ccCuX|fxAE%4LtVmJA{ z<-mgauU6JoN{o+FGMim^>pO44N=141mjUEHaPUZRs3C$&K592Afl3cM!bedPkT zplk4~(fJ4hYa9R|Lbr!XNIL%zy_Y*)BE$1j*P+~YL454LcrZ>la>a``s^d>hRbD__q>@L)v|By%Z7*9mlYaEvwMG(1ph*_^CTb?9pVQ|$ki4+U$i<**AnodeU) zaC5pCw_(cxecc(sXUyFuOr)U=LtPVXGU>2~?)J^e_(xL&gOTmNG&g-iX^GS?6OI7u zLl^}zIG8=A%#={&(IJzaJ<#qyV!!}{(^{IdAyO-U2z|z`<3Y(zYzEtx$`2?bjz)Ti zsz1>ZtLyDf;wh*Ofk-s+V}rUc6Wv`x;wRgFi}fDd*dW-fb$ti-s0R;eYA_0yRmreG zfWhrw#}KREJy1Ml45grzuWnf9c4Q1DQudcv_tYf*-L z0tLBM2b~+TN^6ArHgiTSQ#JwEbT5eR6+I7CDk&VRw#=0A55}9LX9w|Rnsj&xixKEO z*|{#uH`@G}#5Tzk@31;aW&;*w_uRm;g{Z6*n1>~KND1IZ=&c$Nud;XP9wd(&!P`IT zN#&(7g(rP`mlBkDC*Uaefq5JKqvkoKR*~A}lI|s$v%Uk1Uw0}i&q@(xexYHCjI206 z|KsU(oiM@aDh%6vXCq z4OL6&t-IA*+M80Z^*)xb^E+zB)MM@KP6a%nzYZp*HQ!k%p?Za@&cdx~Hc_QHMAZ9u z{~H;SROe>n$CVtbamKfq!t1)OF9Q}8M5tUwUDl#he(Mf(kE>nTh96}t&DV!>T{*9R z-jd@Qg51sR6))v_Ke8bd_`5Zpy@+I{TpPAStQWz=v0e{dhN;y)t!nGrl@oy^?s zfVH;XqPuEm>(~}YXXq&Xl4ft&9yOWuPDw^g`rN!w!6#GlsMl$;%iVYTm{FZ4{6RSN z6x_ZFH=ppHi|*JTp_6Ce_buk4KphIF8_hQll}+5_JwPcq_k2eM3kSKnlwUe29e*Uv z7|_}m{T<11TpPVNaHWuiMpgQyMqG7ESS*{37aWLq^aJNxg>ARy7mPca&}5sc4twJc z_S6()@5hQ*)8iEQFKhENCjsyQIF+VlhgRG>AguXiQ z(-q?e?wbdw1uvfe%zT2dNOnQ&DStr?7oFwoKHH7y#EB&*K*ZXq+E+{>2sU$6d6KDW zpBdzDt2Gi+33s(!vFi@XfNN8*AJ823D2&@z4`{P#@eH zf!i$#2iVXp)JIjUBhVV{`UCkiT*@Lhvo%(>}lc6hSY zJ7UUNB)(0X%y6|jFTmMxV$j}imLA^|z?Zr^RhUJTF?%+Ia_wF;4?#8A_ZVlrb1_=8 zgI0YTF1|{ly)3}~n8PlTL?yCG=XAsyE5i)W;qG{QKFZ=c^L2>}%}mkXdoY0XcuR5= zuhahEXECaYOKpOe*Kox;9m9O^9-N;QNpE-%a;=*@SobSa6W6FeMK*u)+{ME;YvwV> z-CKI-w?Y^As%#x^iO?7iP{RkbM42*|w*+;#8)tB*D6#RI)b}G9%rfCqD?J(KY)<0t z^6um===Va;B?5H&Up2MSxSiOceyo+(Dqoqd^$VMSa=MJ8t9c|^{E~=F1)NW!nzT<9 zOvSwimLzsK7w}{8Xk|=xAxOh~y~ob$QXVXtIs}}UH9ebW=IWQ37LXkOOnM{H6c4WJ z(6511^2*ZGQXV$32hd`de?%ux+(3s4?cf4z=%}U4J{Mcko)H@z?W(Zw_sg7Wu1xJ% z>D+HLJ3oad%4r+yifwU4Om{BSrql~MQy*um`M^llA}eiX3y_t_=WrQXpOX(v=!XhSiY6;W{C4`AE{PMwwf3tdGJ9-@DFL(Z{hN0n&i`9j|ZBQXxx^*=$oJ zCRL!-RaQ!+tU?D;lKhG(1GkS&T8hmlT*r&kDv+Hm+Zntghz_4Op2=25lrxx*XlTAn zrWb<754bQXYadE`rnTU|dvzLSz0Im&R_b>j^3h&0OQA8IA0cWuf8bC29ORwYt7F3z zpNYsoCTU`GQ+u>l+WDcCo0OQamyk=H;%pTH_d<<>Vmol$(&G0`CrYvHU&RqTIk8(d z93+(Iy95t@GxwqQ(KCzYPCn~6y(=&2lh%xlSL2gh%ha$`*5j>e7jQk_TE!}~_Lw03 zAw{wqQC7yA19MQx#Le82!%`-RU)1BOqCZ&Qpgp$tD3S&@)=JS#^zTzAO{MNgdL#rY zXzgW%=8lT!2+86>q_X8JXIlJ5T>CwMHGN=!L2(P02JyS6dU`DjV2fu&|%KCX0ns~$f)cD?9q z-$Yy^9(aHxJ1}H!1YhAf7rdJ)r)jnE!F0>k`KHyJWWc1`lo&c$afpKrGlhRuF|In$ z?Ba6J{zY-TnNYmZ5o=Tgr^67cSZ<4OmqE6oZwhW7YFR3ht_4}R6(TSMAI4`>(^Jx##(hXqFIeT*L&$03meDC9?f+PMNp6 z6H|I@za0psabL>;?jlu-;cTdj#atp17imjz|DpIdHJqKT4At?ngp*`$$(B@qLum~4 z4ibeMLF7>(xGm5Po+X#|E>(%KC|L zup)$J1;8DbJ|6y(B`z;NF+`34Zc28rjnvnW6JrOa^d_f z?Uf=R?CSZE&;-1c7E|_>&a|ub<7L$|9?q3ImB}tW*J4U!K7e~r z`$dx9-uQthRG+yG!@E-JqQ}4UoxD--&<@**o2O0JaU=vbD+(#nRE?l(Gk1B|8nf_P z?f1oe1!-pKHlw|doiQ(yOjM+t@zXCiNm7F;UH`eS`#`X zR+n~ge7MZ)j6L)XuLtPKl;D0U|845qIe%FNrVH8?_pviRG}DP5za%zDQv(i%N5)TN z_<=9Zx6rYgpqTODxpjA$D)@}@4fi-#_2G20MYXS8N4(&#?S|p4zuJYTP30`z(~^OH zn5&|U+P_ZJg|X%rogDP3p zplYg{i}Us-FX+W>SwFkL(f=3vJ(E>((9q18u(Ome<()JocZHr!6esNFc$`WXZ_^p7jg{N&7<7u0PX+^!&+Xt9rytT@ZF zA^0{Fx3LuAR1|aV>+B@n!0(Nmn$`L~ThWQBNdoo|7Gb`a76KwU_{;l87o^?Z1*w%j zeDkmlZ`u{hh|#K`{@bwx_no3F+C7m+7aLTkz=xLL&O(aS>)!}fBRv+mFZ6iV<|`pd z?Zd#=IKN5QZ*bfC8DUlK@eS_t#$6cgR64XY+gCebt92>Q@=WiR-0K6KQU^*eZbRL~ z)m{7qJa@f7lexowb!xZuUiVO<=#l0;a|gF+IYyp`{cbj)Y~_T@dg%50HRqDAOP+pE zlIHs1pUqA4B|5>xJn`*}=6bT!5@)iiHhCRIby?T+$aE?>kKUEhkc57uOm*cG7JPb&j9&oW?Nom?kDHSV-|FFg$tKfozg zsNL>YGhSKp@(nR)S=py@<~BS~Wb_)htARPaK3!B{iEt{{nm&D;H0xl$U5q z@|+*wzqtqs+29y6%`l-=5fl)z?M7daAY=Z`xm<@nWsB!d%PI3r*iL0F%Lum>{8DHs zy`i|=wJG5B$!`p5wK|KTTaBKrhox`!7YwhhJPEMMcy$IDJ!ma1K*TaTE?#(6MWhaL z!ql9wz~k&soTa4e!Sz4ID~2?X44ZW!NBGcTTAK*(fV>PVZv%0;DK>lxD6F*}Nm1Ey zTewVl=e9XE*#|gacTc1TGKaH^x!&!U_|)SklZ77g0~7${h_u;@ZbXWW>9lR-`6L_@`MI@%4TB zpyH-VSH>1J%B7$^hgGp3E!5Ef^{gYj8q@EEZ{oBC7E@~yllI}%6KLr>&o&E>{XSS2 zao`vmIRKvEk36TOsx$l(GJ%+K&4`^2qZi{Yk*g7|<-h5nit#ae=<^r|P8?9osc^7D zGpMQRXhmfa3Nj63{4v#)^-cWl&v5@Wmb{zl8TxZri!7I5qnKb&IQuVH(S*Z4otAcC zjZD@nyh+Jw%d=Kl^b_AJRCW2JYvHxc*LjXYYua~m8i)Fs3bJqVN8+c&*En{62X@Y6 zmJF8)IBm^2{%1JR;GU^QWN(>(w_^&Yt0p8g?{D@Q(FPq`cPErxbsZWq5mO%mHaaiwrm;5DDmNML{_ zx+cKx>62k_eqr_FK4g5cx?WQ9MhAWl@5>IKZ!-`z%jul-ul9D|?B%0!TJE0etk&DX z`P4E&+<}2V5M_quaun-%mZelW-2N2z86EZvcBDP$tRplROryUjWdpsJ>)T@sTm{6oJ*d>z{#+rtF{rWzy+l_$iQN;u? zjz);R`V2VcYxqqCQp=!g1hq5leGCfk$|2EZX*@D>WU_q{vnx_MbR2}fVjyu;w z*I+!PCRe?5jCu`FIC$p_d%+5jzo;*tPgdOk4WK;b8N~&Co|5|JODubO<^X{jJI{UF z0wzf2p%{#(W|mnEx?Vpp?L;FR?x?`B0j4=Sq@RSMlKYT#WDqOmaQ~RE-@hXB+refU2o2f`HubwyBV}yLpP1~QS@jh>+GmLAb ztA6(FSh`Za0#q56jd)-AZ;N!f-k0*e;ztEZ;`qyrBwS=B*@u^m`lAlQl{SSn76=E6 z|BsFmNGOKbD;lNzzI9a#m0%ahkc_m|(bPvdFWMZSnO*oj(fT8&hCbs#uL-aB7Djib zK%oPmRP9In4@&RjSnZNkGB&%#z&RfY5Bl;ahbaU{gBdffv)39d#8-vOXD$a)rGnd( zXJpOU$k>3tGj|H=S{J(5E8>z)RU?;jh5bh4G!vsqH?#Q zIwZ1eZ>xTS%=pDyh0OfA6|&f<_iC;H_!7h!o_ar-Iirq3|1`X<}s8&1-G4C~0+7?-Pp0{=UB=Az|D^%yEz@0%J z5NYJW&i#rNv=I}f80J#LkU}{rd?gP1Z$G zMPE%|w-~x&5OoUfJ2-W01ZTvYw!>Cecm;p{W_&0S0a0Qm`Ch$f&!Il_e*7yf)?1(p52-wCekrc+VT4s_xaU;1|+j;X2RX&@s3tMoS z$H|9!JaTyBO*EI70!43Ue8Pths4XnqZiYiwKc~q|21n@ln!9vZL?qAXbGAJ@QhghP z8u1iM9ztMyzD?NjJ|^Fm8QSG7Fo9oIvaav_OhpEIMK;V{ebGUxF{9$!oVv&TEA2qa z;|OB?;a}excj4v0B_TBiSe_L1aEWojUo&+VD8q)yh&_db*I_xu>}BEb)*bXQb81#t z#(&dLwl&_Wg)Af+`F+ZUKs8yB&TF&@>F&EFp&Q}Ko0kcS7x^HSs>hWlKST`gkTq)X zh}_6O!sl7YqiGzfo1Ph9r9HlyF7KTm!{@I#5E3;mx(xHIP0;!7K9;4n`}IrN&vyoB zF&@zy7wU&LjLB&2x@z$4s?igPUc0NDOYI75{z$C+Ud3n#MD*Jgbgs{k;FcWZw zv=B%}tqkGqt}|8P(Jp<%?!;?BN5UzK8q%k`REJD$7HH;&qq{s*s-~50A;N*@a8SdZ zZ^P)4d@fruKI_}%tQB7m{16|X=KU*aOp*IBlE=$%HStDC2(rv#c?Tr;HO!(CRatS4GyMP>`*_7c%6w$s)^S z9ncDu&X^wDx{MQ9+&3xtAon~e`3$+OZveGs8;@4AyYV!mXK?dRorQMw zR^lj4QU~8eJ|9T@k8=~k`qc@BTY?A~>NQkx7XA4A$w0Bo0iamXK@FBE@<=sinYD(G zV%&N2Ua-z)SUM=fQJEX-xC!)vu=vRIx>_<9<<0(HOnsgdX>ZLo?(D#{Wu3PehvR|QQisN{LxR8N_pztQml%*jOG}NtN%G7$ z#b=t^n({ol@rNoH6xv@uVH^v3<)jcNK44iDQ?qv`;gN`T_EO>k;Kn|oK;#Olp`{kz zuMQ5VDJ5wkuN@&h&?e;b{K>RJq@cJ<%v9A#*^bsX3yqew;^U_sQ?)AY5tYwV#JiTC zWtvwLsjHw|o{?jN@G_$U$zp+ISL{|C0_?Xy4NLR^>nx+%%L(siSr!`a^7pEXyZ7l< z4v!SBP zqhBx%+qYfQ@#;+>IO9Trp+{MC8`oGBsHi;JMnJY@J(MrqbJC*x~1I=tpW5;TYuURks zaB|9%@L?si^f2&dd|3r0ngre}?r1bRjm4i^Nh*ey`4Ajyu;$KNS%gU(C-Mk|N%Ed_ za6{};6eVwq9{a3I^uDxyu6qSuH<^y-9?ygH_si)m8eeVlm&DJjGB(YPEeY{R`b<$l z1Jz^{b_@2BoHb{8fwX2~4K3LEJha#nI1l^k+r(ABOMsqCzCIK3!g>P{jD|x4wFNt7 z9E6+IR+>fEkat2Q!qN(rL%h+;KQ=%)f3WzchId~MO&IBuzpCS17iCa={&)?FGF}fS zj0TUC5A}gTMV{Pa5T{PEvC#Y6XzG-O8_`EE>3_~aHh!ce7tEEEytYR%X;y*m9!N+r^l*gXSJ0wimn62$WP+R40zatOOB>Jr zMHuAz7hq;axAFY2;YcpDCfUWDaz9KVFLT+p7R|b_BihO4EjSj;nfeuO)dwj59c#Gb zU^Gt?s>b_D62_N0C$ICctAsOGL8wj0A zWBLdx!*0x@#7k6_ff%(-XES+qetXopAveD0s&J1D6&)<@!O$7oXF(=!d*mqX!p zp1A=Pr6+4)#S14AmiU~YlW%*Prg13^?d?|>Bk{W9M?!a>pRD$HThAtupFV1AA9EjB z6*-R{F5)mLNz>;e{PqJd<3^}WSf$;_ zK$6?JQ0>c5$dC zS#D*~QAaCEIO7revR5@YjS|`2Nv-T9ETl zfLYJZ@RMZ3IeJnahWMOF5Fw4$8Sn7UC4MjQYt{@-N`_I*uLvuJMJuXCt&Y)*RPcA zvYl@R#e|EbWm}6U-RI7GqEbd|-pAe{FSwgpf0jG)^T;XQlP2B|3JKOqHeGYZ{jS4eEdl+Va@>3GT70@s~!e(<4sb9X5C65m-%a4Top zwr|IR0H~ICWo4Wv!7?3w#N1r;$Ah*KmMb{a4Jc#paGt64Ek4N9LAl?w9vimPbfipq zWHdZ_zEp)`%ejHPsVzOupep`S<8M&H7dW>WUh3yN3bo{`K|$#Wp&D)e4|$Vn3Tba; z_JcP4Uv2z3CwGmEUcr~!ADDN;65dsAhR(QSi{2430Hk$XH}nOf2uh$2A#%G!-q9Ko%MOL%)WPTeJ2=^Ja}HV zZ030L@3F?8+G$A+qgQ*@=HMFUdjidAX)MO*Ks!3R;NrcJGkiJb5f>^0_pjhZxc?o& z`5R3LI0Wnuy%vm&zajl<;rG%}2@~PO+XeU9+UWXa#rFNGv$V@V(F&rtE4)c^nBPtt zNpZgSGeR9}WV6pXyDTFh9l=49V9}nlorpPd{kfZ~KA$3-tY_~y>Xdf%tipbG<|8;Q}Un#K) zuE5!2yx4*byfR{LS^1vh1y%h32*$DH#`8q+2S{<3--1Ry&?^O+&CYb*U&mwd5(@R~ ztUI1u^#GpnU!^2(w@A_BjNY|!M_n#LGeSnc45@m@Vael+zrd%JXeMnCCRT(4FPvol z?s=0a)amS2Lbz+!aQi@en-oP9b>97n&^rKIO?hH#IL`g$r8D%m9F`SL=rTa)TnBAZ zhW9i&!F_z&Emb!HqF;@HTUE^McUmB;aYGPj^$%$GhZbDFw{nJG6-`SX;zODmi)*~}k0GATWu1rxI7#Ccl_}koC21}~qZWHX9pNbg&vQ52I=mt; z8ZDNop{I@a-*QZiBmx^RBLZ9?J*7gghyPZ?otr6YAcxonD;U+_ z0v(coUhamCPSk=oNn^`s==^IV@7w=_X~=5Nf-FO@fAa(PSgJ1xB-c!LFRdBpv$w62 z1#i3lN5Ip-uYodC0ejmrS?~}>@PF~VO^XohNKuGR;x$3(a#9H5+t!02P*l*9@v&Vf zs1x>&No*lkCkrZ>mgA&`s5eR3V-IvQ!ulHtjXDK)+eYW{ZB42sgsB(%G20wkWdE7^?#@ZpD9gf1@h%7 z?g87Fb0py^__u76A3R<8ylv<+{E#F4|H7;%N2hdR7aoIhX*UeCV1k}lT_epTM=O~0 z6dq`wd;dTF?7cH%IDAK;S6^sAb0<*R{Y$}$eyA9Z0u+(iM8QMWBDmN8VjgJ`Ucp_C z9&R8ivc=rs%KJCBKH=5XJ6N6!4uy=?CXg5|GVqI{c<4+pz?QA(Y>8o-&Uq0TxdG`(R?Ti0i6}tGwOz*$A)va5% zMRlKEpnbaVd86ddBSD64-JwfSp|aMiTdRv$sh+cAe8m|`bResydsQ>5WcLLb4+J&N zU>4G7It8?6U7$bbgJ$5N)Qt?sB}GASA4?r<vjc7l-by9`+#{y zLJL7=y?)Je$CK9Ib2~|c9VN$Zf}wXK3XLS&lr>{c&fy}ZA#z}>I&Zw%ce~t&Dfk|= z0%Iz86xPxg9g1@PnbST&6crluGKv`V>URYQs%WnfH@Z-%gLiv#D_siSV2}nqlq~Wb zywLmnlc(&8;gF+d%mG>O;aw3i0*q%N{eg92Znoc}hlY%a1j4bSePNn0hh)JaRLX$N z?G%!z@W_YrTA5OKctq1Bz>MYS%56ba?J;86+JAq0RK~mJme4^ZeIaDvMV)M)lvQg^ zyDv#2SXtYLJu4C#@Nn$-SK3Omb#m^{0ES<=IXm7 zwXYp4Jv4oA6R@Y4&c)OtyswqX4EYrP8^j&2)G4XWKmk>+aFP&)SUMBF^FoqlvOor3 zJEN_W8TWp@iS_1WYc=_Y;ei-IBAv-{e;7l53WS@?!1Ii|1zSdv&6HYC0w6PM@(}O> zD)o2CZnAYMW4~W%pE=nbunN0_B|&t;Yy0dgkmUHkLDjwhVT?35z$5)Ncv`5wrU0c) z#{mp)Xu?H+F#E(jz^D<0CWdMZ_HG&3-y{G{{)h(sQPz4=3iT#4*jy!m6ufPkYpl~4 zbC>azf)~L;+u2h_n*ol7%l%V?9Dz7%8}o*k;0vlg>fmE?vRl`E4RsZ+<6glut7eX4 zUtyM8->Ja^9{;tUuMqHDTM+QwTM)3Agqb(%NB{CNEPEGn#7f^S`BGVLr~b?AE-4ib z3to(&gC?&Q%2-&6t!MYm_6D|oNUE@>O30tqIhOuj(Y+uLIJQvK981%jIEnr+j}j0u z@_MOMb+pHc_fo%1*mJ-Q6ZCL|>8(2Rk!jymRS6Ge^O6)*%$dX5SD5*r9hzowbQpD{$-4ig&nt8Ua>TNrm~xeDxxrNE zee)rU%uGU_Xi4`VZ1!VM7=^dV+z35%y6jCaOdqt!zjUNg^JFH0JiPoW)Uq2FpWTip z3qEO{N)9;oqm;c7R~R9d7>HT!=jD+1` zCv28JD{OC@D&+d35g!yoPJ1mB)g^QzKtKRrmHS|$Uef{QQeuL-Gc#_=NRwRs;Bfm& zBYyX{r)!*lV^tb>J@oKHfW48=nD>8_=N~eEl)LHm0!&I#BoHYDO6InsP@dEChG^;PKnL^PrfDLwR6$%EVBicG`qaQo2+ntB zt+l8{{)v0~!J7H&Hh#&~d)<@zqQ=m{+Pj4GS9`ZCn!nzQ{s5LS;>7tL&W{PafE`K* zmv)iQEg4P#W_p|o?>W!nx_4zUeE9R>xYc8yW5y2;hLXb*SW}dwa1S7hO)vjN3U_!f5WsE zfdxGqVf5)0UFF{t%+j5r(zTyl7*f_vT6$_7Y#@ryc=7IuInQqGU8(e?>SwH^!3`aj zUC*_r6d<=gHcH8r1k5Bl#;3VFO)&BXjb8~)2P!|lIChC#2Y1w~wp4NKFE>32*5bAe z`HVG&#Q2MxJhM3LtoV%DRSY~Cn8y;6s6Xi+L9te$k8_Wy$ILrE(WU*^_IrF*q}`>c z9s8>w58jv>(r_~5Ew9rOKEl%<@}n;HQtByoUzf^!xxg@QO=9I}|NHr7YUE>)0W<5| zlEIkpamq(433p@!3v-iw-zx^0v;n0#yo7Y#0@_`=t%> zIql_GxM2wOsr9>I+e8x zNuVnND`tzV)fGRuT^db_`|>MZojt3tAl3@q5brXtzZ|%(Y?@)SbS&|B8nZNir%PEo z)^9I9n(~oeH3z+j?g6nZcm0=*^S+C4wcyL%o8AiV?bekGPq&lM^g_q}k4-JpOTj$J z3eaAB3ZqAnn{J9o$(qY=je#r`YSAR&{^{$fkFj%KUzh`172Zv9N4Iz-%dr_-Sm(MW z5k-m4m@VFyHrG;_2+Qne>c~?q2dl9QIxMie@|gOxrYF>cjJ6hjfQEe@@TlcvguJX}|VPEe`%pw!_1P=3$G* zruL*jkIl(AmH3C^MtfAD5cFh|Tw!?1TbWy`qj8%4lyjoyl)O`28~E97<@6@9K=&zE zK4D+?*hfcy>EIT@xAuU-j%*xt{MsHTf&zzzrUd#ZwKD@rWYJ?xjE=pc`>NTKq``xv z=*UBFvb&|*0lvyA@X8G2LyY%(>G5F#E>4DN+bUIV+Q@S(`+EaSDak$T85Ha$KF?!e zkMnOagi=k(iCE3v=OSVQ{zQoUO?7dTaV$JxD%bKGevJ~9UBy_YziPi_u|6lU*p$bF z?fQWnd2fW_6V!_FBA1oMy#{RWXLWpEo3rk^4I&8_o{LrJ=luqy{t*Ugcr;2J(<}*a zeTZ(>{E`i6@WuVC+F7gf)4w2w-Fbl9f}SOx!`JcQISJceHY;rRy+7deZQtki--i~` z3@L?HYBAP7O`In*rlmSnq2QM)IFxU1T+J!9xX<=3?yxsS5ZdcYvd-q-C6+xG4WT-{ zUmu^7l~AeW_qZG-)o8|rw^-jgyCb#GJI!{wcnL7#N8Y$k#)vVNO8k2+uPQO9!rUn9 z;r(`m3L89LV_~FH()Wsz09B$Z;`jZec28^1Ypk}0~YmO!#F@$m1O9^i- zK8ws7-wvbr+m1Qf->&Ys}yz1aS3pBH0R0dA#QBv!lOHL zrrYrO4AH-oHl@jXw;dGjC!7DwMGOvHbFz<;!#fqfFf`^T?vyffG*=>wNl?Q@o^Djt z;0lk=xtO7gB+;XN%G#N}I2jN@p%9#e#j#`~ zgt1QVNyy1%=Rn3Em&lP}z1u|Php^$sYkw9-3JN3s+7O#n)4N3cx|LG$Jkh|-ytL;6 zrL3Arvcu2ZeuDC&oB&su9~i5v4VQS%^e;d@R(qzA$j^ay1c#HZn^cY35R=@MqC2uNMG`Q5rB_z}>_AA_G##|UIU3U3Q(NlM(s<%Xuk~rf|MB-f@pQ~67 z75#xiUW@MuR`?XIq}I2dm6K;H_3(WLF?lYLB??GWs&oiVz(`Y& zUP6=J2`xbK+xYz#o|n&c@rs;1yE{8GJM)=x3h+wZMq`VDKr2q0DyFgFLbR}k6z%e1 z1|qD$lN$R5DWd331sk}z4DH6lnCLfmpGGKp=VEK9cNqpeFHZC;rg7o=5dOh}+k=DC z)GePO$4_0%tk+DBG~GFCW^x1WTbdsiRAH%7Z#}*}^0BvLOkg0e_2|Tl#WQqJ>EcH# zIM?c%ZLoW$9pn9y`nEmJ?u+ckCN(jIRep^ZmE%%4mf=3k$PL3Rl<(GX z*??<5f7xxKI`Yl-z0e0g^!5{qa(}o%&+*po4daKl`K{0$JMuTe1X<}axdt*>T9X<{Kv@~4oIBO7O$huLx}de%JY{*h z{E+(^HS!YzunOL(C3g}@_bv);?S8={$j7uGbRo|T{n&7>Ge8G2-m|PwXR+FEyxYHm z)Yx|zrha@rlL%I24_(q$D#WP)OYIr9E@Z$h{wU3YLu#U$4GM0|m;O|)cI$2x?=}@D zFQMMsrZa+NZPV3X41>Q+&l6`ib6L7QM;UN^Rp#E+RV&4rt>tSqbR1cg(|@qlYPu~j zTSDKwWu|oJ#11RQ*{eE~u{p*y*z4GUc8Q%K3$RieXPL8k>yW{=3F@Qz)WaOQqZ2l~@%yS{E}2#oTT6Bc#z3++Av*vzgk z_tWt>+p&kn7uHAp^<%IN7k2$NPIn_VYjyZ#R=oqOI}oed##q;1+^Hpg@XULVgPUbr zyGipsXs-P{|7~M_=B0^0a}5baD*%XNsFQ+a5;xK;ojwP8IT?o>C>Kz|qJ_?l4h}fZ zu^ZkimfPPn#AEQoTf?11N1mEvLvqogIU$@IV&wJ6AT zs*>r%hut$6|Bf+f3tOyYmJ!i?=17_Xu8U^&5BQbIQJX(d0+GvuXqm&#%pk9%#JrcA zM^N$<`~}9$oy_2a$=fWE%bN09cwB=$t6!VdA%{1c{EMsj2_rdUDebeKCPmzkyfO|) zTB-Xa_GR(JEy=(g(w6-I8&tDiK$$SHm#p4j0^JO&-e~;KNO2u+Ag_K&N@m`Z+YKtV|SIauqw~uq~nbR`T1#7kwLw zep$v-tHZ+uD}%sQwU28mjA^PeJ$%3c6s8U1!pyarxHvfcF@oS$E z#|IO{5ql2DF1JoMc1^d@h5M#0;k}UsMb#`37w-xJ&oi$<4*F)_rvAebt6ch;`B zru%CHhvn$pCbRN5O?y6^sdyVV{772kA!CFyOjI-I8Q&MCa_F6#;A6#xUw+d=YR-kJ z%ejB!T)B|@bH67T3-X`ll5PebpGi@aZBLpY-*XLgCh}L62$@=QNBf@ek%aFy_VqsjH*8oxJ_fY9B zTW)Gl&5H&Gor>sTu5g5}yOQPyz<>sYd8 z%DaGviI${;QHvb$=TC&(^9WOaR_AP#BKS5%N#$Tlc9tF`SxJ2v;r`ve<%Ff??0sdg zvat*~Ezk6?RK@9y-&yU}$`!!1{uTw^vHH5;wMWc7SYL{YdeC8g(Zp}36n8eA`4@}) zjq{OFM|-j=<=INT)+Gbqwr1k~BLQJaY;ZKr6ge4oG{Tb1zGzXNIA>RKF(dL-W=xd5 z>o-p5FKIR0LycMy*O)hB{z|q<6|dH3e@xa6CaTc_Xk`Zd&}-#4H0Go1_Iy@!5mLp* z+HSH*OBU2Po=VnOQDVuA!N-at2GKEFMhB+}Dp;d$TOzWHob|V8>(+rh*UQPI>YI~uhaMXTCT zPk%mH{cB{?QU%7{BL{5|2p#L<{r8VxD8ei8@}FGP+OXGU2LT*#qVwTeVmM388}5V# z$3jhr8*s3H$hq=nBZpW)Zoi?A4;!2M)y{B^{R}fzJcTIJ@z-#{A`MR|JX-|0U zJU8GAALe>FrvGk_izy7s1bK9=yI#(_M9wWf7TwQ07U-YerSN53LEDYB6>Z}@aRQrv zqIcrylv$9^#|K2ZcYEo8q4)XgwE>M2Dc%<5YC)ZBkG%)&XOGgZT<%WKHTBQJ-oWOZ zDY^Viy*f&vMrX|XV}M{`>$66>Z(V0^e?k9m>6Cu3ZEv7yZ5EE3+2#F?6Hw4pR1BUO zv`-9pC;T>1cxmUik(~LR^bQpV&-|me@n~#=<2yLCt_0Rz=JntF%(p5L4mG>Z3iqAN z)SOI}!}TnqiAClBeBF@MUiq$8!9kep+LHtT(%BX98;h|9nr(^vP6W zNEDn6&mD$wzBwDyTMv-ACOzIu#uoC)!;_y&Bhng-h@y(XS)U-n5BXb--PWVvZY63C z1?%i5zuxHSOB9SVpQ}V?OE|Y0J(2m zmX14#Sz6sCr;2CKN2Y75%72+f)g{HttB^-@w&n?s`cz|jF$V|;if4X-JOuZ6GY|S7p`zslP}sm8FiK!vue8sIlTfjh)j_1g;J|H5;Hs!+pOAh-@ua>UsdxDo8`b z2E4I-ijQ7;Jox?VBia}qu(?k8cZeutN!kU5-c@ku-kxn}E!lUJZY;iPx$|n$Mc+t| zo10k|rO{I)w-ic8Pu<~b?>F?8G4fDm6g%H(V|p6iX{>aQEqly)<`q~<9qGgFVT?eC zYGqBLk*dS#8pPyJw_!dd`bMm zR0h3k6SU#H;Nmya5@Cy7y`)-2T2~)0YqWW4FM`nUx3#`BA>lWby-`le8ZMtrQOtGs zBkHLtkIiGnkxKIF$|Jl_llR#m#@ zSm=daLuk95x5>un?03hIuOn@p2Y}4mkk6;xBD>XDB=2%4gL^ItZ~sqDrYCO!K9fUV zNrk1Vj~*o+pZ&H*Lo)H`?{kIYf#OY8(Ym1|k7H9`D!K`Sqwy-?PS-{F@bQ9^yUmE! zz-DRPB7ic&3xdvf;`(emm125PR`h;lFox2sDZv8f3@=T_veBTyDf)QEXh*?}B51;7V#|#~}as-Q$hYr3&PlrArrI(}< zp5VR5j}4bbG{rQ{;R6Terh_--!o#z@JjMrgw@TF3NN+rV!}2CvpVCa=)l&9nB*tqa z@N4{dZzIyFn5}3F>vF3<)76}gzOZpwaI9W1Ydl!w>CviXy99$h<#UInG`E#Us(F5T z_jAeR29 z0(?dlN!{U}4=OwG^dHOQ&I3yDK>24exU%3)T#@U`9R3pfvTzp_EbsOeZaDkE!;5O? z)N2ni!dkg4ZQ@+9Y3T0krzG!)d6<9B5{KULG23@lO6v6DTeE4(+^KojsdcLr74yB+ z&FvDs8Zvc-C+p09f%o8xbQWqU+I@P?ee%LX7U|Df1-&D|!+kUut?3J&)b{PjoLka7 zor`Ou%*qOG|2y+^0XETWmr>VT z8Ub4jzxPT}dNA=q%3O!8Zvw#)7X^(ta$X4bqkL8iB2OI~k)i*S;C5Jd7C(!73&Jwm zSegd0OCJV|B{F~XZ?$BXawc-cmK&LYEGZ;W=?=hYw|p?l#R|t|?7{pkCSFOgqUsjbk!7XrQR9;n3jR z1^OckzFgK>Ux90U8%r|o=W*ReFnKSj(~g<;3}? z98Jj;b1tt0UBF~RHtJ>>zyqQHIP)pF$7ai1f0c>T7`W@7I@nZD;TqN)F=*>>Moja1 zb%&kuJ4Q@Ao2cm4c<&pV;SK=D+)h$hc|5GWR>g?fp5aL9$h8WuzHbUTAN1FqbdQhn z7ld#(1#5OH)((vDX_$UF=nVOXyVCtFHyF(bmD*BidKe5AG4wl4fTv31 z0nw-)Ef0Cw@pm}%*3qV3VB%Q2OsQ35_w-2{XA-o2p6vH4;n(QI{t>?tJ!q2q-wQ>{ z`;x$OcHOf^9D9G%R41WFKIDmqK^!o*S|Ir?3BPmEaERb34j#H=X~+#@C-wu-Ox=)% z5UQ0o?{NHz6oL{x?7l6`@n-ax?h)}Q<^rOWEypITORwq?HEfm^3WaCF6 zh rz+T#>55_bCvD$kJBbV!J#yPy?`$`5%N(k8q-gz4B>Y0G(0bR$eT}lSOyRZIz zgEzxa6rkz;RJ+T0AuEsr@1r${em(MPQlp)~x5`jvUL3;Lfi3E=s==2BVo+E*~}q>ygoy@y>GNo+L;A+gI#YdRWtDJ(xL3XrGlybk67C!H_)@T#Pqk? z)LBSXd}N+WkKy3M9z2=dr{`UQbtDdg_nFS;iL(k@7h2Y+v(UU2fj~^T;-jC_?i3F> zyeek$4CM8t_T&GyQlkO3@^UMwz9dT6qN2e&onsA6^MYKFZB7)-$+5t{z|(c;E$BAY zgGz=>ACnjavzx zh&je$pSkM_y~IQBx}0q;=TYP!iGsI^ewdrP{oWn}=$&;b2sKJ3hd$IXjU;Fr=juWH zWh(y;Z)4psj9F%I@o}*S4G@*0Ls=x!POtZIdJqSc*~^D+e|_gLH%mMT5IWO`28Ac~ zq`;v+csW&9IJzQ(P%0u*8}u#Z-)4U$4%Uyueu~wKjRhQ=1$dPcpy4yU0vGoV=AYu& z!3OXyVE(H(+pa->H-P3=bGD*ACK-G3dpmSz?S{OY#$a#-B*Jvh&#^UUlh_7sd_2Mw7?0~+vj9zrC?e(2b2+HkV z-b`xJQ{B1(8CN1p78%Sap$5fyV2jm|Vp}~-wpmG4iGx<#i}xs8b|`cctnZp_DJXrd1|}p0=)ni$2Ti;6Psp z?*kXw&yAUZPABje5w2P-OdlKY_NHCg|L8jS?yMiiz^6Ay9H{mf!z-9#{Vwsni} z8~UT!k~@c=irkBLKAe(58AsVkRfl#r*Jrt|C2Jddroxw-?kK=M?6Hl{A;J8OU zJYxEpE(#@Tct4@JI%{jnmW#}PvV*)z_`Wdtb6U@wW;$lv#w}ey9`Y7oX1wSkvZjhW z*t36=?~gKCBpWaifbwI(qi#UIAg=4$;xsXLELNMd6-J1yZq0@=GR@1Q|D2sWvBqqQWZe;XYOzzQCrhZq=X zLNxX5BR7sKzKrcjX9>^P$)Xl&SJBILt2`mg%yXd7xN`S6EkfV|r6jgY>y-UL(a%-e zyE@AxpHQ^lS-1IlJVxv8Z{S0PgP1#yE7IxGT&Kn#4qRQ;kbqQDPVO@|`sW4benCt# zAiCAK*IN2)StZS3L(f8FuDq-B7?7ysX%59J%OJ+IJPgq?M;xFq#20Cna*JQb@gNvg zxEIk02Uc6P)%H-4vblTERU5H(ZwM#jqpV}{ScD$L73K-LXq5rzWuPUBytG+{HDkq< zh0If@x4(vmon5W#_B@1iw~gy*~UY4vWY$yXqy4>eq$W64R35%#CJ@SQ`)l0R5Nz)&6S|YHW z{9LJ(zY7ka6JjFNdRp!X90y`dEf3I z47hJSmO6lXJy7mi{j9fjs^R1LeZA2fQ?*PIDDP#?E9k!n^}(?ed=?_u8++8l#mtRd zY`@!6=O5rsd|0P4!JK_ADxy<)%#A5m%9erF*se50-1{h8!cd--<1Qi?W(Y?itUp8DfUk*Ob{N zW~SH5fte!2KI9ZM5Tp|czq2rZFpm}O-W2YxGa;)6PHMyiW0H~%Wy@a8>rDZ@u3OJ8xGr{*)X|Tn8y3$JrP52g@&q6T6&P zx`?*L9L7@tfyKa}O3tkac(R@Y-Vp4c6FitmH?Pn&uQ}P{GCN;Mr_@)fsF?5~gzT0; zG5bvYJYVNRb{mP=@~6+%P83N5nOY)@cccBUZ-~_rMHxkdXAWoyF2Ij^b`^g%cMZ9x zuu|#VUr%~0wI|Tw2oGHO#sBtTsbVcmTrV>3n!t%T^MNIIBy@*#$)W3u4ao9Ba4Mz^ zj-eRGztZBeG^un$kC-Ryrh2x|xnC^)ia;7X@pE*kIz!7P`bCmF);k)f8#93!Gr<)Vg`!|i|dW7Kf3fsdjzqx^&mlnp* zBF1dQy^RF-hIP4#_^h`qv`i9T^O4(X(qb0lYpM*^@A6ejZhLF76uM8NB}E39S?@zX z=LdB?Xr683<_1VC0ZK%WJ5BYIXmE!O8GeA~Utgf6{8^QEWJgzhDO$4<4@Nu)XbDA| zK|hz)3+Kd}I?k9NnCa}&JEA#O+L%DsT2$SVxP((A8m~s}-$3;b!?NFev zc}>w+P)%K8x}yV^C?zx$^c`OdSkJV3o%>Y}7H1f!w=vjzCoIp)(J@qWrv_Ywa%m~KkWG1kDHWu&!!Uyk%#K^!Vr}GaP%MaeyNw@4^=w! ze{W+#fDEv-I*L8g$u7Gp2Pn6fp&Z}^*i>hdks()3s>~}zqxW@Z> zwcoM695x3O!6XIFX!9IO?oD{gDQV9G4_Cy{wAow~{KCJ{{|nfAQ!$pH?}?dHhpqRL zD-THG!!aF*+eSty_QZ^NNu!QS)Bi>C0D|LQB90fYJ1A*Ae)I|&G}I|RHZIHqXoe%( z3SaY4y{=diL#{ePJG;Qm-zoBd2B;JMqTgEO?7VKGd0?)5l=sut^_u3Fz|^v9JG3~6 zlr-C}A*P*w3=k5!T}FW3QhWUC7373>dyK659S(9Qv(ML7`sr5%4z?S~_MNP! zr2)Qzw0%PXL1cdzO@Pf>w@94` z74a5cU}~{|87hf0qPAnnP*&$^N#b=0`c+*X5wMTfaoaOfVI4m*&h__jbr>*>r^{ai zo8Z&JI`0!Z4GsBoJz>#1&Qil}D?VpI#-D+d0Ahd^ZKRKh0DVSu2srb(Mv#d3p?-3@ zu&%VdCd1$!!<8}4UojoYOYSHz!}FPNnr~l`!Q#9(f$6F=23rVQyZK~*NU^(nGrT|c zm9!-Nc7gnTz_8GP62g6?-5@tkkB+-FPnv$`J`WHBoQTH7{KqazvN=QCFkm_dl&p&p zL|1&o06&j4wh@Xy$)y`a85Pw<*UWhUWRk6$xTq6&9J_brzK3ePD}izHEYB72Z^m_{+C4w& zwBnjcyN|@-tSiPW0xeN_*L>vxU{VvrUY(e&5}Tb`^c}o_s6X<@AmAb6H(lgb&w~Yp z9CS5o2&-Lj;0(EeTwBaf-#7M$l5Dvop^u2Yx$E-T;Mw=W1|eI-=62niMLzU3c_1s* zNM7DTz7YJxWqHkaDZ@6DeDm_G-d;J*(adj75126DtHs4y~lMeQ}!+%V`vbKc~)|1fr$8Ua?Gxmfb1B0HEip!cD@( zdL{V*um(|!`Sh}DJMp)L;IPWir9B|eo2MXCew?Nj`=13(T~T7uH!(G}f9Mpz zUxGo|`}CBJ_4hUx+B7?kOZ2W>L;;zirPC60S8woyK+r<_t=hfz^^d_FJBfT(a?`>w z0ugn-g97yDIQCBh9%?~glb6s>p41Z~+ZiP89rMGut5W{}M!ajYgzGf;nF@gi!L zf7J@lx%NQ;qzucBTqTHqosBT>8Csc^BmjPcO0)75*H@i?RCvZ`Jdk6crJ%)$aPQ(2 z_#r6b&Viv#9(7XfNtV2R=KUiTdETX&dk$%-=0WiaKy&?E`k3mhrRv{84O?lK%rS?< zYzBtoW|W4dc_yw|0S)#6B=uH_A9Bf_N!(`lodn$wy=VJV42zf^oXQH zi=^H0=$F%v{dRghF5<>~$z4J?nbGPF`1Fpk+hh_gUsPVXo=%=id!tvK9+%;0cErJIGnjCifnx=j*W2Mt;4<3{+;~m>O?W}cs}76H;Lpxd zD!K5)BQ0%iU6L89FP_~`AEo6_j>=uVDYwG%L-}jU5{ufo%5iE_yfB2SeUYYLzUS+$ zQdXrDml1I9-}b$lRrgNboqNRz;mRbVo{f!S-*6nIU3r=|`nj{snC^X#>($7FLG)OF7|jB- zICV{!YuA5+aU)vc284MTFH8zr?l!l}q6y6CZ-Z!Z9q+HPg9a~C)WnCoR$m|}cFP%! zB;Nw5S^^qMZ&u7D^_$IDf8-;Oqu1h+1^1sTfR9gzZF)Vhta_+4S~)Lo5`DWW9Aj&C zZ-Ogy+Bor2xq=OZiC#4Fwf(HAlrpWL&!5zc37U#zVP>BBMBID81j$rUJCM|mtvziGq##D&tHrUpD>ZXh1%b8E-71St zsR^IIMdSa<^bZmy#0UQ}J;(P4l__gNdPqEm6q-r9-W#2A2#_U{oiJ^#q;WLpdI>CKta`s+cfP|CDbJVK0Xlo zf*N;F=zjS+vP9QGq%5}@l$qq(_yS#X|8%mz+6MuCXxyl5Tfq>Ga(@nHDJ|rE2V!j@ zIa$)A?U_kQA7%(;QC;93XIxcUM>~mIpuQ%KhvA9S*Tj%{p47!QUFs8Y21t2%&otyO z$8w^_$}Mnwra-K(fiisU!Qk-ye3yIf+gK{(koQ|;lomBaK%$d|X-7?efa|Ei- zOEnt#6Z7htjNxv)?buW&XdT_#_X+hRqP{!m+x3lzP|v_8>lTELt~OUXST;RJX7!XM z;#-%}0a)bNww5O3aX0Vfx5_!I?n z3w-v7?UYWmK(_x2=8-FO#uJpopGOa`ZYD0r%9&5?k%Oc3D)__QmP#^ z$D3JGHcA*ReRSB3|GWMfUN~=NMT;$mTW#^Qu5P~p&u4tR$9tudd#VxU<_r>sh@l&n{uldWNW6czxpXZfWb$xFiXvw9ut)%_#(ld=hR? zBF-#;Zp{+4#ftB=hKGQCD%a7fDP8bI<4k2J(&@3hr^N<;USPDqg8VT!?i~BXD4bx{bS`raW}bTaz1$KO6f)2v$gf z?-5$N>+|1V(Jyz11cfz+>b9YC7F9mN?z}^~lA4zRie&wuLrLBu#a} zeh4QUiY*xC^D5#*jPI)bavD4ts>AZJv23ty2+-eD-0UXi~=iW|h7hIRx=8>!$PfI!| z;4l)N8myKUaN*WadWb;Nh?%p&4Uc|dU{i!sDghK>nXGK z6H0W(U=vj zKMtGEI}V!Db;}JCsFbL9p$J~$yMtM|w$vW^Gcp-51nFZIQvH(tMx!xpqy5;Z6+@|+ zx_gwqmu>LbYtvIA8O$c1(RqyuYn2Yf@A=_`K>Kf&rh!f0f8pNk$5}c)0ZzyQ>r(7ZCzBBMWb;iv0$I`ph7w?3Z;*iXgpAU3w8pIOYxyNeWz3G%q zj$I3=oRe-N{#;{Xd36j1GYwA{EHcSuKxpt^D6_o(PkuZYui<(`&%tJ-^M^K*?< z!^-vxZK>W-+ouk?lB0aDQQ5ln5SDwsM+f~##rEUae%XUzIYLb<=*bSw;s5{rKc)bi bK2@apewVKbMcECw36Q?-wM+RIt)KoM-mob7 literal 0 HcmV?d00001 diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000000..865e9329f376 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard new file mode 100644 index 000000000000..4f0a58ac372e --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Info.plist b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Info.plist new file mode 100644 index 000000000000..7b6037c25e51 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Info.plist @@ -0,0 +1,64 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + SceneDelegate + UISceneStoryboardFile + Main + + + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h new file mode 100644 index 000000000000..2921a4af3ac5 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h @@ -0,0 +1,12 @@ +// Copyright 2020 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 + +@interface SceneDelegate : UIResponder + +@property (strong, nonatomic) UIWindow * window; + +@end + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.m b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.m new file mode 100644 index 000000000000..01fbd4804fc3 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.m @@ -0,0 +1,54 @@ +// Copyright 2020 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 "SceneDelegate.h" + +@interface SceneDelegate () + +@end + +@implementation SceneDelegate + + +- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). +} + + +- (void)sceneDidDisconnect:(UIScene *)scene { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). +} + + +- (void)sceneDidBecomeActive:(UIScene *)scene { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. +} + + +- (void)sceneWillResignActive:(UIScene *)scene { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). +} + + +- (void)sceneWillEnterForeground:(UIScene *)scene { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. +} + + +- (void)sceneDidEnterBackground:(UIScene *)scene { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. +} + + +@end diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.h b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.h new file mode 100644 index 000000000000..92e88f435dab --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.h @@ -0,0 +1,11 @@ +// Copyright 2020 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 + +@interface ViewController : UIViewController +@property(nonatomic, strong) IBOutlet UIImageView* imageView; + +@end + diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.m b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.m new file mode 100644 index 000000000000..cfce5fd73581 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.m @@ -0,0 +1,123 @@ +// Copyright 2020 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 "ViewController.h" +#import +#import +#import + +static int64_t loadStartupTime(NSError **error) { + pid_t pid = [[NSProcessInfo processInfo] processIdentifier]; + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; + struct kinfo_proc proc; + size_t size = sizeof(proc); + int err = sysctl(mib, 4, &proc, &size, NULL, 0); + if (err != 0) { + int errCode = errno; + if (error) { + *error = [NSError errorWithDomain:@"smiley" code:errCode userInfo:@{}]; + } + return 0; + } + + struct timeval startTime = proc.kp_proc.p_starttime; + int64_t microsecondsInSecond = 1000000LL; + int64_t microsecondsSinceEpoch = + (int64_t)(startTime.tv_sec * microsecondsInSecond) + + (int64_t)startTime.tv_usec; + + return microsecondsSinceEpoch; +} + +static NSString *loadIpAddress() { +#if TARGET_IPHONE_SIMULATOR + return @"127.0.0.1:4040"; +#else + NSString *ipPath = [[NSBundle mainBundle] pathForResource:@"ip" + ofType:@"txt"]; + NSError *err; + NSString *ipAddress = [NSString stringWithContentsOfFile:ipPath + encoding:NSUTF8StringEncoding + error:&err]; + assert(err == nil); + return [ipAddress + stringByTrimmingCharactersInSet:[NSCharacterSet + whitespaceAndNewlineCharacterSet]]; +#endif +} + +static void sendResults(NSTimeInterval result) { + NSLog(@"send results:%f", result); + NSString *ipAddress = loadIpAddress(); + NSString *url = [NSString stringWithFormat:@"http://%@", ipAddress]; + NSMutableURLRequest *urlRequest = + [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; + NSDictionary *payload = @{ + @"test": @"smiley", + @"platform": @"uikit", + @"results" : @{ + @"startupTime" : @(result), + } + }; + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload + options:0 + error:&error]; + assert(error == nil && jsonData); + [urlRequest setHTTPMethod:@"POST"]; + [urlRequest setHTTPBody:jsonData]; + + NSURLSession *session = [NSURLSession sharedSession]; + NSURLSessionDataTask *dataTask = [session + dataTaskWithRequest:urlRequest + completionHandler:^(NSData *data, NSURLResponse *response, + NSError *error) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + if (httpResponse.statusCode != 200) { + NSLog(@"Error %@ '%@'", error, url); + } + }]; + [dataTask resume]; +} + +@interface ViewController () +@property(nonatomic, strong) CADisplayLink *displayLink; +@end + +@implementation ViewController { + BOOL _waitingForDraw; +} + +- (void)viewDidLoad { + [super viewDidLoad]; +} + +- (void)loadView { + [super loadView]; + self.displayLink = [CADisplayLink displayLinkWithTarget:self + selector:@selector(onTick:)]; + [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] + forMode:NSRunLoopCommonModes]; + self.imageView.image = [UIImage imageNamed:@"smiley"]; + _waitingForDraw = YES; +} + +- (BOOL)prefersStatusBarHidden { + return YES; +} + +- (void)onTick:(CADisplayLink *)sender { + if (_waitingForDraw) { + int64_t epochTime = loadStartupTime(nil); + NSTimeInterval epocTimeSeconds = (double)epochTime / 1000000.0; + NSDate *startTime = [NSDate dateWithTimeIntervalSince1970:epocTimeSeconds]; + NSTimeInterval runTime = [[NSDate now] timeIntervalSinceDate:startTime]; + sendResults(runTime); + _waitingForDraw = NO; + [self.displayLink invalidate]; + self.displayLink = nil; + } +} + +@end diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ip.txt b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ip.txt new file mode 100644 index 000000000000..d331e21174a0 --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ip.txt @@ -0,0 +1 @@ +192.168.0.18:4040 \ No newline at end of file diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/main.m b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/main.m new file mode 100644 index 000000000000..d079e809d19c --- /dev/null +++ b/packages/imitation_game/tests/smiley/uikit/smiley/smiley/main.m @@ -0,0 +1,15 @@ +// Copyright 2020 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 +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + NSString * appDelegateClassName; + @autoreleasepool { + // Setup code that might create autoreleased objects goes here. + appDelegateClassName = NSStringFromClass([AppDelegate class]); + } + return UIApplicationMain(argc, argv, nil, appDelegateClassName); +} From d824e748e41815a015a0a7f2536e24a6b43db868 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Tue, 18 Aug 2020 15:54:09 -0700 Subject: [PATCH 12/15] [imitatioin_game] Made the imitation_game start reporting its results in the README.md. (#193) --- packages/imitation_game/CHANGELOG.md | 3 + packages/imitation_game/LICENSE | 27 +++++ packages/imitation_game/README.md | 12 +- .../{ => bin}/imitation_game.dart | 46 +++++++- .../smiley/README.md | 0 .../smiley/flutter/run_ios.sh | 0 .../smiley/flutter/smiley/.gitignore | 0 .../smiley/flutter/smiley/.metadata | 0 .../smiley/flutter/smiley/README.md | 0 .../smiley/flutter/smiley/android/.gitignore | 0 .../flutter/smiley/android/app/build.gradle | 0 .../android/app/src/debug/AndroidManifest.xml | 0 .../android/app/src/main/AndroidManifest.xml | 0 .../kotlin/com/example/smiley/MainActivity.kt | 0 .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values/styles.xml | 0 .../app/src/profile/AndroidManifest.xml | 0 .../flutter/smiley/android/build.gradle | 0 .../flutter/smiley/android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../flutter/smiley/android/settings.gradle | 0 .../smiley/flutter/smiley/assets/ip.txt | 0 .../smiley/flutter/smiley/images/smiley.png | Bin .../smiley/flutter/smiley/ios/.gitignore | 0 .../smiley/ios/Flutter/AppFrameworkInfo.plist | 0 .../flutter/smiley/ios/Flutter/Debug.xcconfig | 0 .../smiley/ios/Flutter/Release.xcconfig | 0 .../smiley/flutter/smiley/ios/Podfile | 0 .../ios/Runner.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../smiley/ios/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../flutter/smiley/ios/Runner/Info.plist | 0 .../ios/Runner/Runner-Bridging-Header.h | 0 .../smiley/flutter/smiley/lib/main.dart | 4 +- .../smiley/flutter/smiley/pubspec.yaml | 0 .../smiley/uikit/run_ios.sh | 0 .../smiley/uikit/smiley/exportOptions.plist | 0 .../smiley/smiley.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../smiley/uikit/smiley/smiley/AppDelegate.h | 4 +- .../smiley/uikit/smiley/smiley/AppDelegate.m | 23 ++-- .../AppIcon.appiconset/Contents.json | 0 .../smiley/Assets.xcassets/Contents.json | 0 .../smiley.imageset/Contents.json | 0 .../smiley.imageset/smiley.png | Bin .../smiley/Base.lproj/LaunchScreen.storyboard | 0 .../smiley/smiley/Base.lproj/Main.storyboard | 0 .../smiley/uikit/smiley/smiley/Info.plist | 0 .../uikit/smiley/smiley/SceneDelegate.h | 5 +- .../uikit/smiley/smiley/SceneDelegate.m | 30 +++-- .../uikit/smiley/smiley/ViewController.h | 1 - .../uikit/smiley/smiley/ViewController.m | 47 +++----- .../smiley/uikit/smiley/smiley/ip.txt | 0 .../smiley/uikit/smiley/smiley/main.m | 8 +- .../imitation_game/lib/README_template.dart | 109 ++++++++++++++++++ .../imitation_game/lib/imitation_game.dart | 1 + packages/imitation_game/pubspec.yaml | 8 ++ packages/imitation_game/run.sh | 1 + 93 files changed, 256 insertions(+), 73 deletions(-) create mode 100644 packages/imitation_game/CHANGELOG.md create mode 100644 packages/imitation_game/LICENSE rename packages/imitation_game/{ => bin}/imitation_game.dart (76%) rename packages/imitation_game/{tests => imitation_tests}/smiley/README.md (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/run_ios.sh (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/.gitignore (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/.metadata (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/README.md (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/.gitignore (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/build.gradle (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/build.gradle (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/gradle.properties (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/android/settings.gradle (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/assets/ip.txt (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/images/smiley.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/.gitignore (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Flutter/Release.xcconfig (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Podfile (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/AppDelegate.swift (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Info.plist (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/lib/main.dart (97%) rename packages/imitation_game/{tests => imitation_tests}/smiley/flutter/smiley/pubspec.yaml (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/run_ios.sh (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/exportOptions.plist (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/AppDelegate.h (75%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/AppDelegate.m (51%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/Info.plist (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/SceneDelegate.h (63%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/SceneDelegate.m (63%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/ViewController.h (99%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/ViewController.m (65%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/ip.txt (100%) rename packages/imitation_game/{tests => imitation_tests}/smiley/uikit/smiley/smiley/main.m (59%) create mode 100644 packages/imitation_game/lib/README_template.dart create mode 100644 packages/imitation_game/lib/imitation_game.dart create mode 100644 packages/imitation_game/pubspec.yaml create mode 100755 packages/imitation_game/run.sh diff --git a/packages/imitation_game/CHANGELOG.md b/packages/imitation_game/CHANGELOG.md new file mode 100644 index 000000000000..d7756211733e --- /dev/null +++ b/packages/imitation_game/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* Initial version (TBD). diff --git a/packages/imitation_game/LICENSE b/packages/imitation_game/LICENSE new file mode 100644 index 000000000000..bc67b8f95568 --- /dev/null +++ b/packages/imitation_game/LICENSE @@ -0,0 +1,27 @@ +Copyright 2019 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/packages/imitation_game/README.md b/packages/imitation_game/README.md index cbb19a43684d..5f389b99897e 100644 --- a/packages/imitation_game/README.md +++ b/packages/imitation_game/README.md @@ -34,7 +34,7 @@ tested. As new tests are added please add to this list: ```text ./ ├─ imitation_game.dart -└─ tests/ +└─ imitation_tests/ ├─ smiley/ │ ├─ README.md │ ├─ flutter/ @@ -91,3 +91,13 @@ An implementation has to follow these rules: ``` A single test run can report multiple numbers. + +## Results +Date created: 2020-08-17 23:57:16.702500Z + +- smiley + - flutter + - startupTime: 0.561475s + - uikit + - startupTime: 0.373102068901062s + diff --git a/packages/imitation_game/imitation_game.dart b/packages/imitation_game/bin/imitation_game.dart similarity index 76% rename from packages/imitation_game/imitation_game.dart rename to packages/imitation_game/bin/imitation_game.dart index 3b0804975d5b..59a047d5259e 100644 --- a/packages/imitation_game/imitation_game.dart +++ b/packages/imitation_game/bin/imitation_game.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:mustache/mustache.dart'; +import 'package:imitation_game/README_template.dart'; const int _port = 4040; @@ -33,6 +35,14 @@ Future> findFiles(Directory dir, {FileFilter where}) { return completer.future; } +String _makeMarkdownOutput(Map results) { + final Template template = Template(readmeTemplate, name: 'README.md'); + final Map values = Map.from(results); + values['date'] = DateTime.now().toUtc(); + final String output = template.renderString(values); + return output; +} + class _Script { _Script({this.path}); String path; @@ -75,6 +85,33 @@ class _ScriptRunner { } } +/// Recursively converts a map of maps to a map of lists of maps. +/// +/// For example: +/// _map2List({'a': {'b': 123}}, ['foo', 'bar']) -> +/// { +/// 'foo':[ +/// { +/// 'name': 'a', +/// 'bar': [{'name': 'b', 'value': 123}] +/// } +/// ] +/// } +Map _map2List(Map map, List names) { + final List> returnList = >[]; + final List tail = names.sublist(1); + map.forEach((String key, dynamic value) { + final Map testResult = {'name': key}; + if (tail.isEmpty) { + testResult['value'] = value; + } else { + testResult[tail.first] = _map2List(value, tail)[tail.first]; + } + returnList.add(testResult); + }); + return {names.first: returnList}; +} + class _ImitationGame { final Map results = {}; _ScriptRunner _scriptRunner; @@ -95,6 +132,7 @@ class _ImitationGame { results[test][platform] = {}; } data['results'].forEach((String k, dynamic v) { + // ignore: avoid_as results[test][platform][k] = v as double; }); return _runNext(); @@ -148,6 +186,7 @@ Future main() async { if (request.method == 'POST') { final String content = await utf8.decoder.bind(request).join(); final Map data = + // ignore: avoid_as jsonDecode(content) as Map; print('$data'); keepRunning = await game.handleResult(data); @@ -163,8 +202,9 @@ Future main() async { keepRunning = await game.handleTimeout(); } } - const JsonEncoder encoder = JsonEncoder.withIndent(' '); - final String jsonResults = encoder.convert(game.results); - print('$jsonResults'); + + final Map markdownValues = + _map2List(game.results, ['tests', 'platforms', 'measurements']); + File('README.md').writeAsStringSync(_makeMarkdownOutput(markdownValues)); await server.close(force: true); } diff --git a/packages/imitation_game/tests/smiley/README.md b/packages/imitation_game/imitation_tests/smiley/README.md similarity index 100% rename from packages/imitation_game/tests/smiley/README.md rename to packages/imitation_game/imitation_tests/smiley/README.md diff --git a/packages/imitation_game/tests/smiley/flutter/run_ios.sh b/packages/imitation_game/imitation_tests/smiley/flutter/run_ios.sh similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/run_ios.sh rename to packages/imitation_game/imitation_tests/smiley/flutter/run_ios.sh diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/.gitignore b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/.gitignore similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/.gitignore rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/.gitignore diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/.metadata b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/.metadata similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/.metadata rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/.metadata diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/README.md b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/README.md similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/README.md rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/README.md diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/.gitignore b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/.gitignore similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/.gitignore rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/.gitignore diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/build.gradle b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/build.gradle similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/build.gradle rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/build.gradle diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/debug/AndroidManifest.xml diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/AndroidManifest.xml diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/kotlin/com/example/smiley/MainActivity.kt diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/drawable/launch_background.xml diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/main/res/values/styles.xml diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/app/src/profile/AndroidManifest.xml diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/build.gradle b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/build.gradle similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/build.gradle rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/build.gradle diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle.properties b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/gradle.properties similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/gradle.properties rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/gradle.properties diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/android/settings.gradle b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/settings.gradle similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/android/settings.gradle rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/android/settings.gradle diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/assets/ip.txt b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/assets/ip.txt similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/assets/ip.txt rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/assets/ip.txt diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/images/smiley.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/images/smiley.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/images/smiley.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/images/smiley.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/.gitignore b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/.gitignore similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/.gitignore rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/.gitignore diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Flutter/Debug.xcconfig diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Flutter/Release.xcconfig diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Podfile b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Podfile similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Podfile rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Podfile diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.pbxproj diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/AppDelegate.swift diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Info.plist b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Info.plist similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Info.plist rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Info.plist diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/ios/Runner/Runner-Bridging-Header.h diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/lib/main.dart b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/lib/main.dart similarity index 97% rename from packages/imitation_game/tests/smiley/flutter/smiley/lib/main.dart rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/lib/main.dart index 546aedb6fe85..0dcab31f25fa 100644 --- a/packages/imitation_game/tests/smiley/flutter/smiley/lib/main.dart +++ b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/lib/main.dart @@ -26,9 +26,7 @@ Future _sendResult(double result) async { body: jsonEncode({ 'test': 'smiley', 'platform': 'flutter', - 'results': { - 'startupTime': result - }, + 'results': {'startupTime': result}, }), ); if (response.statusCode != 200) { diff --git a/packages/imitation_game/tests/smiley/flutter/smiley/pubspec.yaml b/packages/imitation_game/imitation_tests/smiley/flutter/smiley/pubspec.yaml similarity index 100% rename from packages/imitation_game/tests/smiley/flutter/smiley/pubspec.yaml rename to packages/imitation_game/imitation_tests/smiley/flutter/smiley/pubspec.yaml diff --git a/packages/imitation_game/tests/smiley/uikit/run_ios.sh b/packages/imitation_game/imitation_tests/smiley/uikit/run_ios.sh similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/run_ios.sh rename to packages/imitation_game/imitation_tests/smiley/uikit/run_ios.sh diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/exportOptions.plist b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/exportOptions.plist similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/exportOptions.plist rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/exportOptions.plist diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley.xcodeproj/project.pbxproj diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.h b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/AppDelegate.h similarity index 75% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.h rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/AppDelegate.h index 545a4e5190ce..9a7d7f20dea6 100644 --- a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.h +++ b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/AppDelegate.h @@ -4,8 +4,6 @@ #import -@interface AppDelegate : UIResponder - +@interface AppDelegate : UIResponder @end - diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.m b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/AppDelegate.m similarity index 51% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.m rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/AppDelegate.m index 4d7550a2d3bf..cac844f52dd6 100644 --- a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/AppDelegate.m +++ b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/AppDelegate.m @@ -10,28 +10,29 @@ @interface AppDelegate () @implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } - #pragma mark - UISceneSession lifecycle - -- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options { +- (UISceneConfiguration *)application:(UIApplication *)application + configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession + options:(UISceneConnectionOptions *)options { // Called when a new scene session is being created. // Use this method to select a configuration to create the new scene with. - return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role]; + return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" + sessionRole:connectingSceneSession.role]; } - -- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions { +- (void)application:(UIApplication *)application + didDiscardSceneSessions:(NSSet *)sceneSessions { // Called when the user discards a scene session. - // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. - // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + // If any sessions were discarded while the application was not running, this will be called + // shortly after application:didFinishLaunchingWithOptions. Use this method to release any + // resources that were specific to the discarded scenes, as they will not return. } - @end diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/Contents.json diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/Contents.json diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Assets.xcassets/smiley.imageset/smiley.png diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Base.lproj/LaunchScreen.storyboard diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Base.lproj/Main.storyboard diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/Info.plist b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Info.plist similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/Info.plist rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/Info.plist diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/SceneDelegate.h similarity index 63% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/SceneDelegate.h index 2921a4af3ac5..bc46a078a237 100644 --- a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h +++ b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/SceneDelegate.h @@ -4,9 +4,8 @@ #import -@interface SceneDelegate : UIResponder +@interface SceneDelegate : UIResponder -@property (strong, nonatomic) UIWindow * window; +@property(strong, nonatomic) UIWindow* window; @end - diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.m b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/SceneDelegate.m similarity index 63% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.m rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/SceneDelegate.m index 01fbd4804fc3..061f723671d3 100644 --- a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.m +++ b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/SceneDelegate.m @@ -10,45 +10,43 @@ @interface SceneDelegate () @implementation SceneDelegate - -- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. - // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. - // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). +- (void)scene:(UIScene *)scene + willConnectToSession:(UISceneSession *)session + options:(UISceneConnectionOptions *)connectionOptions { + // Use this method to optionally configure and attach the UIWindow `window` to the provided + // UIWindowScene `scene`. If using a storyboard, the `window` property will automatically be + // initialized and attached to the scene. This delegate does not imply the connecting scene or + // session are new (see `application:configurationForConnectingSceneSession` instead). } - - (void)sceneDidDisconnect:(UIScene *)scene { // Called as the scene is being released by the system. // This occurs shortly after the scene enters the background, or when its session is discarded. - // Release any resources associated with this scene that can be re-created the next time the scene connects. - // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + // Release any resources associated with this scene that can be re-created the next time the scene + // connects. The scene may re-connect later, as its session was not neccessarily discarded (see + // `application:didDiscardSceneSessions` instead). } - - (void)sceneDidBecomeActive:(UIScene *)scene { // Called when the scene has moved from an inactive state to an active state. - // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was + // inactive. } - - (void)sceneWillResignActive:(UIScene *)scene { // Called when the scene will move from an active state to an inactive state. // This may occur due to temporary interruptions (ex. an incoming phone call). } - - (void)sceneWillEnterForeground:(UIScene *)scene { // Called as the scene transitions from the background to the foreground. // Use this method to undo the changes made on entering the background. } - - (void)sceneDidEnterBackground:(UIScene *)scene { // Called as the scene transitions from the foreground to the background. - // Use this method to save data, release shared resources, and store enough scene-specific state information - // to restore the scene back to its current state. + // Use this method to save data, release shared resources, and store enough scene-specific state + // information to restore the scene back to its current state. } - @end diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.h b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ViewController.h similarity index 99% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.h rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ViewController.h index 92e88f435dab..a3585bf5c130 100644 --- a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.h +++ b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ViewController.h @@ -8,4 +8,3 @@ @property(nonatomic, strong) IBOutlet UIImageView* imageView; @end - diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.m b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ViewController.m similarity index 65% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.m rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ViewController.m index cfce5fd73581..deaa9bb8921d 100644 --- a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ViewController.m +++ b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ViewController.m @@ -24,8 +24,7 @@ static int64_t loadStartupTime(NSError **error) { struct timeval startTime = proc.kp_proc.p_starttime; int64_t microsecondsInSecond = 1000000LL; int64_t microsecondsSinceEpoch = - (int64_t)(startTime.tv_sec * microsecondsInSecond) + - (int64_t)startTime.tv_usec; + (int64_t)(startTime.tv_sec * microsecondsInSecond) + (int64_t)startTime.tv_usec; return microsecondsSinceEpoch; } @@ -34,16 +33,13 @@ static int64_t loadStartupTime(NSError **error) { #if TARGET_IPHONE_SIMULATOR return @"127.0.0.1:4040"; #else - NSString *ipPath = [[NSBundle mainBundle] pathForResource:@"ip" - ofType:@"txt"]; + NSString *ipPath = [[NSBundle mainBundle] pathForResource:@"ip" ofType:@"txt"]; NSError *err; - NSString *ipAddress = [NSString stringWithContentsOfFile:ipPath - encoding:NSUTF8StringEncoding - error:&err]; + NSString *ipAddress = + [NSString stringWithContentsOfFile:ipPath encoding:NSUTF8StringEncoding error:&err]; assert(err == nil); - return [ipAddress - stringByTrimmingCharactersInSet:[NSCharacterSet - whitespaceAndNewlineCharacterSet]]; + return + [ipAddress stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; #endif } @@ -54,30 +50,27 @@ static void sendResults(NSTimeInterval result) { NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; NSDictionary *payload = @{ - @"test": @"smiley", - @"platform": @"uikit", + @"test" : @"smiley", + @"platform" : @"uikit", @"results" : @{ @"startupTime" : @(result), } }; NSError *error; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload - options:0 - error:&error]; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload options:0 error:&error]; assert(error == nil && jsonData); [urlRequest setHTTPMethod:@"POST"]; [urlRequest setHTTPBody:jsonData]; NSURLSession *session = [NSURLSession sharedSession]; - NSURLSessionDataTask *dataTask = [session - dataTaskWithRequest:urlRequest - completionHandler:^(NSData *data, NSURLResponse *response, - NSError *error) { - NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; - if (httpResponse.statusCode != 200) { - NSLog(@"Error %@ '%@'", error, url); - } - }]; + NSURLSessionDataTask *dataTask = + [session dataTaskWithRequest:urlRequest + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + if (httpResponse.statusCode != 200) { + NSLog(@"Error %@ '%@'", error, url); + } + }]; [dataTask resume]; } @@ -95,10 +88,8 @@ - (void)viewDidLoad { - (void)loadView { [super loadView]; - self.displayLink = [CADisplayLink displayLinkWithTarget:self - selector:@selector(onTick:)]; - [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] - forMode:NSRunLoopCommonModes]; + self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(onTick:)]; + [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; self.imageView.image = [UIImage imageNamed:@"smiley"]; _waitingForDraw = YES; } diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/ip.txt b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ip.txt similarity index 100% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/ip.txt rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/ip.txt diff --git a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/main.m b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/main.m similarity index 59% rename from packages/imitation_game/tests/smiley/uikit/smiley/smiley/main.m rename to packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/main.m index d079e809d19c..9098614813ea 100644 --- a/packages/imitation_game/tests/smiley/uikit/smiley/smiley/main.m +++ b/packages/imitation_game/imitation_tests/smiley/uikit/smiley/smiley/main.m @@ -5,11 +5,11 @@ #import #import "AppDelegate.h" -int main(int argc, char * argv[]) { - NSString * appDelegateClassName; +int main(int argc, char* argv[]) { + NSString* appDelegateClassName; @autoreleasepool { - // Setup code that might create autoreleased objects goes here. - appDelegateClassName = NSStringFromClass([AppDelegate class]); + // Setup code that might create autoreleased objects goes here. + appDelegateClassName = NSStringFromClass([AppDelegate class]); } return UIApplicationMain(argc, argv, nil, appDelegateClassName); } diff --git a/packages/imitation_game/lib/README_template.dart b/packages/imitation_game/lib/README_template.dart new file mode 100644 index 000000000000..be3443ee40da --- /dev/null +++ b/packages/imitation_game/lib/README_template.dart @@ -0,0 +1,109 @@ +/// Mustache template used for generating README.md. +String readmeTemplate = """# Imitation Game + +## Description + +`imitation_game` is a platform for performing automated tests to compare the +performance of different UI frameworks. For example, how much memory does the +same app written in Flutter and UIKit take? + +## Running all the tests + +You need a mobile device plugged into your computer and setup for development. +The mobile device and the computer need to be on the same network, one that +allows communication between computers since that's how the mobile phone will +report its results to the computer. + +```sh +dart imitation_game.dart +``` + +## Dependencies + +In order to run the tests you will need the union of all the platforms being +tested. As new tests are added please add to this list: + +### iOS + +- Flutter +- Xcode +- [ios_deploy](https://github.com/ios-control/ios-deploy) - used to launch apps + on the attached iOS device. + +## Example File Layout + +```text +./ +├─ imitation_game.dart +└─ tests/ + ├─ smiley/ + │ ├─ README.md + │ ├─ flutter/ + │ │ ├─ run_ios.sh + │ │ └─ + │ └─ uikit/ + │ ├─ run_ios.sh + │ └─ + └─ memory/ + ├─ README.md + ├─ flutter/ + │ ├─ run_ios.sh + │ └─ + └─ uikit/ + ├─ run_ios.sh + └─ +``` + +Here there are 2 different tests with 2 different platform implementations. The +tests are named `smiley` and `memory`, they are both implemented on the +platforms `flutter` and `uikit`. + +### Adding a test + +Tests should comprise of implementations on one or more platform. The directory +for the test should be added to `./tests`. Inside that directory there should +be a directory of implementations and a `README.md` file that explains the test. + +### Adding an implementation to a test + +An implementation has to follow these rules: + +- It needs to perform the same operations as the other implementations and + follow the description in the test's `README.md`. +- It needs to contain a `run_ios.sh` script that will build and launch the test + on the connected device. +- It should contain a file named `ip.txt` which will be overwritten by + `imitation_game.dart` with the ip address and port that should be used to + report results to. +- It needs to report its results to the ip and port in the `ip.txt` via an HTTP + POST of JSON data. + +## Data format for results + +```json +{ + "test": "name_of_test", + "platform": "name_of_platform", + "results": { + "some_result_name": 1.23, + "some_result_name2": 4.56, + } +} +``` + +A single test run can report multiple numbers. + +## Results +Date created: {{date}} + +{{#tests}} +- {{name}} + {{#platforms}} + - {{name}} + {{#measurements}} + - {{name}}: {{value}}s + {{/measurements}} + {{/platforms}} +{{/tests}} + +"""; diff --git a/packages/imitation_game/lib/imitation_game.dart b/packages/imitation_game/lib/imitation_game.dart new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/packages/imitation_game/lib/imitation_game.dart @@ -0,0 +1 @@ + diff --git a/packages/imitation_game/pubspec.yaml b/packages/imitation_game/pubspec.yaml new file mode 100644 index 000000000000..931556b15d63 --- /dev/null +++ b/packages/imitation_game/pubspec.yaml @@ -0,0 +1,8 @@ +name: imitation_game +version: 0.0.1 +description: Testing framework for comparing multiple frameworks' performance. +homepage: https://github.com/flutter/packages/tree/master/packages/imitation_game +dependencies: + mustache: ^1.1.1 +environment: + sdk: ">=1.8.0 <3.0.0" diff --git a/packages/imitation_game/run.sh b/packages/imitation_game/run.sh new file mode 100755 index 000000000000..f29e0eb4fba2 --- /dev/null +++ b/packages/imitation_game/run.sh @@ -0,0 +1 @@ +pub run imitation_game From 2afb1b35c2185cd6eff0b80f06c169004eaaf91f Mon Sep 17 00:00:00 2001 From: James Chen-Smith <15643597+jameschensmith@users.noreply.github.com> Date: Wed, 19 Aug 2020 18:08:15 -0500 Subject: [PATCH 13/15] [xdg_directories] Apply missing test visibility annotation (#194) Stumbled across the XDG directory library, and noticed something small. --- packages/xdg_directories/lib/xdg_directories.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/xdg_directories/lib/xdg_directories.dart b/packages/xdg_directories/lib/xdg_directories.dart index 857b72c1c18b..08e8cb6d8512 100644 --- a/packages/xdg_directories/lib/xdg_directories.dart +++ b/packages/xdg_directories/lib/xdg_directories.dart @@ -30,6 +30,7 @@ set xdgEnvironmentOverride(EnvironmentAccessor override) { /// replaces the real environment lookups with an override. /// /// Only available to tests. +@visibleForTesting EnvironmentAccessor get xdgEnvironmentOverride => _xdgEnvironmentOverride; EnvironmentAccessor _xdgEnvironmentOverride; EnvironmentAccessor _productionGetEnv = From 0e4f776d659214d3c0439067d1e0a139cf067752 Mon Sep 17 00:00:00 2001 From: James Chen-Smith <15643597+jameschensmith@users.noreply.github.com> Date: Wed, 19 Aug 2020 18:10:23 -0500 Subject: [PATCH 14/15] [xdg_directories] Swap flutter dependencies out (#195) I didn't notice a need to depend on flutter packages when they could be replaced with the more specific libraries. I opted to go for the latest versions. --- packages/xdg_directories/lib/xdg_directories.dart | 2 +- packages/xdg_directories/pubspec.yaml | 6 ++---- packages/xdg_directories/test/xdg_directories_test.dart | 6 +++++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/xdg_directories/lib/xdg_directories.dart b/packages/xdg_directories/lib/xdg_directories.dart index 08e8cb6d8512..ba4be8b4cd8f 100644 --- a/packages/xdg_directories/lib/xdg_directories.dart +++ b/packages/xdg_directories/lib/xdg_directories.dart @@ -7,7 +7,7 @@ library xdg_directories; import 'dart:convert'; import 'dart:io'; -import 'package:flutter/cupertino.dart'; +import 'package:meta/meta.dart'; import 'package:path/path.dart' as path; import 'package:process/process.dart'; diff --git a/packages/xdg_directories/pubspec.yaml b/packages/xdg_directories/pubspec.yaml index 02b47b32b2cd..ba1d47dd2ffe 100644 --- a/packages/xdg_directories/pubspec.yaml +++ b/packages/xdg_directories/pubspec.yaml @@ -7,12 +7,10 @@ environment: sdk: ">=2.3.0 <3.0.0" dependencies: + meta: ^1.2.2 path: ^1.6.4 process: ^3.0.12 - flutter: - sdk: flutter dev_dependencies: + test: ^1.15.3 mockito: ^4.1.1 - flutter_test: - sdk: flutter diff --git a/packages/xdg_directories/test/xdg_directories_test.dart b/packages/xdg_directories/test/xdg_directories_test.dart index c32089dcc893..9e1eca2b3c04 100644 --- a/packages/xdg_directories/test/xdg_directories_test.dart +++ b/packages/xdg_directories/test/xdg_directories_test.dart @@ -5,7 +5,7 @@ import 'dart:convert'; import 'dart:io'; -import 'package:flutter_test/flutter_test.dart'; +import 'package:test/test.dart'; import 'package:path/path.dart' as path; import 'package:mockito/mockito.dart' show Fake; import 'package:process/process.dart'; @@ -46,6 +46,7 @@ XDG_VIDEOS_DIR="$HOME/Videos" '''); xdg.xdgEnvironmentOverride = (String key) => fakeEnv[key]; }); + tearDown(() { if (tmpDir != null) { tmpDir.deleteSync(recursive: true); @@ -70,6 +71,7 @@ XDG_VIDEOS_DIR="$HOME/Videos" expectDirList(xdg.configDirs, ['/etc/xdg']); expectDirList(xdg.dataDirs, ['/usr/local/share', '/usr/share']); }); + test('Values pull from environment', () { expect(xdg.cacheHome.path, equals(testPath('.test_cache'))); expect(xdg.configHome.path, equals(testPath('.test_config'))); @@ -82,6 +84,7 @@ XDG_VIDEOS_DIR="$HOME/Videos" testPath('usr/test_share'), ]); }); + test('Can get userDirs', () { final Map expected = { 'DESKTOP': testPath('Desktop'), @@ -102,6 +105,7 @@ XDG_VIDEOS_DIR="$HOME/Videos" } xdg.xdgProcessManager = const LocalProcessManager(); }); + test('Throws StateError when HOME not set', () { fakeEnv.clear(); expect(() { From 5b3c1f973585a73be5e8e11f57fa7a0843bb203d Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Wed, 19 Aug 2020 17:38:39 -0700 Subject: [PATCH 15/15] [pigeon] Updated documentation in run_tests.sh and turned the ios unit tests back on. (#191) --- .../ios/Runner.xcodeproj/project.pbxproj | 17 +---- packages/pigeon/run_tests.sh | 69 ++++++++++++++++++- 2 files changed, 69 insertions(+), 17 deletions(-) diff --git a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj index f285dc91805e..20ab37a48ec5 100644 --- a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj @@ -11,10 +11,6 @@ 0D50127523FF75B100CD5B95 /* RunnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D50127423FF75B100CD5B95 /* RunnerTests.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -39,8 +35,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -56,13 +50,11 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -83,8 +75,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,9 +93,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, @@ -271,7 +259,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -408,7 +396,6 @@ }; 249021D3217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -482,7 +469,6 @@ }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -538,7 +524,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh index 8058d8055627..2b3ee4f467e7 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -1,10 +1,28 @@ +############################################################################### +# run_tests.sh +# +# This runs all the different types of tests for pigeon. It should be run from +# the directory that contains the script. +############################################################################### + # exit when any command fails set -e +############################################################################### +# Variables +############################################################################### flutter=$(which flutter) flutter_bin=$(dirname $flutter) framework_path="$flutter_bin/cache/artifacts/engine/ios/" +############################################################################### +# Functions +############################################################################### + +# test_pigeon_ios() +# +# Compiles the pigeon file to a temp directory and attempts to compile the code +# and runs the dart analyzer on the generated dart code. test_pigeon_ios() { temp_dir=$(mktemp -d -t pigeon) @@ -30,6 +48,9 @@ test_pigeon_ios() { rm -rf $temp_dir } +# test_pigeon_android() +# +# Compiles the pigeon file to a temp directory and attempts to compile the code. test_pigeon_android() { temp_dir=$(mktemp -d -t pigeon) @@ -48,7 +69,22 @@ test_pigeon_android() { rm -rf $temp_dir } +############################################################################### +# Dart unit tests +############################################################################### +pub get pub run test test/ + +############################################################################### +# Compilation tests (Code is generated and compiled) +############################################################################### +# Make sure the artifacts are present. +flutter precache +# Make sure flutter dependencies are available. +pushd $PWD +cd e2e_tests/test_objc/ +flutter pub get +popd test_pigeon_android ./pigeons/voidflutter.dart test_pigeon_android ./pigeons/voidhost.dart test_pigeon_android ./pigeons/host2flutter.dart @@ -64,6 +100,9 @@ test_pigeon_ios ./pigeons/void_arg_host.dart test_pigeon_ios ./pigeons/void_arg_flutter.dart test_pigeon_ios ./pigeons/list.dart +############################################################################### +# Mock handler flutter tests. +############################################################################### pushd $PWD pub run pigeon \ --input pigeons/message.dart \ @@ -73,6 +112,31 @@ cd mock_handler_tester flutter test popd +############################################################################### +# iOS unit tests on generated code. +############################################################################### +pub run pigeon \ + --input pigeons/message.dart \ + --dart_out /dev/null \ + --objc_header_out platform_tests/ios_unit_tests/ios/Runner/messages.h \ + --objc_source_out platform_tests/ios_unit_tests/ios/Runner/messages.m +clang-format -i platform_tests/ios_unit_tests/ios/Runner/messages.h +clang-format -i platform_tests/ios_unit_tests/ios/Runner/messages.m +pushd $PWD +cd platform_tests/ios_unit_tests +flutter build ios +cd ios +xcodebuild \ + -workspace Runner.xcworkspace \ + -scheme RunnerTests \ + -sdk iphonesimulator \ + -destination 'platform=iOS Simulator,name=iPhone 8' \ + test +popd + +############################################################################### +# End-to-end (e2e) integration tests. +############################################################################### DARTLE_H="e2e_tests/test_objc/ios/Runner/dartle.h" DARTLE_M="e2e_tests/test_objc/ios/Runner/dartle.m" DARTLE_DART="e2e_tests/test_objc/lib/dartle.dart" @@ -97,5 +161,8 @@ xcodebuild \ test | xcpretty popd +############################################################################### +# Run the formatter on generated code. +############################################################################### cd ../.. -pub global activate flutter_plugin_tools && pub global run flutter_plugin_tools format \ No newline at end of file +pub global activate flutter_plugin_tools && pub global run flutter_plugin_tools format