From a52c7b470d04ae312002fceb601bb26a0b58155f Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Wed, 5 Apr 2017 11:28:33 -0700 Subject: [PATCH] Update the examples/ README and associated fixes. (#9090) This yak shave went as follows: Fix https://github.com/flutter/flutter/issues/8795 by adding stocks to the examples README. Notice the layers entry in that README isn't quite right either. Update that. Check the layers/README file is worth pointing at. Update the layers/README. Let's run some of the layer tests to see if they still work. Oops, need to update them to gradle. Ok let's try running them again. Oops, sector is broken. Add a test for sector. Fix sector. Find you need to add an assert to a const constructor. Notice we need to turn const asserts on for the analyzer. Notice the analysis_options files are out of sync with each other and with the full list of lints. Turn on the lints that should be on. Fix the bugs that finds. --- .analysis_options | 12 +- .analysis_options_repo | 14 +- examples/README.md | 18 +- examples/layers/.gitignore | 10 + examples/layers/README.md | 7 +- examples/layers/android/.gitignore | 12 + examples/layers/android/AndroidManifest.xml | 19 - examples/layers/android/app/build.gradle | 46 ++ .../android/app/src/main/AndroidManifest.xml | 32 ++ .../flutter/examples/Layers/MainActivity.java | 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 examples/layers/android/build.gradle | 28 + examples/layers/android/gradle.properties | 1 + examples/layers/android/settings.gradle | 15 + examples/layers/ios/.gitignore | 37 ++ .../layers/ios/Flutter/AppFrameworkInfo.plist | 30 ++ examples/layers/ios/Flutter/Debug.xcconfig | 2 + examples/layers/ios/Flutter/Release.xcconfig | 2 + examples/layers/ios/Podfile | 38 ++ examples/layers/ios/Podfile.lock | 3 + examples/layers/ios/Pods/Manifest.lock | 3 + .../ios/Pods/Pods.xcodeproj/project.pbxproj | 297 +++++++++++ .../xcschemes/Pods-Runner.xcscheme | 80 +++ .../Pods-Runner-acknowledgements.markdown | 3 + .../Pods-Runner-acknowledgements.plist | 29 ++ .../Pods-Runner/Pods-Runner-dummy.m | 5 + .../Pods-Runner/Pods-Runner-frameworks.sh | 84 +++ .../Pods-Runner/Pods-Runner-resources.sh | 102 ++++ .../Pods-Runner/Pods-Runner.debug.xcconfig | 7 + .../Pods-Runner/Pods-Runner.release.xcconfig | 7 + .../ios/Runner.xcodeproj/project.pbxproj | 485 ++++++++++++++++++ .../contents.xcworkspacedata | 10 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++++ .../contents.xcworkspacedata | 10 + examples/layers/ios/Runner/AppDelegate.h | 6 + examples/layers/ios/Runner/AppDelegate.m | 32 ++ .../AppIcon.appiconset/Contents.json | 116 +++++ .../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 .../Runner/Base.lproj/LaunchScreen.storyboard | 27 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + examples/layers/ios/Runner/Info.plist | 49 ++ examples/layers/ios/Runner/main.m | 10 + examples/layers/pubspec.yaml | 1 + .../layers/rendering/src/sector_layout.dart | 19 +- examples/layers/test/sector_test.dart | 7 +- examples/stocks/android/ic_launcher.zip | Bin 33894 -> 0 bytes examples/stocks/lib/stock_data.dart | 4 +- packages/flutter/lib/src/rendering/error.dart | 4 +- .../flutter/lib/src/widgets/framework.dart | 2 +- packages/flutter_tools/lib/src/ios/mac.dart | 1 + .../src/runner/flutter_command_runner.dart | 6 +- .../app/src/main/AndroidManifest.xml.tmpl | 3 +- 69 files changed, 1813 insertions(+), 51 deletions(-) create mode 100644 examples/layers/.gitignore create mode 100644 examples/layers/android/.gitignore delete mode 100644 examples/layers/android/AndroidManifest.xml create mode 100644 examples/layers/android/app/build.gradle create mode 100644 examples/layers/android/app/src/main/AndroidManifest.xml create mode 100644 examples/layers/android/app/src/main/java/io/flutter/examples/Layers/MainActivity.java create mode 100644 examples/layers/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 examples/layers/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 examples/layers/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 examples/layers/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 examples/layers/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 examples/layers/android/build.gradle create mode 100644 examples/layers/android/gradle.properties create mode 100644 examples/layers/android/settings.gradle create mode 100644 examples/layers/ios/.gitignore create mode 100644 examples/layers/ios/Flutter/AppFrameworkInfo.plist create mode 100644 examples/layers/ios/Flutter/Debug.xcconfig create mode 100644 examples/layers/ios/Flutter/Release.xcconfig create mode 100644 examples/layers/ios/Podfile create mode 100644 examples/layers/ios/Podfile.lock create mode 100644 examples/layers/ios/Pods/Manifest.lock create mode 100644 examples/layers/ios/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 examples/layers/ios/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-Runner.xcscheme create mode 100644 examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown create mode 100644 examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.plist create mode 100644 examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-dummy.m create mode 100644 examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh create mode 100644 examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh create mode 100644 examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig create mode 100644 examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig create mode 100644 examples/layers/ios/Runner.xcodeproj/project.pbxproj create mode 100644 examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/layers/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 examples/layers/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 examples/layers/ios/Runner/AppDelegate.h create mode 100644 examples/layers/ios/Runner/AppDelegate.m create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 examples/layers/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 examples/layers/ios/Runner/Base.lproj/Main.storyboard create mode 100644 examples/layers/ios/Runner/Info.plist create mode 100644 examples/layers/ios/Runner/main.m delete mode 100644 examples/stocks/android/ic_launcher.zip diff --git a/.analysis_options b/.analysis_options index a09839ea2b..c683147f80 100644 --- a/.analysis_options +++ b/.analysis_options @@ -21,6 +21,7 @@ analyzer: language: enableStrictCallChecks: true enableSuperMixins: true + enableAssertInitializer: true strong-mode: implicit-dynamic: false errors: @@ -48,9 +49,9 @@ linter: # === error rules === - avoid_empty_else - avoid_slow_async_io - # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153 - cancel_subscriptions # - close_sinks # https://github.com/flutter/flutter/issues/5789 + # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153 - control_flow_in_finally - empty_statements - hash_and_equals @@ -73,26 +74,29 @@ linter: - await_only_futures - camel_case_types # - constant_identifier_names # https://github.com/dart-lang/linter/issues/204 - - control_flow_in_finally + - empty_catches - empty_constructor_bodies - implementation_imports - library_names - library_prefixes - non_constant_identifier_names - - one_member_abstracts + # - one_member_abstracts # too many false positives # - only_throw_errors # https://github.com/flutter/flutter/issues/5792 # - overridden_fields - package_api_docs - package_prefixed_library_names + # - parameter_assignments # we do this commonly + # - prefer_final_fields # https://github.com/dart-lang/sdk/issues/29197 - prefer_final_locals - prefer_is_not_empty - # - public_member_api_docs + # - public_member_api_docs # this is the only difference from .analysis_options_repo - slash_for_doc_comments - sort_constructors_first - sort_unnamed_constructors_first - super_goes_last # - type_annotate_public_apis # subset of always_specify_types - type_init_formals + # - unawaited_futures # https://github.com/flutter/flutter/issues/5793 - unnecessary_brace_in_string_interp - unnecessary_getters_setters diff --git a/.analysis_options_repo b/.analysis_options_repo index 6de85772ca..919e3ff7f7 100644 --- a/.analysis_options_repo +++ b/.analysis_options_repo @@ -22,13 +22,14 @@ analyzer: language: enableStrictCallChecks: true enableSuperMixins: true + enableAssertInitializer: true strong-mode: implicit-dynamic: false errors: # treat missing required parameters as a warning (not a hint) missing_required_param: warning # treat missing returns as a warning (not a hint) - missing_return: warning + missing_return: warning # allow overriding fields (if they use super, ideally...) strong_mode_invalid_field_override: ignore # allow having TODOs in the code @@ -45,9 +46,10 @@ linter: # === error rules === - avoid_empty_else - # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153 + - avoid_slow_async_io - cancel_subscriptions # - close_sinks # https://github.com/flutter/flutter/issues/5789 + # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153 - control_flow_in_finally - empty_statements - hash_and_equals @@ -70,20 +72,22 @@ linter: - await_only_futures - camel_case_types # - constant_identifier_names # https://github.com/dart-lang/linter/issues/204 - - control_flow_in_finally + - empty_catches - empty_constructor_bodies - implementation_imports - library_names - library_prefixes - non_constant_identifier_names - - one_member_abstracts + # - one_member_abstracts # too many false positives # - only_throw_errors # https://github.com/flutter/flutter/issues/5792 # - overridden_fields - package_api_docs - package_prefixed_library_names + # - parameter_assignments # we do this commonly + # - prefer_final_fields # https://github.com/dart-lang/sdk/issues/29197 - prefer_final_locals - prefer_is_not_empty - - public_member_api_docs + - public_member_api_docs # this is the only difference from .analysis_options - slash_for_doc_comments - sort_constructors_first - sort_unnamed_constructors_first diff --git a/examples/README.md b/examples/README.md index 73005d8e70..e17a8a0acd 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,8 +10,10 @@ the `flutter` tool. **Tip:** To see examples of how to use a specific Flutter framework class, copy and paste a URL with this format in your browser. Replace `foo` with the -classname you are searching for (for example, here's the [query](https://github.com/flutter/flutter/search?q=path%3Aexamples+new+AppBar) for examples of -the [`AppBar`](https://docs.flutter.io/flutter/material/AppBar-class.html) class). +classname you are searching for (for example, here's the +[query](https://github.com/flutter/flutter/search?q=path%3Aexamples+new+AppBar) +for examples of the +[`AppBar`](https://docs.flutter.io/flutter/material/AppBar-class.html) class). ``` https://github.com/flutter/flutter/search?q=path%3Aexamples+new+foo @@ -23,11 +25,12 @@ Available examples include: the text "hello, world." - **Flutter gallery** The [flutter gallery app](flutter_gallery) showcases - Flutter's implementation of [material design](https://material.google.com/). + Flutter's widgets, including its implementation of + [material design](https://material.google.com/). - **Platform Channel** The [platform channel app](platform_channel) demonstrates how to connect a Flutter app to platform-specific APIs. For - documentation, see https://flutter.io/platform-channels/ . + documentation, see . - **Platform Channel Swift** The [platform channel swift app](platform_channel_swift) is the same as [platform @@ -38,6 +41,7 @@ Available examples include: embed Flutter within an iOS or Android app. - **Layers** The [layers vignettes](layers) show how to use the various layers - in the Flutter framework. There is no main.dart in this directory because each - file is a standalone example. To run a particular file, use - `flutter run -t filename.dart`. + in the Flutter framework. For details, see the [layers README](layers/README). + +- **Stocks** The [stocks](stocks) demo shows how one might structure + an application with several screens. diff --git a/examples/layers/.gitignore b/examples/layers/.gitignore new file mode 100644 index 0000000000..eb15c3d27c --- /dev/null +++ b/examples/layers/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +.atom/ +.idea +.packages +.pub/ +build/ +ios/.generated/ +packages +pubspec.lock +.flutter-plugins diff --git a/examples/layers/README.md b/examples/layers/README.md index 04c1d0897e..76eae5ec3e 100644 --- a/examples/layers/README.md +++ b/examples/layers/README.md @@ -18,8 +18,11 @@ Flutter's layered architecture. * [*services/*](services/) These examples use services available in Flutter to interact with the host platform. -To run each example, use the `-t` argument to the `flutter` tool: +To run each example, specify the demo file on the `flutter run` +command line, for example: ``` -flutter run -t widgets/spinning_square.dart +flutter run raw/spinning_square.dart +flutter run rendering/spinning_square.dart +flutter run widgets/spinning_square.dart ``` diff --git a/examples/layers/android/.gitignore b/examples/layers/android/.gitignore new file mode 100644 index 0000000000..5c4ef82869 --- /dev/null +++ b/examples/layers/android/.gitignore @@ -0,0 +1,12 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures + +/gradle +/gradlew +/gradlew.bat diff --git a/examples/layers/android/AndroidManifest.xml b/examples/layers/android/AndroidManifest.xml deleted file mode 100644 index 6cdd1a9854..0000000000 --- a/examples/layers/android/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/examples/layers/android/app/build.gradle b/examples/layers/android/app/build.gradle new file mode 100644 index 0000000000..4e2e46b56c --- /dev/null +++ b/examples/layers/android/app/build.gradle @@ -0,0 +1,46 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withInputStream { stream -> + localProperties.load(stream) + } +} + +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.") +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 25 + buildToolsVersion '25.0.2' + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + 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 { + androidTestCompile 'com.android.support:support-annotations:25.0.0' + androidTestCompile 'com.android.support.test:runner:0.5' + androidTestCompile 'com.android.support.test:rules:0.5' +} diff --git a/examples/layers/android/app/src/main/AndroidManifest.xml b/examples/layers/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..c4c3bc15c3 --- /dev/null +++ b/examples/layers/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/examples/layers/android/app/src/main/java/io/flutter/examples/Layers/MainActivity.java b/examples/layers/android/app/src/main/java/io/flutter/examples/Layers/MainActivity.java new file mode 100644 index 0000000000..22499ecc86 --- /dev/null +++ b/examples/layers/android/app/src/main/java/io/flutter/examples/Layers/MainActivity.java @@ -0,0 +1,12 @@ +package io.flutter.examples.Layers; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; + +public class MainActivity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } +} + diff --git a/examples/layers/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/layers/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!ia0y~yVDJE84rT@hh9qO>QU(SF$r9IylHmNblJdl&R0hYC z{G?O`&)mfH)S%SFl*+=BsWuD@4C?}XLR=Xb7#RJ!7{h04Zu=H;^aq4w44VZJaXaum zG@>0o`I5 z6U6gpN>(hBs@ovlyiK}omrVN}&28UY_JdsVcA=Cl0|SF_NswPKgMfg5KtMnO2sE4r zf%}pIPku2lFue41aSVw#{PxUsz9t6&hrp0GdlTMw^~h@f`fs1s!olsWbZ#C0v7PJ9 zExVjNeb(Ol`RU07XFf|X@qSK7qke0_C&kUH>MnD(8u-mi5B zt(&|xZ@%@sBNk%nt_5+E&U1QAlyT>>sMB2Zd5T5*R3&Sld5=98o%0qdm+@@-JjKB8 z(xcUiGOB?O=e)LCdt!o~wXBiQlFwyn4J{(JaZG%Q-e|yQz{EjrrIztFmwg@gt#&=FffMC4mtWmbKAF&qdyqKXG0ipk&vT5 zAmZ%d{SXF=bCKq@Z-GZZ;tV#~j83JDzFmxd-Hahq8AGNqhE8V;o5>h9i!po_WB6=l zU2kT?Kvt(bR^JA;;7+;DUGlvL6sMk6nsrHO&Q;BA-wby`jSBSdXJueu5G@Jv3uX`y zP*5;1FzBB@fBpXR=g+?ff&5MV!VC-yOFdm2Lp+YZy>e2h$w0vMVh8iNMNLhM)++IJ z{QqCg*LgRGXKpKZaOLSMJFo8MNc{figWv3mbJp+w-BoBm(|-hT|4dcbJ2lEyX!??Y`jpZ81*D{;rF6b`?;0>>pbJRKPRw2)?8wK8GH9> zL)n=k&vkA#ITl(SSsBW`??>AG{pM|AK2Jc#t6>y4N#$)H8ZEGkUc!`m{6pbTImMF#2{f z`gJk-_b~?aGX_m$44TXsJQ-wH$W+GA>5O4B7{g{VhRtFOpT!tHo5?tW$tsn}K99+{ zjLE&4*|Uz>tC88eNi3sZJbQ{n(LBkDd1t=Sn-plsE283-d*czTa-zm@iQD#kujt@|Kvt4hp|H z71QJA-@DE-vCc=}m3vdfeqD}l&W>B;IduNM%M_}RPx;yPVrk2E_T?&?d+vqXsA}xF zGk52_Ny78;-$vOoENNLjTll#WOG?YLuZ?eO;uVxk)@?h*_~6>qo(~l}_f@BaD>p=c zm>yaWRpaQm|`^KGX?!;c=*_;KycpYksb1 rdBk${xlomwC<})`ozHbP0l+XkKcl<5t literal 0 HcmV?d00001 diff --git a/examples/layers/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/layers/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!ia0y~yV3+{H9Lx+13>Rhybuln7NS3%plmzFem6RtIr7}3C z$Dctjh(SM?K|h4SAdJB{hQT_6!9JhSFr3jep3y9U z(L9OKDxJ|flhG!d(I$t{HiywRm(ebd(Y}z;v6#`Zgwd&#(Yb=rrHawDn$fL>(XE!z zt&Y*Xj?trm(W8;kvysuWiP5u}(X)lotC`WOh0&*-(Wisaw}a8QlhLo6(XWTmzlYJk zmocD^F|eO8Z~|lCM8?2Lj6o9_gC>F8A3T{ccnV|4RK}2LjG@yRLuW9C&0q|h$rv_^ zF?<$d_-uBwU=HgjPRC?Uw`?x2A}+rQ?!a2^kVfvX7VhwN?#NE=s4niP9-inPl?69d z7T#1{bVqf`J=LWT)RsR~Tk%+JQT9|ZQFKYxDR#LKT37?|`uT^vIyZoR#b9vmDf()v(?iz7_L)oF78 zkJJ<)r8pUt8M$!5-N#*39u$gn zR>-(G$wg0`aolam=a?PG9$oC(GH>-!X0d*^l*gJvuFJp95x7~EvFLL3EEhhxt`pq; z%_lBC*86lUSiR`uj?O)w{s`}^n&Wz}@?RH+ochG+^SU~oY!t72t=ZWjXFc({Ty9i< zoXX3Kohi2Ju9xPeP296QFr{gETuR&Xh?K77YDUL{MQ1+I?2fS6ciP3jaR24wmqlki zKfgU-wdbO}>o1>vX;$n~9ltDoY4ItEi|?MFbkSNqMRUkMU-}~Bs z)+NdNzgg`VE)XKX=tVT|2z5{L4{YJjHWS*rIm-E6Ws`IFvdRnm87H fR&jd1QhDAN-h`R^uRUjAU|{fc^>bP0l+XkKAv&s= literal 0 HcmV?d00001 diff --git a/examples/layers/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/layers/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Lx+145>_WOc@v$BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFy0FA32|j$U7=vLLgJC#>aTJ4T9D`W`gLwjjbtZ#N4x^eAqnb0LmM5cOIHO54qe%>- zNi3sjJfm3xqeU{KMGB*38lzP@qg4i@bta=t7NczrqirsuT`r?t9;018qkTT3eF39G z5u;-~4uK+6lW`UY0|SF-NswPKgMfko7&thbzyBTz-gcI+Wnf^o^K@|x zskrs_3VX0{ph#Pyi^G})N%|2R%{L?-ZV(U%Y+lqcfu(WAio}U)uIrV(+3WUaecD+A zmQ6SJem|Gdo_Kp z-*x@+`J3Y19B#kQTkx(t_`-K<>p6dn#rh_GuokuWC9d+nXX1zFdIcZVw{qEhc&=6O z^|eUFqwV?=KCBk6c(Pr4!l%_@70=G=P581}wBp75D22D-njfy%?{qk*AOB#Z{bq-g z`q2+|)-Q6ns2@Io{eMN{rubzF`u|EA+wSjG@UL6#aQc1N1oQe;4(H#;OmN?SS>~@F ztIeOC+&g|0i+=ccTfE@YZP5>((!~ot`|Cb zb^PFdrt-VXypJEaJ95?T2$v)Ws{O#V4Ednvz`|Pb} zf4VOe!@bWom-}e`tT2YtP3!%mny=z+}-K6mV2ZEt5Icwo(g z%Zr!wX>UAuh9QhqUj7<;)5IBxDQpH>KRz6|eoM6P*rQ_`EdPlXYgN?$U-3W2|NYf9 z3~H?J-^u1!lq%j3KgpL6_~F~TxcJXA&m~w0?N0Rh)m167XXobE9?sqiHmlnth&$|i z@b&H6->;epMCgPeb()B(Tr|RH~O+1PwlVxdT!ROU2OGQ3PvhLeQAwP zO|AMWqpQ}lM;-?Ix_3Z(ZoZK*%HiZ|EUDeVf^rGH<21r@EM zSf|zZ`p5aNP1ut4@|gFs0GYW>Kcl68^QPJ_Y plugins.load(stream) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/examples/layers/ios/.gitignore b/examples/layers/ios/.gitignore new file mode 100644 index 0000000000..d0a7d98562 --- /dev/null +++ b/examples/layers/ios/.gitignore @@ -0,0 +1,37 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/app.flx +/Flutter/app.zip +/Flutter/App.framework +/Flutter/Flutter.framework +/Flutter/Generated.xcconfig +/ServiceDefinitions.json diff --git a/examples/layers/ios/Flutter/AppFrameworkInfo.plist b/examples/layers/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000000..6c2de8086b --- /dev/null +++ b/examples/layers/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + UIRequiredDeviceCapabilities + + arm64 + + MinimumOSVersion + 8.0 + + diff --git a/examples/layers/ios/Flutter/Debug.xcconfig b/examples/layers/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000000..9803018ca7 --- /dev/null +++ b/examples/layers/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Generated.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/examples/layers/ios/Flutter/Release.xcconfig b/examples/layers/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000000..a4a8c604e1 --- /dev/null +++ b/examples/layers/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Generated.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/examples/layers/ios/Podfile b/examples/layers/ios/Podfile new file mode 100644 index 0000000000..74b3de0649 --- /dev/null +++ b/examples/layers/ios/Podfile @@ -0,0 +1,38 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +if ENV['FLUTTER_FRAMEWORK_DIR'] == nil + abort('Please set FLUTTER_FRAMEWORK_DIR to the directory containing Flutter.framework') +end + +target 'Runner' do + use_frameworks! + + # Pods for Runner + + # Flutter Pods + pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR'] + + if File.exists? '../.flutter-plugins' + flutter_root = File.expand_path('..') + File.foreach('../.flutter-plugins') { |line| + plugin = line.split(pattern='=') + if plugin.length == 2 + name = plugin[0].strip() + path = plugin[1].strip() + resolved_path = File.expand_path("#{path}/ios", flutter_root) + pod name, :path => resolved_path + else + puts "Invalid plugin specification: #{line}" + end + } + 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/examples/layers/ios/Podfile.lock b/examples/layers/ios/Podfile.lock new file mode 100644 index 0000000000..5f093f33bb --- /dev/null +++ b/examples/layers/ios/Podfile.lock @@ -0,0 +1,3 @@ +PODFILE CHECKSUM: fe68fbd35e5bc75c5acdec41319edc0cdaebd038 + +COCOAPODS: 1.0.1 diff --git a/examples/layers/ios/Pods/Manifest.lock b/examples/layers/ios/Pods/Manifest.lock new file mode 100644 index 0000000000..5f093f33bb --- /dev/null +++ b/examples/layers/ios/Pods/Manifest.lock @@ -0,0 +1,3 @@ +PODFILE CHECKSUM: fe68fbd35e5bc75c5acdec41319edc0cdaebd038 + +COCOAPODS: 1.0.1 diff --git a/examples/layers/ios/Pods/Pods.xcodeproj/project.pbxproj b/examples/layers/ios/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..e0f3f551fd --- /dev/null +++ b/examples/layers/ios/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,297 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 08F011DBD88D0920DE96F3C5A69A26E8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */; }; + D3926DFAF385F0A3878A1536D134FB40 /* Pods-Runner-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 468664057D17C890473F3825BE8B6822 /* Pods-Runner-dummy.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 027D05C3C28CE1BD46A8707666A9C5F8 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 14E58FE88BDE74696DA18D71709505C9 /* Pods-Runner-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Runner-acknowledgements.plist"; sourceTree = ""; }; + 1B4CEFB7A7C39037B5DFAFCE375062E1 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 468664057D17C890473F3825BE8B6822 /* Pods-Runner-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Runner-dummy.m"; sourceTree = ""; }; + 5C42D986846F74B4DB78535F7182D117 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7AD2F72BE79A2D928E85F9EB9FB613FA /* Pods-Runner-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Runner-acknowledgements.markdown"; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + A1153EC5FE504BE5C724E20E9B411E90 /* Pods-Runner-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Runner-frameworks.sh"; sourceTree = ""; }; + A84633CB40E489EF4DD77D43434D3024 /* Pods-Runner-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Runner-resources.sh"; sourceTree = ""; }; + CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 08266C2F1E6679346D9D748BD3A7915D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 08F011DBD88D0920DE96F3C5A69A26E8 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1C79DB53CD07E661221493B5C6E0CF0B /* Pods-Runner */ = { + isa = PBXGroup; + children = ( + 7AD2F72BE79A2D928E85F9EB9FB613FA /* Pods-Runner-acknowledgements.markdown */, + 14E58FE88BDE74696DA18D71709505C9 /* Pods-Runner-acknowledgements.plist */, + 468664057D17C890473F3825BE8B6822 /* Pods-Runner-dummy.m */, + A1153EC5FE504BE5C724E20E9B411E90 /* Pods-Runner-frameworks.sh */, + A84633CB40E489EF4DD77D43434D3024 /* Pods-Runner-resources.sh */, + 1B4CEFB7A7C39037B5DFAFCE375062E1 /* Pods-Runner.debug.xcconfig */, + 5C42D986846F74B4DB78535F7182D117 /* Pods-Runner.release.xcconfig */, + ); + name = "Pods-Runner"; + path = "Target Support Files/Pods-Runner"; + sourceTree = ""; + }; + 3DCAB2B7CDE207B3958B6CB957FCC758 /* iOS */ = { + isa = PBXGroup; + children = ( + CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 6276BDF4AEEBE7163429CDB73B6980D7 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 1C79DB53CD07E661221493B5C6E0CF0B /* Pods-Runner */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, + 9A3A7EACADA9417D2516CD83C5B1027A /* Products */, + 6276BDF4AEEBE7163429CDB73B6980D7 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 9A3A7EACADA9417D2516CD83C5B1027A /* Products */ = { + isa = PBXGroup; + children = ( + 027D05C3C28CE1BD46A8707666A9C5F8 /* libPods-Runner.a */, + ); + name = Products; + sourceTree = ""; + }; + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3DCAB2B7CDE207B3958B6CB957FCC758 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B0B211B0FA111CE20F29C3A6B3CED356 /* Pods-Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBD992B4B5EA046F3BF6DB62624D0AF0 /* Build configuration list for PBXNativeTarget "Pods-Runner" */; + buildPhases = ( + 83AF969EC59378C6BB28D1C7AFE23E7D /* Sources */, + 08266C2F1E6679346D9D748BD3A7915D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-Runner"; + productName = "Pods-Runner"; + productReference = 027D05C3C28CE1BD46A8707666A9C5F8 /* libPods-Runner.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 9A3A7EACADA9417D2516CD83C5B1027A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B0B211B0FA111CE20F29C3A6B3CED356 /* Pods-Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 83AF969EC59378C6BB28D1C7AFE23E7D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D3926DFAF385F0A3878A1536D134FB40 /* Pods-Runner-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 309EF1F5E327BE758428CD2A22E8B8BD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1B4CEFB7A7C39037B5DFAFCE375062E1 /* Pods-Runner.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 3FA451D268613890FA8A5A03801E11D5 /* 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_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5E62115DE8C09934BF8D2FE5D15FED1E /* 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_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + A73609B65BD0880FA9B2FE021CB0D23D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5C42D986846F74B4DB78535F7182D117 /* Pods-Runner.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5E62115DE8C09934BF8D2FE5D15FED1E /* Debug */, + 3FA451D268613890FA8A5A03801E11D5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBD992B4B5EA046F3BF6DB62624D0AF0 /* Build configuration list for PBXNativeTarget "Pods-Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 309EF1F5E327BE758428CD2A22E8B8BD /* Debug */, + A73609B65BD0880FA9B2FE021CB0D23D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/examples/layers/ios/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-Runner.xcscheme b/examples/layers/ios/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-Runner.xcscheme new file mode 100644 index 0000000000..df28494a58 --- /dev/null +++ b/examples/layers/ios/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-Runner.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown new file mode 100644 index 0000000000..102af75385 --- /dev/null +++ b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.plist b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.plist new file mode 100644 index 0000000000..7acbad1eab --- /dev/null +++ b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-dummy.m b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-dummy.m new file mode 100644 index 0000000000..0b73bc1cb2 --- /dev/null +++ b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Runner : NSObject +@end +@implementation PodsDummy_Pods_Runner +@end diff --git a/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh new file mode 100644 index 0000000000..893c16a631 --- /dev/null +++ b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh @@ -0,0 +1,84 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + diff --git a/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh new file mode 100644 index 0000000000..0a1561528c --- /dev/null +++ b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh @@ -0,0 +1,102 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig new file mode 100644 index 0000000000..f1c5b33231 --- /dev/null +++ b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig @@ -0,0 +1,7 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = $(inherited) -ObjC +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig new file mode 100644 index 0000000000..f1c5b33231 --- /dev/null +++ b/examples/layers/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig @@ -0,0 +1,7 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = $(inherited) -ObjC +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/examples/layers/ios/Runner.xcodeproj/project.pbxproj b/examples/layers/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..ec0f0da000 --- /dev/null +++ b/examples/layers/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,485 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 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, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; + 9740EEBB1CF902C7004384FC /* app.flx in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB71CF902C7004384FC /* app.flx */; }; + 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 */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B1F3D14E8117A6C9F65810E0 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D558BB7489B1C82B42A9097 /* libPods-Runner.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 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 = ""; }; + 4D558BB7489B1C82B42A9097 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; + 9740EEB71CF902C7004384FC /* app.flx */ = {isa = PBXFileReference; lastKnownFileType = file; name = app.flx; path = Flutter/app.flx; 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 = ""; }; + 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + B1F3D14E8117A6C9F65810E0 /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { + isa = PBXGroup; + children = ( + ); + name = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 9740EEB71CF902C7004384FC /* app.flx */, + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 840012C8B5EDBCF56B0E4AC1 /* Pods */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4D558BB7489B1C82B42A9097 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */, + 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + 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 = 0830; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + 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 = ( + 9740EEBB1CF902C7004384FC /* app.flx in Resources */, + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; + }; + 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 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"; + }; + AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.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 */ + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + 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_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; + 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; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ARCHS = arm64; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + 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 = io.flutter.examples.Layers; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ARCHS = arm64; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + 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 = io.flutter.examples.Layers; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..21a3cc14c7 --- /dev/null +++ b/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/layers/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/layers/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000000..1c95807881 --- /dev/null +++ b/examples/layers/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/layers/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/layers/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..21a3cc14c7 --- /dev/null +++ b/examples/layers/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/layers/ios/Runner/AppDelegate.h b/examples/layers/ios/Runner/AppDelegate.h new file mode 100644 index 0000000000..cf210d213f --- /dev/null +++ b/examples/layers/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/examples/layers/ios/Runner/AppDelegate.m b/examples/layers/ios/Runner/AppDelegate.m new file mode 100644 index 0000000000..4b3623eb8b --- /dev/null +++ b/examples/layers/ios/Runner/AppDelegate.m @@ -0,0 +1,32 @@ +#include "AppDelegate.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..d22f10b2ab --- /dev/null +++ b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4mJh`hTcwDUIqpR#^NA%Cx&(BWL`2bFuwD2 zaSX8#TsvjAw@jeOvGY5>_q|>h+1u6fBdexi<)tM8-3iJOH-6e{csS^|t`^`h%M4z^ zvrUsp%yCUni-1dr!HteCeu1-6sf(@4&z-gOX8TrnJhnM~hPD2_`!&xEoBNpM46ZP5 z>RM6Fs4Du%wQt&V4?nF#Au;N4dCxlREhFOs+Q*8UNIXwA$#oIyO8|+tqV&R#9*$ zUnSd|Hw&5HJe-|^3yuFWnr2?uxcNuK(*U^*-n;k6AAGamV&=3x zQTjVJM+cmBEL?H-jDy2s*;QO>QThRLANE|lxz@Sy?+%4F#V^}4%*``0mhkR1xTsnd zsl4K{bVpgeu!#g~y%YEC?D&;me>Lr&{KSK$>&ee#llSpUG=!hMOnEB&rtbEo$NBpo ze0#XwfU{CPz~%7UQ+uQ}ChR*S%%W*wac<_u>)Jc^mA`9MySCxd!B^Kd#zy?>WBq3t zA?x*4_ W$LnK$#EXG}fx*+&&t;ucLK6TGg!*^@ literal 0 HcmV?d00001 diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccbfd967d9697cd4b83225558af2911e9571c9b GIT binary patch literal 1283 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2y{PIR?dBvs;g z{d;TUyFpPJ%eF4Kv7n|^zp=ULn1t;EM$XP7lUeld*iOAGhrAO=?vmAmpTR*XMV$8#$?-Y`cDL-1XCS@pJejB8Rvppy6eq7etCUAujg?qj6J!e{Uv#AAYb{|~a_aH522J@Q@fi&BOpfuWHHbGp zf5x@0=W&%z;t#%xYZ_i1#tsY?XV=JR1*ru$Xe%q8GYMi`*I43cb15zIa$ef*g)OP` zxn+8uo27Eb>{9r}R#PV@sJksCu`zk^$I#qqi)ZJWE@$GC^4#7iY9ct-)8d8n31bVb zX;lK#VjdrPy!sZ;@og0)Rhw5$KOp&F-NcXuofoDxM?Z25Q1Tbd+xYNCT0eV~Php(s zr(KmiUp+T6+&?C9dbVk>SLWbgX@7~0v#&fvx}_S)%a@u$R+v$Lgb zcLiOYf4R$3h^y$~8P-z=e?C;X^D^2|@K|_BOOua4qui|r8!K13nyLg|73lxrZXr*ju;F zgx|erIDfsIxhjhHXMvIP?8enx7P6mu>*fc1c=y;ahGSjp;lGuBcQh{SzH#ApT49dK z`Ang8Y6pT&Jlr#3(Hn0W*>~S9f3}}*)^yfuapkkQmiJL7h52FRWrLWr4F+59@QKX* z&iiA|j)#}$b~)uf+UVL>vE{JpQwhGc;jIHlKqXlCF80s&R_HEmS6Euygc@5k7ASXhVP2g(|73{u6(F=?yx`%zx0!xh0k=> z@2~H(ejI6YT%e^_^d0ZiKSyPK{bY7bNiOgy*`?Sx*{Rj0zP_&O%zjCcZ5wK1&7b$b zS-4u+Re)>xxmODx+IoKSah(vkF4bmQOJ?4@n*L71#9h^eYmdsG-&9-ce|Um#?yRl} zHz)kP-&6SUG5^IIEML~BMqVrRQjA}+dhu305AQAA`6pzU9W{1E>(0+>-l`ogtQT#4 zv{I4dqgB+-Pp<{^Wvq|eKaP}%{%owt&7)o~)wHF}A<4B|UA%w)kz-Te{&=aQJFhvL zcU`h$Qee7tc-{WP?;gh+O*;8F!nyTEd4_zXS=)6n^)GSALu(@ zFj_mOP`4*Na%-LC^ZU2XzIy6y&|qkMNLIl0d(*@(Mjs@LFW7h~w7dO(eCMgX;W}ey z)$1FVT(;b{_T{serM4|X+iVsv?@3bGd0_hizGsX6s!a`EBIo^}j%A+F$3@YdzmBZj z*|cUF%e7fvr+yyrOFrYjRQJK&Nt+6#ztwGP_&n*`Q6J-9SNuJG)iEwe+w485%%@SC z)0^p~ht+}=x9!*b3^nYjoiqK*szo(3n7-R@emEuiR&Q1|0|Nttr>mdKI;Vst04OMA Ap8x;= literal 0 HcmV?d00001 diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4mJh`2CF|eix?PKe|x$(hGg8kJ3Br{#8u|_ z_r9dgjs8-qSv*|RE-Crj{anx)sHw2EzMm;qaVooM=);5T@;xrShAOR6jo*@1hGhwO z*Bn?RA+_;(9Jkc0h_1C6OiM+)8lAkW@7{ZN=luOQXSY;ezx(#?+xhn_PnvIj`}XeJ z^!>*B=l;CgqmUuO5V6FnP9n7P7vI(PUCpz+gzmb2UA)izt%L5>BmwRAzjvSyiSyI*IpJk#T4b1F!2XiIK3GC99kKERz# z#llXd+2zr$^&!bCj%$9Ht@T@0)2LZ?29M*>nVA(Yw`)dRH)Gvt71bSeUv1N8mlwNS z4~cv<&5bGxdhmFUwk2P6nbfCSt~c(e9$MyCd+~brAEhae3h!HZF0uY#ctl^M;=oEh z(YHFSOC65Z)mDD^`iD=@>%)&j5}iNhupByS+SuzUe&ptiL~GxJZZT~WzMM zs3oO+Z-U~Qw+BwLWovJkY4`eL^zEKpb~Dihf4*5{OBWa&j^dNy)Yi)|*(PgYMMC%(TgB=f_)>F?(i-{Lt}{cgTc64|8SnG>gdgv-0M z(1s<|VnxMTTb{`)Ht(^kpRVzIUFuFP+oy}nez;V8{4%BJUwpF4!=7ZH11hhWxUG8{ zA2;g0;CQ~u#_FdI|LM$&=U4x!m1<*B4F0*|#%z<{ZT|`v#dz%F+j3FFpSx_|G^hRD zW%J)k7_+H6FI!yg@DykaiKnaiTRan`fRnej^uRO`~` zZcTY`aN)}6R;!CM4$pJE5o*tx@U-)Q&jsxwiEEP794E+$s2TE$tVcc1Hf{mdn7 z8>DtsPdQ-Bv3rs0ZqMKwZ-R|d*iW(@%W-2Az}rFP|(+}bujN=5dCfllL@XNex?Z}U36Q-AR7O5^Gy z+?mm@1b6B25oJSg3m9 zMild*)AOC8jwTjNm7B#Z%@~`p_p(StiPChHi3NR!uAB2nKJDc?v*_&CT?fn@g}G`% zlc!`Tn<#uKJ+Z*R_1=vIXU+4^nK?E3H#MK0_T%Wb@BHT-?zi_ZIV!PG{PF$b7V{L( zNah{gdpB&^Bv`esXVdfAn12GtDrPagf7I{4JZP!Rt@aE20WV798$P_M6EKs|c+bGG zzGhv+_IdI_L4Jh}#oNAXeh^+!{ounTXTG=lE0|a9v8#B#+HXbHhwN9mVf%02V9md> z?clp-#R^_UYqURFgfncNvwr)U=hq*m1lgQRoB3gH>eoa*@9F&d$>k1g?bp48c~Y*t ztx!2`H}}!TOsTC+n^uW;>_6(qb?E={f@!f;s~^1%QD63HRmIn=A8nSua&8CSRP@!*%Y!T_y$w1_n=8 KKbLh*2~7ZftovC2 literal 0 HcmV?d00001 diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cde12118dda48d71e01fcb589a74d069c5d7cb5 GIT binary patch literal 1025 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 Ap8x;= literal 0 HcmV?d00001 diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmeAS@N?(olHy`uVBq!ia0y~yU~)otvE_5-M^$ zy=;4+y##NUoACZA5?oDz`+qblXmRL1y?9C8EqRfOi*S;OA)9MpN9Q7;B^Q`-mA!l# zG8SwJ;9j`RW|abC;DRX*8(A||FKN6zWS925;@!DBPv4bHpL=)i@w+$op4@NkTb@>3 z|J(linLB%{-2{Y87z(oM>P5CnY-KH#F>R1?s|-|@R9gSbo_~?wf_=_=`=si3?^C~8 zkUr6tA#eJks4L=SS;_^`fub7XtsW67+~<$x_`CmIRJl;VD@gt+51U%{uS46CR~(A) zDLHu9oj=R8*uit^n*{b#KK7Z>?Yo@CUD)nPgzP?+d-K|jI(aACg6NJX{I7PHyZQ1h zVO6-U(HvZ;c&VlFlym8`2S-~yiVn_QEW~|w+m9V)?D~pFeys?WVY~PFm2i_~SfO-k zuuS6ezFL*X|IVdE+qswClvp}5;)Gz8M_OM`>yE&AoF6PQr(8V!M&ib~In0IERYdP? zTqv;S72kpI=S&-xsasyGwLALv_uir>OY~hEQm(HnP&z0t98ecG*ZraFPO+v*&2}1Z zz8uU62^5-D>u_<)x7i!^#v3V3d0Fv;h4F{k`iIi2?-LB=nUT%0F>TIAne5fU?6W{@3BHT90nr4PUb2u~flSrzmO0ioTtEPp(yJ9=1-f zu$dNW&sZ^6y`jzOyi7&TXKtI;JT{B`5Mde4^_Qh8?l3&DN&LWTAbfb5bc5tHgC9&Y zUY^@5ny^fbM~@+`=+Fk)1;K}|i8c6nNNi&)S@c@Tjg zByt|eDV(RtFn6AT59U*3OT~Y-6zBGqEewVe4Um)_2T~osNf#@=h^;&J8d*am6J%lo)Cmc!+R_dsFD9Gyk z((*i4Mcce%Dor!a%y75b^+@FYIpe1;R&p-3A6^ux+vn}6z9i2UaMaQ!Snuf;fv+vP zZxa|E?k&5*&Tn2R`0cDgk5S*lnPxLDn5}S7d7!m>QoH%iuWUW{Ynju^UbJVh+XOG) zyh6C!>g(ZZk5===`P1ICYgj{P1T; zHve|uS)cK#&T@k%bNHuz@pH&|&wogH_nyRtDn+p^JcpBir%HU!)!*T@pXK@=sT;qF z*BhyLEPTUo!s*T}cLl8iwO1|E|DRZvolX#Od7rB& zW}>{Otl`hu=Lc=mRXJ3%9oMX5H$N4+lk-SWwc@R9N5c7!aO_!MeZaO@lcU&`>$hShMQ7 z!=407m)rZF2?!^3bFF`9vSYpu`@@&63SxTfh4-E-OuO#(AaJMnt>-R!`!a-CH)gV^ zl`{0Kw5c~rqikGW87*ZLA(tNw=UjwbQOj9`o6&!PIPi+FD9c^A~5!|Fo{#3VQ*pD+&9fD%C_a*mlSxm)}MFL&d%0NyPO!dT{;~) zZ;pp`^mcRJj%TgLwjS(^KkWJ$7Av&Pjo_Bs^XtQ&8ys>a)8n2#{QUVuU8?lM-^$`s z?=82lb&jlcVz6VC5x>K^$#2eXJD#8!@vCjrglgkF=Wfam z{A**jbX+&sXWE?{(>M82vAnLswwATB72>b_cZ3E{IqhcU=deuq=8Q+l;Q{5%QNKE; z?O%OG;M~?9@2Xp`&AfU|;Lg0}83J*iS4dsXl9-%Q#J|d#-B54O=M}$0!q!!Y)_e|} z{$gcBUo4B<%Br{tD<-Xxce9~`g`c)#G7fy|MT zcdriIyVw}=TlMLr{R~UnUYMTvGh1+i-2|rFPxdkDFZguhpW36(_7f6{FJ*WbGD-xb9H zQ`Z&hNjwf%bYk`nfv*x-##+2ur+Rr-F>jS9J?W4vCvt;J=~sottEiCZiRM|0e!ZA@ zB1lWKZq1#GeX}~PF4+ES+$AROzceq^@m|KX=9P=~BplehuJ8|2sQirCp0W#$3kR$( zQrG)>GWemtLHXv0ZmX&3k3`p;v(v4Z({yX$0XM!~lXuSCpt+l|_~6{rb9Gi9v)=UJ z?jM2h>81Jw)3vT2TjytdVfE=EqwwPC7sZW2K8x%&c=2(k;@RnzJ3hziFHzbzL0&fG z@zJGEGh_CKo)cyMRLbnPFk<7f;DvYZD7A7KW)<vUw(YGZOh+Zo6XV_`V(6Ng>KwB+RdYvy-w(1g87|~7C(-}Ud{ctnlHXQDO>8@ zKNDu#n-^Z$S|44%V!zOV#git@s@&ntd54!T=8@5U*9U$FuJ7l5SQflvndqzeUP(HP zHrAYXi|u#l9z3|VS4{8xr+AhR-kX@;O`rC(be(j8Fyo(%XTF*zo-1AcBHtvcM|Jjl z^=mux4pehKc&Ac&`k?joE~&hO1{p@@YTvfDOt`e^?VW2kEVjpIoZ1;=74CN+@lfyX z;-$=M=4cx}c=5n#%|kE78Tl(jVooxsmk26LHXOcVA+Yk97h}ZLm`+CZjMMs+4WVbJ zN)$Ai^F3h)=}LGS)5*B{se32mYF+zIM(yWbJQ2A+J$WK5!;=nV{R~VxkagNW=|GmC zGnBRJ8B7Jp$kn~f5KR{E&ZWNB=ka8>cz3#gTG0l3?U2GdpOW{hPdB@@=XT5a?=vn4 zPT2OwbYboEnbrA+nEQ4Y-+cdFO6<(NIgRy?KCizqqwOSPM~q+Qm))8XpL!GH1f(KI=yYqK__b;w^8!Q^4$h@yO9)YZ>w1 zoHx1e)Vg_`%k7lQd*Cb988UzWgxbQq)ql?Mrp`(!n((~DV(zNxjbB5Gg`eHIAZB%g zp}KU_@-1_G=M_80uF@&llxSV4G2yjK!)+n^9Sif!KKRLTrRbki4UgFWcruTVm&Tn7 z+qv6crRbk~dnO{_>a3=T`Co5!^Ew`i6%5|7kXi59lOWTb*Oc#^d~xe>{QJhu_ujMy zp4F^Q)$}~q%d_G3$>MH{o#)th99O)v`Ql!d51HA2TXneZoL~@tz3!&Ssna1R8fTw6 zX#3gMoppl!2fp$-3I)onF+4_@ZE9P8J&s|!?th|iF4s}94bn!8)xXvMS(ZDT5L*5; zg7MjO)6VSOn_5e6tuFrCptGnrnRQ0{o4Pmc#d{sZuI}8(eC9wDqvdv)6H3aL-;`EOW7hiW#n;1k*gUy>{o8?^uX!T=?!A2Yd*q|~{3wY7)`q5&ty|>YZ?2ws zF5^{Ou^EHRrUcnD6;DE|XQf4nMNC`D&^~q1N!~dpt-fx|{?qF7ps$Ai!Hf3j1xbIJ z7xcz6UG2Vpv%$4pCuXwizO^sapV-{_?y$Rt@x@jD!yPZrH<=Y$UI{oM#=4fFon_~3 zb@k^D?6$~lsXybqW3|KjTDGekhu1$;bUt^MYlFgs;)4Hod2Y?9cHF;;@yo2`0lj7k zOjRtcF}emRiuy0#o5tQQh!%LqoZnpbQs=^Q9mc<}MEjaKAIx%l^~5IS-btmaDT(=~ zCKem<|9q=>Aoc>wt=8=gabG!J1kZP2*I(W+UytEUTMp;5l!f`LjYHIL7ZhrhT-o!# zx$GX#h2wYme?4)1@!+V)2QR(?#V0ksd19wd9=b1~{XXS%Ta6FriFA`v%Yx^7m~PFS z>?q&7veJfW-WP)x;dYF_wk(~oOf!Km$MA&G)fCOV-0k-2&mY|TZj_-2P`H72`$mjF^fLG)?oM0F@0Y2|2@jP76kIeOw2N3yrZt3 z!o4dt8r=?=56FetC9KInPa)hb0_t7Ma?^$C^&eGiG83E!9c?nt>O)w1VK*_`-< z@8+#t+$l^y%75LMBvy2)Kq1_eh0StVx8hxv0(NPB&AB;ZjW)IwCj|3NH%-n{Z}{*2 z|04S&w-CR+g4GjemdY~P#FrgVohwt}+qY(SnvT4B!|_v5&5K)PK87hF>>eQP#6C|lHb#p6Nq|4Z>Hii{W6t39^axv8#{#GM)t4GZ*I3*O*2}Xpto+xaqG!1l1|?F z&2WCo`op3t1XrA&e68T*1-}6H`gW@so35DJS%~*9@;{-L7^mah`tZ*0?{)7=9n*NP z+kW9}liGiSJ$cK7^avx16Z)Db4jqU+eB-P4SyzV1RWY4XeO2y`eYSVZcJ&2rjNc*i zgo|sI$eXlxtf9Vr@^=nP80TsnoY!!iIY7Vo?yQx^%rE85Jezk-fO#70b>5kF`|g`Q z56bIX7Ob{$g~Z|_#n*FYpS<^RI#)?b!uEx$ei*I#DSF4|r+&&-maXm9h4N3fuMDYZ zzxAByc5l^`)!U~=2^`#SU}wjI$n!i(C={9 zXL(4qi2nJF{9ENpwO?h(ty!;GIU#su;=1{BJ7)D&aeY;^xW6+j_WOZ%s@4^6SGZmI jx+3^aWbGD-xb9H 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

i)x2+E zxb%Qx!oO#)noag>?LC&0@xJcT6^1m1SdYISs@Ve$*vv?jJ7_TfSBW%l?XCJ1i#duF z8pGsg)Rc+by~Vg?^3ArJ-zJp)bCeC8!OUH!uMI<9JgXt^-@M|*8@BYwyux_ zNlH3ohZ=V^T6wuUFmB;KX>&+`Sj! zm%W`7+M8&#(I7 zL7buVQ1ptcDS12kdjg9kAGq&IG-Ewc>MN36Arip+;*WbpoO)^0*%kYz_jK2t6-`z= z{HKF;Gs~?t+0T9@I`;lzT)^FQ>#g71FymM6)E+lkimZ-wcqYOYb%mGxg4UI+Am%KF zxAlJo4AzSqykG7Z{CslZyRRav_sw?{b+FfIjH}_ea5rFa9m9)9lXh(hC|CddtA+LR zliMdO(#4Lhs`GxP!nSMKMW$W5i&EI4ES9O5zG83qwl;YA!I)BGN&9_WNy5)2TTX0T zSLeXAcSHPwKzoKQ|GzF~e|A3OLW}fCi^oP?p?AEV{jkN#lIStuw7W^Y+Lg7xzMxPk{c`L zPd3aEI(lxl>oZq#uLYJ1_4l)Apc2lMZl4!jF&SIX}_dB$LVy`-di|FRo5 z?Ug^@nJM&QXG++;gAVt7)2_Zx=@)a*e`P$i`0bUzHS!F*9=vq7=XMo+#x3#e{T%OS z{L3c(Tzpz*f&QMxGZ*(OZBClUTJp7due4TW!=3o$eNjQo8R854R!cHH6F#T>`OC_b zIdR_4X4)$jKbe{mS0H=1X7$bSUuP`=hqhX{-r< z&rFVO-eni{)tNz-ebQ0wi+}g+<=j>I)6GcD#)a9%>YAyj=~fNXD}gKInO^8OBxk;I zce>WUb9J0@a?N7a(%Q}M9o%2OX=nJA{M4|qt2N5W=sSP3#H)6Ot=nG-IP7O$;LTgg z6;NHjox4`2;osyx4C(yJldc$keHt^{`QpmA(*Kt+{0gkz$S1Nm+}^2Z!O67pUWO{O zhBCodOZI(LcA2ejw!55jf%`(|-xpTCHu20Von2F$F!|QLgI}3mEWY`hp|s_-`v!iK zn`gTIPEl+Vh_B?_s(kCK@`2g<-+D#fXGP{Q+s4-!F@9MTZO>FS&r0$At)p$a{~p-% zybG}3Bx`$BCTn-7PgvtWqiX&I-^^E@UcOQK&-Vi_y)zi>53>10`tZPyi zM1J+uF5xZSxhKcv?T3xQ;bxNzKPJ9x{r4-WO!R&qXHDeBhFNhp^8VV+T2dBpyEJ)e z%8oO?`oA8W`AL4_1v#g?s){?azuwP0qw62|G=JX0ji00cexJKG4c?!0~d z;%@)9*E6n|trpF)=+-u@{JE;up4psVergEU_KgNJj`mhfw{6Jfvd(t5JyveFHpgP+ zv!;BDvepA1r$Z02T%q;2+UteW|l+hKwp_rc{wO_3{Q z54lg+THV2_w8ZMlb1~}X4G98W1t+8Ey@6L6lz&N?1 zb4)%3;9InDgIP53^_Ar=ajus zaqE}f+x~p(LANC5ETz>7?~9fc?OfRGA(t`f`u;=v8uwnmIB`Qo&$lH1wWbTjN(h45_6H)5y$e2)n^F!8~` z7W0{`2@A{0w5zRtug=>0VXL+{N7>HD#YxLQ3Vq|+6z9a;a9HzVuY7v^LA!%Lqiq5d z(!F!i-6zHV*7FfcH9y85}Sb4q9e0QKHA1^@s6 literal 0 HcmV?d00001 diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 zcmeAS@N?(olHy`uVBq!ia0y~yVDJH94mJh`hU3!%wHX-L)jeGtLn>~)ol~77;wp3e zd*9(B^+)V|Sb7bYEevxsNN95Ly>R5pG><4!#}uyGs~mG-mhw@#=)jY|P(&$f z(L{!c<|0R&xLsVAeA3`bV(L)P-SU0k-1Wx0t*`Gaz6}C*cPCHEH}hRrY(4+)xqLb6 z?~|7>axw5eng)r>M#OO6het&Tdk2 zjXO>(+e6iPSaKw;noN1MNY&D7-9 z9Z#(y_{7gW;WTWkedtzxQflox4oCOxJ(tZ>=XklBr<7cJy-_c6<>4pH4?fl?x10LB zUanWU;8yb0cTa*E9!y=F=<`RhcVRJK?2;*CnExqm)o;lS z(_0muYo!}TY}Q!gDH0YN&0*T!lU-HKk;?A$3ME+W%-nlh&G( zYqi#7w)d=_SNG47E1R)ZRCQX3>^`9zM;c0Z98ElV&WL;Ul!LD}@Jx$1`kp6Zy7Z&z zq35)=UW+`bs<1OLr6kk*if+)p16o@dr#(JUbTYD!d9&7m+nlEj6L!APIo|Me)n*yS zw9JP08|0_0J)rZpjql(l-Wg8~z02~J>E3O6s+2Iz-%GY_YG}gGXKU6lo&LJAdF_Eu zlGC0ZND6zGzEfb@(gQJjem=KL*tyO1v4+9!Ij%-iv>R?dT(jrpq_Uig0uOhuYvcIG zyL@?eNUUJf=`V8Ci}{!y^X{DEn*NdfQ9tARe^P<>OwDBY65Vze?sc$_FEwb{dHfKU zgZ8fFDQsewcg8i%bU$=TI&Jk_)k9U!Dt5c6&wE?JMFt*Z-FYo0As$ecG9_ zqm#{3o~{hfG@mXTA-MG7*Qmd4_bNWWPjKg!s^@yVi_Ke2@5Q9_>W-pf(Y41GEPbuR zrXBnJTB=}}o8$cRuWr7SDC<)cH8I}s%J&F!S$;|s5X-lTtY`+C7ri2H`K`R|V* z-U6n%?^;q{KC-@>0}Nr`<` zdy7|@ZO+jI+fB+1?c3Nt7=&(Q%qX+gel6W0{>Me~V~<7m;YVJqXEh@tZ!db6|Iuc` z=1HRM+qU!H3TaPF{i@3GlKqauxmV(|o^841>^Mc9!-`FN^?@%BHZHz@M$s)n)meJ~ z@%~lcG^FbLG`KU>6K=Bg{1-~Tc2VHnttZD9mze0>%;TBClpC$zRes!{?(_W@T&sSY z7~Y&Y*Qi=%8KZTL@39%Nj3T+b2}>N?r{=sp+94)+c>f>ndtI&-nJ44kDhe#Uw}(Zo zY<~Q%l%9K;JW(gF$#Hcr$T&RzL#TdJ`7JLG;pq>LF8zJgD)slmn^ku-XR&Rui+KKU zbp*%CEY3Y&eI;xba|ZnkI=d!JZ8gy^*`Pg~05HAUF3_{)t-pO$Th`yYuVR1~wb^{#6$ zS;cm56aRyiaZ=?|=e=or_JdzKWVxWs`)MB&K5JIYpTnE~vPLwh*7)kJy2QepH*F;i zj@KU*yZTHfSN+^$J~OUsYn%I>K3rMn$N9S6&s)OQGpyn6l}L4K_P1~BB`!HE3|-%p zUo|-~!OT+kNWfPS=GuGf-tOyv(_)X+zuy~uCi>%+*^eR~>9s#z_T1;xqn+hj zUhA1VcV9|noLx0zs^_~oM;k4)S9EqoD9uY+#UM1fU$p4qO3gzd%9D%Ve`s+v-pcQu z=NK%p!6@2XU+I_7y4oY`tC(8dSR%TEQ&&Fri(YZLpL=1)!;Fm+R$ZBFB&)f1-?F17 zae;Qnx6Mf45!-yvfW@2rR>rEmR#Q(~^7;GtYKd*rsW_9P7jF15m-VV&?zY+as%vI0 zx>fQh`l0;ZMXIL9_quOo&+2*<(N|_a?c O7(8A5T-G@yGywok=Zg*i literal 0 HcmV?d00001 diff --git a/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/layers/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6a84f41e14e27f4b11f16f9ee39279ac98f8d5ac GIT binary patch literal 3294 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 literal 0 HcmV?d00001 diff --git a/examples/layers/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/layers/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000000..ebf48f6039 --- /dev/null +++ b/examples/layers/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/layers/ios/Runner/Base.lproj/Main.storyboard b/examples/layers/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..f3c28516fb --- /dev/null +++ b/examples/layers/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/layers/ios/Runner/Info.plist b/examples/layers/ios/Runner/Info.plist new file mode 100644 index 0000000000..7da3b49993 --- /dev/null +++ b/examples/layers/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + layers + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/examples/layers/ios/Runner/main.m b/examples/layers/ios/Runner/main.m new file mode 100644 index 0000000000..1bdb8e28d1 --- /dev/null +++ b/examples/layers/ios/Runner/main.m @@ -0,0 +1,10 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, + NSStringFromClass([AppDelegate class])); + } +} diff --git a/examples/layers/pubspec.yaml b/examples/layers/pubspec.yaml index 0a11561a63..efa111149f 100644 --- a/examples/layers/pubspec.yaml +++ b/examples/layers/pubspec.yaml @@ -10,3 +10,4 @@ dev_dependencies: flutter: assets: - services/data.json + uses-material-design: true diff --git a/examples/layers/rendering/src/sector_layout.dart b/examples/layers/rendering/src/sector_layout.dart index 04025d0136..593391b97e 100644 --- a/examples/layers/rendering/src/sector_layout.dart +++ b/examples/layers/rendering/src/sector_layout.dart @@ -15,7 +15,8 @@ class SectorConstraints extends Constraints { this.maxDeltaRadius: double.INFINITY, this.minDeltaTheta: 0.0, this.maxDeltaTheta: kTwoPi - }); + }) : assert(maxDeltaRadius >= minDeltaRadius), + assert(maxDeltaTheta >= minDeltaTheta); const SectorConstraints.tight({ double deltaRadius: 0.0, double deltaTheta: 0.0 }) : minDeltaRadius = deltaRadius, @@ -216,12 +217,16 @@ class RenderSectorRing extends RenderSectorWithChildren { BoxDecoration decoration, double deltaRadius: double.INFINITY, double padding: 0.0 - }) : _padding = padding, _desiredDeltaRadius = deltaRadius, super(decoration); + }) : _padding = padding, + assert(deltaRadius >= 0.0), + _desiredDeltaRadius = deltaRadius, + super(decoration); double _desiredDeltaRadius; double get desiredDeltaRadius => _desiredDeltaRadius; set desiredDeltaRadius(double value) { assert(value != null); + assert(value >= 0); if (_desiredDeltaRadius != value) { _desiredDeltaRadius = value; markNeedsLayout(); @@ -249,11 +254,11 @@ class RenderSectorRing extends RenderSectorWithChildren { @override SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { final double outerDeltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius); - final double innerDeltaRadius = outerDeltaRadius - padding * 2.0; + final double innerDeltaRadius = math.max(0.0, outerDeltaRadius - padding * 2.0); final double childRadius = radius + padding; final double paddingTheta = math.atan(padding / (radius + outerDeltaRadius)); double innerTheta = paddingTheta; // increments with each child - double remainingDeltaTheta = constraints.maxDeltaTheta - (innerTheta + paddingTheta); + double remainingDeltaTheta = math.max(0.0, constraints.maxDeltaTheta - (innerTheta + paddingTheta)); RenderSector child = firstChild; while (child != null) { final SectorConstraints innerConstraints = new SectorConstraints( @@ -489,10 +494,12 @@ class RenderBoxToRenderSectorAdapter extends RenderBox with RenderObjectWithChil assert(child.parentData is SectorParentData); assert(width != null); assert(height != null); - final double maxChildDeltaRadius = math.min(width, height) / 2.0 - innerRadius; + if (!width.isFinite && !height.isFinite) + return Size.zero; + final double maxChildDeltaRadius = math.max(0.0, math.min(width, height) / 2.0 - innerRadius); final SectorDimensions childDimensions = child.getIntrinsicDimensions(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), innerRadius); final double dimension = (innerRadius + childDimensions.deltaRadius) * 2.0; - return constraints.constrain(new Size(dimension, dimension)); + return new Size.square(dimension); } @override diff --git a/examples/layers/test/sector_test.dart b/examples/layers/test/sector_test.dart index 52a622c573..693898f1a5 100644 --- a/examples/layers/test/sector_test.dart +++ b/examples/layers/test/sector_test.dart @@ -2,12 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:test/test.dart'; +import 'package:flutter_test/flutter_test.dart'; import '../rendering/src/sector_layout.dart'; +import '../widgets/sectors.dart'; void main() { test('SectorConstraints', () { expect(const SectorConstraints().isTight, isFalse); }); + + testWidgets('Sector Sixes', (WidgetTester tester) { + tester.pumpWidget(new SectorApp()); + }); } diff --git a/examples/stocks/android/ic_launcher.zip b/examples/stocks/android/ic_launcher.zip deleted file mode 100644 index 1baf404f77172eb359c84b4ff897744a6a190885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33894 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 Y7vRkb8jojSWng7!XJlYF*#y!K0A9tZr2qf` diff --git a/examples/stocks/lib/stock_data.dart b/examples/stocks/lib/stock_data.dart index cd82d8b2ff..d84c37d305 100644 --- a/examples/stocks/lib/stock_data.dart +++ b/examples/stocks/lib/stock_data.dart @@ -39,10 +39,10 @@ class Stock { } class StockData { - List> _data; - StockData(this._data); + final List> _data; + void appendTo(Map stocks, List symbols) { for (List fields in _data) { final Stock stock = new Stock.fromFields(fields); diff --git a/packages/flutter/lib/src/rendering/error.dart b/packages/flutter/lib/src/rendering/error.dart index c5ed737a5b..b7fcb860d8 100644 --- a/packages/flutter/lib/src/rendering/error.dart +++ b/packages/flutter/lib/src/rendering/error.dart @@ -51,7 +51,7 @@ class RenderErrorBox extends RenderBox { ); _paragraph = builder.build(); } - } catch (e) { } + } catch (e) { } // ignore: empty_catches } /// The message to attempt to display at paint time. @@ -114,6 +114,6 @@ class RenderErrorBox extends RenderBox { context.canvas.drawParagraph(_paragraph, offset); } - } catch (e) { } + } catch (e) { } // ignore: empty_catches } } diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart index 290fee49c3..afad2b6f7a 100644 --- a/packages/flutter/lib/src/widgets/framework.dart +++ b/packages/flutter/lib/src/widgets/framework.dart @@ -3006,7 +3006,7 @@ class ErrorWidget extends LeafRenderObjectWidget { static String _stringify(Object exception) { try { return exception.toString(); - } catch (e) { } + } catch (e) { } // ignore: empty_catches return 'Error'; } diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index adbb5ad77c..3c31e0779c 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -72,6 +72,7 @@ class Xcode { else _eulaSigned = true; } catch (error) { + _eulaSigned = false; } } } catch (error) { diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart index d4d25f7df2..c9c683840f 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart @@ -280,7 +280,11 @@ class FlutterCommandRunner extends CommandRunner { if (engineSourcePath == '/' || engineSourcePath.isEmpty || !dirExists) engineSourcePath = null; } - } on FileSystemException { } on FormatException { } + } on FileSystemException { + engineSourcePath = null; + } on FormatException { + engineSourcePath = null; + } if (engineSourcePath == null) engineSourcePath = _tryEnginePath(fs.path.join(Cache.flutterRoot, '../engine/src')); diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/AndroidManifest.xml.tmpl b/packages/flutter_tools/templates/create/android.tmpl/app/src/main/AndroidManifest.xml.tmpl index c5b831934f..592a869eb1 100644 --- a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/AndroidManifest.xml.tmpl +++ b/packages/flutter_tools/templates/create/android.tmpl/app/src/main/AndroidManifest.xml.tmpl @@ -5,7 +5,8 @@ -